Commit Graph

1312 Commits

Author SHA1 Message Date
John McCall
43f28f4aa9 Split SIL emission for builtin functions into its own file.
NFC for now, but I've also added the infrastructure to allow
"early emission", i.e. emission directly from the original
RValueSource, which can be useful either as an optimization
(e.g. for Builtin.initialize) or a requirement for particularly
hacky SIL intrinsics should we need them (and I'm thinking of
needing one).

Swift SVN r23953
2014-12-16 02:02:54 +00:00
Chris Lattner
a048b078e3 Implement: <rdar://problem/16181314> don't require immediate initialization of 'let' values
... now that we have an exquisitely shaved yak.

This provides a simple and uniform model for "let" constants: they are always either
immediately initialized in their declaration, or they are initialized dynamically
exactly once before any use.  

This is a simple generalization of our current model for initializers, but enables
the use of let constants in more cases in local context, e.g. patterns like this:

   let x : SomeThing

   if condition {
     x = foo()
   } else {
     x = bar()
   }
   use(x)

Previously this would have to be declared a "var" for no good reason: the value is
only ever initialized, never actually mutated.

The implementation of this is reasonably straight-forward now that the infrastructure
is in place: Sema treats 'let' constants as "settable" if they lack an initializer
(either in the declaration or in a non-PBD binding).  This exposes them as an lvalue
at the AST level.  SILGen then lowers these things to an alloc_stack, and DI enforces
the "initialization only" requirement that it already enforces for uninitialized 'let'
properties in structs/classes.



Swift SVN r23916
2014-12-13 07:17:44 +00:00
Erik Eckstein
14af3a57e8 Enable elimination of dead methods which are in classes of higher visibility.
The underlying problem is that e.g. even if a method is private but its class is public, the method can be referenced from another module - from the vtable of a derived class.
So far we handled this by setting the SILLinkage of such methods according to the visibility of the class. But this prevented dead method elimination.
Now I set the SILLinkage according to the visibility of the method. This enables dead method elimination, but it requires the following:
1) Still set the linkage in llvm so that it can be referenced from outside.
2) If the method is dead and eliminated, create a stub for it (which calls swift_reportMissingMethod).



Swift SVN r23889
2014-12-12 17:35:40 +00:00
Chris Lattner
e2da1224d6 generalize and clean up the logic in LetValueInitialization to be easier to follow,
paving the way for future progress.


Swift SVN r23875
2014-12-12 01:14:43 +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
9662c65938 tidy up some code weirdisms that John pointed out, NFC.
Swift SVN r23867
2014-12-11 21:14:36 +00:00
Chris Lattner
4618e7d2fb remove some now-dead code. This computation is now done based on
SIL function types, not on AST types.


Swift SVN r23865
2014-12-11 20:43:37 +00:00
Chris Lattner
d844671de5 Revise our AST to represent the self argument of a non-mutating protocol method
as passing self by value, not by inout.  This is the correct representation at
the AST level, and we now lower self references as the new @in_guaranteed
parameter convention.  This allows SIL clients (like DI) to know that a nonmutating
protocol method does not mutate the pointee passed into the method.

This fixes:
<rdar://problem/19215313> let properties don't work with protocol method dispatch
<rdar://problem/15821762> Self argument of generic curried nonmutating instance methods is inout



Swift SVN r23864
2014-12-11 20:41:37 +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
Joe Groff
90651fcdd6 Clang importer: Preserve unknown NS_ENUM values through raw value conversions.
We can't reliably reject raw values in an NS_ENUM's init(rawValue:), because the enum may have SPI or future values we don't statically know about. Fixes https://twitter.com/autorelease/status/524698585406124033

Swift SVN r23817
2014-12-09 23:33:42 +00:00
Chris Lattner
674a50df2f refactor how "getPathStringToElement" in DI works, to clean it up and simplify
clients.  NFC except for slightly better diagnostic in .sil testcases.  


Swift SVN r23809
2014-12-09 17:51:06 +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
9b9720be8b Don't try to emit SIL for external definitions that
haven't been type-checked.

Deserialization and so on can cause the creation of
synthetic external definitions after the type-checker
has finished processing.  I hope we don't need them?
This really doesn't seem like the right fix, but the
alternative is a non-deterministic crash when emitting
a function body with no types.  I haven't figured out
why it's non-deterministic.

Speculatively committing this while awaiting local
test suite verification.

Swift SVN r23734
2014-12-05 08:25:14 +00:00
John McCall
b376264442 Bind mark_dependence as Builtin.markDependence.
Swift SVN r23707
2014-12-05 00:38:03 +00:00
John McCall
dd07c8ca10 Add 'mark_dependence', which indicates that an address
or pointer depends on another for validity in a
non-obvious way.

Also, document some basic value-propagation rules
based roughly on the optimization rules for ARC.

Swift SVN r23695
2014-12-04 22:38:09 +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
Michael Gottesman
85e2502f96 Pass in SILOptions to SILModule.
This should have been done a long time ago since SILOptions are options that
should be able to effect everything SIL related. In this case I just want to
pass in a flag on the SILModule to enable +0 self. By putting it on the
SILModule I can conveniently check it in SILFunctionType without exposing any
internal state from SILFunctionType.cpp.

Swift SVN r23647
2014-12-03 07:43:52 +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
Michael Gottesman
dedebe5f0d [silgen] Emit guaranteed arguments as managed retains.
This means that even though the guaranteed parameter comes in at +0, we
immediately retain it and add a cleanup handler at the end of the function. Once
+0 self has been turned on, I will add a guaranteed optimization that removes
such retains, releases.

Tests will follow with the commit that enables the actual +0 self parameter.

Swift SVN r23627
2014-12-03 01:43:28 +00:00
Michael Gottesman
5bfdc670ad [silgen] Move EmitBBArguments into SILGenDecl.cpp since that is the only place it is used and remove the resulting dead methods.
This was done at John's request.

Swift SVN r23623
2014-12-02 23:58:42 +00:00
Michael Gottesman
61f4f28fca Remove trailing whitespace. NFC.
Swift SVN r23622
2014-12-02 23:46:41 +00:00
John McCall
a884e045c4 Bind optional l-values during their formal evaluation.
Previously, we were binding optional l-values only when
performing an access.  This meant that other evaluations
emitted before the formal access were not being
short-circuited, even if the language rules said they
should be.  For example, consider this code::

  var array : [Int]? = ...
  array?[foo()] = bar()

Neither foo nor bar should be called if the array is
actually nil, because those calls are sequenced after
the optional-chaining operator ?.

The way that we currently do this is to project out
the optional address during formal evaluation.  This
means that there's a formal access to that storage
beginning with the formal evaluation of the l-value
and lasting until the operation is complete.  That's
a little controversial, because it means that other
formal accesses during that time to the optional
storage will have unspecified behavior according to
the rules I laid out in the accessors proposal; we
should talk about it and make a decision about
whether we're okay with this behavior.  But for now,
it's important to at least get the right short-circuiting
behavior from ?.

Swift SVN r23608
2014-12-02 01:16:53 +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
Michael Gottesman
abef8c9999 Remove trailing whitespace. NFC.
Swift SVN r23589
2014-12-01 01:49:50 +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
80d0ab3762 Evaluate subscript index expressions during the formal
evaluation of the l-value, not lazily at the first point
of access.

Swift SVN r23542
2014-11-22 00:21:29 +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
Jordan Rose
5c8803a5c4 Remove the last uses of UnqualifiedLookup::forModuleAndName.
This API didn't take accessibility into account in a useful way, and
usually did a more general search than what was actually needed. We've
gradually been replacing uses of it with either more safe or more direct
APIs, including a regular UnqualifiedLookup, DeclContext::lookupQualified,
or Module::lookupValue. Now it's gone.

No functionality change.

Swift SVN r23449
2014-11-19 22:28:32 +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
Greg Parker
eef633d732 Replace assert(0) with llvm_unreachable() or llvm::report_fatal_error().
Swift SVN r23340
2014-11-15 00:24:32 +00:00
Joe Groff
055e8671a0 SILGen: Fix memory leak when casting from address-only to loadable trivial type.
The result does not carry a meaningful cleanup when trivial. Fixes rdar://problem/18936388.

Swift SVN r23284
2014-11-12 21:03:15 +00:00
Joe Groff
b73b22a179 Remove meaningless code.
Swift SVN r23278
2014-11-12 18:13:40 +00:00
Joe Groff
aa3f35c28d Don't consider DynamicTypeExpr or MetatypeConversionExpr to produce a statically derived metatype.
Though the value may be statically known in some cases, that isn't good enough to do what we try to do with this information. In particular, if we invoke a class method on a MetatypeConversion, we want to dispatch to the method of the original metatype, not statically call the method of the converted type, which is what is evident in the AST. Fixes rdar://problem/18877135.

Swift SVN r23277
2014-11-12 18:10:31 +00:00
Joe Groff
4b2097c9f4 SILGen: Include overrides of required allocating initializers in the vtable.
Part of fixing rdar://problem/18877135.

Swift SVN r23271
2014-11-12 17:36:55 +00:00
Adrian Prantl
0c21c4da07 Expose ExitableFullExpr scopes to the debug info, so variables declared in
patterns show up in their own scopes, and the same variable name can be
reused in consecutive patterns.

<rdar://problem/15187441> Implement local variable debug scoping for variables declared in patterns

Swift SVN r23251
2014-11-11 23:27:43 +00:00
Joe Groff
976d1db2f8 SILGen: Don't leak BridgeObjects when we cast their bit patterns.
Fixes rdar://problem/18925836.

Swift SVN r23240
2014-11-11 19:16:14 +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
f2658bf152 SILGen: Use select_enum_addr instead of a library function for "does optional have value" queries.
Thanks Arnold for fixing the crashes this exposed in the perf suite.

Swift SVN r22954
2014-10-26 22:34:23 +00:00
Joe Groff
e7287289e4 SILGen: Redispatch protocol class method and init requirements.
Fixes a bug where dynamic dispatches of class methods or initializers through generic interfaces didn't redispatch to subclasses. Also fix up some logic errors noticed by inspection.

Swift SVN r22945
2014-10-26 04:37:59 +00:00