Commit Graph

2864 Commits

Author SHA1 Message Date
Holly Borla
009d7d0c70 [Concurrency] nonisolated can only be applied to actor properties with
`Sendable` type.
2024-01-26 08:54:28 -08:00
Arnold Schwaighofer
edd7eaa0d7 OSLog: os_log strings should be in the __oslogstring section on machO
rdar://121384422
2024-01-26 08:30:56 -08:00
Michael Gottesman
f077e4a9d7 [region-isolation] Fix the call site or self error for values used in the same region as a function argument.
This is just good to do and also makes it so that in my test case for
assumeIsolated, I get a better msg.
2024-01-25 20:40:56 -08:00
Michael Gottesman
8ff934193b [region-isolation] Move RequireLiveness above the diagnostic emission utilities since I am going to be adding more logic to the diagnostic emission utilities. 2024-01-25 20:40:56 -08:00
Michael Gottesman
48ecf6734f [region-isolation] Hide some state only associated with the UseAfterTransferDiagnostic.
I am doing this since I am going to add something similar albeit
different/specialized for the TransferNonTransferrable diagnostic.
2024-01-25 20:40:56 -08:00
Michael Gottesman
40754ba587 [region-isolation] Begin preparing to cleanup the "call site passes self or argument" warning.
This involves me changing where we emit the error. Instead of us emitting the
error early in the evaluator, we emit it later when we emit diagnostics for all
other transferring things.

This is NFCI.
2024-01-25 20:40:56 -08:00
Michael Gottesman
7c79a24a1f [region-isolation] Values that are captured by an actor isolated closures are transferred to that closure.
This commit makes it so that we treat values captured by an actor isolated
closure as being transferred to that closure. I also introduced a new diagnostic
for these warnings that puts the main warning on the capture point of the value
so the user is able to see the actual capture that causes the transfer to occur:

```swift
  nonisolated func testLocal2() async {
    let l = NonSendableKlass()

    // This is not safe since we use l later.
    self.assumeIsolated { isolatedSelf in
      isolatedSelf.ns = l
    }

    useValue(l) // expected-note {{access here could race}}
  }
```

```
test.swift:74:14: warning: main actor-isolated closure captures value of non-Sendable type 'NonSendableKlass' from nonisolated context; later accesses to value could race
    useValue(x) // expected-warning {{main actor-isolated closure captures value of non-Sendable type 'NonSendableKlass' from nonisolated context; later accesses to value could race}}
             ^
test.swift:76:12: note: access here could race
  useValue(x) // expected-note {{access here could race}}
           ^
```

One thing to keep in mind is that if we have a function argument being captured
in this way, we still emit the "call site passes `self`" error. I am going to
begin cleaning that up in the next commit in this PR so that we emit a better
error here. But it makes sense to split these into two separate commits since
they are doing different things.

rdar://121345525
2024-01-25 20:40:56 -08:00
Rick van Voorden
f8ae46b3f3 [inclusive-language] changed sanity to soundness 2024-01-25 18:18:02 -08:00
Nate Chandler
e8364d632c [Gardening] MoveChecker: Tweaked comment. 2024-01-25 11:01:14 -08:00
Holly Borla
47afd21d85 [Concurrency] Remove ActorIsolation::GlobalActorUnsafe. 2024-01-21 21:05:33 -08:00
Michael Gottesman
50aaad376b Merge pull request #70836 from gottesmm/transferring-parameter
[region-isolation] Add support for transferring parameters.
2024-01-19 11:10:58 -08:00
Michael Gottesman
eb573092d1 [region-isolation] Teach the checker that a use of a local value after being strongly transferred is an error.
Before the previous patch, we were just getting lucky on macOS due to UB. Now
that the UB is fixed, we correctly crash without this commit since we were not
pattern matching the simple case of a local value that was transferred and used
later.
2024-01-18 13:20:28 -08:00
Michael Gottesman
23adcbadb9 [region-isolation] Eliminate some UB caused by dereferencing unchecked optionals.
llvm::Optional<T> used to make it so that in asserts builds if one dereferenced the optional and nothing was there, one would get an assert. std::optional<T> does not have that property.
2024-01-18 13:20:28 -08:00
Michael Gottesman
9303c40162 [region-isolation] Teach region isolation that assigning into a transferring parameter is a transfer of the value.
The specific semantics is if we assign into a transferring parameter's field,
then we "merge" src's value into the transferring parameter, so we
conservatively leave the region of the transferring parameter alone. If we
assign over the entire transferring parameter, we perform an assign fresh since
any value that used to be in the transferring parameter cannot reference
anything in its new value since they are all gone.
2024-01-18 13:20:28 -08:00
Nate Chandler
d538894203 [AddressLowering] Handle copyable_to_moveonly.
The _value version of the instruction lowers to the _address version.
2024-01-18 07:30:23 -08:00
Nate Chandler
99df40a6d1 [AddressLowering] Handle moveonly_to_copyable.
The _value version of the instruction lowers to the _address version.
2024-01-18 07:30:23 -08:00
nate-chandler
858bc4b523 Merge pull request #70965 from nate-chandler/opaque-values/20240117/1
[AddressLowering] Handle mark_unresolved... inst.
2024-01-18 00:42:51 -08:00
Nate Chandler
c4a393cbf7 [AddressLowering] Handle mark_unresolved... inst.
In the fullness of time, AddressLowering should never see such
instructions because they will be eliminated after diagnostics.  Until
that time, though they need to be handled.
2024-01-17 15:16:59 -08:00
Slava Pestov
a7f484b3a4 AST: Clean up isSendableType() 2024-01-16 22:44:43 -05:00
Holly Borla
22d9e85953 Merge pull request #70758 from hborla/generalize-isolated-param
[Concurrency] Allow isolated parameters to have optional type.
2024-01-10 19:07:04 -08:00
Michael Gottesman
053e30d46d [region-isolation] Make sure not to run RegionAnalysis on functions that we do not support.
Before this commit, this was done at the beginning of TransferNonSendable. I
thought that those checks would be sufficient to ensure that
RegionAnalysisFunctionInfo was not created for functions that we do not
support. Turns out when we perform certain forms of verification, we force all
function analyses to be created for all functions meaning that we would create a
RegionAnalysisFunctionInfo for such an unsupported function causing us to hit
asserts.

In this commit, I move the check to whether or not we support a function into
RegionAnalysisFunctionInfo itself and use that to determine if we should run
TransferNonSendable. This additionally allows me to change
RegionAnalysisFunctionInfo so that one can construct one for an unsupported
function... as long as one doesn't actually touch any of its methods. If one
does, I put in an assert so we will know that operator error has occured.
2024-01-10 13:41:12 -08:00
Michael Gottesman
a9dc4ed6cc [region-isolation] Refactor out the Region analysis from TransferNonSendable.
NFCI. This is just a pure refactor of the analysis part of TransferNonSendable
into a separate SIL level analysis so it can be reused by other passes.

The reason that I am committing this earlier is that I am working concurrently
on other patches that change TransferNonSendable itself and I want to avoid
issues when rebasing those patches. Getting this patch into tree earlier avoids
that.

This is in preparation for adding a new flow sensitive initialization pass that
combines region based analysis with the current flow sensitive isolation's
diagnostic emitter. The idea is that we want to preserve the diagnostics from
that pass rather than try to make our own as an initial step.
2024-01-10 13:41:12 -08:00
Holly Borla
0db14c93d6 [SILOptimizer] Derive optional executor values from optional actor values
in LowerHopToActor.

In order to project an optional executor value from an optional actor value,
the executor lowering needs to modify the CFG. This is done by splitting
LowerHopToActor into two passes. The first pass records all actor operands
of hop_to_executor and extract_executor instructions and records the
dominating instruction that will derive the executor value. The second pass
iterates over the multi-map of dominating instructions, derives the executor
value, and rewrites the operands of all reachable hop_to_executor and
extract_executor instructions to reuse that executor value.
2024-01-09 21:38:13 -08:00
Holly Borla
c0e9178e9e [SILOptimizer] Open existential actors for hop_to_executor as part of the
LowerHopToActor pass instead of during SILGen.
2024-01-09 21:37:24 -08:00
Andrew Trick
264cbaea42 Add mark_dependence [nonescaping] flag.
The dependent 'value' may be marked 'nonescaping', which guarantees that the
lifetime dependence is statically enforceable. In this case, the compiler
must be able to follow all values forwarded from the dependent 'value', and
recognize all final (non-forwarded, non-escaping) use points. This implies
that `findPointerEscape` is false. A diagnostic pass checks that the
incoming SIL to verify that these use points are all initially within the
'base' lifetime. Regular 'mark_dependence' semantics ensure that
optimizations cannot violate the lifetime dependence after diagnostics.
2024-01-04 14:47:35 -08:00
Joe Groff
1cb500c208 Merge pull request #70573 from jckarter/moveonly-addressor-diagnostic-names
SIL: Get addressor property names for display in move checker diagnostics.
2024-01-02 10:14:16 -08:00
Joe Groff
ba7abd0dd9 SIL: Get addressor property names for display in move checker diagnostics. 2023-12-20 16:20:48 -08:00
Michael Gottesman
bee76bf696 [region-isolation] Add support for unchecked_value_cast.
Same as unchecked_trivial_bit_cast.
2023-12-19 16:42:02 -08:00
Michael Gottesman
fbc8b53c8f [region-isolation] Add support for unchecked_bitwise_cast.
Just followed the model of unchecked_trivial_bit_cast.
2023-12-19 15:52:04 -08:00
Michael Gottesman
0b74399768 [region-isolation] Add support for unchecked_trivial_bit_cast
NOTE: This required me to stop using swift::getUnderlyingObject from
getUnderlyingTrackedObject since when it stripsCasts it looks through
unchecked_trivial_bit_cast... but we only want to do that if both the operand
and result of the instruction are non-Sendable. To fix this I inlined
getUnderlyingObject's impl and removed that part of stripCasts.
2023-12-19 15:45:20 -08:00
Michael Gottesman
d08359eb20 [region-isolation] Add support for ref_to_raw_pointer, raw_pointer_to_ref, index_raw_pointer. 2023-12-19 15:21:42 -08:00
Michael Gottesman
c90097f1f0 [region-isolation] Add support for *_existential_box instructions.
NOTE: I am just adding coverage that we support these instructions. One can only
use this with Error today and Error is always Sendable. So this is just going
for completeness.
2023-12-19 13:29:12 -08:00
Michael Gottesman
8178eb0a6e Merge pull request #70514 from gottesmm/pr-763529d8ee9f4164b82d03087fec25439cc1d315
[region-isolation] Fix the dataflow and add support for project_block_storage
2023-12-19 10:21:59 -08:00
Michael Gottesman
ddd8c01877 [region-isolation] Do not treat mark_dependence as an ignore. Treat it as an assign from op 0 -> result and a require of op 1.
Semantically a mark_dependence returns a value that is equal to its first
parameter with the extra semantics that any destroys of the 2nd operand cannot
occur before any uses of the result of the instruction. From a region
perspective this suggests that the instruction should be an assign from the
first operand onto the result and act as a require on the result. Semantically
the requirement that the 2nd operand cannot be destroyed before any uses of the
result does not expose any memory or state from the first operand implying that
we don't need to merge it into the result region. The restriction is purely to
tell the optimizer what it can/cannot do rather.
2023-12-18 16:56:32 -08:00
Michael Gottesman
71a8c8eedc [region-isolation] Some small comment cleanups/reordering of definitions. NFCI. 2023-12-18 16:29:46 -08:00
Michael Gottesman
998f067d59 [region-isolation] Add support for mark_unresolved_move_addr. It is a store. 2023-12-18 16:21:34 -08:00
Joe Groff
614a8e35ac Merge pull request #70507 from jckarter/generic-moveonly-diagnostic-names
Look through copy_addr and opened existentials to diagnose move-only sources.
2023-12-18 13:27:09 -08:00
Michael Gottesman
f6cda45e52 [region-isolation] Add support for alloc_vector. Its an assign fresh. 2023-12-18 12:47:42 -08:00
Michael Gottesman
58a6e2aa4d [region-isolation] Add Asserting support for {alloc,dealloc}_pack_metadata since they only appear in Lowered SIL.
I also added a note to the SIL.rst and an assert into the SILVerifier to better
document this requirement.
2023-12-18 12:35:40 -08:00
Michael Gottesman
4a635b61a4 [region-isolation] Add support for fix_lifetime.
fix_lifetime just acts as a require.
2023-12-18 12:35:40 -08:00
Michael Gottesman
59fe82d878 [region-isolation] Do not run on non-Ownership SSA SIL and mark certain instructions that can only appear in non-OSSA as asserting.
We already only supported Ownership SSA since we run early in the pipeline
before OSSA is lowered. This just formalizes this behavior. I am marking these
instructions as Asserting (even though we will never see them) so I can
semantically be sure that all of the instructions are covered without using an
"unsupported" like moniker that I fear will lead to new instructions being added
as unsupported. Better to have a semantic thing for new instruction adders to
use.
2023-12-18 12:35:40 -08:00
Michael Gottesman
7712639ab0 [region-isolation] Add support for project_block_storage.
rdar://119743743
2023-12-18 09:35:57 -08:00
Meghana Gupta
890ec7d855 Merge pull request #70477 from meg-gupta/fixpredmemopt
Use OSSALifetimeCompletion in PredictableMemOpt
2023-12-15 19:18:22 -08:00
Michael Gottesman
bcb8f1b0d8 [region-isolation] Implement the dataflow correctly.
This involved fixing a few different bugs.

1. We were just performing dataflow by setting that only the initial block needs
to be updated. This means that if there isn’t anything in the initial dataflow
block, we won’t visit any successor blocks. Instead the correct thing to do here
is to visit all blocks in the initial round.

2. I also needed to fix a separate issue where we were updating our union-find
data structure incorrectly as found by an assert on transfernonsendable.swift
that was triggered once I fixed 1. Put simply, we needed to set a new max label
+ 1 when our new max element is less than or equal to the old max label + 1…
before we just did less than so if we had a new max element that is the same as
our fresh label, we wouldn’t increment the fresh label.

rdar://119584497
2023-12-15 17:14:09 -08:00
Joe Groff
02800046c6 Look through copy_addr and opened existentials to diagnose move-only sources. 2023-12-15 16:36:09 -08:00
Joe Groff
58bf935e48 Merge pull request #70475 from jckarter/noncopyable-addressors
Move-only check the value projected from addressors.
2023-12-15 15:35:58 -08:00
Meghana Gupta
06f0d15c45 Use OSSALifetimeCompletion in PredictableMemOpt
The current algorithm to complete lifetimes is incorrect in a few cases.
Use OSSALifetimeCompletion instead.

Fixes rdar://119204768
2023-12-15 15:16:55 -08:00
Michael Gottesman
1f9b074a8d Merge pull request #70481 from gottesmm/more-translation-stuff
[region-isolation] Begin filling out unhandled instructions.
2023-12-15 11:17:41 -08:00
Joe Groff
1b9a0712bf Move-only check the value projected from addressors.
Mark the result of a move-only addressor as unresolved. The pointed-at value
cannot be consumed so ensure that only [read] or [modify] accesses are
performed. Update the move-only checker to recognize code patterns
from addressors.
2023-12-15 10:10:44 -08:00
nate-chandler
680c737ddb Merge pull request #64789 from nate-chandler/more-move-values
[SILGen] Used move_value for more lexical values.
2023-12-15 07:07:54 -08:00