Commit Graph

2441 Commits

Author SHA1 Message Date
zoecarver
d3b71ba907 [cxx-interop] Fix static extensions on foreign reference types.
Foreign reference types don't have dynamic metadata like other Swift classes.
2022-07-28 11:59:47 -07:00
Erik Eckstein
57fdba2e7f SIL: add infrastructure to make snapshots from SILFunctions.
Snapshots are copies of a function at a given point in time.

Currently it's only used for running passes repeatedly for performance profiling.
In future it can be used for caching when doing lazy evaluation in the pipeline.
2022-07-27 17:02:35 +02:00
Michael Gottesman
1e6187c4f4 [sil] Update all usages of old API SILValue::getOwnershipKind() in favor of new ValueBase::getOwnershipKind().
Andy some time ago already created the new API but didn't go through and update
the old occurences. I did that in this PR and then deprecated the old API. The
tree is clean, so I could just remove it, but I decided to be nicer to
downstream people by deprecating it first.
2022-07-26 11:46:23 -07:00
Egor Zhdan
8165806aa0 Merge pull request #60174 from apple/egorzhdan/scs-stringref-p1
[cxx-interop][SwiftCompilerSources] Use `llvm::StringRef` instead of `BridgedStringRef`
2022-07-25 14:26:59 +01:00
Zoe Carver
bd003bcd7f Merge pull request #59509 from zoecarver/frt-with-ref-counting
[cxx-interop] Add support for reference counting operations on foreign reference types.
2022-07-23 20:51:39 -07:00
Michael Gottesman
b0449589a6 Merge pull request #60187 from gottesmm/moveonly_type_begin
[move-only] Implement very initial work for move only
2022-07-22 11:35:52 -07:00
nate-chandler
83d97819ad Merge pull request #60121 from nate-chandler/rdar94346482
[SILOpt] Handle reborrows of owned phis in CanonicalizeOSSALifetime.
2022-07-22 11:08:02 -07:00
Michael Gottesman
65c21b61bf [move-only] Begin implementing support for concrete move only types.
This is just the very beginning... I still need to implement more parts of
SILGen for this. But all great things start small. I am going to iterate on top
of this and just wanted to get some initial parts of the work in as I go.
2022-07-21 15:33:17 -07:00
Michael Gottesman
afd8accb75 [move-only] Add a move only request to lookup if a ValueDecl is a "move only type".
I also created a SILType::isMoveOnly() helper that returns true if a type is
a move only wrapped type or a first class move only type. The verifier check
that move only types aren't copied in canonical SIL was rewired to use that as well.
2022-07-21 15:33:17 -07:00
Egor Zhdan
0e2d438c5b [cxx-interop][SwiftCompilerSources] Use llvm::StringRef instead of BridgedStringRef
rdar://83361000
2022-07-21 16:32:16 +01:00
zoecarver
4021082a55 [wip][cxx-interop] Support for custom reference counting operations. 2022-07-21 10:25:57 -04:00
Erik Eckstein
3ae2889593 SIL: need to clear the bitfield ID when moving instructions between functions
I forgot to do this when introducing the `NodeBitfield`.

rdar://97095506
2022-07-21 14:35:14 +02:00
Michael Gottesman
7a43d246b0 Merge pull request #60047 from gottesmm/plus_zero_fix_noimplicitcopy
[no-implicit-copy] Use default param convention instead of forcing +1
2022-07-20 02:36:52 -07:00
Michael Gottesman
f1182a73da [no-implicit-copy] Remove auto +1 param signature change called by noimplicit copy in favor of following normal convention.
I also added a bunch of tests for both the trivial/non-trivial case as well as
some docs to SIL.rst.
2022-07-19 16:39:03 -07:00
Michael Gottesman
9b625588f0 [sil] Make copyable_to_moveonlywrapper forwarding like moveonlywrapper_to_copyable.
Specifically this means that rather than always being owned, we now have owned
and guaranteed versions of copyable_to_moveonlywrapper. Similar to
moveonlywrapper_to_copyable, one chooses which variant one gets by using
specific SILBuilder APIs:
create{Owned,Guaranteed}CopyableToMoveOnlyWrapperValueInst. It is still
forwarding and the rest of the forwarding APIs work as expected except that the
forwarding ownership is fixed (and an assertion will result if one attempts to
do so).

NOTE: It is assumed that trivial operands are always passed to the owned
variant.
2022-07-19 14:39:59 -07:00
Nate Chandler
8c44d36bc8 [SIL] Add utility to transitively visit operands.
The new utility looks through operands whose values are themselves
SILPhiArguments and visits those arguments' operands.
2022-07-18 16:22:13 -07:00
Alex Lorenz
ceb093df12 Merge pull request #59787 from Robertorosmaninho/cxx-interop/SwiftToCxxErrorHandling
[Interop] [SwiftToCxx] Using the hardcode noexcept flags on the compiler only to non throwing functions
2022-07-15 13:42:44 +01:00
swift-ci
f91b892f25 Merge pull request #60053 from ktoso/wip-sil-branch-names
[SILPrinter] print target branch debug names in SIL dumps
2022-07-15 04:36:50 -07:00
Konrad `ktoso` Malawski
b63770b414 also handle general successors 2022-07-15 18:30:02 +09:00
Roberto Rosmaninho
ff222acebc Setting hardcode SWIFT_NOEXCEPT and noexcept flags only to
non-throwing functions.
Activating swift-functions-errors tests
Inserting macros and additional parameters in C and C++ functions following the pattern to lowering to LLVM IR.
2022-07-14 12:34:53 -03:00
eeckstein
d128d81ea5 Merge pull request #60035 from eeckstein/silnode-set
SIL: add efficient Set data structures for SILValue and SILInstruction, similar to BasicBlockSet.
2022-07-14 10:56:21 +02:00
Konrad `ktoso` Malawski
e72eb0d108 [SILPrinter] print target branch debug names in SIL dumps 2022-07-14 17:34:08 +09:00
Pavel Yaskevich
5bd077a461 [SIL] Keep alive @_alwaysEmitIntoClient decls with opaque result types
If such declarations have availability conditions they have to be
kept alive until IRGen to emit opaque type descriptor that is going
be used at runtime to determine the underlying type.

This is important for "optimized" mode only because in non-optimized
mode "shared" symbol survives SILGen.
2022-07-13 15:46:23 -07:00
Michael Gottesman
ded34afb73 [no-implicit-copy] Remove rest of the unnecessary code from SILFunctionType.
Previously I thought that we would have @_noImplicitCopy change the
SILFunctionType (but not the AST level type). This caused other problems and was
unnecessary. So I removed all such changes in this commit. Specifically:

1. We no longer thread through no implicit copy in SILFunctionType.cpp.
2. noImplicitCopy no longer by default makes an argument an owned
argument. Instead we use the default convention and handle it appropriately.
2022-07-13 14:03:09 -07:00
Erik Eckstein
6760dc420c SIL: add a utility which can manage per-value and per-instruction bitfields and flags efficiently.
It's used to implement `InstructionSet` and `ValueSet`: sets of SILValues and SILInstructions.
Just like `BasicBlockSet` for basic blocks, the set is implemented by setting bits directly in SILNode.
This is super efficient because insertion and deletion to/from the set are basic bit operations.

The cost is an additional word in SILNode. But this is basically negligible: it just adds ~0.7% of memory used for SILInstructions.
In my experiments, I didn't see any relevant changes in memory consumption or compile time.
2022-07-13 14:27:50 +02:00
Erik Eckstein
64ba6fdf5d SIL: simplify the SILNode inline bitfields.
The use of the SWIFT_INLINE_BITFIELD macros in SILNode were a constant source of confusion and bugs.
With this refactoring I tried to simplify the definition of "shared fields" in SILNode, SILValue and SILInstruction classes:

* Move `kind`, `locationKindAndFlags` and the 32-bit fields out of the 64-bitfield into their own member variables. This avoids _a lot_ of manual bit position computations.
* Now we have two separate "shared fields": an 8-bit field (e.g. for boolean flags) and a 32-bit field (e.g. for indices, which can potentially get large). Both fields can be used independently. Also, they are not "bit fields" per se. Instructions can use the field e.g. as a `bool`, `uint32_t`, or  - if multiple flags are to be stored - as a packed bit field.
* With these two separate fields, we don't have the need for defining bitfields both in a base class _and_ in a derived value/instruction class. We can get rid of the complex logic which handles such cases. Just keep a check to catch accidental overlaps of fields in base and derived classes.
* Still use preprocessor macros for the implementation, but much simpler ones than before.
* Add documentation.
2022-07-11 17:27:29 +02:00
Nate Chandler
34c08b8344 [TaskToThread] Add Task.runInline.
The new intrinsic, exposed via static functions on Task<T, Never> and
Task<T, Error> (rethrowing), begins an asynchronous context within a
synchronous caller's context.  This is only available for use under the
task-to-thread concurrency model, and even then only under SPI.
2022-07-08 08:44:18 -07:00
Konrad `ktoso` Malawski
728c007fb9 [Distributed] Implement witnesses for sync or non-throw dist reqs
[Distributed] generic and inner test; without one edge case

[Distributed] fix distributed_thunk test; unsure about those extra hops, could remove later

[Distributed] Remove type pretending in getSILFunctionType; it is not needed

It seems our constant replacement in the earlier phases is enough, and
we don't need this trick at all.

[Distributed] Use thunk when calling cross-actor on DA protocols
2022-07-04 19:02:11 +09:00
Michael Gottesman
198b974622 Merge pull request #59859 from gottesmm/pr-276c4e4220a25490659a285e8b94a36bd28ffede
[no-implicit-copy] Rename SILMoveOnlyType -> SILMoveOnlyWrappedType.
2022-07-01 23:17:43 -07:00
Michael Gottesman
8f3fe63fed [no-implicit-copy] Rename SILMoveOnlyType -> SILMoveOnlyWrappedType.
Since I am beginning to prepare for adding real move only types to the language,
I am renaming everything that has to do with copyable types "move only wrapped"
values instead of move only. The hope is this reduces/prevents any confusion in
between the two.
2022-07-01 17:26:13 -07:00
Michael Gottesman
4f6cce7bb8 Merge pull request #59833 from gottesmm/pr-816f80a06afa9ee661f077ea89193ef1cce5ece6
[no-implicit-copy] A few small fixes.
2022-07-01 15:46:43 -07:00
Doug Gregor
bf9b4e3612 Merge pull request #59819 from jckarter/missing-sendable-conformance-in-subst-function-type
SIL: Allow missing Sendable conformances when building abstraction pattern for function type lowering.
2022-07-01 07:32:40 -07:00
Michael Gottesman
5adb94ca9f [no-implicit-copy] Remove the move only bit in type lowering for now.
We currently do not need it so I am removing it. We /do/ use move only as a
TypeLowering itself though. Just not as a property.
2022-06-30 22:22:27 -07:00
swift-ci
9aa2de4137 Merge pull request #41083 from kavon/inconvenienced-actors
[SE-327] Remove need for `convenience` for delegating initializers of an actor.
2022-06-30 14:56:32 -07:00
Joe Groff
8a4743a525 SIL: Allow missing Sendable conformances when building abstraction pattern for function type lowering.
Fixes rdar://95979338.
2022-06-30 13:51:26 -07:00
Kavon Farvardin
2e865c8098 prevent serialization of allocating inits for actors
A public designated initializer of a class would have its allocating
entry-point serialized in the module, meaning with `-O` that entry-point
can get inlined into programs linking against that module. Once that
entry-point is inlined, the program will _require_ that it remain non-delegating,
because it will depend on the 2nd entry-point (for actual initializing) to be in the
library.

As a result of this change, public initializers of an actor should be resilient in a
library, whether their underlying implementation is delegating or not.
2022-06-30 13:47:39 -07:00
Allan Shortlidge
2515f7a58d Frontend: Introduce the -enable-experimental-ad-hoc-availability flag.
When developing a module for an OS or SDK, one may use declarations from other modules that were recently introduced in the in-development OS. Those declarations will be annotated as available at the deployment target of the client module and yet the symbols for that declaration are not available in all development builds of that OS. If the module strongly links those symbols, it will crash on older development builds of the OS. The `-enable-experimental-ad-hoc-availability` flag is designed to give developers the option of weakly linking all symbols in other modules that were introduced at the deployment target.

This change introduces the basic change in linking behavior but does not address typechecking. Use of the declarations that are made unavailable in this mode will need to be diagnosed and developers will need a way to detect the unavailability at runtime before use.

Resolves rdar://96011550
2022-06-29 11:44:07 -07:00
Holly Borla
574f01ab19 [IRGen] Use existential AnyObject throughout IRGen. 2022-06-28 13:21:03 -07:00
Holly Borla
0053526c5d Merge pull request #41909 from hborla/existential-any-anyobject
[Sema] Use `ExistentialType` for `Any` and `AnyObject`.
2022-06-24 20:51:50 -07:00
Erik Eckstein
ca291fb147 SIL: store IRGenOptions in SILModule
SIL optimization passes can use the IRGen options to do target specific optimizations.
2022-06-23 22:16:42 +02:00
Adrian Prantl
7c1c7b6249 Emit debug locations for hop_to_executor instructions.
The function prologue of async funclets inherits its source location
from the hop_to_executor instruction. This makes it easier to produce
logical backtraces, since the PC in logical frames will always point
to the start if the function.

rdar://89776340
2022-06-23 09:40:25 -07:00
Adrian Prantl
37b8391ae9 Remove source location workaround for autoclosures.
This patch reverts a workaround that was put into pre-1.0 Swift to
avoid linetable entries for autoclosure functions. Nowadays
autoclosures aren't emitted in separate functions, which makes this
obsolete. The workaround also was no longer being tested by the test
suite.

rdar://89776340
2022-06-23 09:40:25 -07:00
Robert Widmann
ce4afc7e4d Recurse Into Existential Types With Generic Structure
Before the introduction of parameterized existential types, there
was no generic structure under these types. Now that there is, we'll
need to recurse into them to pick up any latent generic types
and lower them appropriately.

rdar://94320481
2022-06-18 12:36:50 -06:00
Holly Borla
429488f6c9 [Sema] Use ExistentialType for Any and AnyObject. 2022-06-17 18:29:15 -07:00
Doug Gregor
74503f00ff Use the distributed thunk for non-distributed protocol requirements (#59513)
When a distributed-actor-isolated witness is provided for a
non-distributed-actor-isolated requirement, always hop to the
distributed thunk.

While here, mark distributed thunks as being `final`, to ensure that
we always statically call them vs. trying to retrieve them from the
vtable (since they aren't in the vtable).
2022-06-17 11:13:59 +09:00
Michael Gottesman
72523cf9d0 [move-only] Fix a few bugs around MoveOnlyWrapperToCopyableValue.
The main fixes are:

1. MoveOnlyWrapperToCopyableValue needed to be marked as a
   FirstArgOwnershipForwardingSingleValueInst instead of just as being an
   Ownership mixin. I discovered that in certain cases I was treating it that
   way (in the isa check for FirstArgOwnershipForwardingSingleValueInst), but we
   were inconsistent. Now we are consistent.

2. MoveOnlyWrapperToCopyableValue is always specified as being initialized as
   owned or guaranteed. What is key to understand though is that the
   owned/guaranteed property here is more a semantic property around whether the
   lifetime of the move only value is ending or if we are allowing it to escape
   as an moveonlywrapped unwrapped guaranteed parameter to a function. The main
   implication of this is that we can not just use the actual ownership kind to
   determine the type of moveonlywrapper_to_copyable we are using. This is b/c
   after ownership lowering, the resulting ownership kind will be none, meaning
   the instruction will be in an invalid state. Thus the need to represent this
   as a separate bit in the instruction. It may make sense to rename the forms
   of this instruction to be `[lifetime end]` and `[guaranteed function arg]`
   that way it is semantically clear. But I am going to do that change at
   another time.
2022-06-15 14:15:21 -07:00
Michael Gottesman
8216a2a816 [move-only] Rename AbstractionPattern move only wrapper add/remove methods to match SILType's
Just forgot to change these when I changed the name of the SILType methods. In
summary:

1. withoutMoveOnly -> removingMoveOnlyWrapper
2. withMoveOnly -> addingMoveOnlyWrapper
2022-06-15 14:15:21 -07:00
Michael Gottesman
6cdfc29c03 [typelowering] Use the RawASTType when looking up TypeLowerings.
This ensures that trivial moveonlywrapped values are not treated as trivial thus
enabling us to track ownership for them.
2022-06-15 14:15:21 -07:00
Zoe Carver
dfb2348ab2 Merge pull request #59373 from zoecarver/nfc-operator-cleanup 2022-06-10 18:31:57 -07:00
zoecarver
65263ab0ee [nfc] Remove dead operator code pt. 2 2022-06-10 13:37:21 -07:00