Commit Graph

6427 Commits

Author SHA1 Message Date
Mike Ash
ba25b624f8 Merge pull request #18737 from mikeash/change-swift_unknownX-to-swift_unknownObjectX
[Runtime] Rename swift_unknown* functions to swift_unknownObject*.
2018-08-17 14:19:27 -04:00
Arnold Schwaighofer
622ccfaf6f Merge pull request #18760 from aschwaighofer/conditional_conf_instantiation
IRGen: Bind local type metadata from conformance's type in a conditional conformance's instantiation function
2018-08-17 06:06:38 -07:00
Vedant Kumar
c76494b02e Use atomic profile counter updates when TSan is enabled
This suppresses TSan diagnostics about racy profile counter updates.

rdar://40477803
2018-08-16 16:23:25 -07:00
Jordan Rose
ef06972428 [IRGen] Simplify the ownership of ProtocolInfo (#18704)
Rather than keep a singly-linked list of ProtocolInfo objects to free,
just rely on them being cached in the single DenseMap in
TypeConverter.
2018-08-16 13:09:36 -07:00
Arnold Schwaighofer
437e938904 IRGen: Bind local type metadata from conformance's type in a conditional conformance's instantiation function
rdar://43096256
SR-8495
2018-08-16 12:25:41 -07:00
Ben Cohen
428c580158 Fix unused variable warnings in release builds. (#18755) 2018-08-16 11:46:45 -06:00
Mike Ash
46309d9794 [Runtime] Rename swift_unknown* functions to swift_unknownObject*.
These functions don't accept local variable heap memory, although the names make it sound like they work on anything. When you try, they mistakenly identify such things as ObjC objects, call through to the equivalent objc_* function, and crash confusingly. This adds Object to the name of each one to make it more clear what they accept.

rdar://problem/37285743
2018-08-15 17:48:23 -04:00
Jordan Rose
f505c8b8a0 [IRGen] Add some PrettyStackTraces for metadata emission (#18727) 2018-08-15 12:51:20 -07:00
Arnold Schwaighofer
d293845435 Merge pull request #18723 from aschwaighofer/fix_coro_alloca_free
IRGen: Call coro.alloca.free on the token not the address of a coro.alloca.alloc
2018-08-15 09:48:44 -07:00
adrian-prantl
cbd53a0337 Merge pull request #18717 from adrian-prantl/43296089
Add initial support for debug info for coroutine allocas.
2018-08-15 08:24:37 -07:00
Arnold Schwaighofer
d2e1a0d09f Merge pull request #18711 from aschwaighofer/renable_inlining_isOSVersionAtLeast
Re-enable inlining of the _stdlib_isOSVersionAtLeast macro
2018-08-15 08:17:09 -07:00
Arnold Schwaighofer
f2ec95951d IRGen: Call coro.alloca.free on the token not the address of a coro.alloca.alloc
rdar://43311065
2018-08-15 08:06:26 -07:00
Arnold Schwaighofer
8993b0d10d Address review comments 2018-08-15 07:05:47 -07:00
Andrew Trick
b3c66cc19f Merge pull request #18708 from atrick/without-actually-asserting
Fix static exclusivity verification for withoutActuallyEscaping.
2018-08-14 19:38:56 -07:00
Adrian Prantl
556c8e5a2f Add initial support for debug info for coroutine allocas.
Unfortunately the example I was testing this with still crashed IRGen later on...

<rdar://problem/43296089>
2018-08-14 19:07:55 -07:00
Joe Groff
77ea0d54b0 Merge pull request #18637 from jckarter/share-c-and-uninhabited-enum-value-witness
[WIP] IRGen: Use prefab value witness tables for uninhabited and @objc enums.
2018-08-14 17:54:49 -07:00
Andrew Trick
c9033ed938 Add a SIL attribute [without_actually_escaping].
ConvertFunction and reabstraction thunks need this attribute. Otherwise,
there is no way to identify that withoutActuallyEscaping was used
to explicitly perform a conversion.

The destination of a [without_actually_escaping] conversion always has
an escaping function type. The source may have either an escaping or
@noescape function type. The conversion itself may be a nop, and there
is nothing distinctive about it. The thing that is special about these
conversions is that the source function type may have unboxed
captures. i.e. they have @inout_aliasable parameters. Exclusivity
requires that the compiler enforce a SIL data flow invariant that
nonescaping closures with unboxed captures can never be stored or
passed as an @escaping function argument. Adding this attribute allows
the compiler to enforce the invariant in general with an escape hatch
for withoutActuallyEscaping.
2018-08-14 17:14:25 -07:00
Joe Groff
8eee14d593 IRGen: Use prefab value witness tables for uninhabited and @objc enums.
@objc enums don't support reflection and aren't given extra inhabitants, so we never in practice use their enum value witnesses (and the ones we generated were wrong!), and we can share the prefab value witnesses for the builtin integer types for C enums. All uninhabited types like Never can also share an arbitrary value witness table; the value witnesses will never be invoked.
2018-08-14 14:03:35 -07:00
Arnold Schwaighofer
b9b6362251 Re-enable inlining of the _stdlib_isOSVersionAtLeast macro 2018-08-14 13:42:55 -07:00
Jordan Rose
84f471b031 [IRGen] Handle ProtocolInfo for protocols whose members aren't used (#18692)
Certain uses of protocols only formally need the requirement
signature, not any of the method requirements. This results in IRGen
seeing a protocol where none of the members have been validated except
the associated types. Account for this by allowing ProtocolInfo to
only contain the layout for the base protocols and associated types,
if requested.

Note that this relies on the layout of a witness table always putting
the "requirement signature part" at the front, or at least at offsets
that aren't affected by function requirements.

rdar://problem/43260117
2018-08-14 11:10:02 -07:00
Doug Gregor
b08a6f56b4 [AST] Drop resilience expansion from TypeBase::getReferenceCounting().
We’re not using this parameter, and don’t expect to do so in the future,
so remove it. Also fold away TypeBase::usesNativeReferenceCounting()
and irgen::getReferenceCountingForType(), both of which are trivial.
2018-08-14 09:10:49 -07:00
Slava Pestov
dffcafbdb7 IRGen: VarDecls always have an interface type and a contextual type 2018-08-14 02:19:31 -07:00
Slava Pestov
41aebf8e5a IRGen: Simplify NominalMetadataVisitor's treatment of generic requirements
We don't need to substitute the superclass type as we walk up a
class hierarchy, or look up the generic parameters and conformances
to check if they're concrete, since we're always just emitting
null pointers in place of the generic parameters and requirements,
to be filled at runtime.

Also, don't leave space for generic parameters and requirements from
Objective-C superclasses, since that's not how they're represented.
2018-08-14 00:20:12 -07:00
Slava Pestov
fbba4a7c0a IRGen: Remove obsolete todos 2018-08-14 00:20:07 -07:00
Jordan Rose
d52dad3732 [IRGen] Extract getConformance from ProtocolInfo (#18681)
We were using this just as a convenient way to share an existing
DenseMap, but it's not really related; we don't need to compute
witness table layout just to generate a conformance reference.

I started working on this because the "Cub" source compat project was
hitting issues here, but now I can't reproduce it. Still, this is a
reasonable cleanup.
2018-08-13 17:16:41 -07:00
Jordan Rose
038a55757d Merge pull request #18639 from jrose-apple/layoutless
[IRGen] Don't compute witness table layout just to form existentials
2018-08-10 18:17:17 -07:00
Jordan Rose
9b9ef88dbd [IRGen] Don't compute witness table layout just to form existentials
We weren't using this information, and trying to access it runs into
trouble when the protocol is in another file.
2018-08-10 17:06:59 -07:00
Slava Pestov
83ee03e69e Merge pull request #18435 from slavapestov/var-decl-get-type
Clean up code around VarDecl::setType()
2018-08-10 15:43:05 -07:00
Jordan Rose
3d34b9c156 [IRGen] Remove unused ExistentialTypeInfoBase::findWitnessTable
Turns out we never ask this of TypeInfo anymore.
2018-08-10 15:37:31 -07:00
Slava Pestov
4b258e86e6 AST: Stop setting contextual types on ParamDecls
VarDecl::getType() lazily maps the interface type into context if needed.
2018-08-10 13:33:12 -07:00
Slava Pestov
e44721dd19 IRGen: Remove the 'access type'/'layout type' distinction from StructLayout
This was part of the old resilience workaround for classes and
is no longer used.
2018-08-10 00:42:34 -07:00
Slava Pestov
b26d8ca6ed IRGen: For classes with resiliently-sized fields, calculate both a fragile and resilient layout
Use the fragile layout to emit static metadata, and use the
resilient metadata for almost everything else.

Add some tests to ensure that we use runtime metadata, even
for classes with fully fragile layout.
2018-08-10 00:42:34 -07:00
Slava Pestov
9f5505d95c IRGen: Don't make values constant in getAddrOfSimpleVariable()
We also use this for field offset globals, which are not always
constant. I think in practice everything was getting set
correctly, but it was hard to follow the logic.
2018-08-10 00:42:34 -07:00
Slava Pestov
b012d17b24 IRGen: Move field offset global emission out of class metadata emission 2018-08-10 00:42:34 -07:00
Slava Pestov
90f01deba2 IRGen: Remove tryEmitClassConstantFragileInstance{Size,AlignMask}() 2018-08-10 00:42:34 -07:00
Slava Pestov
b26f3efced IRGen: Remove ClassTypeInfo::getHeapAlignment() 2018-08-10 00:42:34 -07:00
Slava Pestov
69be7d93b2 IRGen: Split up ClassLayoutBuilder::ClassMetadataRequiresDynamicInitialization into fine-grained conditions 2018-08-10 00:42:34 -07:00
Slava Pestov
f594d5bfbf IRGen: Split off ClassLayout implementation into its own file 2018-08-07 05:34:29 -07:00
Slava Pestov
fc91a58d82 IRGen: [ClassLayout] Better fix for SR-4687
We cannot use field offset globals if *any* field of a generic class
with Objective-C ancestry is dependent.

This is because the Swift runtime first performs layout starting
from a static instance start offset, and then asks the Objective-C
runtime to slide the offsets based on the dynamic superclass size.

So if the class has a field of generic type, the alignment of that
type can change the offsets of fields *before* it as well as after.

So we cannot assuem that any fields in such a class have the same
offset across instantiations at all.

The previous fix captured the intent of the above, but it only
kicked in if the immediate superclass of the class was imported
from Objective-C. But really we need to do this for any class with
Objective-C ancestry.

While fixing this, re-organize the code in ClassLayoutBuilder a
little bit to untangle the stored property iteration from the
interesting FieldAccess adjustments that take place after.
2018-08-07 04:26:43 -07:00
Slava Pestov
d460d5def6 IRGen: Remove ASTTy field from StructLayout 2018-08-07 04:26:43 -07:00
Slava Pestov
92f1ddc981 IRGen: [ClassLayout] Don't compute FieldAccess for superclass fields
Previously we would recursively get the abstract layout for the fully
generic class type for every superclass. But really we only need to do
that for fields of the class itself, not any superclass fields, since
we throw out the superclass field information anyway.
2018-08-07 04:26:43 -07:00
Slava Pestov
bdb5eb3289 IRGen: [ClassLayout] Don't build a separate StructLayout for classes
The type info for a class described its layout using a combination of a
StructLayout and ClassLayout, with different information stored in both.

Since we never use a class as a struct, it's simpler to add the relevant
bits to ClassLayout, and not build a StructLayout at all.

Also, drop inherited properties from the ClassLayout -- they're no
longer needed.
2018-08-07 00:37:03 -07:00
Slava Pestov
7315893d3d IRGen: [ClassLayout] Only look for fields of the immediate class
When emitting fixed class metadata, we emit field offsets for all fields,
including those from superclasses, if any.

Get the ClassLayout for the correct class before looking up a field that
might potentially belong to a superclass. Soon, I'm going to slim down
ClassLayout instances to only store the fields belonging to the class
itself, removing the InheritedStoredProperites array altogether.
2018-08-07 00:34:55 -07:00
Slava Pestov
a4f06c40fc IRGen: [ClassLayout] Don't recursively compute layout of the same type
Even if two types are different, they might still have the same
type info, so don't call getLayout() without checking the type info
for identity first. This allows simplifying an early exit into an
assertion elsewhere.
2018-08-06 23:22:16 -07:00
Doug Gregor
88d2feb44b Merge pull request #18528 from DougGregor/irgen-objc-refcount
[IRGen] Use a more precise computation for the kind of reference count.
2018-08-06 19:25:48 -07:00
Davide Italiano
72df014a84 Merge pull request #18447 from sparkasaurusRex/codeview-linetables
Reduce breaks in CodeView linetables
2018-08-06 17:08:56 -07:00
Doug Gregor
4d39506c4a [IRGen] Use a more precise computation for the kind of reference count.
TypeBase::usesNativeReferenceCounting() was doing a lot of work to
find the class that a type refers to, then determine whether it
would use the native reference-counting scheme. Its primary caller
in IRGen would use an overly-conservative approximation to decide
between the “Objective-C” and “unknown” cases, which resulted in
uses of “unknown” reference counting for some obviously-ObjC cases
(e.g., values of “NSObject”).

Moreover, the approximation would try to call into the type checker
(because it relied unnecessarily on the superclass *type* of a class
declaration), causing an assertion.

Fixes rdar://problem/42828798.
2018-08-06 17:04:47 -07:00
swift-ci
71f0248b0a Merge remote-tracking branch 'origin/master' into master-next 2018-08-06 11:07:55 -07:00
swift-ci
1623f42447 Merge pull request #18292 from mhong/master_bytes_string 2018-08-06 09:05:58 -07:00
Doug Gregor
bd5f5d80e4 [AST] Add ExtensionDecl::getExtendedNominal().
Introduce ExtensionDecl::getExtendedNominal() to provide the nominal
type declaration that the extension declaration extends. Move most
of the existing callers of the callers to getExtendedType() over to
getExtendedNominal(), because they don’t need the full type information.

ExtensionDecl::getExtendedNominal() is itself not very interesting yet,
because it depends on getExtendedType().
2018-08-03 11:26:48 -07:00