Commit Graph

3719 Commits

Author SHA1 Message Date
Ellis Hoag
a9765e9b68 Reduce breaks in CodeView linetables
Summary:
CodeView does not recognize zero as an artificial line location
and so a line location of zero causes unexpected behavior when
stepping through user code. If we find a line location of zero
and our scope has not changed, we use the most recent debug
location. That is expected to be the user code that most likely
relates to the current instruction and is similar to the behavior
in LLDB.

Test Plan:
test/DebugInfo/linetable-codeview.swift
2018-08-01 10:40:33 -07:00
Michael Gottesman
cc727062c0 [sil-parse] Create SILParserFunctionBuilder and use it when parsing.
This allowed me to fold all of the weird direct calls to createFunction into a
singular createFunctionForForwardReference. This is the only API that is needed
by the SILParser so only providing that gives us a significantly cleaner API.

rdar://42301529
2018-08-01 08:54:54 -07:00
swift-ci
72304d7b4a Merge remote-tracking branch 'origin/master' into master-next 2018-08-01 07:29:57 -07:00
adrian-prantl
796489960f Merge pull request #18366 from adrian-prantl/28859432
Add debug info support for inlined and specialized generic variables.
2018-08-01 07:19:01 -07:00
swift-ci
c7b52aaea9 Merge remote-tracking branch 'origin/master' into master-next 2018-08-01 00:28:53 -07:00
eeckstein
af3765e95b Revert "Reduce breaks in Codeview linetables" 2018-07-31 22:28:43 -07:00
swift-ci
bf137ae65b Merge remote-tracking branch 'origin/master' into master-next 2018-07-31 18:59:26 -07:00
Andrew Trick
06d0973ebe Merge pull request #18315 from atrick/fix-argument-convention
Fix several incorrect uses of ApplySite::getArgumentConvention.
2018-07-31 18:09:54 -07:00
Adrian Prantl
58475ef1ad Add debug info support for inlined and specialized generic variables.
This patch adds SIL-level debug info support for variables whose
static type is rewritten by an optimizer transformation. When a
function is (generic-)specialized or inlined, the static types of
inlined variables my change as they are remapped into the generic
environment of the inlined call site. With this patch all inlined
SILDebugScopes that point to functions with a generic signature are
recursively rewritten to point to clones of the original function with
new unique mangled names. The new mangled names consist of the old
mangled names plus the new substituions, similar (or exactly,
respectively) to how generic specialization is handled.

On libSwiftCore.dylib (x86_64), this yields a 17% increase in unique
source vars and a ~24% increase in variables with a debug location.

rdar://problem/28859432
rdar://problem/34526036
2018-07-31 16:59:56 -07:00
swift-ci
100bec92a7 Merge remote-tracking branch 'origin/master' into master-next 2018-07-31 11:09:58 -07:00
adrian-prantl
4201f9c37b Merge pull request #18312 from sparkasaurusRex/codeview-linetables
Reduce breaks in Codeview linetables
2018-07-31 11:04:02 -07:00
swift-ci
36db31171c Merge pull request #18332 from gottesmm/pr-83e3bf21976ea8978e84c112a248c97ead2b1381 2018-07-31 11:00:31 -07:00
Mingsheng Hong
9cb7f494fa Merge branch 'master' of github.com:apple/swift into master_bytes_string 2018-07-31 10:59:06 -07:00
Michael Gottesman
11b24415c1 [sil-module] Create SILFunctionBuilder and hide creation/erasing functions on SILModule.
This commit does not modify those APIs or their usage. It just:

1. Moves the APIs onto SILFunctionBuilder and makes SILFunctionBuilder a friend
   of SILModule.
2. Hides the APIs on SILModule so all users need to use SILFunctionBuilder to
   create/destroy functions.

I am doing this in order to allow for adding/removing function notifications to
be enforced via the type system in the SILOptimizer. In the process of finishing
off CallerAnalysis for FSO, I discovered that we were not doing this everywhere
we need to. After considering various other options such as:

1. Verifying after all passes that the notifications were sent correctly and
   asserting. Turned out to be expensive.
2. Putting a callback in SILModule. This would add an unnecessary virtual call.

I realized that by using a builder we can:

1. Enforce that users of SILFunctionBuilder can only construct composed function
   builders by making the composed function builder's friends of
   SILFunctionBuilder (notice I did not use the word subclass, I am talking
   about a pure composition).
2. Refactor a huge amount of code in SILOpt/SILGen that involve function
   creation onto a SILGenFunctionBuilder/SILOptFunctionBuilder struct. Many of
   the SILFunction creation code in question are straight up copies of each
   other with small variations. A builder would be a great way to simplify that
   code.
3. Reduce the size of SILModule.cpp by 25% from ~30k -> ~23k making the whole
   file easier to read.

NOTE: In this commit, I do not hide the constructor of SILFunctionBuilder since
I have not created the derived builder structs yet. Once I have created those in
a subsequent commit, I will hide that constructor.

rdar://42301529
2018-07-31 10:04:03 -07:00
swift-ci
45338c78ba Merge remote-tracking branch 'origin/master' into master-next 2018-07-30 15:49:06 -07:00
Andrew Trick
e3f5de90ac [Exclusivity] fix diagnostics for conditional noescape closures.
Add support to static diagnostics for tracking noescape closures through block
arguments.

Improve the noescape closure SIL verification logic to match. Cleanup noescape
closure handling in both diagnostics and SIL verification to be more
robust--they must perfectly match each other.

Fixes <rdar://problem/42560459> [Exclusivity] Failure to statically diagnose a
conflict when passing conditional noescape closures.

Initially reported in [SR-8266] Compiler crash when checking exclusivity of
inout alias.

Example:

struct S {
  var x: Int

  mutating func takeNoescapeClosure(_ f: ()->()) { f() }

  mutating func testNoescapePartialApplyPhiUse(z : Bool) {
    func f1() {
      x = 1 // expected-note {{conflicting access is here}}
    }
    func f2() {
      x = 1 // expected-note {{conflicting access is here}}
    }
    takeNoescapeClosure(z ? f1 : f2)
    // expected-error@-1 2 {{overlapping accesses to 'self', but modification requires exclusive access; consider copying to a local variable}}
  }
}
2018-07-30 14:42:30 -07:00
Andrew Trick
a349133347 Added getArgForOperand for BranchInst and CondBranchInst.
Allows a SIL pass to follow a def-use chain through phis.

Other terminators can also propagate values through block arguments, but they
always need special handling.
2018-07-30 14:42:30 -07:00
Andrew Trick
89ed064808 Fix several incorrect uses of ApplySite::getArgumentConvention.
At least most of these were latent bugs since the code was
unreachable in the PartialApply case. But that's no excuse to misuse
the API.

Also, whenever referring to an integer index, be explicit about
whether it is an applied argument or callee argument.
2018-07-28 00:05:40 -07:00
Ellis Hoag
0c2ca3d6a0 Reduce breaks in Codeview linetables
Summary:
CodeView does not recognize zero as an artificial line location
and so a line location of zero causes unexpected behavior when
stepping through user code. If we find a line location of zero
and our scope has not changed, we use the most recent debug
location. That is expected to be the user code that most likely
relates to the current instruction and is similar to the behavior
in LLDB.

Test Plan:
test/DebugInfo/linetable-codeview.swift
2018-07-27 15:52:15 -07:00
swift-ci
b3a5a0d26b Merge remote-tracking branch 'origin/master' into master-next 2018-07-27 14:09:05 -07:00
swift-ci
ef67c04069 Merge pull request #18298 from gottesmm/pr-63201f6defe3bef8bacee00a498d76c352c1e389 2018-07-27 14:04:28 -07:00
Michael Gottesman
4c5620ae94 [sil-module] Eliminate some style inconsistencies. NFC. 2018-07-27 13:14:47 -07:00
swift-ci
fbc52103e6 Merge remote-tracking branch 'origin/master' into master-next 2018-07-27 13:09:06 -07:00
Mingsheng Hong
ba38bcb279 Introduce a new 'bytes' form of the string_literal SIL instruction. Have it
print and parse as a stable hexadecimal form that isn't interpreted as UTF8.

One use case is in representing serialized protobuf strings (as in the
tensorflow branch: f7ed452eba/lib/SILOptimizer/Mandatory/TFPartition.cpp (L3875)).

The original work was done by @lattner and merged into the tensorflow
branch. This PR is to upstream those changes.
2018-07-27 11:58:00 -07:00
Andrew Trick
4a283be626 [nfc] ApplySite argument APIs: cleanup and add comments.
Use consistent terminology, clarify comments, and group APIs.
This matches the documentation in SILDevelopment.md.
2018-07-27 11:18:35 -07:00
swift-ci
685b007c3f Merge remote-tracking branch 'origin/master' into master-next 2018-07-23 20:39:45 -07:00
John McCall
7a4aeed570 Implement generalized accessors using yield-once coroutines.
For now, the accessors have been underscored as `_read` and `_modify`.
I'll prepare an evolution proposal for this feature which should allow
us to remove the underscores or, y'know, rename them to `purple` and
`lettuce`.

`_read` accessors do not make any effort yet to avoid copying the
value being yielded.  I'll work on it in follow-up patches.

Opaque accesses to properties and subscripts defined with `_modify`
accessors will use an inefficient `materializeForSet` pattern that
materializes the value to a temporary instead of accessing it in-place.
That will be fixed by migrating to `modify` over `materializeForSet`,
which is next up after the `read` optimizations.

SIL ownership verification doesn't pass yet for the test cases here
because of a general fault in SILGen where borrows can outlive their
borrowed value due to being cleaned up on the general cleanup stack
when the borrowed value is cleaned up on the formal-access stack.
Michael, Andy, and I discussed various ways to fix this, but it seems
clear to me that it's not in any way specific to coroutine accesses.

rdar://35399664
2018-07-23 18:59:58 -04:00
swift-ci
2d5e32164c Merge remote-tracking branch 'origin/master' into master-next 2018-07-20 10:10:08 -07:00
Davide Italiano
dc85c0a469 Merge pull request #17426 from sparkasaurusRex/codeview-linetables
[IRGen] Fix debug locations to work well with CodeView
2018-07-20 09:54:31 -07:00
Bob Wilson
61fd167cf7 Merge remote-tracking branch 'origin/master' into master-next 2018-07-19 15:58:02 -07:00
Erik Eckstein
7d8835354b ClosureSpecializer: extend the benefit-analysis so that specialization is also done in case a closure is passed through multiple call-levels.
This fixes a performance regression for stdlib's sort.

SR-8267
rdar://problem/42246895
2018-07-19 09:59:52 -07:00
Ellis Hoag
8200916129 Fix debug locations to work well with CodeView
Summary:
There are a few problems with how Swift currently emits location
information for CodeView.

1. WinDbg does not work well with column information so all column
locations must be set to zero.

2. Some instructions, e.g., ``a + b``,  will emit ``@llvm.trap()``
and ``unreachable``. Those instructions should have artificial
locations, i.e., they should have a line location of zero.

3. Some instructions, e.g., ``a / b``, will emit ``unreachable``
sandwiched between other code for that instruction. This makes
WinDbg confused and it cannot decide which set of instructions
to break on. Those instructions should have the same line location
as the others.

4. There are several prologue instructions with artificial line
locations that create breaks in the linetables. Those instructions
should have valid line locations, usually at the start of the
function.

5. Case bodies have cleanup instructions with artificial line
locations unless it has a ``do`` block. Those locations should
be the last line in the case block.

Test Plan:
test/DebugInfo/basic.swift
test/DebugInfo/columns.swift
test/DebugInfo/linetable-codeview.swift
test/DebugInfo/line-directive-codeview.swift
2018-07-18 09:54:19 -07:00
swift-ci
f6db5924b4 Merge remote-tracking branch 'origin/master' into master-next 2018-07-17 10:49:36 -07:00
swift-ci
82f3e66c40 Merge pull request #18003 from apple/remove-qualifier 2018-07-17 10:42:04 -07:00
swift-ci
5d2c43f626 Merge remote-tracking branch 'origin/master' into master-next 2018-07-17 10:10:13 -07:00
Joe Shajrawi
160952345c Merge pull request #17988 from apple/rxwei-patch-2
Handle builtin FP types in SILBuilder::appendOperandTypeName
2018-07-17 10:01:51 -07:00
Chris Lattner
50ac820258 Remove an unnecessary const qualifier, NFC
This makes SILType less useful than Type for no apparent reason.
2018-07-16 21:13:45 -07:00
swift-ci
9eb4e3a0a4 Merge remote-tracking branch 'origin/master' into master-next 2018-07-16 18:48:54 -07:00
Slava Pestov
0c0ecba756 AST: Add new overload of ProtocolConformance{,Ref}::subst() taking a SubstitutionMap 2018-07-16 16:44:27 -07:00
Richard Wei
b28225403a Fix formatting. 2018-07-16 15:50:51 -07:00
Richard Wei
96e055d355 Handle builtin FP types in SILBuilder::appendOperandTypeName
The following builder method doesn't handle floating point operands yet.

```cpp
BuiltinInst *createBuiltinBinaryFunction(SILLocation Loc, StringRef Name,
                                            SILType OpdTy, SILType ResultTy,
                                            ArrayRef<SILValue> Args)
```

This patch adds support for calling this method with floating point operands.

```cpp
SILValue x = ...; // $Builtin.FPIEEE32
B.createBuiltinBinaryFunction(loc, "fmul", x->getType(), x->getType(), { x, x })
```

Corresponding SIL:
```
%0 = builtin "fmul_FPIEEE32"(%x : $Builtin.FPIEEE32, %x : $Builtin.FPIEEE32) : $Builtin.FPIEEE32
```
2018-07-16 15:45:46 -07:00
swift-ci
691e92eb8b Merge remote-tracking branch 'origin/master' into master-next 2018-07-11 16:29:41 -07:00
Gogul Balakrishnan
9e26f0a8cb Made the helper into static function and addressed cosmetic changes. 2018-07-10 22:37:05 -07:00
Gogul Balakrishnan
f48091745c Add a viewCFGOnly function for debugging purposes. 2018-07-10 14:27:45 -07:00
swift-ci
1772ad1ca2 Merge remote-tracking branch 'origin/master' into master-next 2018-07-07 14:49:35 -07:00
Adrian Prantl
fdad9076f2 Revert "Add debug info support for inlined and specialized generic variables."
There is an assertion failure building the source compatibility suite that
needs to be investigated.

This reverts commit 91f6f34119.
2018-07-07 13:01:01 -07:00
swift-ci
dcc3937689 Merge remote-tracking branch 'origin/master' into master-next 2018-07-07 07:39:56 -07:00
Adrian Prantl
91f6f34119 Add debug info support for inlined and specialized generic variables.
This patch adds SIL-level debug info support for variables whose
static type is rewritten by an optimizer transformation. When a
function is (generic-)specialized or inlined, the static types of
inlined variables my change as they are remapped into the generic
environment of the inlined call site. With this patch all inlined
SILDebugScopes that point to functions with a generic signature are
recursively rewritten to point to clones of the original function with
new unique mangled names. The new mangled names consist of the old
mangled names plus the new substituions, similar (or exactly,
respectively) to how generic specialization is handled.

On libSwiftCore.dylib (x86_64), this yields a 17% increase in unique
source vars and a ~24% increase in variables with a debug location.

rdar://problem/28859432
rdar://problem/34526036
2018-07-06 22:06:48 -07:00
swift-ci
2507876125 Merge remote-tracking branch 'origin/master' into master-next 2018-07-06 17:08:57 -07:00
Joe Groff
849d9397d6 SIL: Generate external key path references with local candidate components.
The other side of #17404. Since we don't want to generate up front key path metadata for properties/subscripts with no withheld implementation details, the client should generate a key path component that can be used to represent a key path component based on its public interface.
2018-07-06 14:24:07 -07:00