Commit Graph

857 Commits

Author SHA1 Message Date
Joe Groff
d8b699a523 Balance guaranteed arguments in native-to-ObjC thunks.
Swift SVN r24454
2015-01-15 21:53:49 +00:00
John McCall
cae0f6e3db Add the ability for a owning addressor to return
a non-native owner.  This is required by Slice, which
will use an ObjC immutable array object as the owner
as long as all the elements are contiguous.

As part of this, I decided it was best to encode the
native requirement in the accessor names.  This makes
some of these accessors really long; we can revisit this
if we productize this feature.

Note that pinning addressors still require a native
owner, since pinning as a feature is specific to swift
refcounting.

Swift SVN r24420
2015-01-14 19:14:20 +00:00
Joe Groff
07a47a02d0 SILGen: Remove InOutInitialization and its related "AddressBinding" initialization kind.
We don't need these now that we don't set up argument bindings via initializations.

Swift SVN r24413
2015-01-14 05:51:01 +00:00
John McCall
48f7a19d74 Enter a writeback scope before performing an assignment.
We need this in order to unpin at the correct moment.

Add an assertion that there's a scope active when pushing
an unpin writeback, as well as an assertion to ensure that
we never finish a function with writebacks active.

Swift SVN r24411
2015-01-14 02:17:27 +00:00
John McCall
3b89751b08 Merge the subscript r-value path with the l-value path.
Fixes a dumb bug where r-value subscripts would
unnecessarily emit their bases as ReadWrite.

Swift SVN r24410
2015-01-14 01:38:56 +00:00
John McCall
dc4431ebff Split addressors into unsafe, owning, and pinning variants.
Change all the existing addressors to the unsafe variant.

Update the addressor mangling to include the variant.

The addressor and mutable-addressor may be any of the
variants, independent of the choice for the other.

SILGen and code synthesis for the new variants is still
untested.

Swift SVN r24387
2015-01-13 03:09:16 +00:00
David Farler
3530e542ca Static class stored properties
rdar://problem/19422120

Allow static/class final stored properties to get through to the
mangled global property implementations.

Swift SVN r24303
2015-01-09 09:54:18 +00:00
Chris Lattner
bf43c5cd49 move getDeclCaptureKind to be a method on TypeConverter and simplify a bunch of
clients of CaptureKind by having getDeclCaptureKind map address-only lets onto
Box or NoEscape, instead of having all the clients do it.


Swift SVN r24136
2014-12-24 00:23:24 +00:00
Chris Lattner
d59a2d0490 Teach SILGen about NoEscape:
- Introduce a new 'noescape' CaptureKind and have getDeclCaptureKind()
   use it for by-address captures in noescape closures.
 - Lower NoEscape captures to a simple inout pointer instead of to a
   pointer + refcount.

This includes a test of the SILGen produced code itself along with an
integration test that shows that this enables inout deshadowing to remove
shadows that would otherwise have to be preserved due to closures capturing
them.

This can be more aggressive for address-only let constants, but that will
wait for a follow-up patch.



Swift SVN r24135
2014-12-24 00:03:13 +00:00
Chris Lattner
58e0efc345 Enhance getDeclCaptureKind() to take the closure that is capturing the
given decl, and plumb the information down to it.  NFC since the argument
is currently dead.



Swift SVN r24132
2014-12-23 23:08:38 +00:00
Chris Lattner
8c916c31f4 Fix <rdar://problem/19275047> Extraneous retains/releases of self are bad
This teaches SILGenLValue that base expressions referring to self can always
be done at +0, avoiding retain/release traffic.  This eliminates some hacks 
where init() needed special code, and also reduces r/r traffic in general.

Before the example in the radar silgen'd to:

sil hidden @_TFC1x4Base3foofS0_FT_T_ : $@cc(method) @thin (@owned Base) -> () {
bb0(%0 : $Base):
  debug_value %0 : $Base  // let self             // id: %1
  strong_retain %0 : $Base                        // id: %2
  // function_ref x.Base.__allocating_init (x.Base.Type)() -> x.Base
  %3 = function_ref @_TFC1x4BaseCfMS0_FT_S0_ : $@thin (@thick Base.Type) -> @owned Base // user: %5
  %4 = metatype $@thick Base.Type                 // user: %5
  %5 = apply %3(%4) : $@thin (@thick Base.Type) -> @owned Base // user: %7
  %6 = ref_element_addr %0 : $Base, #Base.f       // user: %7
  assign %5 to %6 : $*Base                        // id: %7
  strong_release %0 : $Base                       // id: %8
  strong_release %0 : $Base                       // id: %9
  %10 = tuple ()                                  // user: %11
  return %10 : $()                                // id: %11
}

now the %2 and %8 instructions are gone.



Swift SVN r23977
2014-12-17 06:09:56 +00:00
Chris Lattner
ec00695c19 remove emitSelfForDirectPropertyInConstructor, we can just use emitRValueForDecl
now that +0 expressions are plumbed through.


Swift SVN r23976
2014-12-17 05:26:16 +00:00
Chris Lattner
e824b0b9ba fix <rdar://problem/19254812> DI bug when referencing let member of a class
SILGen was emitting extraneous retains/releases on self when accessing let
properties in a class, leading to bogus diagnostics.  Fixing this just 
amounted to realizing that emitDirectIVarLValue is already safe w.r.t. +0
bases.



Swift SVN r23975
2014-12-17 05:16:56 +00:00
Chris Lattner
55d4615eb3 simplify code, nfc.
Swift SVN r23961
2014-12-16 20:32:30 +00:00
Chris Lattner
b738fb3a2a fix <rdar://problem/19267795> failable initializers that call noreturn function produces bogus diagnostics
by marking some instructions autogenerated.


Swift SVN r23959
2014-12-16 20:14:49 +00:00
Chris Lattner
8236e7f18b Simplify the implementation of SILGenFunction::VarLoc by eliminating the
"isConstant" distinction.  This was an irritating bit of redundant state
that was making the code more complicated.  Clients of VarLoc really only
care about "has address" and "has box", not whether the VarLoc came from
a let or var (and if they did, they can ask the VarDecl directly).  NFC,
just more "yak shaving" as Doug likes to say.


Swift SVN r23869
2014-12-11 22:11:23 +00:00
Chris Lattner
5d8613c7c9 Introduce a new "Indirect_In_Guaranteed" SIL parameter convention. This
isn't used yet, but will be for modeling the self argument passed to an 
address-only witness implementation.   NFC since all this code is dead :-)



Swift SVN r23857
2014-12-11 01:41:29 +00:00
John McCall
3b4e0d307e Intrinsic support for pinning.
Using the intrinsics is obnoxious because I needed them
to return Builtin.NativeObject?, but there's no reasonable
way to safely generate optional types from Builtins.cpp.
Ugh.

Dave and I also decided that there's no need for
swift_tryPin to allow a null object.

Swift SVN r23824
2014-12-10 00:52:48 +00:00
Chris Lattner
d513803d84 Sigificantly replumb how SILGen generates mark_uninitialized instructions, generating
them in a more consistent and principled way.  Two changes here: MUI is generated
when a vardecl is emitted, not as a separate "MarkPatternUninitialized" pass.  Second,
when generating a MUI for self parameters with a temporary alloc_stack (due to the
possibility of superclass remapping of self) emit the MUI on the allocation itself,
not on the incoming argument.  This is a lot more consistent (dissolving a bunch of 
hacks in DI).

In terms of behavior changes, this only changes the raw sil generated by SILGen and
consumed by DI, so there is no user-visible change.  This simply unblocks future work.



Swift SVN r23823
2014-12-10 00:29:40 +00:00
Chris Lattner
f3ed7e93e1 Completely redesign our AST representation of capturelists. Formerly,
a capture list hung off the CaptureExpr it was associated with.  This made
sense lexically (since a capture list is nested inside of the closure) but
not semantically.  Semantically, the capture list initializers are evaluated
outside the closure, the variables are bound to those values, then the closure
captures the newly bound values.

To directly represent this, represent captures with a new CaptureListExpr node,
which contains the ClosureExpr inside of it.  This correctly models the semantic
relationship, and makes sure that AST walkers all process the initializers of the
capture list as being *outside* of the closure.

This fixes rdar://19146761 and probably others.


Swift SVN r23756
2014-12-06 04:36:11 +00:00
Chris Willmore
36d0f187ec Sema, SILGen, ClangImporter: Add special support for Set<T>
Add the following functionality to the Swift compiler:

* covariant subtyping of Set
* upcasting, downcasting of Set
* automatic bridging between Set and NSSet, including
    * NSSet params/return values in ObjC are imported as Set<NSObject>
    * Set params/return values in Swift are visible to ObjC as NSSet

<rdar://problem/18853078> Implement Set<T> up and downcasting

Swift SVN r23751
2014-12-06 02:52:33 +00:00
John McCall
6aa60ed1a8 Document how WritebackScope plays into the formal access
model and remove SuppressWritebackScope.

Swift SVN r23662
2014-12-03 22:59:00 +00:00
John McCall
84cb0faaf3 Forward base rvalues directly to accessors instead of
conservatively copying them.

Also, fix a number of issues with mutating getters that
I noticed while examining and changing this code.  In
particular, stop relying on suppressing writeback scopes
during loads.

Fixes rdar://19002913, a bug where an unnecessary copy of
an array for a getter call left the array in a non-unique
state when a subsequent mutation occurred.

Swift SVN r23642
2014-12-03 05:13:11 +00:00
John McCall
b0adca8115 Base prepareAccessorBaseArg's behavior in a more principled
way on whether the accessor consumes its self argument, rather
than a simple type analysis.

Swift SVN r23601
2014-12-01 23:50:00 +00:00
Adrian Prantl
4016c57819 Debug info: Make a store that is part of the initial setup of a frame
variable part of the function prologue by omitting its location.

Fixes <rdar://problem/18989457> Xcode 6.2 6C86C (lldb-320.4.157) : po self returns error: Execution was interrupted, reason: EXC_BAD_ACCESS

Swift SVN r23569
2014-11-24 01:06:18 +00:00
John McCall
df3006f785 Track the unique use of l-value components and avoid
cloning subscript values aggressively.

Swift SVN r23550
2014-11-22 06:17:35 +00:00
John McCall
c47693292f Hide the management of lvalue components inside LValue. NFC.
There's really no reason for this to be exposed.

Swift SVN r23549
2014-11-22 06:17:33 +00:00
Joe Groff
f8dfcaa84e SIL: Consider the original Clang type of a decl before bridging Bool back to ObjCBool.
It's not always correct to map a Swift Bool back to ObjCBool in C land, since Bool could have originally been a proper _Bool. Pass the clang::Decl down to type lowering so we can recognize this. We still don't have a great solution for block types, because there's no decl to refer to, and Swift's user-level type system erases the distinction between void(^)(_Bool) and void(^)(BOOL). However, this is enough to let us start using C APIs that traffic in _Bool.

Swift SVN r23546
2014-11-22 05:21:55 +00:00
Michael Gottesman
1afc987739 Refactor the SILArgument API on SILBasicBlock so we can insert bb arguments anywhere in the argument list. Also clean up the API names so that they all match.
Swift SVN r23543
2014-11-22 00:24:40 +00:00
John McCall
ee66391b54 Evaluate the LHS of an assignment before the RHS.
Many individual LValue evaluations still reflect
broken semantics: for example, the index expression
in a subscript l-value is delayed until the l-value
is actually projected.  But this is a necessary
step in the right direction.

Swift SVN r23532
2014-11-21 21:11:04 +00:00
John McCall
5672a42e46 Ensure that LValues are uniquely used.
Swift SVN r23492
2014-11-20 23:01:15 +00:00
Arnold Schwaighofer
c322b3592d Add a data dependence between opened existential values and method_inst that 'use' them.
Before this patch there was no dependence visible to the optimizer between a
open_existential and the witness_method allowing the optimizer to reorder the
two instruction. The dependence was implicit in the opened archetype but this
is not a concept model by the SIL optimizer.

  %2 = open_existential %0 : $*FooProto to $*@opened("...") FooProto
  %3 = witness_method $@opened("...") FooProto,
                      #FooProto.bar!1 : $@cc(...)
  %4 = apply %3<...>(%2)

This patch changes the SIL representation such that witness_methods on opened
archetypes take the open_existential (or the producer of the opened existential)
as an operand preventing the optimizer from reordering them.

  %2 = open_existential %0 : $*FooProto to $*@opened("...") FooProto
  %3 = witness_method $@opened("...") FooProto,
                      #FooProto.bar!1,
                      %2 : $*@opened("...") FooProto : $@cc(...)
  %4 = apply %3<...>(%2)

rdar://18984526

Swift SVN r23438
2014-11-19 17:22:22 +00:00
Andrew Trick
fd7c8d5627 Silence unused variable warnings.
Swift SVN r23346
2014-11-15 01:10:27 +00:00
Adrian Prantl
5eeba0f112 Pass the decl when constructing SILArguments for captured arguments.
Fixes an assertion found via <rdar://problem/18188980>.

Swift SVN r23164
2014-11-07 21:47:57 +00:00
Manman Ren
a5f251e6e9 [Global Opt] adds emitGlobalGetter in SILGen.
Refactor part of emitGlobalAccessor to emitOnceCall so it can be used
by both emitGlobalGetter and emitGlobalAccessor.

This is the second patch to use global getter for "let" globals.

rdar://16614767


Swift SVN r23107
2014-11-05 00:46:13 +00:00
Adrian Prantl
c41b30299f Audit all SILPasses to ensure that new instructions are never created
without a valid SILDebugScope. An assertion in IRGenSIL prevents future
optimizations from regressing in this regard.
Introducing SILBuilderWithScope and SILBuilderwithPostprocess to ease the
transition.

This patch is large, but mostly mechanical.
<rdar://problem/18494573> Swift: Debugger is not stopping at the set breakpoint

Swift SVN r22978
2014-10-28 01:49:11 +00:00
Joe Groff
db4ff15380 SILGen: Implement partial application of generic methods.
Most of the parts were already here. We mishandled a few edge cases in RValueEmitter because of MemberRefExpr/ApplyExpr confusion at the Sema level, and we artifically asserted that we didn't support this. Removing the assertion and wiring up the existing thunking infrastructure made this just fall out. Fixes rdar://problem/18763738.

Swift SVN r22944
2014-10-26 02:34:26 +00:00
Joe Groff
3f23b82e6d SIL: Rename SILGlobalAddr to GlobalAddr.
All globals are SIL globals now.

Swift SVN r22827
2014-10-18 17:08:28 +00:00
Joe Groff
e3f9a2035c SIL: Move SILGen and passes over to use "builtin" instead of "apply (builtin_function_ref)".
Swift SVN r22785
2014-10-15 23:37:22 +00:00
Chris Lattner
88df3e4aa0 teach SILGenFunction::emitIgnoredExpr to try a bit harder to avoid
emitting LoadExprs (unless they have a side effect that must be 
emitted).  This is good for -O0 code quality in general, but is important
to avoid materializing 'self' values in initializers that semantically
don't have to happen.

This is progress towards fixing: 
<rdar://problem/17207456> Unable to access dynamicType of an object in a class initializer that isn't done

enabling the struct cases.



Swift SVN r22735
2014-10-14 21:32:01 +00:00
Chris Lattner
558439b507 simplify the implementation of emitMetatypeOfValue a bit, NFC.
Swift SVN r22733
2014-10-14 21:06:15 +00:00
Chris Lattner
63d3c8641e Simplify SILGen to always emit the base of a dynamicType expr at +0,
avoiding some retain/releases.  There is nothing that requires a +1
base and the extra retain/release occasionally get in the way.



Swift SVN r22731
2014-10-14 20:48:01 +00:00
Joe Groff
bb46f4bbd9 SIL: Remove the global_addr instruction.
It's no longer needed now that we always lower to SIL globals.

Swift SVN r22693
2014-10-12 17:19:06 +00:00
Devin Coughlin
6ee6f3d751 [SILGen] Add SILGen for potentially unavailable global functions.
Swift SVN r22692
2014-10-11 23:02:10 +00:00
John McCall
89e60f31aa Add protocol witness tables to existential metatype
layouts.  Introduce new SIL instructions to initialize
and open existential metatype values.

Don't actually, y'know, lift any of the restriction on
existential metatypes; just pointlessly burn extra
memory storing them.

Swift SVN r22592
2014-10-08 01:20:13 +00:00
Devin Coughlin
6a04c00f6e Add SILGen for UnavailableToOptionalExpr.
This commit adds SILGen for references to potentially unavailable global
variables. We emit .None if the global variable is not available and
.Some(rvalue) if the global variable is available. I will add SILGen
for references to other kinds of potentially unavailable declarations in a
later commit.


Swift SVN r22556
2014-10-06 23:51:52 +00:00
Joe Groff
a6a68d49cc SILGen: Avoid using a stdlib function to get optional values.
When we've already established that the optional has a value, using unchecked_take_enum_data_addr to directly extract the enum payload is sufficient and avoids a redundant call and check at -Onone. Keep using the _getOptionalValue stdlib function for checked optional wrapping operations such as "x!", so that the stdlib can remain in control of trap handling policy.

The test/SIL/Serialization failures on the bot seem to be happening sporadically independent of this patch, and I can't reproduce failures in any configuration I've tried.

Swift SVN r22537
2014-10-06 15:46:21 +00:00
Joe Groff
069ad18620 Revert "SILGen: Avoid using a stdlib function to get optional values."
This reverts commit r22533. The optimizing bots seem to have problems with it.

Swift SVN r22534
2014-10-06 04:40:58 +00:00
Joe Groff
28805f0d2a SILGen: Avoid using a stdlib function to get optional values.
When we've already established that the optional has a value, using unchecked_take_enum_data_addr to directly extract the enum payload is sufficient and avoids a redundant call and check at -Onone. Keep using the _getOptionalValue stdlib function for checked optional wrapping operations such as "x!", so that the stdlib can remain in control of trap handling policy.

Swift SVN r22533
2014-10-06 04:31:52 +00:00
Joe Groff
cac5807ae2 SILGen: Emit "main" as a SIL function.
Eliminate the intermediate top_level_code function. Now that SIL is expressive enough to express a "main" function, there's no reason for it, and this eliminates a bunch of mystery code in IRGen to thunk from main to top_level_code by reaching for hardcoded symbol names. Demystify the special code for setting up C_ARGC and C_ARGV by having SILGen look for a transparent "_didEnterMain" hook in the stdlib and emit a call to it.

Swift SVN r22525
2014-10-05 04:13:24 +00:00