Commit graph

11643 commits

Author SHA1 Message Date
kennytm
82f2c28bc8 Rollup merge of #45110 - Nashenas88:master, r=arielb1
Improve newtype_index macro to handle description and constants consistently
2017-10-13 23:37:53 +08:00
bors
43d95e2ce9 Auto merge of #45032 - alexcrichton:target-cfu, r=michaelwoerister
rustc: Allow target-specific default cgus

Some targets, like msp430 and nvptx, don't work with multiple codegen units
right now for bugs or fundamental reasons. To expose this allow targets to
express a default.

Closes #45000
2017-10-13 08:57:08 +00:00
kennytm
db6fdf664a
Rollup merge of #45172 - oli-obk:patch-8, r=pnkfelix
Upgrade some comments to doc comments
2017-10-13 01:58:47 +08:00
kennytm
ff53dc7166
Rollup merge of #45105 - camsteffen:patch-2, r=pnkfelix
Fix rustc documentation typo

I'm new to rustc but this looks like a typo.
2017-10-13 01:58:42 +08:00
bors
1807f27a33 Auto merge of #45176 - michaelwoerister:fix-region-and-trans-item-order, r=nikomatsakis
incr.comp.: Fix HashStable for ty::RegionKind and trans item order

Fixes #45161 and the failing rust-icci tests.

r? @nikomatsakis
2017-10-12 11:20:16 +00:00
bors
39fd958520 Auto merge of #44967 - wesleywiser:trans_fulfill_obligation, r=nikomatsakis
Turn `trans_fulfill_obligation` into a query

Part of #44891
2017-10-12 07:48:11 +00:00
Paul Faria
9423bee6d3 Move const qualifier from brackets to constant values and remove comma from after identifier 2017-10-11 20:01:55 -04:00
bors
cbf5d39cca Auto merge of #44888 - tirr-c:binder-hr-region, r=arielb1
Refactor fmt::Display and fmt::Debug impls in ppaux

Also fixes #44887.

There was a problem that unnamed late-bound regions are *always* named `'r` while they are displayed using `std::fmt::Display`.

---

```rust
fn main() {
    f(|_: (), _: ()| {});
}
fn f<F>(_: F) where F: Fn(&(), for<'r> fn(&'r ())) {}
```

Before (incorrectly shadows lifetime, `for<'r>` omitted for the second argument):

```
error[E0631]: type mismatch in closure arguments
 --> test.rs:2:5
  |
2 |     f(|_: (), _: ()| {});
  |     ^ ----------------- found signature of `fn((), ()) -> _`
  |     |
  |     expected signature of `for<'r> fn(&'r (), fn(&'r ())) -> _`
  |
  = note: required by `f`
```

After:

```
error[E0631]: type mismatch in closure arguments
 --> test.rs:2:5
  |
2 |     f(|_: (), _: ()| {});
  |     ^ ----------------- found signature of `fn((), ()) -> _`
  |     |
  |     expected signature of `for<'s> fn(&'s (), for<'r> fn(&'r ())) -> _`
  |
  = note: required by `f`
```

r? @nikomatsakis
2017-10-11 16:00:25 +00:00
Steve Klabnik
0a0bec7695 Rollup merge of #45139 - michaelwoerister:document-force_from_dep_node, r=nikomatsakis
incr.comp.: Add some documentation to force_from_dep_node().

r? @nikomatsakis
2017-10-10 20:22:26 -04:00
Michael Woerister
7a016c1ca6 incr.comp.: Add missing match branch in HashStable impl for ty::RegionKind. 2017-10-10 17:08:49 +02:00
Oliver Schneider
1cb9f70b22 Upgrade some comments to doc comments 2017-10-10 16:12:11 +02:00
Alex Crichton
5187763cff rustc: Allow target-specific default cgus
Some targets, like msp430 and nvptx, don't work with multiple codegen units
right now for bugs or fundamental reasons. To expose this allow targets to
express a default.

Closes #45000
2017-10-09 13:45:30 -07:00
Michael Woerister
eb1006f5cf incr.comp.: Add some documentation to force_from_dep_node(). 2017-10-09 17:29:59 +02:00
bors
72d65019c7 Auto merge of #45075 - alexcrichton:inline-less, r=michaelwoerister
rustc: Don't inline in CGUs at -O0

This commit tweaks the behavior of inlining functions into multiple codegen
units when rustc is compiling in debug mode. Today rustc will unconditionally
treat `#[inline]` functions by translating them into all codegen units that
they're needed within, marking the linkage as `internal`. This commit changes
the behavior so that in debug mode (compiling at `-O0`) rustc will instead only
translate `#[inline]` functions into *one* codegen unit, forcing all other
codegen units to reference this one copy.

The goal here is to improve debug compile times by reducing the amount of
translation that happens on behalf of multiple codegen units. It was discovered
in #44941 that increasing the number of codegen units had the adverse side
effect of increasing the overal work done by the compiler, and the suspicion
here was that the compiler was inlining, translating, and codegen'ing more
functions with more codegen units (for example `String` would be basically
inlined into all codegen units if used). The strategy in this commit should
reduce the cost of `#[inline]` functions to being equivalent to one codegen
unit, which is only translating and codegen'ing inline functions once.

Collected [data] shows that this does indeed improve the situation from [before]
as the overall cpu-clock time increases at a much slower rate and when pinned to
one core rustc does not consume significantly more wall clock time than with one
codegen unit.

One caveat of this commit is that the symbol names for inlined functions that
are only translated once needed some slight tweaking. These inline functions
could be translated into multiple crates and we need to make sure the symbols
don't collideA so the crate name/disambiguator is mixed in to the symbol name
hash in these situations.

[data]: https://github.com/rust-lang/rust/issues/44941#issuecomment-334880911
[before]: https://github.com/rust-lang/rust/issues/44941#issuecomment-334583384
2017-10-09 14:00:12 +00:00
bors
d7acd29ad5 Auto merge of #45064 - alexcrichton:reduce-codegen-units, r=michaelwoerister
rustc: Reduce default CGUs to 16

Rationale explained in the included comment as well as #44941
2017-10-09 08:49:38 +00:00
Paul Faria
35545b36cf Improve newtype_index macro to handle description and constants consistently 2017-10-08 15:20:28 -04:00
bors
650b1b1f3a Auto merge of #45016 - pnkfelix:mir-borrowck-gather-and-signal-move-errors, r=nikomatsakis
MIR-borrowck: gather and signal any move errors

When building up the `MoveData` structure for a given MIR, also accumulate any erroneous actions, and then report all of those errors when the construction is complete.

This PR adds a host of move-related error constructor methods to `trait BorrowckErrors`. I think I got the notes right; but we should plan to audit all of the notes before turning MIR-borrowck on by default.

Fix #44830
2017-10-08 18:12:26 +00:00
Wesley Wiser
31f4b57002 Turn trans_fulfill_obligation into a query
Part of #44891
2017-10-08 11:59:02 -04:00
Cameron Steffen
e6728ecdbb fix documentation typo 2017-10-08 10:40:52 -05:00
Wonwoo Choi
cbc6e90288 Introduce Print trait for displaying types 2017-10-08 20:53:14 +09:00
Wonwoo Choi
9b0480bec6 Name higher-ranked lifetimes properly while displaying
Now they don't shadow other lifetimes.
2017-10-08 20:53:14 +09:00
bors
ff8e264950 Auto merge of #45012 - Gankro:noalias, r=arielb1
Add -Zmutable-noalias flag

We disabled noalias on mutable references a long time ago when it was clear that llvm was incorrectly handling this in relation to unwinding edges.

Since then, a few things have happened:

* llvm has cleaned up a bunch of the issues (I'm told)
* we've added a nounwind codegen option

As such, I would like to add this -Z flag so that we can evaluate if the codegen bugs still exist, and if this significantly affects the codegen of different projects, with an eye towards permanently re-enabling it (or at least making it a stable option).
2017-10-08 10:43:45 +00:00
bors
f338dba297 Auto merge of #45100 - kennytm:rollup, r=kennytm
Rollup of 10 pull requests

- Successful merges: #45018, #45042, #45052, #45053, #45058, #45060, #45081, #45083, #45090, #45094
- Failed merges:
2017-10-08 05:55:13 +00:00
kennytm
048949724f Rollup merge of #45090 - rust-lang:petrochenkov-patch-1, r=alexcrichton
Document that `-C ar=PATH` doesn't do anything

Are there any plans to use an external archiver in the future?
IIRC, it was used before, but its use was replaced with LLVM's built-in archive management machinery. I can't found a relevant PR though. EDIT: Found it - https://github.com/rust-lang/rust/pull/26926!

The `-C` option is stable so it still can't be removed right away even if there are no plans to use it (but maybe it can be deprecated?).
Target specifications have a field for archiver as well, which is unused too (these ones are unstable, so I guess it can be removed).

r? @alexcrichton
2017-10-08 13:39:05 +08:00
kennytm
ae54d5ecae Rollup merge of #45058 - hunteke:fix_rustc_private_typo_2017Oct, r=shepmaster
Fix typo, per #45057.

This looks like a simple string -- one character -- fix.  Given that I'm currently running low on battery, I have not actually compiled and tested this.  But I am fully confident this passes muster.  If not, I'll be maintainer-educated, yes?  ;-)
2017-10-08 13:39:01 +08:00
kennytm
92a35d93dd Rollup merge of #45018 - michaelwoerister:fix-dep-node-debug-recursion, r=eddyb
incr.comp.: Fix infinite recursion in Debug implementation of DepNode

Small bug fix. Depends on #44901 to land first.
2017-10-08 13:38:57 +08:00
bors
928a295718 Auto merge of #44983 - vitiral:dirty_clean_groups, r=michaelwoerister
groundwork for rustc_clean/dirty improvements

This is a WIP PR that needs mentoring from @michaelwoerister.

There are several TODOs but no outstanding questions (except for the main one -- **is this the right approach?**)

This is the plumbing for supporing groups in `rustc_clean(labels="...")`, as well as supporting an `except="..."` which will remove the excepted labels in the "clean" check and then assert that they are dirty (this is still TODO).

See the code TODO's and example comments for a rough design.

I'd like to know if this is the design you would like to do, and then I can go about actually filling out the groups and implementing the remaining logic.
2017-10-08 03:02:35 +00:00
Alex Crichton
4b2bdf7b54 rustc: Don't inline in CGUs at -O0
This commit tweaks the behavior of inlining functions into multiple codegen
units when rustc is compiling in debug mode. Today rustc will unconditionally
treat `#[inline]` functions by translating them into all codegen units that
they're needed within, marking the linkage as `internal`. This commit changes
the behavior so that in debug mode (compiling at `-O0`) rustc will instead only
translate `#[inline]` functions into *one* codegen unit, forcing all other
codegen units to reference this one copy.

The goal here is to improve debug compile times by reducing the amount of
translation that happens on behalf of multiple codegen units. It was discovered
in #44941 that increasing the number of codegen units had the adverse side
effect of increasing the overal work done by the compiler, and the suspicion
here was that the compiler was inlining, translating, and codegen'ing more
functions with more codegen units (for example `String` would be basically
inlined into all codegen units if used). The strategy in this commit should
reduce the cost of `#[inline]` functions to being equivalent to one codegen
unit, which is only translating and codegen'ing inline functions once.

Collected [data] shows that this does indeed improve the situation from [before]
as the overall cpu-clock time increases at a much slower rate and when pinned to
one core rustc does not consume significantly more wall clock time than with one
codegen unit.

One caveat of this commit is that the symbol names for inlined functions that
are only translated once needed some slight tweaking. These inline functions
could be translated into multiple crates and we need to make sure the symbols
don't collideA so the crate name/disambiguator is mixed in to the symbol name
hash in these situations.

[data]: https://github.com/rust-lang/rust/issues/44941#issuecomment-334880911
[before]: https://github.com/rust-lang/rust/issues/44941#issuecomment-334583384
2017-10-07 19:09:46 -07:00
bors
ac76206be4 Auto merge of #44841 - alexcrichton:thinlto, r=michaelwoerister
rustc: Implement ThinLTO

This commit is an implementation of LLVM's ThinLTO for consumption in rustc
itself. Currently today LTO works by merging all relevant LLVM modules into one
and then running optimization passes. "Thin" LTO operates differently by having
more sharded work and allowing parallelism opportunities between optimizing
codegen units. Further down the road Thin LTO also allows *incremental* LTO
which should enable even faster release builds without compromising on the
performance we have today.

This commit uses a `-Z thinlto` flag to gate whether ThinLTO is enabled. It then
also implements two forms of ThinLTO:

* In one mode we'll *only* perform ThinLTO over the codegen units produced in a
  single compilation. That is, we won't load upstream rlibs, but we'll instead
  just perform ThinLTO amongst all codegen units produced by the compiler for
  the local crate. This is intended to emulate a desired end point where we have
  codegen units turned on by default for all crates and ThinLTO allows us to do
  this without performance loss.

* In anther mode, like full LTO today, we'll optimize all upstream dependencies
  in "thin" mode. Unlike today, however, this LTO step is fully parallelized so
  should finish much more quickly.

There's a good bit of comments about what the implementation is doing and where
it came from, but the tl;dr; is that currently most of the support here is
copied from upstream LLVM. This code duplication is done for a number of
reasons:

* Controlling parallelism means we can use the existing jobserver support to
  avoid overloading machines.
* We will likely want a slightly different form of incremental caching which
  integrates with our own incremental strategy, but this is yet to be
  determined.
* This buys us some flexibility about when/where we run ThinLTO, as well as
  having it tailored to fit our needs for the time being.
* Finally this allows us to reuse some artifacts such as our `TargetMachine`
  creation, where all our options we used today aren't necessarily supported by
  upstream LLVM yet.

My hope is that we can get some experience with this copy/paste in tree and then
eventually upstream some work to LLVM itself to avoid the duplication while
still ensuring our needs are met. Otherwise I fear that maintaining these
bindings may be quite costly over the years with LLVM updates!
2017-10-07 22:18:20 +00:00
Vadim Petrochenkov
691ab6c5bf Document that -C ar=PATH doesn't do anything 2017-10-07 19:26:02 +03:00
Guillaume Gomez
fe24e815a2 Fix invalid rustdoc rendering for FnTy args 2017-10-07 17:23:06 +02:00
Alex Crichton
4ca1b19fde rustc: Implement ThinLTO
This commit is an implementation of LLVM's ThinLTO for consumption in rustc
itself. Currently today LTO works by merging all relevant LLVM modules into one
and then running optimization passes. "Thin" LTO operates differently by having
more sharded work and allowing parallelism opportunities between optimizing
codegen units. Further down the road Thin LTO also allows *incremental* LTO
which should enable even faster release builds without compromising on the
performance we have today.

This commit uses a `-Z thinlto` flag to gate whether ThinLTO is enabled. It then
also implements two forms of ThinLTO:

* In one mode we'll *only* perform ThinLTO over the codegen units produced in a
  single compilation. That is, we won't load upstream rlibs, but we'll instead
  just perform ThinLTO amongst all codegen units produced by the compiler for
  the local crate. This is intended to emulate a desired end point where we have
  codegen units turned on by default for all crates and ThinLTO allows us to do
  this without performance loss.

* In anther mode, like full LTO today, we'll optimize all upstream dependencies
  in "thin" mode. Unlike today, however, this LTO step is fully parallelized so
  should finish much more quickly.

There's a good bit of comments about what the implementation is doing and where
it came from, but the tl;dr; is that currently most of the support here is
copied from upstream LLVM. This code duplication is done for a number of
reasons:

* Controlling parallelism means we can use the existing jobserver support to
  avoid overloading machines.
* We will likely want a slightly different form of incremental caching which
  integrates with our own incremental strategy, but this is yet to be
  determined.
* This buys us some flexibility about when/where we run ThinLTO, as well as
  having it tailored to fit our needs for the time being.
* Finally this allows us to reuse some artifacts such as our `TargetMachine`
  creation, where all our options we used today aren't necessarily supported by
  upstream LLVM yet.

My hope is that we can get some experience with this copy/paste in tree and then
eventually upstream some work to LLVM itself to avoid the duplication while
still ensuring our needs are met. Otherwise I fear that maintaining these
bindings may be quite costly over the years with LLVM updates!
2017-10-07 08:17:52 -07:00
Guillaume Gomez
3493c62ff2 Add names to BareFnTy 2017-10-07 13:16:20 +02:00
bors
e11f6d5355 Auto merge of #44614 - tschottdorf:pat_adjustments, r=nikomatsakis
implement pattern-binding-modes RFC

See the [RFC] and [tracking issue].

[tracking issue]: #42640
[RFC]: 491e0af/text/2005-match-ergonomics.md
2017-10-07 00:28:42 +00:00
Tobias Schottdorf
de55b4f077 implement pattern-binding-modes RFC
See the [RFC] and [tracking issue].

[tracking issue]: https://github.com/rust-lang/rust/issues/42640
[RFC]: 491e0af/text/2005-match-ergonomics.md
2017-10-06 16:30:23 -04:00
bors
b67f4283b3 Auto merge of #45065 - arielb1:not-correct, r=nikomatsakis
fix logic error in #44269's `prune_cache_value_obligations`

We want to retain obligations that *contain* inference variables, not
obligations that *don't contain* them, in order to fix #43132. Because
of surrounding changes to inference, the ICE doesn't occur in its
original case, but I believe it could still be made to occur on master.

Maybe I should try to write a new test case? Certainly not right now
(I'm mainly trying to get us a beta that we can ship) but maybe before
we land this PR on nightly?

This seems to cause a 10% performance regression in my imprecise
attempt to benchmark item-body checking for #43613, but it's better to
be slow and right than fast and wrong. If we want to recover that, I
think we can change the constrained-type-parameter code to actually
give a list of projections that are important for resolving inference
variables and filter everything else out.
2017-10-06 15:30:32 +00:00
Ariel Ben-Yehuda
91fdadba61 fix logic error in #44269's prune_cache_value_obligations
We want to retain obligations that *contain* inference variables, not
obligations that *don't contain* them, in order to fix #43132. Because
of surrounding changes to inference, the ICE doesn't occur in its
original case, but I believe it could still be made to occur on master.

Maybe I should try to write a new test case? Certainly not right now
(I'm mainly trying to get us a beta that we can ship) but maybe before
we land this PR on nightly?

This seems to cause a 10% performance regression in my imprecise
attempt to benchmark item-body checking for #43613, but it's better to
be slow and right than fast and wrong. If we want to recover that, I
think we can change the constrained-type-parameter code to actually
give a list of projections that are important for resolving inference
variables and filter everything else out.
2017-10-06 17:12:24 +03:00
Alex Crichton
1988447007 rustc: Reduce default CGUs to 16
Rationale explained in the included comment as well as #44941
2017-10-06 07:06:30 -07:00
bors
ed1cffdb21 Auto merge of #44818 - petrochenkov:astymac2, r=jseyfried
Improve resolution of associated types in declarative macros 2.0

Make various identifier comparisons for associated types (and sometimes other associated items) hygienic.
Now declarative macros 2.0 can use `Self::AssocTy`, `TyParam::AssocTy`, `Trait<AssocTy = u8>` where `AssocTy` is an associated type of a trait `Trait` visible from the macro. Also, `Trait` can now be implemented inside the macro and specialization should work properly (fixes https://github.com/rust-lang/rust/pull/40847#issuecomment-310867299).

r? @jseyfried or @eddyb
2017-10-06 05:37:43 +00:00
Kevin Hunter Kesling
73ca15cc29 Fix typo, per #45057. 2017-10-05 21:31:59 -04:00
Vadim Petrochenkov
2d9161d188 Improve resolution of associated types in macros 2.0 2017-10-06 00:35:21 +03:00
bors
417c73891f Auto merge of #44943 - nivkner:fixme_fixup, r=dtolnay
address some FIXME whose associated issues were marked as closed

part of #44366
2017-10-05 19:52:00 +00:00
bors
4531131bf3 Auto merge of #44878 - Nashenas88:master, r=nikomatsakis
Store a new Region value every time we create a new region variable

Paired with @spastorino to walk through this and implement #44870.
2017-10-05 17:14:12 +00:00
kennytm
71fba531dc Rollup merge of #45006 - MaikKlein:patch-2, r=nikomatsakis
Typo in `librustc/README.md`
2017-10-05 20:22:36 +08:00
Michael Woerister
b50e8ebbba Fix infinite recursion in <DepNode as Debug>. 2017-10-05 10:20:13 +02:00
bors
a0db04b62b Auto merge of #44940 - philipc:remap-path, r=michaelwoerister
Don't use remapped path when loading modules and include files

Fixes bug reported in https://github.com/rust-lang/rust/issues/41555#issuecomment-327866056.

cc @michaelwoerister
2017-10-05 05:16:41 +00:00
Santiago Pastorino
8ee16f4352 Generate SerializedDepNodeIndex using newtype_index macro 2017-10-04 23:51:43 -03:00
Santiago Pastorino
b5a5556dd4 Generate DepNodeIndexNew using newtype_index macro 2017-10-04 23:51:43 -03:00
Santiago Pastorino
3d230af80b Move newtype_index to rustc_data_structures 2017-10-04 23:50:53 -03:00
bors
d7e73e4b1a Auto merge of #44901 - michaelwoerister:on-demand-eval, r=nikomatsakis
incr.comp.: Switch to red/green change tracking, remove legacy system.

This PR finally switches incremental compilation to [red/green tracking](https://github.com/rust-lang/rust/issues/42293) and completely removes the legacy dependency graph implementation -- which includes a few quite costly passes that are simply not needed with the new system anymore.

There's still some documentation to be done and there's certainly still lots of optimizing and tuning ahead -- but the foundation for red/green is in place with this PR. This has been in the making for a long time `:)`

r? @nikomatsakis
cc @alexcrichton, @rust-lang/compiler
2017-10-04 19:14:41 +00:00