Commit Graph

1069 Commits

Author SHA1 Message Date
Adrian Prantl
7eeece6cbd Debug Info: Unify the unwrapping of inout/lvalue types. (NFC) 2015-12-04 16:40:52 -08:00
Joe Groff
5e4bb4b96c Merge pull request #207 from mrecachinas/irgensil-assertion
[IRGen] Add assertion to `emitPHINodesForBBArgs`
2015-12-04 14:08:27 -08:00
John McCall
4d1b6e2eb6 Reform the runtime interface for unowned reference-counting.
This is a bit of a hodge-podge of related changes that I decided
weren't quite worth teasing apart:

First, rename the weak{Retain,Release} entrypoints to
unowned{Retain,Release} to better reflect their actual use
from generated code.

Second, standardize the names of the rest of the entrypoints around
unowned{operation}.

Third, standardize IRGen's internal naming scheme and API for
reference-counting so that (1) there are generic functions for
emitting operations using a given reference-counting style and
(2) all operations explicitly call out the kind and style of
reference counting.

Finally, implement a number of new entrypoints for unknown unowned
reference-counting.  These entrypoints use a completely different
and incompatible scheme for working with ObjC references.  The
primary difference is that the new scheme abandons the flawed idea
(which I take responsibility for) that we can simulate an unowned
reference count for ObjC references, and instead moves towards an
address-only scheme when the reference might store an ObjC reference.
(The current implementation is still trivially takable, but that is
not something we should be relying on.)  These will be tested in a
follow-up commit.  For now, we still rely on the bad assumption of
reference-countability.
2015-12-04 13:18:14 -08:00
Mike Recachinas
75ecee2d3c [IRGen] Add assertion to emitPHINodesForBBArgs
Converted the check that the DebugScope `DS` exists and that the
DebugScope's `SILFn` is the same as the `IGF`'s to an assertion
based on the FIXME's suggestion on line 831.
2015-12-04 15:43:30 -05:00
Adrian Prantl
beb0d00758 Remove dead code. 2015-12-04 11:05:27 -08:00
Adrian Prantl
0d300206cd Remove wrapper functions that added little value. (NFC) 2015-12-04 11:05:26 -08:00
Adrian Prantl
7821341542 Add an argument-number field to DebugValueInst and friends.
This commit adds a DebugVariable field that is shared by
- AllocBoxInst
- AllocStackInst
- DebugValueInst
- DebugValueAddrInst
Currently DebugVariable only holds the Swift argument number.

This allows us to retire several expensive heuristics in IRGen that
attempted to identify which local variables actually where arguments
and recover their relative order.

Memory footprint notes:
This commit adds a 4-byte field to 4 SILInstructin subclasses.
This was offset by 8ab1e2dd50
which removed 20 bytes from *every* SILInstruction.

Caveats:
This commit surfaces a known bug in FunctionSigantureOpts, tracked in
rdar://problem/23727705 — debug info for exploded function arguments
cannot be expressed until this is fixed.

This reapplies ed2b16dc5a with a bugfix for
generic function arrguments and an additional testcase.

<rdar://problem/21185379&22705926>
2015-12-03 13:40:35 -08:00
Johan K. Jensen
fa76656c82 Remove instances of duplicated words 2015-12-03 20:00:29 +01:00
Adrian Prantl
2740ad6976 Temporarily Revert "Add an argument-number field to DebugValueInst and friends."
while investigating buildbot breakage.

This reverts commit ed2b16dc5a.
2015-12-02 19:10:05 -08:00
Adrian Prantl
ed2b16dc5a Add an argument-number field to DebugValueInst and friends.
This commit adds a DebugVariable field that is shared by
- AllocBoxInst
- AllocStackInst
- DebugValueInst
- DebugValueAddrInst
Currently DebugVariable only holds the Swift argument number.

This allows us to retire several expensive heuristics in IRGen that
attempted to identify which local variables actually where arguments
and recover their relative order.

Memory footprint notes:
This commit adds a 4-byte field to 4 SILInstructin subclasses.
This was offset by 8ab1e2dd50
which removed 20 bytes from *every* SILInstruction.

Caveats:
This commit surfaces a known bug in FunctionSigantureOpts, tracked in
rdar://problem/23727705 — debug info for exploded function arguments
cannot be expressed until this is fixed.

<rdar://problem/21185379&22705926>
2015-12-02 18:33:07 -08:00
Roman Levenstein
378442185f Merge a switch case into the identical case block below. NFC. 2015-12-01 21:27:50 -08:00
Roman Levenstein
5cc14abb82 [sil-devirtualizer] Improve devirtualization of witness_method instructions.
Handle such cases like partial applications of witness methods and applications of witness methods with substitutions.

Some of these uses-cases occur when there is a protocol defining an operator, a generic struct conforming to this protocol, and the operator conformance of this struct is expressed as a global function.
2015-12-01 14:49:47 -08:00
David Farler
fbbb593b1c IRGen: Lower super_method SIL instruction for native classes
This is the first part of making class method dispatch resilient.

If we have the following class hierarchy:

    // Module A
    class Parent {
      func foo() {}
    }

    class Child : Parent {}

    // Module B
    class Grandchild : Child {
      override func foo() {
        super.foo()
      }
    }

dispatch to `Parent.foo` will be static via a `function_ref`, so if
someone adds a `foo()` to `Child` later on, `Grandchild` won't know
about it without recompiling.

Stage in the IRGen portion of dynamic dispatch when calling methods on
`super`:

- Don't assert in IRGen if we see a native super_method instruction.
- Perform virtual lookup on superclass's metadata. If we see a
  `super_method` instruction for a native class:
  - Get the address of the superclass's metadata at offset 1
  - Load the superclass's metadata
  - Perform virtual lookup on this metadata instead

TODO: SILGen super_method instructions for native classes.
TODO: Devirtualize back down to static dispatch with a reslience lookup
mechanism.

rdar://problem/22749732
2015-11-30 21:19:06 -08:00
Slava Pestov
e6d35f29f2 Fix typos I noticed in IRGen and SILGen, NFC 2015-11-30 13:32:55 -08:00
Adrian Prantl
f40d28f402 Debug Info: Don't reset the debug scope after leaving the outermost scope,
because the debugger is not expecting the function epilogue to
be in a different scope.

rdar://problem/23621232
2015-11-19 17:41:51 -08:00
Adrian Prantl
8ab1e2dd50 Unify debug scope and location handling in SILInstruction and SILBuilder.
The drivers for this change are providing a simpler API to SIL pass
authors, having a more efficient of the in-memory representation,
and ruling out an entire class of common bugs that usually result
in hard-to-debug backend crashes.

Summary
-------

SILInstruction

Old                   New
+---------------+     +------------------+    +-----------------+
|SILInstruction |     |SILInstruction    |    |SILDebugLocation |
+---------------+     +------------------+    +-----------------+
| ...           |     | ...              |    | ...             |
|SILLocation    |     |SILDebugLocation *| -> |SILLocation      |
|SILDebugScope *|     +------------------+    |SILDebugScope *  |
+---------------+                             +-----------------+

We’re introducing a new class SILDebugLocation which represents the
combination of a SILLocation and a SILDebugScope.
Instead of storing an inline SILLocation and a SILDebugScope pointer,
SILInstruction now only has one SILDebugLocation pointer. The APIs of
SILBuilder and SILDebugLocation guarantees that every SILInstruction
has a nonempty SILDebugScope.

Developer-visible changes include:

SILBuilder
----------

In the old design SILBuilder populated the InsertedInstrs list to
allow setting the debug scopes of all built instructions in bulk
at the very end (as the responsibility of the user). In the new design,
SILBuilder now carries a "current debug scope" state and immediately
sets the debug scope when an instruction is inserted.
This fixes a use-after-free issue with with SIL passes that delete
instructions before destroying the SILBuilder that created them.

Because of this, SILBuilderWithScopes no longer needs to be a template,
which simplifies its call sites.

SILInstruction
--------------

It is neither possible or necessary to manually call setDebugScope()
on a SILInstruction any more. The function still exists as a private
method, but is only used when splicing instructions from one function
to another.

Efficiency
----------

In addition to dropping 20 bytes from each SILInstruction,
SILDebugLocations are now allocated in the SILModule's bump pointer
allocator and are uniqued by SILBuilder. Unfortunately repeat compiles
of the standard library already vary by about 5% so I couldn’t yet
produce reliable numbers for how much this saves overall.

rdar://problem/22017421
2015-11-19 09:31:26 -08:00
Michael Gottesman
9fb54bf4bf Fix for upstream ilist changes. 2015-11-11 16:07:41 -08:00
Adrian Prantl
098c07957e Debug Info: Don't skip updating IRGenDebugInfo's current location for SILLocations that are marked as prologue. IRGenDebugInfo will handle them correctly anyway and if the instruction with the prologue location originates from an inlined function, this would result in dropping debug location information.
rdar://problem/23288366
2015-11-10 10:24:57 -08:00
Argyrios Kyrtzidis
f0f83d32c2 Fix -Wunused-function warnings. 2015-11-05 19:04:10 -08:00
Erik Eckstein
5067dad4dc IRGen: create end-of-lifetime intrinsics for dealloc_ref [stack] 2015-11-04 12:50:50 -08:00
Erik Eckstein
68fa1c2c34 Support for stack promotion in IRGen.
This means: handling of alloc_ref [stack].
It can be configured with two new options. See Option/FrontendOptions.td.

As the [stack] attribute is not generated yet, there should be NFC.




Swift SVN r32929
2015-10-28 00:44:25 +00:00
Adrian Prantl
2f9f964219 Change the contract between Swift compiler and LLDB about how the function
prologue is handled in the line table.
We now mark the first instruction after the stack setup as end_prologue and
any further initilizations (which may include function calls to metadata
accessors) with line 0 which lldb will skip. This allows swiftc to emit
debug info for compiler-generated functions such as metadata accessors.
Mixing debug and non-debug functions is not very well supported by LLVM
and the resulting line table makes it impossible for LLDB to determine
where a function with debug info ends and a nondebug function starts.

rdar://problem/23042642

Swift SVN r32816
2015-10-22 00:20:03 +00:00
Slava Pestov
76f1168adf Remove dealloc_ref's [constructor] form since its no longer needed
Swift SVN r32688
2015-10-14 22:50:09 +00:00
Slava Pestov
7cc59e01d7 SIL: Add DeallocPartialRefInst
This instruction destroys instance variables in a partially-initialized
object, then frees it.

Swift SVN r32661
2015-10-13 19:56:20 +00:00
Slava Pestov
090d723763 SIL: Remove null_class instruction
Swift SVN r32605
2015-10-11 02:11:22 +00:00
Andrew Trick
c20370a664 Remove the last remnants of unchecked_ref_bit_cast
Swift SVN r32598
2015-10-10 05:42:57 +00:00
Andrew Trick
57a450b28f Generate unchecked_ref_cast, not unchecked_ref_bit_cast.
This improves support for promoting to and generating
unchecked_ref_cast so we no longer need unchecked_ref_bit_cast, which
will just go away in the next commit.

Swift SVN r32597
2015-10-10 05:42:53 +00:00
Andrew Trick
665e5169d5 Add unchecked_ref_cast_addr SIL instruction.
Swift SVN r32587
2015-10-10 03:39:32 +00:00
John McCall
a945bacc6b Split GenProto.cpp into three files; NFC.
- GenProto.cpp for protocols and protocol conformances
  - GenExistential.cpp for existential type layout and operations
  - GenArchetype.cpp for archetype type layout and operations

Swift SVN r32493
2015-10-07 18:41:12 +00:00
Adrian Prantl
5e14a906b4 Re-enable the SIL Verifier for debug scopes of debug instrinsics.
Swift SVN r32064
2015-09-18 03:05:07 +00:00
Adrian Prantl
2f6f4a2a4a Add a workaround to not produce local variables for
capture list arguments like "[weak self]". The better solution
would be to require all variables to be described with a
SILDebugValue(Addr) and then not describe capture list
arguments (tracked in rdar://21185379).

rdar://problem/22702122

Swift SVN r31963
2015-09-15 18:36:42 +00:00
Nadav Rotem
16bd644825 [IRGen] Remove an extra null comparison in 'exact' checked_cast_br.
rdar://22666588

This change removes a comparison and a branch on every virtual call. Before this
change we were generating code for comparing the metadata to figure out if the
incoming instance is an 'exact' cast, and then we checked if the result of the
cast was zero. This is unnecessary because we can simply reuse the result of the
exact metadata comparison. Moreover, we know that the metadata instance can't be
zero because we've emitted a load to that address that did not trap.

  %1 = getelementptr inbounds %C4main1X, %C4main1X* %0 ...
  %.metadata = load %swift.type*, %swift.type** %1  // Loading %0
  %2 = icmp eq %swift.type* %.metadata, bitcast (...)
  %3 = icmp ne %C4main1X* %0, null   ; <-----------  %0 can't be null.
  %4 = and i1 %3, %2
  br i1 %4, label %5, label %7

Swift SVN r31920
2015-09-12 05:10:53 +00:00
Slava Pestov
1628bfc3e2 SIL: Split dealloc_ref into [constructor] and [destructor] kinds
dealloc_ref [destructor] is the existing behavior. It expects the
reference count to have reached zero and the isDeallocating bit to
be set.

The new [constructor] variant first drops the initial strong
reference.

This allows DI to properly free uninitialized instances in
constructors. Previously this would fail with an assertion if the
runtime was built with debugging enabled.

Progress on <rdar://problem/21991742>.

Swift SVN r31142
2015-08-11 18:38:00 +00:00
Erik Eckstein
d9a5ee364c IRGen: clear error slot only in errorblock
In the non-error case it is null anyway.
This increases the chances that the store can be removed by dead-store-elimination in llvm.



Swift SVN r31127
2015-08-10 21:41:10 +00:00
Roman Levenstein
92246b30d1 [irgen] Support static initializers for tuples.
Nothing very spectacular here. Almost the same logic, as we do for structs.

Swift SVN r30238
2015-07-15 23:40:10 +00:00
Andrew Trick
5a16f5de4d Allow Builtin.isUnique to take implicitly unwrapped optional for completeness.
Swift SVN r30171
2015-07-13 22:46:15 +00:00
Adrian Prantl
82295e6bf8 Revert "Debug Info: Shadow-copied debug_value_addr instructions need an extra"
This reverts commit r30041. Contrary to previous radars lldb is happier
without it.

Swift SVN r30094
2015-07-10 22:09:19 +00:00
Adrian Prantl
a6341c08ed Debug Info: Shadow-copied debug_value_addr instructions need an extra
indirection.

rdar://problem/21749451

Swift SVN r30041
2015-07-09 21:40:41 +00:00
Adrian Prantl
85c8f4f181 Emit -Onone shadow copies for debug_value_addr instructions.
<rdar://problem/21710192> Not emitting shadow copies for debug_value_addr

Swift SVN r29986
2015-07-08 19:49:26 +00:00
Doug Gregor
3023a710fc Split TypeBase::isDependentType() into isTypeParameter() and hasTypeParameter().
The isDependentType() query is woefully misunderstood. Some places
seem to want it to mean "a generic type parameter of dependent member
type", which corresponds to what is effectively a type parameter in
the language, while others want it to mean "contains a type parameter
anywhere in the type". Tease out these two meanings in
isTypeParameter() and hasTypeParameter(), respectively, and sort out
the callers.

Swift SVN r29945
2015-07-07 21:20:54 +00:00
Joe Groff
9bdac157d2 SIL: Remove EnableTypedBoxes staging option.
Swift SVN r29762
2015-06-27 18:10:12 +00:00
Joe Groff
8a04d67408 IRGen: Strip out dead code for untyped boxes.
Swift SVN r29761
2015-06-27 17:50:13 +00:00
Slava Pestov
c033da92a4 IRGen: Implement emission of ExistentialMetatypeInst for boxed existentials
This is based on code from emitMetatypeOfOpaqueExistential() and
emitBoxedExistentialProjection().

Fixes <rdar://problem/21498036>.

Swift SVN r29735
2015-06-26 07:29:52 +00:00
Dmitri Hrybenko
2fc1cbe8c1 Adjust to the new IRBuilder APIs
Swift SVN r29692
2015-06-25 22:01:24 +00:00
Andrew Trick
a32a0af02b Allow unchecked_trivial_bit_cast to cast to smaller types.
I'm sure this is totally safe, why wouldn't it be?

Fixes <rdar://problem/21095584> Swift: UnsafePointer on tuple works in
debug but compiles crashing binary in release

Swift SVN r29614
2015-06-24 20:25:15 +00:00
Joe Groff
3c2ee54d43 IRGen: Implementation of typed box operations.
When producing TypeInfo for a box, try to reuse instantiations for common type structures:

- any POD type with the same stride and alignment can share a fixed HeapLayout;
- any single-refcounted-pointer type can share a fixed HeapLayout with types that have the same ReferenceCounting;
- dynamically-sized types can share a runtime-based box implementation.

For the runtime implementation, use new to-be-implemented variants of allocBox/deallocBox that will produce polymorphically-projectable boxes using instantiated metadata.

Swift SVN r29612
2015-06-24 19:43:24 +00:00
Adrian Prantl
c34d71ac85 Debug Info: Ensure that shadow copies for arguments also described by
debug_value intrinsics are only emitted once.

rdar://problem/21450456

Swift SVN r29532
2015-06-20 01:08:12 +00:00
Andrew Trick
7565a65235 Introduce unchecked_bitwise_cast SIL instruction.
We need a SIL level unsafe cast that supports arbitrary usage of
UnsafePointer, generalizes Builtin.reinterpretCast, and has the same
semantics on generic vs. nongeneric code. In other words, we need to
be able to promote the cast of an address type to the cast of an
object type without changing semantics, and that cast needs to support
types that are not layout identical.

This patch introduces an unchecked_bitwise_cast instruction for that
purpose. It is different from unsafe_addr_cast, which has been our
fall-back "unknown" cast in the past. With unchecked_bitwise_cast we
cannot assume layout or RC identity. The cast implies a store and
reload of the value to obtain the low order bytes. I know that
bit_cast is just an abbreviation for bitwise_cast, but we use
"bitcast" throught to imply copying a same sized value. No one could
come up with a better name for copying an objects low bytes via:

  @addr = alloca $wideTy
    store @addr, $wideTy
      load  @addr, $narrowTy

Followup patches will optimize unchecked_bitwise_cast into more
semantically useful unchecked casts when enough type information is
present. This way, the optimizer will rarely need to be taught about
the bitwise case.

Swift SVN r29510
2015-06-19 16:29:35 +00:00
Joe Groff
821b0f488e SIL: Add a project_box insn to project the address of the value from a box.
Still no implementation yet; we'll need to renovate how boxes work a bit to make them projectable (and renovate SILGen to generate typed boxes for the insn to be useful).

Swift SVN r29490
2015-06-18 15:47:22 +00:00
Mark Lacey
f56ca1ed68 Revert "SIL: Add a project_box insn to project the address of the value from a box."
This reverts commit r29475 because it conflicts with reverting r29474,
and it looks like that commit is breaking the build of the SpriteKit
overlay.

Swift SVN r29481
2015-06-18 06:27:52 +00:00