Commit Graph

3719 Commits

Author SHA1 Message Date
swift-ci
decf2b1130 Merge remote-tracking branch 'origin/master' into master-next 2018-07-05 11:49:26 -07:00
John McCall
34b0cbc11d Merge pull request #16237 from davezarzycki/metaprogram_ref_storage_types
[AST] NFC: Enable reference storage type meta-programming
2018-07-05 14:45:38 -04:00
swift-ci
3fb013d317 Merge remote-tracking branch 'origin/master' into master-next 2018-07-03 16:28:59 -07:00
Christopher Rogers
dff1d8983d Fix typos/grammar in comments & docs 2018-07-03 14:31:36 +09:00
David Zarzycki
476d869e55 [SIL] NFC: Adopt reference storage type meta-programming macros 2018-06-30 06:44:33 -04:00
swift-ci
b739b4a189 Merge remote-tracking branch 'origin/master' into master-next 2018-06-29 18:09:14 -07:00
Andrew Trick
4353e27db2 Exclusivity access marker verification. Handle Unsafe access.
Now that SILGen change adds Unsafe access markers to addressors and
materializeForSet, we can use that as a sentinel to enable strict
verification everywhere.
2018-06-28 23:25:07 -07:00
swift-ci
e25df4000d Merge remote-tracking branch 'origin/master' into master-next 2018-06-28 09:09:28 -07:00
swift-ci
bf22d4cefd Merge pull request #17578 from Dante-Broggi/patch-5 2018-06-28 08:53:52 -07:00
Bob Wilson
cf76e7b4b6 Merge remote-tracking branch 'origin/master' into master-next 2018-06-27 23:49:07 -07:00
Andrew Trick
8d41d6ef5f Enable strict verification of begin_access patterns in all SIL passes. (#17534)
* Teach findAccessedStorage about global addressors.

AccessedStorage now properly represents access to global variables, even if they
haven't been fully optimized down to global_addr instructions.

This is essential for optimizing dynamic exclusivity checks. As a
verified SIL property, all access to globals and class properties
needs to be identifiable.

* Add stronger SILVerifier support for formal access.

Ensure that all formal access follows recognizable patterns
at all points in the SIL pipeline.

This is important to run acccess enforcement optimization late in the pipeline.
2018-06-27 23:40:52 -07:00
Dante Broggi
56ed0804a3 Fix parameter name in comment 2018-06-27 20:31:55 -04:00
swift-ci
db8853edd9 Merge remote-tracking branch 'origin/master' into master-next 2018-06-26 20:10:08 -07:00
swift-ci
33e547ce2a Merge pull request #17540 from adrian-prantl/scopelocs 2018-06-26 20:01:29 -07:00
swift-ci
5e49ce352a Merge remote-tracking branch 'origin/master' into master-next 2018-06-26 19:50:13 -07:00
Andrew Trick
9d4b4c755c Rewrite SILCombiner::propagateConcreteTypeOfInitExistential. (#17315)
Fixes <rdar://40555427> [SR-7773]:
SILCombiner::propagateConcreteTypeOfInitExistential fails to full propagate type
substitutions.

Fixes <rdar://problem/40923849>
SILCombiner::propagateConcreteTypeOfInitExistential crashes on protocol
compositions.

This rewrite fixes several fundamental bugs in the SILCombiner optimization that
propagates concrete types. In particular, the pass needs to handle:

- Arguments of callee Self type in non-self position.
- Indirect and direct return values of Self type.
- Types that indirectly depend on Self within callee function signature.
- Protocol composition existentials.
- All of the above need to work for protocol extensions as well as witness methods.
- For protocol extensions, conformance lookup should be based on the existential's conformance list.

Additionally, the optimization should not depend on a SILFunction's DeclContext,
which is not serialized. (In fact, we should prevent SIL passes from using
DeclContext). Furthermore, the code needs to be expressed in a way that one can
reason about correctness and invariants.

The root cause of these bugs is that SIL passes are written based on untested
assumptions of Swift type system. A SIL pass needs to handle all verifiable SIL
input because passes need to be composable. Bail-out logic can be added to
simplify the design; however, _the bail-out logic itself cannot make any
assumptions about the language or type system_ that aren't clearly and
explicitly enforced in the SIL verifier. This is a common mistake and major
source of bugs.

I created as many unit tests as I reasonably could to prevent this code from
regressing. Creating enough unit tests to cover all corner cases that were
broken in the original code would be intractable. But the code has been
simplified such that many corner cases disappear.

This opens up some oportunity for generalizing the optimization and eliminating
special cases. However, I want this PR to be limited to fixing correctness
issues only. In the long term, it would be preferable to replace this
optimization entirely with a much more powerful general type propagation pass.
2018-06-26 19:33:31 -07:00
Adrian Prantl
60c71c9b33 Point the SILLocations of function-level SILDebugScopes to the beginning of the scope.
This mostly makes textual SIL easier to read and has no effect on the generated DWARF.

<rdar://problem/28859432>
2018-06-26 18:07:04 -07:00
swift-ci
0111c9498a Merge remote-tracking branch 'origin/master' into master-next 2018-06-26 14:29:38 -07:00
Graydon Hoare
3b1ba34eec Merge remote-tracking branch 'origin/master' into master-next 2018-06-26 14:09:57 -07:00
Andrew Trick
025af31572 [NFC] SILGlobalVariable utilities. (#16870)
* SILModule::isVisibleExternally utility for VarDecls.

* Fix the SIL parser so it doesn't drop global variable decls.

This information was getting lost in SIL printing/parsing.
Some passes rely on it. Regardless of whether passes should rely on it,
it is totally unacceptable for the SIL passes to have subtle differences
in behavior depending on the frontend mode. So, if we don't want passes
to rely on global variable decls, that needs to be enforced by the API
independent of how the frontend is invoked or how SIL is serialized.

* Use custom DemangleOptions to lookup global variable identifiers.

* SILGlobalVariable utilities.

Move the utilities that are required for recognizing SILGlobalVariable access
into SILGlobalVariable.[h|cpp].

Structural SIL properties that are assumed by the optimizer, and thus required
for SIL verification, should never be embedded in SILOptimizer passes, or even
in SILOptimizer/Utils. Structural SIL properties need to be defined in
/SIL. They are as much part of the SIL language as the opcode list.

These particular utilities are required for working with SILGlobalVariables, and
will be used by a whole-module access enforcement optimization.

The primary API for recognizing SIL globals is `getVariableOfGlobalInit`. It is
required to find the association between the addressor SILFunction marked
[global_init], and the SILGlobalVariable being addressed.

Other helper APIs expose more details about the addressor's SIL patterns and are
useful for transforming the initializer itself into an optimized form.
2018-06-26 13:26:30 -07:00
Andrew Trick
7c4d15f96a SILModule::isVisibleExternally utility for VarDecls. (#16834)
* SILModule::isVisibleExternally utility for VarDecls.

* Fix the SIL parser so it doesn't drop global variable decls.

This information was getting lost in SIL printing/parsing.
Some passes rely on it. Regardless of whether passes should rely on it,
it is totally unacceptable for the SIL passes to have subtle differences
in behavior depending on the frontend mode. So, if we don't want passes
to rely on global variable decls, that needs to be enforced by the API
independent of how the frontend is invoked or how SIL is serialized.

* Use custom DemangleOptions to lookup global variable identifiers.
2018-06-26 12:27:26 -07:00
swift-ci
adcaa7eafc Merge remote-tracking branch 'origin/master' into master-next 2018-06-26 06:09:27 -07:00
Huon Wilson
ed64fadb28 [SIL]/[SILOpt] Thunks and specializations shouldn't be connected to their parent class.
The "subclass scope" is meant to represent a connection to a vtable (and how
public something needs to be), for things that end up in class
vtables. Specializations and thunks are mostly internal implementation details
and do not end up there, so subclass scope is not applicable to them. This stops
the thunks and specializations being incorrectly public.

(Note, there are some thunks that _are_ public facing: if a function has its
signature optimized, the original entry point becomes a thunk, and this entry
point is what ends up in vtables etc., so needs to remain around, which means
keeping the same hacks for `private` members of an `open` class.)

Fixes rdar://problem/40738913.
2018-06-26 16:25:42 +10:00
Huon Wilson
413501b34a [SIL] Separate thunks from signature optimization from other thunks.
Signature optimization is slightly different to (most) other thunks, in that
it's taking an existing function and turning that into a thunk, rather than
creating a thunk that calls an existing function. These symbols can be public,
etc. and so need to be handled a bit different to other types of thunks.
2018-06-26 14:53:58 +10:00
Bob Wilson
44712233c3 Merge remote-tracking branch 'origin/master' into master-next 2018-06-21 23:36:03 -07:00
Joe Groff
3e4e00c163 SILGen: Emit "trivial" property descriptors for properties that withhold no information about their implementation.
Client code can make a best effort at emitting a key path referencing a property with its publicly exposed API, which in the common case will match what the defining module would produce as the canonical key path component representation of the declaration. We can reduce the code size impact of these descriptors by not emitting them when there's no hidden or possibly-resiliently-changed-in-the-past information about a storage declaration, having the property descriptor symbol reference a sentinel value telling client key paths to use their definition of the key path component.
2018-06-21 15:18:24 -07:00
swift-ci
753753bf0c Merge remote-tracking branch 'origin/master' into master-next 2018-06-13 14:08:57 -07:00
Michael Gottesman
76d36f302c Remove FIXME that I already fixed in e02266d4fa. 2018-06-13 13:14:15 -07:00
Bob Wilson
796122fa45 Merge remote-tracking branch 'origin/master' into master-next 2018-06-12 15:06:47 -07:00
David Zarzycki
25249e63a4 Merge pull request #16869 from davezarzycki/cache_bb_during_SILSuccessor_iteration
[SIL] Perf: Cache basic block during SILSuccessor iteration
2018-06-12 15:56:48 -04:00
Michael Gottesman
e02266d4fa [func-sig-opts][projection] All projection trees during the run on a function should share the same bump ptr allocator.
Found while reading code.
2018-06-11 20:51:26 -07:00
Bob Wilson
3ff7bff8b7 Merge remote-tracking branch 'origin/master' into master-next 2018-06-11 10:12:59 -07:00
Devin Coughlin
c50ca98ac6 [SIL] Factor out logic for detecting sanitizer instrumentation. NFC.
Factor out common logic for detecting sanitizer instrumentation and put it in
SIL/InstructionUtils.
2018-06-10 16:44:19 -07:00
swift-ci
9b93fd1d46 Merge remote-tracking branch 'origin/master' into master-next 2018-06-06 19:09:43 -07:00
Andrew Trick
2689f405b2 Merge pull request #16998 from atrick/silbuilder-context
[NFC] Add SILBuilderContext.
2018-06-06 19:01:30 -07:00
swift-ci
b87ea23124 Merge remote-tracking branch 'origin/master' into master-next 2018-06-06 17:29:44 -07:00
Andrew Trick
df94dffab7 [NFC] Add SILBuilderContext.
In an upcoming bug fix, I want to pass SILBuilderContext to a
utility. I could continue reusing SILBuilder, even though the utility
must set its own insertion point and debug location. However, this is
terrible practice that I don't want to perpetuate.

The lifetime of a SILBuilder should correspond to a single insertion
point and debug location. That's the only sane way to preserve debug
information in SIL passes.

There are various pieces of contextual state that we've been adding to
the SILBuilder. Those have made it impossible to use SILBuilder
correctly. I'm pulling the context out, so clients can begin using
better practices. In the future, we can make SILBuilderContext
polymorphic, so passes can extend it easily with arbitrary
callbacks. We can also make it self-contained so we don't need to pass
around pointers to an InsertedInst list anymore.
2018-06-06 14:45:45 -07:00
Erik Little
863f3a19ff Rename @effects to @_effects
@effects is too low a level, and not meant for general usage outside
the standard library. Therefore it deserves to be underscored like
other such attributes.
2018-06-06 12:53:03 -04:00
Jordan Rose
73ee008bfd Merge remote-tracking branch 'origin/master' into master-next 2018-05-29 11:18:44 -07:00
David Zarzycki
52fd7cb2c9 [SIL] Perf: Cache basic block during SILSuccessor iteration
'operator*' in this patch becomes a hot spot in some scenarios. For
example: an enum with an unusually large number of cases.
2018-05-29 09:44:07 -04:00
Slava Pestov
d8fc9decf9 AST: Remove GenericSignature::getSubstitutionMap() 2018-05-28 19:45:28 -07:00
swift-ci
141f04e2e2 Merge remote-tracking branch 'origin/master' into master-next 2018-05-25 17:09:00 -07:00
Davide Italiano
216c382213 [SILLocation] Mark this function as LLVM_NODISCARD to prevent misuses. 2018-05-25 16:34:07 -07:00
swift-ci
2ee4fa9e73 Merge remote-tracking branch 'origin/master' into master-next 2018-05-24 10:29:06 -07:00
Andrew Trick
e29c2089a4 Rework AccessStorageAnalysis design. 2018-05-23 09:23:39 -07:00
swift-ci
9d02f94670 Merge remote-tracking branch 'origin/master' into master-next 2018-05-22 10:49:24 -07:00
swift-ci
b5180dc9d4 Merge pull request #16769 from gottesmm/pr-93220bb1c692fb12516036d4a8cb961c81dc62ae 2018-05-22 10:37:40 -07:00
swift-ci
1b30e9f16b Merge remote-tracking branch 'origin/master' into master-next 2018-05-22 10:29:29 -07:00
Michael Gottesman
590857dc01 [projection] Add a small note that we should eliminate the allocator from ProjectionTree. 2018-05-22 09:23:02 -07:00
Michael Gottesman
e8af11d61b [gardening] Rename ProjectionTree::getLeafTypes() => getLiveLeafTypes().
This is a more appropriate name. Otherwise, a reader could think that it returns
/all/ leaf types including dead leaf types.
2018-05-22 09:16:27 -07:00