Commit Graph

6749 Commits

Author SHA1 Message Date
Adrian Prantl
70b023ddb5 Change the SILLocation for exit branches in if statements to that of
the last instruction in the previous basic block.
Previously the location of the condition was reused for this, which caused
really unintuitive stepping behavior in the debugger.

<rdar://problem/18433491> Stepping order doesn't match developer expectations

Swift SVN r22269
2014-09-24 19:22:05 +00:00
Erik Eckstein
5e894aa80f Reference deallocating constructors in the SILVtable to prevent dead function elimination.
Those destructors are not referenced anywhere else in the SIL, but are used in the metadata
of a class. If they are private then dead function elimination would remove them.

This fixes <rdar://problem/18431856> unreachable executed at GenDecl.cpp:808



Swift SVN r22261
2014-09-24 11:29:38 +00:00
John McCall
1b3771c10b Fix a pair of bugs with rvalue addressed subscripting.
Swift SVN r22258
2014-09-24 09:07:30 +00:00
John McCall
b0a843630e Add some SILGen tests for addressors and fix some
bugs involving non-member variables with addressors.

Swift SVN r22256
2014-09-24 07:18:20 +00:00
Devin Coughlin
b727b6d932 Treat potentially unavailable global variable references as optional.
This patch adds the ability (-enable-experimental-unavailable-as-optional) to
treat potentially unavailable declarations as if they had optional types. For
the moment, this is only implemented for global variables.

The high-level approach is to (1) record the potential unavailability of a
declaration reference in the overload choice during constraint generation; (2)
treat the declaration as if it had an optional type during overload resolution
(this is similar to how optional protocol members are treated); and (3) add an
implicit conversion (UnavailableToOptionalExpr) during constraint application
to represent the run-time availability check and optional injection.

This patch does not implement SILGen for UnavailableToOptionalExpr.


Swift SVN r22245
2014-09-24 00:07:46 +00:00
John McCall
defaf07046 SILGen support for addressors.
Addressors now appear to pass a simple smoke-test; in
order to allow some parallel developement, I'll be
committing actual SILGen tests for this later and
separately.

Swift SVN r22243
2014-09-23 23:46:52 +00:00
Erik Eckstein
c16c510167 Set SILLinkage according to visibility.
Now the SILLinkage for functions and global variables is according to the swift visibility (private, internal or public).

In addition, the fact whether a function or global variable is considered as fragile, is kept in a separate flag at SIL level.
Previously the linkage was used for this (e.g. no inlining of less visible functions to more visible functions). But it had no effect,
because everything was public anyway.

For now this isFragile-flag is set for public transparent functions and for everything if a module is compiled with -sil-serialize-all,
i.e. for the stdlib.

For details see <rdar://problem/18201785> Set SILLinkage correctly and better handling of fragile functions.

The benefits of this change are:
*) Enable to eliminate unused private and internal functions
*) It should be possible now to use private in the stdlib
*) The symbol linkage is as one would expect (previously almost all symbols were public).

More details:

Specializations from fragile functions (e.g. from the stdlib) now get linkonce_odr,default
linkage instead of linkonce_odr,hidden, i.e. they have public visibility.
The reason is: if such a function is called from another fragile function (in the same module),
then it has to be visible from a third module, in case the fragile caller is inlined but not
the specialized function.

I had to update lots of test files, because many CHECK-LABEL lines include the linkage, which has changed.

The -sil-serialize-all option is now handled at SILGen and not at the Serializer.
This means that test files in sil format which are compiled with -sil-serialize-all
must have the [fragile] attribute set for all functions and globals.

The -disable-access-control option doesn't help anymore if the accessed module is not compiled
with -sil-serialize-all, because the linker will complain about unresolved symbols.

A final note: I tried to consider all the implications of this change, but it's not a low-risk change.
If you have any comments, please let me know.



Swift SVN r22215
2014-09-23 12:33:18 +00:00
Doug Gregor
44c1709505 Add EnumElementDecl::getArgumentInterfaceType().
Use this in calls to TypeBase::getTypeOfMember() that were relying on
archetypes solely because they were using EnumElementDecl::getArgumentType().

Swift SVN r22205
2014-09-23 03:44:00 +00:00
Joe Groff
6cd5123712 SILGen: Use the formal type when taking dynamicTypes of values.
The metatype is associated with the formal AST type of the value, not whatever lowered SIL type we happen to have lying around. Adjust the SIL verifier to check that value_metatype instructions produce a metatype for which the instance is a potential lowering rather than by exact type match. This lets us take the metatype of metatypes (and incidentally, of functions, and of tuples thereof), fixing rdar://problem/17242770.

Swift SVN r22202
2014-09-23 02:56:48 +00:00
Joe Groff
f518ff5003 Remove the dead Builtin.typeof function.
We have syntax for this now.

Swift SVN r22201
2014-09-23 02:56:41 +00:00
Joe Groff
232cec4b61 SIL: Rename TypeConverter::getInterfaceType{In,OutOf}Context
It extracts an interface type out of a contextual type, but the name made it sound like it put it into a context. NFC.

Swift SVN r22188
2014-09-22 21:56:47 +00:00
John McCall
2fc49df319 Teach SILGen to take advantage of materializeForSet
accessors on non-dynamic storage.

This allows us to take advantage of dynamic knowledge
that a property is implemented as stored in order to
gain direct access to it instead of copying into a
temporary.  When a class or protocol-member property
is expensive to copy, and particularly when it's of
copy-on-write type, such direct accesses can massively
improve the performance of a program.

We are currently only able to apply this when the
property is implemented purely as stored.  A willSet
observer inherently blocks the optimization, but we
should be able to make it work even for properties
with didSet observers.  This could be done by returning
an arbitrary callback from materializeForSet instead
of returning a flag indicating whether to call the
setter.

rdar://17416120

Swift SVN r22122
2014-09-19 05:25:22 +00:00
Anna Zaks
5fca94b1b2 [SIL Unreachability] Remove spurious warnings in the deinit method.
Mark the deinitializer auto-generated code as cleanup.

radar://18225133

Swift SVN r22111
2014-09-19 01:40:08 +00:00
Anna Zaks
782fac1d6a [SIL Unreachability] Do not report false positives in single statement closures
(I suspect SILLocation annotation code in other places is not aware of isImplicit() AST flag...)

Swift SVN r22110
2014-09-19 01:40:03 +00:00
John McCall
8cae5ba1d0 Generalize 'isDirectPropertyAccess' to allow for
direct (i.e. non-polymorphic) access to accessor
functions, and use this in materializeForSet for
computed properties.

Swift SVN r22059
2014-09-18 05:51:32 +00:00
Joe Groff
0279b570ac SILGen: Class-constrained generic bases are +1 for setters too.
Factor out the common logic here for future consistency. Fixes rdar://problem/18275858.

Swift SVN r22057
2014-09-18 02:31:11 +00:00
Joe Groff
2d792ba60b SILGen: Class-constrained generic property getters have a +1 base.
Fixes rdar://problem/18294424 and its many dupes.

Swift SVN r22048
2014-09-17 22:53:33 +00:00
John McCall
9c1d89289f Fix some bugs involving the implicit generation of
materializeForSet accessors for stored properties.

Also, reliably place materializeForSet after the
setter, no matter when we generate it.

Swift SVN r22014
2014-09-17 08:08:08 +00:00
John McCall
75050f8166 Generate an implicit 'materializeForSet' accessor
along with getters and setters.

Just generate it for now.

Swift SVN r22011
2014-09-17 08:08:03 +00:00
Joe Groff
1b3790034b SILGen: Don't try to emit closures in stored property initializers multiple times.
We emit initializer expressions once for every init definition, which caused us to try to emit the same symbol for closure bodies in initializers multiple times. Fixes rdar://problem/17971234.

Swift SVN r21997
2014-09-16 23:34:56 +00:00
Doug Gregor
4dca192b18 Switch IntegerLiteralConvertible over to initializers.
Swift SVN r21986
2014-09-16 21:59:15 +00:00
Joe Groff
3aa75d0c38 SILGen: Fix broken value semantics in previous commit.
When we take advantage of AllowPlusZero, we shouldn't put a cleanup on the materialized temporary.

Swift SVN r21982
2014-09-16 21:44:49 +00:00
Joe Groff
d3702950af SILGen: Materialize class-constrained "self" parameters when passed to non-class-constrained protocol methods.
Fixes rdar://problem/17480006, rdar://problem/17557409, rdar://problem/17929884 and crash suite #019.

Swift SVN r21981
2014-09-16 21:12:40 +00:00
Joe Groff
1c4e08a9c8 Fix up a tangle of issues related to reabstraction.
- A spot fix in SILGen for reabstracting the result of a downcast, which fixes checked casts to function types.
- Associate the layout information in type metadata records with the most abstract representation of the type. This is the correct thing to do in cases where we need the metadata as a tag for an opaque value--if we store a value in an Any, or pass it as an unconstrained generic parameter, we must maximally reabstract it. This fixes the value semantics of existentials containing trivial metatypes.
- To ensure that we get runtime layout of structs and enums correct when they contain reabstractable types, introduce a "metadata for layout" concept, which doesn't need to describe the canonical metadata for the type, but only needs to describe a type with equivalent layout and value semantics. This is a correctness fix that allows us to correctly lay out generic types containing dependent tuples and functions, and although we don't really take advantage of it here, it's also a potential runtime performance win down the road, because we could potentially produce direct metadata for a primitive type that's layout-equivalent with a runtime-instantiated type. To aid in type safety here, push SILType deeper into IRGen in places where we potentially care about specific representations of types.
- Finally, fix an inconsistency between the runtime and IRGen's concept of what spare bits unmanaged references and thick metatypes have.

Together, these fixes address rdar://problem/16406907, rdar://problem/17822208, rdar://problem/18189508, and likely many other related issues, and also fixes crash suite cases 012 and 024.

Swift SVN r21963
2014-09-16 01:44:34 +00:00
Manman Ren
a952c556c9 [Global Opt] replace GlobalAddrInst with SILGlobalAddrInst.
Update SILGen to create SILGlobalVariable and SILGlobalAddrInst instead of
GlobalAddrInst. When we see a definition for a global variable, we create
the corrsponding SILGlobalVariable definition.

When creating SILGlobalVariable from a global VarDecl, we mangle the global
VarDecl in the same way as we mangle it at IRGen. The SILLinkage is also
set in the same way as we set it at IRGen.

At IRGen, we use the associated VarDecl for SILGlobalVariable if it exists,
to have better debugging information.

We set the initializer for SILGlobalVariable definition only.

We also handle SILGlobalAddrInst in various SILPasses, in the similar way
as we handle GlobalAddrInst.

rdar://15493694


Swift SVN r21887
2014-09-11 20:00:39 +00:00
Devin Coughlin
0d7996f4ee Add parsing of availability query expressions (#os(...))
This patch adds a new 'pound_os' token, a new case for it in parseExprPostfix, and parsing of platform version constraints, e.g., OSX >= 10.10. 

It also adds enough type checking and SILGen to get the parsing tests to run without triggering "Unimplemented" assertions.


Swift SVN r21865
2014-09-11 02:59:05 +00:00
Doug Gregor
78a28c01eb Materialize temporaries properly when translating between init? and init! in witnesses.
Thanks, Joe!


Swift SVN r21854
2014-09-10 22:51:02 +00:00
Doug Gregor
37ec99601a Don't try to copy-initialize an aggregate whose members have
Recent versions of Clang correctly reject this rdar://problem/18291554.

Swift SVN r21848
2014-09-10 19:14:25 +00:00
Joe Groff
e004ad7df4 SIL: Carry AST types through init_existential instructions.
This is necessary to be able to properly stash values with nontrivial lowerings, such as metatypes and functions, inside existential containers. Modify SILGen to lower values to the proper abstraction level before storing them in an existential container. Part of the fix for rdar://problem/18189508, though runtime problems still remain when trying to actually dynamicCast out a metatype from an Any container.

Swift SVN r21830
2014-09-10 05:56:36 +00:00
Doug Gregor
e762e73bf7 Handle failability differences in initializer witnesses.
A failable initializer can satisfy a failable initializer requirement
(regardless of whether either is spelled with init! or
init?). Handle the optional translation within the witness.

Additionally, a failable initializer requirement spelled with
"init!" can satisfy a non-failable initializer requirement, in which
case we force the optional within the witness.

Swift SVN r21812
2014-09-09 21:47:26 +00:00
Doug Gregor
a8a09fd2c2 In a protocol witness thunk for an 'init!' witness of an 'init' requirement, force the optional.
Swift SVN r21793
2014-09-08 23:51:14 +00:00
Joe Groff
419ba5cbea Change RawRepresentable to use failable initializers and property requirements.
Redefine the RawRepresentable protocol to use an 'init?' method instead of 'fromRaw(Raw)', and a 'raw' get-only property instead of 'toRaw()'. Update the compiler to support deriving conformances for enums and option sets with the new protocol. rdar://problem/18216832

Swift SVN r21762
2014-09-06 18:40:14 +00:00
Devin Coughlin
ab563d6ef1 Add availability query expression (#os(...))to the AST
This commit adds a new expression (AvailabilityQueryExpr) and a single kind of
specification for when a block of code or function is available
(VersionConstraintAvailabilitySpec). We may add more kinds of specifications
in the future. At the moment, the AvailabilityQueryExpr allows only a
single platform to be queried; I will add support for multiple platforms
in a later commit.

This commit contains just the added AST nodes; no parsing, type checking, etc.
I’ve added assert(false && “Unimplemented”) for places where support for
AvailabilityQueryExpr will need to be added later.



Swift SVN r21760
2014-09-06 02:11:02 +00:00
Erik Eckstein
f6c68fb1d5 SILGen: fix crash in case a function is specialized which contains an Array/Dictionary up- or downcast.
The apply insts for the call to the collection-casts were generated with substitutions w/o an ArcheType.



Swift SVN r21740
2014-09-05 14:07:25 +00:00
Doug Gregor
769ba83b28 Clean up "self" properly when delegating to a factory method.
Fixes the leak reported in rdar://problem/18141590.


Swift SVN r21739
2014-09-05 04:57:58 +00:00
Joe Groff
620170e795 SILGen: Handle 'init' witnesses less failable than their requirement.
This fix should also extend to the general case of witnesses that return non-optional for optional-returning requirements, when/if we support that.

Swift SVN r21721
2014-09-04 22:24:16 +00:00
Joe Groff
53bbefbe42 SILGen: Thread direct access through all uses of emitRValueForDecl.
Swift SVN r21715
2014-09-04 18:11:04 +00:00
Doug Gregor
3a7b2c3622 Revert r21706 "Stop checking for 'nil' returns from non-failable Objective-C initializers."
Swift SVN r21712
2014-09-04 17:27:22 +00:00
Doug Gregor
a775b4004a Stop checking for 'nil' returns from non-failable Objective-C initializers.
This eliminates the workaround for propagating 'nil' from Objective-C
initializers up through Swift initializers, now that failable
initializers handle this propagation.


Swift SVN r21706
2014-09-04 15:55:56 +00:00
Joe Groff
4be861da99 SILGen: Don't crash when a 'static let' models a 'class var { get }' protocol requirement.
A couple of issues here:

- We didn't apply the base metatype when emitting calls to the getter for static properties, causing a crash when references to the accessor are emitted (such as when modeling a protocol requirement)
- We didn't propagate isDirectPropertyAccess through emitRValueDecl, causing the getter to recursively call itself when it was emitted successfully.

Together these fix rdar://problem/17986478.

Swift SVN r21695
2014-09-04 01:38:25 +00:00
Joe Groff
3c2f1657de SILGen: Copy block arguments, even if they're optional.
Avoids creating a dangling stack block reference when working with imported APIs that take blocks as IUOs, fixing rdar://problem/18132853.

Swift SVN r21662
2014-09-02 23:56:27 +00:00
John McCall
76f0a3d821 After emitting consecutive equivalent isa patterns,
restart after the whole group instead of always at
the second.

rdar://17772217

Swift SVN r21595
2014-08-29 23:24:03 +00:00
Joe Groff
2395820d2d SILGen: Only emit base conformances that belong to the current module.
Fixes rdar://problem/17619178. I can't make a SILGen test case because of rdar://problem/18182969 -- under normal circumstances we appear to produce new conformances for base protocols even when there are conformances in the stdlib we should reuse instead.

Swift SVN r21594
2014-08-29 23:14:11 +00:00
Joe Groff
8f52302f8e SILGen: Implement artificial main for NSApplicationMain.
We're not sure how to trigger this from source code yet, so trigger it with a hidden -emit-NSApplicationMain frontend flag for now.

Swift SVN r21563
2014-08-29 04:45:47 +00:00
Joe Groff
fc5e29284f SILGen: Implement failable class initializers.
Set up the same structure of a failure block and common exit point for class initializers that fail, and fix the codegen for the allocating entry point to use the correct return type when calling a failable initializer.

Swift SVN r21536
2014-08-28 17:41:40 +00:00
Roman Levenstein
97014172b7 [sil-combine] String literal concatenation optimization. Constant-fold concatenation of string literals known at compile-time.
Addresses rdar://17033696.

Swift SVN r21526
2014-08-28 11:33:21 +00:00
Chris Lattner
44a1eb7715 Rework SILGen of optional methods to work with non-@objc situations:
- Split getSelfTypeForDynamicLookup into two pieces, and generalize it
    to work on non-loadable protocols.
  - Change dynamic_method_branch to take its argument as a protocol of any
    protocol type, instead of as something of UnownObject type.
  - Teach emitForcedDynamicMemberRef to only do its peephole optimization for
    @objc cases, since it is special behavior of objc_msgSend.
  - enhance emitDynamicPartialApply & emitDynamicMemberRefExpr to emit the
    proper project_existential instruction (not a _ref) when dealing with a
    non-classbound protocol.

Change the verifier to allow DynamicMethodBranchInst to work on non-@objc
protocol members.

This eliminates a bunch of pointless unchecked_ref_cast's in the generated
SIL for existing code, but this got squashed at IRGen time anyway, so no
real change for anything that sema permits.



Swift SVN r21519
2014-08-28 07:37:18 +00:00
Chris Lattner
dc7c565af8 further generalize dynamic_method and dynamic_method_br: instead of having them force
the subject to "Builtin.UnknownObject", just traffic in the protocol type directly.


Swift SVN r21516
2014-08-28 05:41:35 +00:00
Chris Lattner
50979a2ff4 implement SILGen and IRGen support for witness table generation of non-objc optional
protocol requirements.  Not testable because sema doesn't allow these to exist.


Swift SVN r21513
2014-08-28 04:20:02 +00:00
Joe Groff
88da4626b8 SILGen: Clean up 'self' before entering the failure block of a failing initializer.
A couple reasons for this:

- How 'self' gets cleaned up is dependent on where the failure occurs. If we propagate failure from a class initializer, the failed 'super.init' or 'self.init' has already cleaned up the object, so we only need to deallocate the box. In cases where we fail explicit, we release 'self', which works out because we're only supporting failure with a fully-initialized object for now.
- This lets us set the location info for the cleanup to the AST node that instigated failure, giving better QoI for DI failures (such as failing with a partially-initialized object).

Swift SVN r21505
2014-08-28 01:13:49 +00:00