Commit Graph

49329 Commits

Author SHA1 Message Date
Steve Klabnik 9239b64cd6 Rollup merge of #30698 - steveklabnik:gh29649, r=brson
Fixes #29649

r? @retep998 @alexcrichton
2016-01-06 18:31:57 -05:00
Steve Klabnik 4c90f5dc9f Rollup merge of #30683 - LawrenceWoodman:patch-1, r=steveklabnik
I noticed the alignment was off in the error handling part of the book.  This was caused because two tabs had crept into the file.  I have changed these for spaces.
2016-01-06 18:31:56 -05:00
Anders Granlund 7205d6b580 Fix error in example code 2016-01-07 00:09:26 +01:00
Simonas Kazlauskas 903908582c Reenable MIR test
Fixes #30674
2016-01-06 23:50:54 +02:00
bors 5daa75373d Auto merge of #30654 - nrc:panictry, r=brson
The motivation (other than removing boilerplate) is that this is a baby step towards a parser with error recovery.

[breaking-change] if you use any of the changed functions, you'll need to remove a try! or panictry!
2016-01-06 20:30:55 +00:00
Scott Olson b7fa37d03e Fix pretty-printing for empty tuples in MIR. 2016-01-06 14:17:38 -06:00
Simonas Kazlauskas 15096371dc [MIR] Get rid of that nasty unit_ty temporary lval 2016-01-06 21:43:58 +02:00
bors e8c337b5ca Auto merge of #30532 - nikomatsakis:cross-item-dependencies, r=mw
This is roughly the same as my previous PR that created a dependency graph, but that:

1. The dependency graph is only optionally constructed, though this doesn't seem to make much of a difference in terms of overhead (see measurements below).
2. The dependency graph is simpler (I combined a lot of nodes).
3. The dependency graph debugging facilities are much better: you can now use `RUST_DEP_GRAPH_FILTER` to filter the dep graph to just the nodes you are interested in, which is super help.
4. The tests are somewhat more elaborate, including a few known bugs I need to fix in a second pass.

This is potentially a `[breaking-change]` for plugin authors. If you are poking about in tcx state or something like that, you probably want to add `let _ignore = tcx.dep_graph.in_ignore();`, which will cause your reads/writes to be ignored and not affect the dep-graph.

After this, or perhaps as an add-on to this PR in some cases, what I would like to do is the following:

- [x] Write-up a little guide to how to use this system, the debugging options available, and what the possible failure modes are.
- [ ] Introduce read-only and perhaps the `Meta` node
- [x] Replace "memoization tasks" with node from the map itself
- [ ] Fix the shortcomings, obviously! Notably, the HIR map needs to register reads, and there is some state that is not yet tracked. (Maybe as a separate PR.)
- [x] Refactor the dep-graph code so that the actual maintenance of the dep-graph occurs in a parallel thread, and the main thread simply throws things into a shared channel (probably a fixed-size channel). There is no reason for dep-graph construction to be on the main thread. (Maybe as a separate PR.)

Regarding performance: adding this tracking does add some overhead, approximately 2% in my measurements (I was comparing the build times for rustdoc). Interestingly, enabling or disabling tracking doesn't seem to do very much. I want to poke at this some more and gather a bit more data -- in some tests I've seen that 2% go away, but on others it comes back. It's not entirely clear to me if that 2% is truly due to constructing the dep-graph at all.

The next big step after this is write some code to dump the dep-graph to disk and reload it.

r? @michaelwoerister
2016-01-06 18:37:57 +00:00
Piotr Czarnecki e2ccc4f744 Deprecate reflection-based Arena 2016-01-06 18:07:21 +01:00
Niko Matsakis 93996b160c Fix dependency graph test cases to have correct commments and use -Z incr-comp 2016-01-06 11:29:00 -05:00
Niko Matsakis 876de6e495 Fix tidy errors 2016-01-06 11:28:53 -05:00
Felix S. Klock II b043ded802 finish enabling -C rpath by default in rustc. See #30353. 2016-01-06 16:24:18 +01:00
Niko Matsakis 0c8ee65020 Use `memoized` helper more often. 2016-01-06 10:16:58 -05:00
bors 21b025f55f Auto merge of #30733 - ubsan:wrapping_op_assign, r=eddyb
Fix a breaking change in #30523

While this does fix a breaking change, it is also, technically, a
[breaking-change] to go back to our original way
2016-01-06 15:00:17 +00:00
Niko Matsakis a9d7e36668 Fix numerous typos, renamings, and minor nits raised by mw. 2016-01-06 09:19:19 -05:00
bors d5ac1a1da3 Auto merge of #30481 - nagisa:mir-calls-2, r=nikomatsakis
r? @nikomatsakis

This is a pretty big PR conflating changes to a few different block terminators (Call, DivergingCall, Panic, Resume, Diverge), because they are somewhat closely related.

Each commit has a pretty good description on what is being changed in each commit. The end result is greatly simplified CFG and translation for calls (no success branch if the function is diverging, no cleanup branch if there’s nothing to cleanup etc).

Fixes https://github.com/rust-lang/rust/issues/30480
Fixes https://github.com/rust-lang/rust/issues/29767
Partialy solves https://github.com/rust-lang/rust/issues/29575
Fixes https://github.com/rust-lang/rust/issues/29573
2016-01-06 13:11:18 +00:00
Ms2ger 6f0e58fc5f Stop re-exporting MutateMode's variants. 2016-01-06 13:16:30 +01:00
Simonas Kazlauskas 36b3951c73 Create personality slot when translating Resume
This considerably simplifies code around calling functions and translation of Resume itself. This
removes requirement that a block containing Resume terminator is always translated after something
which creates a landing pad, thus allowing us to actually translate some valid MIRs we could not
translate before.

However, an assumption is added that translator is correct (in regards to landing pad generation)
and code will never reach the Resume terminator without going through a landing pad first. Breaking
these assumptions would pass an `undef` value into the personality functions.
2016-01-06 13:57:52 +02:00
Simonas Kazlauskas f9814242dc panic/panic_bounds_check to destructure tys
Not any more beautiful.
2016-01-06 13:57:52 +02:00
Simonas Kazlauskas d1c644c1e9 Merge Call and DivergingCall diffs into CallKind
This merges two separate Call terminators and uses a separate CallKind sub-enum instead.

A little bit unrelatedly, copying into destination value for a certain kind of invoke, is also
implemented here. See the associated comment in code for various details that arise with this
implementation.
2016-01-06 13:57:52 +02:00
Simonas Kazlauskas 50107034c0 Add tests 2016-01-06 13:57:52 +02:00
Simonas Kazlauskas cef6aee369 Don’t generate landing-pads if -Z no-landing-pads 2016-01-06 13:57:52 +02:00
Simonas Kazlauskas 20ec53a0d3 Fix ReturnPointer generation for void return types
Fixes #30480
2016-01-06 13:57:52 +02:00
Simonas Kazlauskas 924bb1e5eb Refine call terminator translation
* Implement landing pads; and
* Implement DivergingCall translation; and
* Modernise previous implementation of Call somewhat.
2016-01-06 13:57:51 +02:00
Simonas Kazlauskas a1e13983f7 Have a cached unreachable block inside MIR state
It is useful for various cases where direct unreachable cannot be translated and a separate block
is necessary.
2016-01-06 13:57:51 +02:00
Simonas Kazlauskas 4e86dcdb72 Remove diverge terminator
Unreachable terminator can be contained all within the trans.
2016-01-06 13:57:51 +02:00
Simonas Kazlauskas 5b34690842 Remove the Panic block terminator 2016-01-06 13:57:51 +02:00
Simonas Kazlauskas ecf4d0e3ad Add Resume Terminator which corresponds to resume
Diverge should eventually go away
2016-01-06 13:57:51 +02:00
Simonas Kazlauskas 6f18b559df Generate DivergingCall terminator
This simplifies CFG greatly for some cases :)
2016-01-06 13:57:47 +02:00
Simonas Kazlauskas 893a66d7a1 Split Call into Call and DivergingCall
DivergingCall is different enough from the regular converging Call to warrant the split. This also
inlines CallData struct and creates a new CallTargets enum in order to have a way to differentiate
between calls that do not have an associated cleanup block.

Note, that this patch still does not produce DivergingCall terminator anywhere. Look for that in
the next patches.
2016-01-06 13:40:57 +02:00
jonastepe eb30c661c0 heap::deallocate expects a *mut u8 but here a *mut T is given. The final code is correct, the example here would not compile without the cast. I used *mut _ instead of *mut u8 to be consistent with the final code. 2016-01-06 12:13:47 +01:00
bors 7312e0a163 Auto merge of #30692 - michaelwoerister:mir-overloaded-fn-calls, r=nikomatsakis
So far, calls going through `Fn::call`, `FnMut::call_mut`, or `FnOnce::call_once` have not been translated properly into MIR:
The call `f(a, b, c)` where `f: Fn(T1, T2, T3)` would end up in MIR as:
```
call `f` with arguments  `a`, `b`, `c`
```
What we really want is:
```
call `Fn::call` with arguments  `f`, `a`, `b`, `c`
```
This PR transforms these kinds of overloaded calls during `HIR -> HAIR` translation.

What's still a bit funky is that the `Fn` traits expect arguments to be tupled but due to special handling type-checking and trans, we do not actually tuple arguments and everything still checks out fine. So, after this PR we end up with MIR containing calls where function signature and arguments seemingly don't match:
```
call Fn::call(&self, args: (T1, T2, T3)) with arguments `f`, `a`, `b`, `c`
```
instead of
```
call Fn::call(&self, args: (T1, T2, T3)) with arguments `f`, (`a`, `b`, `c`)  //  <- args tupled!
```
It would be nice if the call traits could go without special handling in MIR and later on.
2016-01-06 09:00:57 +00:00
Jeffrey Seyfried 834fb17e94 Fix bug in duplicate checking for extern crates. 2016-01-06 07:04:48 +00:00
Mike Anderson 5038d4e8ef std::cmp::max -> max 2016-01-06 00:42:19 -06:00
Nicholas Mazzuca 14e1e2aee8 Fix a breaking change in #30523
While this does fix a breaking change, it is also, technically, a
[breaking-change] to go back to our original way
2016-01-05 22:16:03 -08:00
Scott Olson b2903d87c9 Improve pretty-printing for ConstVals in MIR. 2016-01-05 23:08:16 -06:00
Niko Matsakis 11c671b59c Workaround stage0 bug 2016-01-05 21:05:51 -05:00
Niko Matsakis 8b22ed8651 Add assert-dep-graph testing mechanism and tests 2016-01-05 21:05:51 -05:00
Niko Matsakis d48f48f61f Refactor compiler to make use of dep-tracking-maps. Also, in cases where
we were using interior mutability (RefCells, TyIvar), add some reads/writes.
2016-01-05 21:05:51 -05:00
Niko Matsakis 5d9dd7cf33 Refactor overlap checker so that it walks the HIR instead of poking into
random tables. The old code was weird anyway because it would
potentially walk traits from other crates etc. The new code fits
seamlessly with the dependency tracking.
2016-01-05 21:05:51 -05:00
Niko Matsakis 75c4f395ac Strip the trait-def phase from collect, which has no function. 2016-01-05 21:05:50 -05:00
Niko Matsakis 005fa14358 Annotate the compiler with information about what it is doing when. 2016-01-05 21:05:50 -05:00
Niko Matsakis aa265869ba Add DepGraph to tcx. 2016-01-05 21:05:50 -05:00
Niko Matsakis c77cd480cf Introduce the DepGraph and DepTracking map abstractions,
along with a README explaining how they are to be used
2016-01-05 21:05:50 -05:00
bors dc1f442634 Auto merge of #30492 - wesleywiser:fix_extra_drops, r=pnkfelix
Fixes #28159
2016-01-06 01:55:45 +00:00
Huon Wilson 4ea84fc184 Remove irrelevant comment
The fundamental problem of duplication was fixed in https://github.com/rust-lang/rust/pull/10891, but the comment was preserved. Closes https://github.com/rust-lang/rust/issues/9762.
2016-01-06 12:28:34 +11:00
Scott Olson c785802c0a Boring whitespace cleanup. 2016-01-05 17:26:22 -06:00
Tobias Bucher ce6baa77fe Clarify how Rust treats backslashes at end of line in string literals
Rust differs in that behavior from C: In C, the newline escapes are resolved
before anything else, and in Rust this depends on whether the backslash is
escaped itself.

A difference can be observed in the following two programs:

```c
#include <stdio.h>
int main()
{
	printf("\\
n\n");
	return 0;
}
```

```rust
fn main() {
	println!("\\
n");
}
```

The first program prints two newlines, the second one prints a backslash, a
newline, the latin character n and a final newline.
2016-01-06 00:04:25 +01:00
Niko Matsakis 6dd3f6143e convert from hard error to future-incompatible lint 2016-01-05 16:21:53 -05:00
Niko Matsakis 27d6b9d215 improve visibility of future-incompatibilities (mildly, at least) 2016-01-05 16:21:53 -05:00