Commit Graph

1549 Commits

Author SHA1 Message Date
swift-ci
1d3d03260a Merge remote-tracking branch 'origin/main' into rebranch 2022-01-17 16:54:06 -08:00
Zoe Carver
be39f38ed0 Merge pull request #40867 from zoecarver/interop-fix-linker-errors
[cxx-interop] Fix linker errors when using std-vector.
2022-01-17 16:38:17 -08:00
zoecarver
ba44bfecce [cxx-interop] Add -lc++ when C++ interop is enabled on Darwin. 2022-01-17 12:11:06 -08:00
swift-ci
ff423884c7 Merge remote-tracking branch 'origin/main' into rebranch 2022-01-13 14:53:35 -08:00
Arnold Schwaighofer
3e077e7d67 IRGen: Use the 'right' async context index in the dynamic replacement prolog
The right index is the index derived for calling a function
(Signature::forAsyncEntry) rather then for receiving the results
(Signature::forAsyncAwait(); the resume fn signature).

rdar://86863272
2022-01-12 15:09:21 -08:00
swift-ci
f63372b795 Merge remote-tracking branch 'origin/main' into rebranch 2022-01-06 01:13:44 -08:00
Pavel Yaskevich
1c9bcc9092 Merge pull request #40699 from xedin/rename-dist-accessor-apis
[Distributed] NFC: Remove `Method` from accessor APIs
2022-01-06 01:03:45 -08:00
swift-ci
574959ebcb Merge remote-tracking branch 'origin/main' into rebranch 2022-01-04 19:34:06 -08:00
Kuba (Brecka) Mracek
243141e8b5 [IRGen] When emitting llvm.used.conditional list, strip all pointer casts in dependencies (#40678) 2022-01-04 19:32:45 -08:00
Pavel Yaskevich
d516281da9 [Distributed] NFC: Remove Method from accessor APIs
The API is not constrained to methods only, it should support
computed properties as well.
2021-12-23 14:10:05 -08:00
swift-ci
134e17c8ec Merge remote-tracking branch 'origin/main' into rebranch 2021-12-17 16:54:09 -08:00
Pavel Yaskevich
7ac42e11b6 [Distributed] IRGen: Store async function pointer to distributed accessor
Direct pointer to the accessor cannot be called at runtime,
so here is how everything is stored:

- For `distributed` and `async` functions -> async function pointer;
- For regular functions -> function pointer.
2021-12-17 10:52:56 -08:00
Pavel Yaskevich
be08a8ba8c [Distributed] IRGen: Pluralize the name of accessible functions section 2021-12-17 10:52:56 -08:00
Pavel Yaskevich
a83101787d [IRGen] Implement accessible function section/record emission
Uses a dedicated section in the binary to emit records about
functions that can be looked up by name at the runtime, and
then called through a fully-abstracted entry point whose
arguments can be constructed in code.
2021-12-17 10:52:56 -08:00
swift-ci
be79aeb3bc Merge remote-tracking branch 'origin/main' into rebranch 2021-12-14 09:34:56 -08:00
Kuba (Brecka) Mracek
f043a48a3d Merge pull request #34400 from apple/thinlto-fixes
Add an end-to-end test for ThinLTO (-lto=llvm-thin flag), fix compiler crashes
2021-12-14 09:24:31 -08:00
Kuba Mracek
4271edde6b Add an end-to-end test for ThinLTO (-lto=llvm-thin flag), fix compiler crashes, fix tests 2021-12-13 16:59:32 -08:00
swift-ci
103ce0b560 Merge remote-tracking branch 'origin/main' into rebranch 2021-12-08 11:38:04 -08:00
zoecarver
fc3b3a1d71 [cxx-interop] Implement foreign reference types.
This is an expiremental feature to allow an attribute, `import_as_ref`, to import a C++ record as a non-reference-counted reference type in Swift.
2021-12-08 15:35:18 +00:00
Ben Barham
30be5117d2 [rebranch][IRGen] Update uses of AttributeList functions
The functions in llvm-project `AttributeList` have been
renamed/refactored to help remove uses of `AttributeList::*Index`.

Update to use these new functions where possible. There's one use of
`AttrIndex` remaining as `replaceAttributeTypeAtIndex` still takes the
index and there is no `param` equivalent. We could add one locally, but
presumably that will be added eventually.
2021-11-13 17:04:29 +10:00
Joe Groff
5c404acbde SIL: More robust substituted function type lowering.
This change separates out the formation of the generic signature and
substitutions for a SIL substituted function type as a pre-pass
before doing the actual function type lowering. The only input we
really need to form this signature is the original abstraction pattern
that a type is being lowered against, and pre-computing it should make
the code less side-effecty and confusing. It also allows us to handle
generic nominal types in a more robust way; we transfer over all of
the nominal type requirements to the generalized generic signature,
then when recursively visiting the bindings, we same-type-constrain
the generic parameters used in those requirements to the newly-generalized
generic arguments. This ensures that the minimized signature preserves
any non-trivial requirements imposed by the nominal type, such as
conditional conformances on its type arguments, same-type constraints
among associated types, etc.

This approach does lead to less-than-optimal generalized generic
signatures getting generated, since nominal type generic arguments
get same-type-bound either to other generic arguments or fixed to
concrete types almost always. It would be useful to do a minimization
pass on the final generic signature to eliminate these unnecessary
generic arguments, but that can be done in a follow-up PR.
2021-11-10 12:45:34 -08:00
Erik Eckstein
c578c937c8 SILOptimizer: run the GlobalOpt pass in the mandatory pipeline.
Replace the dynamic initialization of trivial globals with statically initialized globals, even in -Onone.
This is required to be able to use global variables in performance-annotated functions.
Also, it's a small performance improvement for -Onone.
2021-10-29 22:35:57 +02:00
Kuba (Brecka) Mracek
b3f7c8d8b1 Make VFE / WME / conditional records work even with ObjC interop and with reflection metadata, take #2 (#39878) 2021-10-24 07:20:38 -07:00
Kuba Mracek
0616293353 Revert "Make VFE / WME / conditional records work even with ObjC interop and with reflection metadata (#39808)"
This reverts commit a51dc7e358.
2021-10-22 09:38:39 -07:00
Kuba (Brecka) Mracek
a51dc7e358 Make VFE / WME / conditional records work even with ObjC interop and with reflection metadata (#39808) 2021-10-20 10:13:50 -07:00
Ben Barham
624337148b [NFC] Formatting cleanup to help with next conflicts 2021-10-15 17:15:51 +10:00
Kuba (Brecka) Mracek
cf5fee0a89 Adjust emitted IR on !llvm.used.conditional to match LLVM expectations (#39715) 2021-10-13 11:37:52 -07:00
Mishal Shah
c2fd49cebb Merge pull request #39473 from apple/rebranch
Update swift:main to support llvm-project:stable/20210726 changes (Rebranch merge)
2021-10-11 09:00:51 -07:00
Erik Eckstein
30a74f6284 SIL: remove the private_external SILLinkage
This was a relict from the -sil-serialize-all days. This linkage doesn't make any sense because a private function cannot be referenced from another module (or file, in case of non-wmo compilation).
2021-10-10 19:52:40 +02:00
swift-ci
3f8fea8508 Merge remote-tracking branch 'origin/main' into rebranch 2021-10-06 10:17:29 -07:00
Doug Gregor
305752e724 Simplify @objc actor back-deploy IR and switch to objc_getRequiredClass.
`objc_getRequiredClass` will produce a fatal error if the class isn't
found, which will prevent a malformed program using back-deployed @objc
actor from launching. Also eliminate the spurious `objc_opt_self`
call, which is unneeded given that we're realizing the metadata.

Thanks to Mike Ash for the review.
2021-10-06 08:47:04 -07:00
Doug Gregor
2551a04621 Back-deploy @objc actor types.
@objc actors implicitly inherit from the new, hidden
`SwiftNativeNSObject` class that inherits from `NSObject` yet provides
Swift-native reference counting, which is important for the actor
runtime's handling of zombies. However, `SwiftNativeNSObject` is only
available in the Swift runtime in newer OS versions (e.g., macOS
12.0/iOS 15.0), and is available in the back-deployed _Concurrency
library, but there is no stable place to link against for
back-deployed code. Tricky, tricky.

When back-deploying @objc actors, record `NSObject` as the superclass
in the metadata in the binary, because we cannot reference
`SwiftNativeNSObject`. Then, emit a static initializer to
dynamically look up `SwiftNativeNSObject` by name (which will find it
in either the back-deployment library, on older systems, or in the
runtime for newer systems), then swizzle that in as the superclass of
the @objc actor.

Fixes rdar://83919973.
2021-10-05 23:04:57 -07:00
Kuba Mracek
2dfd232d90 Implement conditional stripping of type descriptors, protocols and protocol conformances via !llvm.used.conditional
A new LLVM IR affordance that allows expressing conditions under which globals
can be removed/dropped (even when marked with @llvm.used) is being discussed at:

- <https://reviews.llvm.org/D104496>
- <https://lists.llvm.org/pipermail/llvm-dev/2021-September/152656.html>

This is a preliminary implementation that marks runtime lookup records (namely
protocol records, type descriptors records and protocol conformance records)
with the !llvm.used.conditional descriptors. That allows link-time / LTO-time
removal of these records (by GlobalDCE) based on whether they're actually used
within the linkage unit. Effectively, this allows libraries that have a limited
and known set of clients, to be optimized against the client at LTO time, and
significantly reduce the code size of that library.

Parts of the implementation:
- New -conditional-runtime-records frontend flag to enable using !llvm.used.conditional
- IRGen code that emits these records can now emit these either as a single contiguous
  array (asContiguousArray = true, the old way), which is used for JIT mode, or
  as indivial globals (asContiguousArray = false), which is necessary for the
  !llvm.used.conditional stripping to work.
- When records are emitted as individual globals, they have new names of
  "\01l_protocol_" + mangled name of the protocol descriptor, and similarly for
  other records.
- Fixed existing tests to account for individual records instead of a single array
- Added an IR level test, and an end-to-end execution test to demonstrate that
  the !llvm.used.conditional-based stripping actually works.
2021-09-29 13:15:02 -07:00
swift-ci
8d9ef3f736 Merge remote-tracking branch 'origin/main' into rebranch 2021-09-21 12:34:58 -07:00
Kuba (Brecka) Mracek
9fb54e95ae Add -internalize-at-link flag to allow dead stripping and VFE across modules at link time (#39214)
- Under -internalize-at-link, stop unconditionally marking all globals as used.
- Under -internalize-at-link, restrict visibility of vtables to linkage unit.
- Emit virtual method thunks for cross-module vcalls when VFE is enabled.
- Use thunks for vcalls across modules when VFE is enabled.
- Adjust TBDGen to account for virtual method thunks when VFE is enabled.
- Add an end-to-end test case for cross-module VFE.
2021-09-21 12:26:52 -07:00
adrian-prantl
fcc77a67df Merge pull request #39032 from adrian-prantl/79462915-5.5
Disable resilience for modules imported by the MemoryBuffer loader.
2021-09-20 16:45:19 -07:00
swift-ci
e3e39cd859 Merge remote-tracking branch 'origin/main' into rebranch 2021-09-16 19:34:29 -07:00
Kuba (Brecka) Mracek
38df7b1fad Stop using 'no_dead_strip' Mach-O section attribute on __swift5_protos, __swift5_proto, __swift5_types sections (#39312)
This is needed to for a future change, <https://github.com/apple/swift/pull/39313>, which will start to allow
under certain conditions to dead-strip unused types, protocols and conformances.
2021-09-16 19:26:46 -07:00
swift-ci
1d5a202148 Merge remote-tracking branch 'origin/main' into rebranch 2021-09-14 07:14:26 -07:00
Kuba (Brecka) Mracek
5412ed1936 Implement LLVM IR Virtual Function Elimination for Swift classes. (#39128)
- Virtual calls are done via a @llvm.type.checked.load instrinsic call with a type identifier
- Type identifier of a vfunc is the base method's mangling
- Type descriptors and class metadata get !type markers that list offsets and type identifiers of all vfuncs
- The -enable-llvm-vfe frontend flag enables VFE
- Two added tests verify the behavior on IR and by executing a program
2021-09-14 06:59:07 -07:00
Arnold Schwaighofer
2bbea54dc0 IRGen: Use llvm.compiler.used instead of llvm.used on ELF
As of "ELF: Create unique SHF_GNU_RETAIN sections for llvm.used global
objects" (https://reviews.llvm.org/D97448) LLVM will create separate
sections for symbols marked as llvm.used. Use llvm.compiler.used
instead.

rdar://82681143
2021-09-03 09:13:48 -07:00
Adrian Prantl
e754f5a6c4 Disable resilience for modules imported by the MemoryBuffer loader.
The MemoryBuffer loader is used by LLDB during debugging to import binary Swift
modules from .swift_ast sections. Modules imported from .swift_ast sections are
never produced from textual interfaces. By disabling resilience the expression
evaluator in the debugger can directly access private members.

rdar://79462915
2021-08-30 17:45:55 -07:00
swift-ci
aa5595e132 Merge remote-tracking branch 'origin/main' into rebranch 2021-08-28 22:53:46 -07:00
Doug Gregor
9d4ce58ed6 Merge pull request #38930 from DougGregor/concurrency-compatibility-library
[concurrency] Implement a compatibility .a library for Concurrency.
2021-08-28 22:40:37 -07:00
swift-ci
627da3ca57 Merge remote-tracking branch 'origin/main' into rebranch 2021-08-23 18:53:36 -07:00
Kuba (Brecka) Mracek
382f04ac79 Do not set alignment and don't set disableAddressSanitizer on @llvm.used and @llvm.compiler.used (#34970)
* Do not set alignment and don't set disableAddressSanitizer on @llvm.used and @llvm.compiler.used

* Update tests
2021-08-23 18:34:27 -07:00
Michael Gottesman
1bc94bfa6a [concurrency] Implement a compatibility .a library for Concurrency.
In a back deployment scenario, this will provide a place where one could provide
function implementations that are not available in the relevant stdlib.

This is just setting up for future work and isn't doing anything interesting
beyond wiring it up/making sure that it is wired up correctly with tests.
2021-08-18 09:35:37 -07:00
Arnold Schwaighofer
f1d68507f8 IRGen: Add type to gep instructions 2021-08-05 12:15:23 -07:00
Mishal Shah
3722bcb85a Revert "[concurrency] Implement a compatibility .a library for Concurrency." 2021-07-29 11:26:51 -07:00
Michael Gottesman
8441871a04 [concurrency] Implement a compatibility .a library for Concurrency.
In a back deployment scenario, this will provide a place where one could provide
function implementations that are not available in the relevant stdlib.

This is just setting up for future work and isn't doing anything interesting
beyond wiring it up/making sure that it is wired up correctly with tests.
2021-07-23 17:30:18 -07:00