Commit Graph

12606 Commits

Author SHA1 Message Date
Arnold Schwaighofer
02589267fd Add an option to enable a copy-on-write existential implementation 2017-03-09 17:22:34 -08:00
Huon Wilson
54f247693c [AST]/[Parse] parse where clauses on protocol declarations. 2017-03-09 16:08:16 -08:00
Jordan Rose
f068ddf1e3 Default DeclAttributes::getAttributes to skipping invalid attributes.
This matches the singular 'getAttribute', and all three current users
of this API were passing 'false' here anyway. No functionality change.
2017-03-09 14:10:25 -08:00
Erik Eckstein
5e80555c9b demangler: put the demangler into a separate library
Previously it was part of swiftBasic.

The demangler library does not depend on llvm (except some header-only utilities like StringRef). Putting it into its own library makes sure that no llvm stuff will be linked into clients which use the demangler library.

This change also contains other refactoring, like moving demangler code into different files. This makes it easier to remove the old demangler from the runtime library when we switch to the new symbol mangling.

Also in this commit: remove some unused API functions from the demangler Context.

fixes rdar://problem/30503344
2017-03-09 13:42:43 -08:00
Brian King
29c1fc472b Generate an error message on protocol extensions with the final attribute. 2017-03-09 14:18:39 -05:00
Arnold Schwaighofer
0169250264 Merge pull request #7997 from aschwaighofer/unsafe_guaranteed_class_method
UnsafeGuaranteedPeephole should handle virtual_method calls
2017-03-09 11:05:12 -08:00
Hugh Bellamy
78d51559dd Merge pull request #7765 from hughbe/runtime-asm
Cleanup uses of __asm__ in the runtime
2017-03-10 01:04:28 +07:00
Arnold Schwaighofer
44e89fb595 UnsafeGuaranteedPeephole should handle virtual_method calls
Make the peephole stronger to handle retain(self), apply(self), release(self)
pairs inbetween unsafeGuaranteed pairs.

rdar://30948468
2017-03-09 09:28:35 -08:00
Joe Groff
99ea154151 Merge pull request #7965 from jckarter/invariant-load
Add a `loadInvariant` builtin.
2017-03-09 06:39:42 -08:00
Joe Groff
39ecc53a25 Add a loadInvariant builtin.
Lowers to an invariant load in LLVM; probably useful for SIL too at some point too, but NFC at that level yet.
2017-03-08 21:02:03 -08:00
Doug Gregor
1f8b0f9b85 Canonicalize conformance access paths for sources pre-requirement-signature.
When a requirement source involving a ProtocolRequirement element is
built prior to the requirement signature of the protocol it
references, we can end up with a requirement source whose steps don't
reflect was is actually available via the requirement signatures. When
building a conformance access path from such requirement sources,
canonicalize on-the-fly using the requirement signatures (which have
been/can be computed by this point) to produce a correct access path.
2017-03-08 16:14:55 -08:00
Slava Pestov
e62c238bc9 AST: Remove unused overload of GenericSignature::getSubstitutions() 2017-03-08 13:54:31 -08:00
Slava Pestov
2777c9b478 AST: Remove TypeBase::gatherAllSubstitutions() 2017-03-08 13:54:31 -08:00
Slava Pestov
3d4503a99c AST: Add optional GenericEnvironment parameter to TypeBase::getContextSubstitutionMap()
If a generic type appears in a generic function, the old
gatherAllSubstitutions() method would map outer generic
parameters to archetypes.

However, getContextSubstitutionMap() did not map them to
anything.

I'm trying to unify these methods, so add an optional
GenericEnvironment to getContextSubstitutionMap() to support
the cases where they're needed.

Of course types in generic functions are not supported right
now, but not preserving this subtle behavioral difference
makes some crashers regress.
2017-03-08 13:54:30 -08:00
Slava Pestov
df81e51f36 AST: Add TypeBase::getRootGenericParam() utility method 2017-03-08 13:54:29 -08:00
Slava Pestov
64400c267a SIL: Remove WitnessMethodInst::getSelfSubstitution() 2017-03-08 13:54:29 -08:00
Slava Pestov
5465c8ca8f SIL: Remove most usages of TypeBase::gatherAllSubstitutions() 2017-03-08 13:54:28 -08:00
Slava Pestov
5381921131 AST: Generalize SubstitutionMap::combineSubstitutionMaps() 2017-03-08 13:54:28 -08:00
Xi Ge
b5256f53b2 Sema: introduce a language option flag, DiagnosticsEditorMode. (#7982)
SourceKit always sets it positively. This may lead to more aggressive fixits however
less informative messages. We currently use the flag only for filling protocol stubs.
2017-03-08 12:46:02 -08:00
Hugh Bellamy
4d45092c34 Cleanup uses of __asm__ in the runtime 2017-03-08 17:32:44 +07:00
Roman Levenstein
be5e01af31 [function-signature-opt] Allow FSO on witness_methods when performing the dead argument signature optimization for partial_apply instructions
This improves performance of some benchmarks, which pass static operators like `Int.<` as closure arguments.

Fixes rdar://23428804
2017-03-07 19:58:49 -08:00
Joe Shajrawi
9a29edfe9e Merge pull request #7972 from shajrawi/rename_opaque_br
Rename unconditional_checked_cast_opaque to unconditional_checked_cast_value
2017-03-07 19:50:27 -08:00
Joe Shajrawi
33b0cf653f Rename unconditional_checked_cast_opaque to unconditional_checked_cast_value 2017-03-07 18:53:52 -08:00
Slava Pestov
de2f5f78ac AST: Remove Substitution::subst()
I want to get rid of Substitution entirely, and now we have
the right abstractions to do everything with SubstitutionMap.
2017-03-07 16:04:54 -08:00
Slava Pestov
4c075ba0ad SILOptimizer: Remove some duplication between SILCloner and TypeSubstCloner
This also fixes a latent bug; we were substituting opened
existentials inside the replacement type of a Substitution,
but not inside the conformances.
2017-03-07 16:04:54 -08:00
Slava Pestov
13cc1ad07c AST: Remove SubstitutionMap::getConformances() 2017-03-07 16:04:53 -08:00
Slava Pestov
b41888acdf AST: Add SubstitutionMap::subst()
This will replace Substitution::subst().
2017-03-07 16:04:46 -08:00
Slava Pestov
61b6cc823e AST: Add ProtocolConformanceRef::subst()
Extract this from Substitution::subst(), which is going away.
2017-03-07 16:04:33 -08:00
Slava Pestov
c040c71ea9 AST: Remove some unnecessary SubstitutionList copies
ASTContext::getSpecializedConformance() already copies the
substitutions, so remove some AllocateCopy() calls.

Also, add a new overload taking a SubstitutionMap instead.
This allows removing some gatherAllSubstitutions() calls,
which have an allocation inside them.

Finally, remove the now-unused ModuleDecl parameter from
ProtocolConformance::subst() and make it public.
2017-03-07 15:59:05 -08:00
Matthew Carroll
69ae6cd588 [Driver] SR-3352: Warn on and ignore -embed-bitcode when not generating object files (#7962)
Commands like -emit-sil and -emit-module (on its own) do not produce object files.
When -embed-bitcode is also set, the driver runs a backend job to generate a module that fails.
This commit emits a warning instead and ignores the -embed-bitcode option.

https://bugs.swift.org/browse/SR-3352
2017-03-07 15:19:08 -08:00
Jordan Rose
e58d02b88b Make sure ErrorTypes containing type variables are marked as such. (#7963)
In some cases, the type checker will produce error types with the
"original type" intact for recovery purposes. Like other types, when
the original type contains a type variable, the ErrorType instance
will be allocated in the "temporary" memory arena associated with the
active constraint solver, because there's no way that particular error
will come up again once the constraint system containing that type
variable has been destroyed.

However, we weren't propagating that "contains a type variable"
information to the newly-created ErrorType, which meant that any type
/containing/ that ErrorType would be allocated in the "permanent"
arena. In practice, this would always be a DependentMemberType; not
too many types are created without looking at their base types at all.
The arena containing the ErrorType would then be deallocated, and its
memory reused later on for a /different/ type. If we ever tried to
make a DependentMemberType whose base was this new type, we'd find the
old DependentMemberType instance in our cache and return that. The
result was that we'd have a DependentMemberType whose "HasError" bit
was set even though the base type was not an error type, and which was
considered canonical whether or not the base type was. This would then
either hit an assertion later on or result in nonsensical errors like
"'C.Iterator' is not the same type as 'C.Iterator'".

Because the reused address always referred to a valid type, none of
the usual dynamic analysis tools could catch the problem. It really
comes down to using a pointer address as a key in a map---but even
without that, we were allocating types in the permanent arena that
really should be temporary, which is a waste of memory.

Likely fixes rdar://problem/30382791, a nondeterministic failure we've
been seeing for weeks on the bots and on developer machines.
2017-03-07 15:18:01 -08:00
swift-ci
4a25d055cf Merge pull request #7960 from atrick/silval 2017-03-07 11:37:58 -08:00
Doug Gregor
81ed11ccfa Merge pull request #7959 from DougGregor/inferred-requirements-are-not-redundant
[GSB] Don't complain about redundant requirements with inferred sources.
2017-03-07 11:26:45 -08:00
Andrew Trick
c2b433bad6 Overhaul the AddressLowering pass to optimize projections and handle more cases.
This adds the underpinning for optimizing storage projections. When subobjects are composed in aggregate they no longer require individual copies.

Optimize copy->store sequences.

Added support for enums and existentials.

Added a mini design doc file comment.

Added -optimize-opaque-address-lowering unit tests.
2017-03-07 10:58:09 -08:00
Doug Gregor
23184497e2 [GSB] Don't complain about redundant requirements with inferred sources.
If a requirement is made redundant due to another requirement that was
inferred from the signature of a generic declaration, don't diagnose
the former as redundant. The user has likely written the requirement
explicitly for clarity purposes (e.g., to emphasize the Hashable
requirement on a function that takes a Set<T>). Removing the
requirement to silence the warning would make the code less clear.

This eliminates all of the annoying, spurious warnings from the build
of the overlays.
2017-03-07 10:41:06 -08:00
swift-ci
fa4a196fe0 Merge pull request #7956 from DougGregor/conformance-access-path 2017-03-07 10:21:37 -08:00
Doug Gregor
202bc7eeea [AST] Introduce GenericSignature::getConformanceAccessPath().
Introduce an API that determines the "conformance access path" that
one would follow to find the conformance of a given type parameter
(e.g., T.Iterator.Element) to a given protocol (e.g., Equatable). A
conformance access path starts at one of the explicit requirements
of that generic signature and then proceeds through zero or more
protocol-supplied requirements. For example, given this function:

  func f<C: Collection>(_: C) { }

The conformance access path for "C.Iterator: IteratorProtocol" is

  (C, Collection) -> (Self, Sequence) -> (Self.Iterator, IteratorProtocol)

because one starts with the explicit requirement "C: Collection", goes
to the inherited protocol requirement (the "Self" in Collection
conforms to Sequence) and then a requirement on the associated type
(Self.Iterator in Sequence conforms to IteratorProtocol).

This is all scaffolding now; it's intended to be used by IRGen (to
find the witness tables it needs) and SubstitutionMap (to dig out
conformances during substitution).
2017-03-07 09:25:43 -08:00
swift-ci
1afbb049c2 Merge pull request #7954 from practicalswift/gardening-20170307b 2017-03-07 09:17:57 -08:00
Doug Gregor
cd93126b4f [GSB] Teach requirement inference to use SubstitutionMaps.
The ad hoc substitution functions here were really odd; use
SubstitutionMap directly, and pass it through to
GenericSignatureBuilder::addRequirement().
2017-03-07 09:09:49 -08:00
Doug Gregor
908123ac11 [GSB] Fix requirement sources from protocol requirement signature.
The stored dependent types in ProtocolRequirement elements within
requirement sources were incorrect for requirements created from the
requirement signature of another protocol, because we picked up the
already-substituted subject type. Thread the optional substitution map
through addRequirement(Requirement) as well, so we maintain the
original spelling of the stored dependent type.

This is a temporary fix; we should be able to recover the stored
dependent types from the potential archetypes in the requirement
source, so that we don't need to specify them explicitly at
construction time.
2017-03-07 08:55:17 -08:00
Devin Coughlin
8026026df3 Merge pull request #7925 from devincoughlin/sil_tsan_inout_access_builtin
SIL: Add SIL builtin for Thread Sanitizer inout accesses
2017-03-07 08:10:00 -08:00
practicalswift
95e74d54ad [gardening] Fix includes 2017-03-07 16:44:53 +01:00
practicalswift
0cf00ac487 [gardening] Add missing headers. 2017-03-07 16:44:53 +01:00
practicalswift
e78d450f7f [gardening] Fix accidental \t:s 2017-03-07 16:44:52 +01:00
practicalswift
dd588b4273 [gardening] Remove likely word processor artefacts 2017-03-07 16:44:52 +01:00
Devin Coughlin
6ac36df1e7 SIL: Add SIL builtin for Thread Sanitizer inout accesses
...and IRGen it into a call to __tsan_write1 in compiler-rt. This is
preparatory work for a later patch that will add an experimental
option to treat Swift inout accesses as TSan writes.
2017-03-06 19:13:50 -08:00
Joe Shajrawi
ca77872ba8 Merge CheckedCastValueBranch with new master 2017-03-06 17:32:09 -08:00
Joe Shajrawi
1f626304f1 Add support for conditional checked cast instruction for opaque value types + SILGen support for it 2017-03-06 16:35:27 -08:00
Doug Gregor
d5d2db5185 [Diagnostics] Allow ValueDecl* diagnostic arguments.
Render these via their full names.
2017-03-06 16:32:29 -08:00
Doug Gregor
370550f472 [GSB] Abstract ConcreteConstraint to a more-general Constraint<T>. 2017-03-06 16:31:30 -08:00