Commit Graph

6754 Commits

Author SHA1 Message Date
Kavon Farvardin
c260792e73 Merge pull request #65690 from kavon/forget-usage-fixes
`_forget` usage fixes to match SE-390
2023-05-06 11:50:10 -07:00
Adrian Prantl
00b24c909b Fix SILDebugScopes for closures expanded from an expression macro.
An expression macro can expand not just to code inside the function, but also to
a closure. Such a closure needs to be treated similar to any functions generated
from a freestanding macro: Its instructions should have locations that point
straight into the macro buffer. Instructions that are expanded into the same
function as the macro expansion can be represented using inline locations
pointing back to the macro expansion, but this is not an option for top-level
function declaration.

https://github.com/apple/swift/issues/65484
rdar://108618562
2023-05-06 09:23:49 -07:00
Slava Pestov
ebb99e5e84 SILGen: Wrap captures of parameter packs inside tuples
Fixes rdar://problem/108481933.
2023-05-05 22:45:03 -04:00
Slava Pestov
a76723fdbe SILGen: Remove some dead code 2023-05-05 22:45:03 -04:00
Kavon Farvardin
578da4949d disallow "non-trivial" stored properties when using forget
We haven't quite got the semantics we want implemented
for `discard` aka `_forget` statements. Allowing people
to use `_forget` in noncopyable types that have stored
properties that require destruction will not let us
implement it the way we'd like in the future without
source break. But, if the type only has "trivial" stored
properties with a no-op destruction, like `Int`, then we
can still provide utility for users like FileDescriptor
who just want to disable the deinit and have nothing
fancy stored in the type itself.

rdar://108877261
2023-05-05 19:05:04 -07:00
Allan Shortlidge
0366c42293 Merge pull request #65557 from tshortli/unavailable-decl-optimization-stub
Introduce `stub` mode for `-unavailable-decl-optimization`
2023-05-05 09:11:41 -07:00
swift-ci
4ddc1f47f9 Merge pull request #65634 from atrick/comment-silgen
Fix SILGen comments for isPlusOne and isPlusOneOrTrivial.
2023-05-04 16:01:43 -07:00
Andrew Trick
42e2652529 Fix SILGen comments for isPlusOne and isPlusOneOrTrivial. 2023-05-03 22:01:49 -07:00
Michael Gottesman
e1f2a207bd Merge pull request #65604 from gottesmm/address-only-stuff
[move-only] Address Only Patches
2023-05-03 18:39:25 -07:00
Allan Shortlidge
65de2a5a9d SILGen: In unavailable stubs apply diagnostic func's back deployment thunk.
Part of rdar://107388493.
2023-05-03 15:19:32 -07:00
Allan Shortlidge
798e29f98a SILGen: Stub initializer functions for unavailable global vars.
Part of rdar://107388493
2023-05-03 15:19:32 -07:00
Allan Shortlidge
b1d20697fa SILGen: Stub unavailable @objc interop functions and thunks.
Part of rdar://107388493
2023-05-03 15:19:32 -07:00
Allan Shortlidge
235922d5ae SILGen: Stub unavailable protocol witness thunks.
Part of rdar://107388493
2023-05-03 15:19:31 -07:00
Allan Shortlidge
8bc1112029 SILGen: Stub unavailable constructors and destructors.
Part of rdar://107388493
2023-05-03 15:19:31 -07:00
Allan Shortlidge
d1416ddd56 SILGen: Stub unavailable functions.
When `-unavailable-decl-optimization=stub` is specified, insert a call to
`_diagnoseUnavailableCodeReached()` at the beginning of the function to cause
it to trap if executed at run time.

Part of rdar://107388493
2023-05-03 15:19:31 -07:00
Andrew Trick
2b019d8203 Merge pull request #65579 from atrick/fix-silgen-consume
Fix SILGen ManagedValue::isPlusOne for addresses
2023-05-03 09:29:59 -07:00
Michael Gottesman
20958c90b5 [move-only] Add initial support for address only types.
Specifically, I changed emitRValueForDecl and SILGenProlog to do the right
thing. I also added some tests.

Some notes:

1. We currently consider using a copyable field of a move only address type to
be a consume of that type. I am going to fix that in the next commit to make it
easier to understand.

2. I am going to need to write more tests/flesh out the behavior more. I am sure
there is more here.

rdar://105106470
2023-05-02 16:30:24 -07:00
Adrian Prantl
686023861e Merge pull request #65552 from adrian-prantl/108736443
Remove a stateful workaround for Property Wrappers.
2023-05-02 13:43:51 -07:00
Andrew Trick
ea7b8055bc Rewrite some isPlusOne calls to isPlusOneOrTrivial.
Whenever we want to forward to a +1 value but don't need to destroy
the original memory, use isPlusOneOrTrivial.

This follows the existing naming scheme.

Fixes rdar://108001491 (SIL verification failed: Found mutating or
consuming use of an in_guaranteed parameter?!:
!ImmutableAddressUseVerifier().isMutatingOrConsuming(fArg))
2023-05-01 23:24:29 -07:00
Andrew Trick
dc95b112cd Fix ManagedValue::isPlusOne for addresses
In-memory values cannot be reused after deinitialization.

Add ManagedValue::isPlusOneOrTrivial() for situations where we want to
forward a value without destroying the original memory.

Fixes rdar://108001491 (SIL verification failed: Found mutating or
consuming use of an in_guaranteed parameter?!:
!ImmutableAddressUseVerifier().isMutatingOrConsuming(fArg))
2023-05-01 23:23:42 -07:00
Adrian Prantl
dcd881e105 SILDebugScopes: Remove a stateful workaround for Property Wrappers.
In an earlier version of the ASTScope -> SILdebugScope translation a workaround
was put into place that would select the current debug scope if an ASTScope was
marked as ignoreInDebugInfo. Removing this workaround makes the translation more
predictable as it eliminated the dependency on the current SILBuilder state. The
property wrapper tests still pass without this.

This uncovers a situations with let bindings where the SIL instructions are
emitted RHS before LHS, which does violate the di-hole verifier. This is
addressed by relaxing the verifier for now.

rdar://108736443
2023-05-01 17:52:44 -07:00
swift-ci
49e50a5c80 Merge pull request #65483 from adrian-prantl/108576484
Remove an obsolete workaround for error variables.
2023-04-28 17:40:20 -07:00
Adrian Prantl
0668289744 Remove an obsolete workaround for error variables.
This is a revert  of the workaround for creating debug  info for error variables
in b2109ab4db, while leaving the test  added back then in place.  The compiler
is now emitting debug info for the error pattern binding as it's supposed to and
after the  recent migration to  stricter debug  scope generation, there  are now
situations where the  variable added for the workaround and  the correct one are
in conflict.

rdar://108576484
2023-04-28 13:03:14 -07:00
Doug Gregor
593c2364e8 [Macros] "Subsume" the initializer when an accessor macros adds non-observers
When an accessor macro adds a non-observing accessor to a property, it
subsumes the initializer. We had previously modeled this as removing
the initializer, but doing so means that the initializer could not be
used for type inference and was lost in the AST.

Explicitly mark the initializer as "subsumed" here, and be more
careful when querying the initializer to distinguish between "the
initializer that was written" and "the initializer that will execute"
in more places. This distinction already existed at the
pattern-binding level, but not at the variable-declaration level.

This is the proper fix for the circular reference issue described in
rdar://108565923 (test case in the prior commit).
2023-04-28 09:50:00 -07:00
Michael Gottesman
94b0caea38 Merge pull request #65353 from gottesmm/pr-7fddccd1df47d4c57c27121727562d691b9f2397
[move-only] A group of batched changes
2023-04-25 16:14:17 -07:00
Adrian Prantl
debb455e0a Merge pull request #65402 from adrian-prantl/108323748
Add support for nested ASTScopes inside of macro expansions.  … @adrian-prantl
2023-04-25 16:01:35 -07:00
Michael Gottesman
9a0b9665f1 [move-only] When emitting accesses to let boxes containing a noncopyable type, always emit mark_must_check.
The reason to do this is that:

1. Otherwise, we do not emit markers when someone attempts to consume the let.
We need the no_consume_or_assign to be there.
2. We need to insert assign_but_not_consuming so that DI can properly check lets
that are conditionally initialized and convert them to
initable_but_not_consuming.

I included a full definite_init SIL test that validates that we get the correct
codegen after DI in this case and emit the appropriate error as well.

rdar://108511534
2023-04-25 10:51:04 -07:00
Michael Gottesman
438974a2b9 [move-only] When emitting borrows for move only types, use a load [copy] instead of a load_borrow.
The reason why I am doing this is that otherwise if one has a function that
takes both a guaranteed and an owned parameter, we will break OSSA invariants
since the load [take] will invalidate the load_borrow. So instead, we put in a
load_borrow knowing that the move checker will convert it to a load_borrow
assuming that the two pass exclusivity checking.

NOTE: Because of some missing functionality in subsequent tests, I had to
disable one test (moveonly_escaping_definite_initialization.swift) and also add
some checks for copy of noncopyable object errors. They will go away in the next
2 commits.

rdar://108510987
2023-04-25 10:51:03 -07:00
Michael Gottesman
9252d5ea8b [move-only] Eliminate dead code that was not removed when re-projected move only types were removed. 2023-04-25 10:51:03 -07:00
Adrian Prantl
3901219eeb Add support for nested ASTScopes inside of macro expansions.
Before this patch the parents of SILDebugScopes representing macro expansions
were missing the inlinedAt field, which resulted in incorrent LLVM IR being
produced. This is fixed by first computing the inlined call site for a macro
expansion and then computing the nested SILDebugScope for the ASTScope of the
expanded nodes; adding the inlinedAt field to all of levels of parent scopes.

rdar://108323748
2023-04-24 14:11:19 -07:00
Joe Groff
f045829068 Merge pull request #65302 from jckarter/borrow-moveonly-lvalue-base
SILGen: Emit move-only bases for lvalues in a borrow scope.
2023-04-20 09:28:56 -07:00
Joe Groff
cb23187209 SILGen: Emit move-only bases for lvalues in a borrow scope.
Normally, if we project from a mutable class ivar or global variable, we'll
load a copy in a tight access scope and then project from the copy, in order to
minimize the potential for exclusivity violations while working with classes and
copyable values. However, this is undesirable when a value is move-only, since
copying is not allowed; borrowing the value in place is the expected and only possible
behavior. rdar://105794506
2023-04-19 14:50:34 -07:00
John McCall
e87fbc8a04 Handle vanishing tuples when emitting a result plan into an initalization
Fixes rdar://107972801
2023-04-19 15:34:03 -04:00
Holly Borla
ae32673553 [Macros] Fix visiting nested conformance macro declarations in SIL and IRGen.
When expanding a conformance macro, the generated extension decls are added to
the TopLevelDecls vector of the synthesized file unit to expose them to
sf->getSynthesizedFile()->getTopLevelDecls(). There are two problems with this:

  1. These decls are also visited via visitAuxiliaryDecls() for the purpose of
     type checking. This causes problems in code generation because the extensions
     are visited separately, and because SIL and IRGen assume nested auxiliary decls
     are members.
  2. SILGen only emits top-level decls directly from the source file rather than its
     synthesized file. Auxiliary decls are visited here, but this doesn't work for
     nested conformance macros because the attached-to decl is not at the top-level,
     so macro-generated conformances for nested types never emit their descriptor.

To fix this in the short term, visit top-level decls in the synthesized file that are
generated by conformance macros, and skip auxiliary extension decls when emitting type
members. This fix is narrowly scoped to only impact macros, but in the future this
warrants a more structural fix to better handle top-level decls in the synthesized file.
2023-04-17 10:33:25 -07:00
Adrian Prantl
68aa944ccd SILgenPattern: Mark location used by forwardIntoSubtree as autogenerated.
If a pattern reuses a value from a previous branch this could result in a step
backwords or a previous scope being reopeneed.

rdar://107764966
2023-04-14 15:18:00 -07:00
Michael Gottesman
ab59958cc3 Merge pull request #65130 from gottesmm/pr-56cbe3c44dba95e1fd7880b174205c541e11c01d
[move-only] Add support for move only empty structs and fix a SILGen issue around their initializers.
2023-04-13 07:07:42 -07:00
swift-ci
703222583c Merge pull request #65047 from adrian-prantl/107764966
Ignore profile counter instructions in the dihole verifier.
2023-04-12 21:36:02 -07:00
Michael Gottesman
19f1dedf1f [move-only] When emitting an initializer for an empty struct, store an instance to make sure it is initialized.
I ran into this while fixing the parent commit when attempting to add the
interpreter test in this commit into the aforementioned parent commit.

rdar://107974302
2023-04-12 20:56:31 -07:00
Adrian Prantl
e51937f29e Don't emit freestanding macros in inlined scopes 2023-04-12 16:48:57 -07:00
Erik Eckstein
dfa46c6129 SILGen: emit drop_deinit in move-only destructors 2023-04-11 10:25:49 +02:00
Erik Eckstein
c4ae7fe9e6 move-only: support deinits which get the self argument as indirect argument
This happens for address-only move-only types.
2023-04-11 10:25:49 +02:00
Adrian Prantl
bccc080888 Fix handling of implicit locations for variables 2023-04-10 18:13:42 -07:00
Adrian Prantl
e3445a8e73 Delete commented-out code. NFC 2023-04-06 14:39:07 -07:00
Adrian Prantl
829491b230 Merge pull request #64551 from adrian-prantl/88274783
Rebase SILScope generation on top of ASTScope
2023-04-05 08:30:13 -07:00
Adrian Prantl
158772c2ab Rebase SILScope generation on top of ASTScope.
This patch replaces the stateful generation of SILScope information in
SILGenFunction with data derived from the ASTScope hierarchy, which should be
100% in sync with the scopes needed for local variables. The goal is to
eliminate the surprising effects that the stack of cleanup operations can have
on the current state of SILBuilder leading to a fully deterministic (in the
sense of: predictible by a human) association of SILDebugScopes with
SILInstructions. The patch also eliminates the need to many workarounds. There
are still some accomodations for several Sema transformation passes such as
ResultBuilders, which don't correctly update the source locations when moving
around nodes. If these were implemented as macros, this problem would disappear.

This necessary rewrite of the macro scope handling included in this patch also
adds proper support nested macro expansions.

This fixes

rdar://88274783

and either fixes or at least partially addresses the following:

rdar://89252827
rdar://105186946
rdar://105757810
rdar://105997826
rdar://105102288
2023-04-04 15:20:11 -07:00
Richard Wei
01e6fe2936 [Macros] Code item macros
Add support for declaring and expanding code item macros.  Add experimental feature flag `CodeItemMacros`.
2023-04-04 09:54:57 -07:00
John McCall
9c9671b349 Merge pull request #64887 from rjmccall/vanishing-tuple-silgen
SILGen and SIL type lowering support for vanishing tuples
2023-04-04 12:41:29 -04:00
John McCall
65510fb7fe Handle vanishing tuples correctly (or more correctly) in arg emission. 2023-04-03 23:17:24 -04:00
John McCall
3ffaae7948 Handle vanishing tuples correctly in result planning. 2023-04-03 23:16:38 -04:00
John McCall
cbf8519084 Fix an indexing bug when binding tuple parameters with non-initial
parameter packs.
2023-04-03 23:12:18 -04:00