2071 Commits

Author SHA1 Message Date
Manish Goregaokar
61d87f0825 Rollup merge of #33576 - soltanmm:vtable, r=nikomatsakis
Plumb inference obligations through selection, take 2

Using a `SnapshotVec` and dumping inferred obligations into `Vtable` variants.

r? @nikomatsakis
2016-05-14 11:57:49 +02:00
Manish Goregaokar
c62d65cfbf Rollup merge of #33574 - michaelwoerister:collector-cleanup, r=nikomatsakis
trans-collector: Assorted fixes and refactorings needed for making trans collector-driven.

As the title says. The messages on the individual commits should do a good job of explaining what they are about.

r? @nikomatsakis
2016-05-14 11:57:49 +02:00
Manish Goregaokar
25ca82aa17 Rollup merge of #33566 - dotdash:biased_switch, r=nagisa
[MIR trans] Optimize trans for biased switches

Currently, all switches in MIR are exhausitive, meaning that we can have
a lot of arms that all go to the same basic block, the extreme case
being an if-let expression which results in just 2 possible cases, be
might end up with hundreds of arms for large enums.

To improve this situation and give LLVM less code to chew on, we can
detect whether there's a pre-dominant target basic block in a switch
and then promote this to be the default target, not translating the
corresponding arms at all.

In combination with #33544 this makes unoptimized MIR trans of
nickel.rs as fast as using old trans and greatly improves the times for
optimized builds, which are only 30-40% slower instead of ~300%.

cc #33111
2016-05-14 11:57:48 +02:00
bors
2b79e05a05 Auto merge of #33508 - alexcrichton:always-lower-frem, r=nikomatsakis
trans: Always lower to `frem`

Long ago LLVM unfortunately didn't handle the 32-bit MSVC case of `frem` where
it can't be lowered to `fmodf` because that symbol doesn't exist. That was since
fixed in http://reviews.llvm.org/D12099 (landed as r246615) and was released in
what appears to be LLVM 3.8. Now that we're using that branch of LLVM let's
remove our own hacks and help LLVM optimize a little better by giving it
knowledge about what we're doing.
2016-05-13 16:00:05 -07:00
Luqman Aden
f3e1d57bc2 Allow repr attribute on single variant enum. 2016-05-13 12:36:57 -04:00
bors
4ec5ce5e44 Auto merge of #33282 - alexcrichton:rustbuild-crate-tests, r=brson
rustbuild: Add support for crate tests + doctests

This commit adds support to rustbuild to run crate unit tests (those defined by
`#[test]`) as well as documentation tests. All tests are powered by `cargo test`
under the hood.

Each step requires the `libtest` library is built for that corresponding stage.
Ideally the `test` crate would be a dev-dependency, but for now it's just easier
to ensure that we sequence everything in the right order.

Currently no filtering is implemented, so there's not actually a method of
testing *only* libstd or *only* libcore, but rather entire swaths of crates are
tested all at once.

A few points of note here are:

* The `coretest` and `collectionstest` crates are just listed as `[[test]]`
  entires for `cargo test` to naturally pick up. This mean that `cargo test -p
  core` actually runs all the tests for libcore.
* Libraries that aren't tested all mention `test = false` in their `Cargo.toml`
* Crates aren't currently allowed to have dev-dependencies due to
  rust-lang/cargo#860, but we can likely alleviate this restriction once
  workspaces are implemented.

cc #31590
2016-05-12 14:31:54 -07:00
Alex Crichton
bb9062a296 rustbuild: Add support for crate tests + doctests
This commit adds support to rustbuild to run crate unit tests (those defined by
`#[test]`) as well as documentation tests. All tests are powered by `cargo test`
under the hood.

Each step requires the `libtest` library is built for that corresponding stage.
Ideally the `test` crate would be a dev-dependency, but for now it's just easier
to ensure that we sequence everything in the right order.

Currently no filtering is implemented, so there's not actually a method of
testing *only* libstd or *only* libcore, but rather entire swaths of crates are
tested all at once.

A few points of note here are:

* The `coretest` and `collectionstest` crates are just listed as `[[test]]`
  entires for `cargo test` to naturally pick up. This mean that `cargo test -p
  core` actually runs all the tests for libcore.
* Libraries that aren't tested all mention `test = false` in their `Cargo.toml`
* Crates aren't currently allowed to have dev-dependencies due to
  rust-lang/cargo#860, but we can likely alleviate this restriction once
  workspaces are implemented.

cc #31590
2016-05-12 08:52:20 -07:00
Masood Malekghassemi
8628ccec8f Add inferred obligation storage to all Vtable variants and SelectionContext 2016-05-11 14:40:24 -07:00
Michael Woerister
802bb578e4 trans: Use CrateContext::empty_substs_for_def_id() instead of Substs::empty() where appropriate. 2016-05-11 17:11:20 -04:00
Björn Steinbrink
49b2cdf47c [MIR trans] Optimize trans for biased switches
Currently, all switches in MIR are exhausitive, meaning that we can have
a lot of arms that all go to the same basic block, the extreme case
being an if-let expression which results in just 2 possible cases, be
might end up with hundreds of arms for large enums.

To improve this situation and give LLVM less code to chew on, we can
detect whether there's a pre-dominant target basic block in a switch
and then promote this to be the default target, not translating the
corresponding arms at all.

In combination with #33544 this makes unoptimized MIR trans of
nickel.rs as fast as using old trans and greatly improves the times for
optimized builds, which are only 30-40% slower instead of ~300%.

cc #33111
2016-05-11 22:18:46 +02:00
Michael Woerister
64bc3c266c trans: Make collector handle the drop_in_place() intrinsic. 2016-05-11 14:30:33 -04:00
James Miller
f4dd4be86a Add test for collecting items in statics 2016-05-11 13:59:14 -04:00
James Miller
dace30659f Inspect MIR for statics in item collection 2016-05-11 13:58:52 -04:00
Michael Woerister
85b155f6f1 trans: Don't try to place declarations during codegen unit partitioning. 2016-05-11 13:58:23 -04:00
Michael Woerister
e3f19cb0b3 trans: Move TransItem to its own module. 2016-05-11 13:49:44 -04:00
Eduard Burtescu
a1c170fc35 rustc: Split local type contexts interners from the global one. 2016-05-11 04:14:58 +03:00
Eduard Burtescu
20652162ca rustc: More interning for data used in Ty<'tcx>. 2016-05-11 04:14:58 +03:00
Eduard Burtescu
12e56ea56b rustc: Wrap users of InferCtxt in an anonymous scope. 2016-05-11 04:14:58 +03:00
Eduard Burtescu
8a704f6dc7 rustc: Remove the TyCtxt field from ParameterEnvironment. 2016-05-11 04:14:58 +03:00
Eduard Burtescu
76affa5d6f rustc: Split 'tcx into 'gcx and 'tcx for InferCtxt and its users. 2016-05-11 04:14:58 +03:00
Eduard Burtescu
513d392f7e rustc: Replace &'a TyCtxt<'tcx> with a TyCtxt<'a, 'tcx> wrapper. 2016-05-11 04:14:58 +03:00
Eduard Burtescu
f8ea24edc8 rustc: Avoid free functions taking &TyCtxt and &InferCtxt. 2016-05-11 04:14:58 +03:00
Eduard Burtescu
d7ee56e862 typeck: Turn everything operating on FnCtxt into a method. 2016-05-11 04:14:58 +03:00
Eduard Burtescu
6e290998c3 infer: Turn normalize_associated_type into a method on TyCtxt. 2016-05-11 04:14:58 +03:00
Eduard Burtescu
0907c198c4 infer: Use methods for creating an InferCtxt. 2016-05-11 04:14:58 +03:00
Eduard Burtescu
b5122d5c4c rustc: Always refer to TyCtxt as tcx. 2016-05-11 04:14:58 +03:00
bors
04308ceefa Auto merge of #33488 - eddyb:trans-fixes, r=Aatch
Fix several -Z orbit crater blockers.

Fixes 3 of the issues found by @nikomatsakis' crater run with `-Z orbit` forced on:
https://gist.github.com/nikomatsakis/6688c30a0e5d3fed07cc1ebd4efb1412

Two of the regressions seemed to be fixed by #33130 and the remaining two are timeouts.
2016-05-10 10:40:02 -07:00
bors
1939b76903 Auto merge of #33473 - michaelwoerister:split-cratecontext, r=nikomatsakis
Preparatory refactorings for collector-driven trans.

This is a set of refactorings that allows to do translation item collection and partitioning before LocalCrateContext instances or LLVM modules are generated. As a consequence we can now create LocalCrateContexts already with knowledge of the codegen unit it will be used for. This is a preparation step for driving trans by the results of codegen unit partitioning.
2016-05-09 23:50:10 -07:00
Alex Crichton
38e6e5d0a9 rustc: Use C++ personalities on MSVC
Currently the compiler has two relatively critical bugs in the implementation of
MSVC unwinding:

* #33112 - faults like segfaults and illegal instructions will run destructors
           in Rust, meaning we keep running code after a super-fatal exception
           has happened.

* #33116 - When compiling with LTO plus `-Z no-landing-pads` (or `-C
           panic=abort` with the previous commit) LLVM won't remove all `invoke`
           instructions, meaning that some landing pads stick around and
           cleanups may be run due to the previous bug.

These both stem from the flavor of "personality function" that Rust uses for
unwinding on MSVC. On 32-bit this is `_except_handler3` and on 64-bit this is
`__C_specific_handler`, but they both essentially are the "most generic"
personality functions for catching exceptions and running cleanups. That is,
thse two personalities will run cleanups for all exceptions unconditionally, so
when we use them we run cleanups for **all SEH exceptions** (include things like
segfaults).

Note that this also explains why LLVM won't optimize away `invoke` instructions.
These functions can legitimately still unwind (the `nounwind` attribute only
seems to apply to "C++ exception-like unwining"). Also note that the standard
library only *catches* Rust exceptions, not others like segfaults and illegal
instructions.

LLVM has support for another personality, `__CxxFrameHandler3`, which does not
run cleanups for general exceptions, only C++ exceptions thrown by
`_CxxThrowException`. This essentially ideally matches our use case, so this
commit moves us over to using this well-known personality function as well as
exception-throwing function.

This doesn't *seem* to pull in any extra runtime dependencies just yet, but if
it does we can perhaps try to work out how to implement more of it in Rust
rather than relying on MSVCRT runtime bits.

More details about how this is actually implemented can be found in the changes
itself, but this...

Closes #33112
Closes #33116
2016-05-09 17:28:48 -07:00
Michael Woerister
118cc9e8e1 Fix some rebasing fallout. 2016-05-09 16:17:00 -04:00
Michael Woerister
00eabcbefa trans::context: Remove some tcx::tls wackiness 2016-05-09 16:17:00 -04:00
Michael Woerister
86a691a5c7 trans: Consistently name SharedCrateContext instances 'scx' 2016-05-09 16:17:00 -04:00
Michael Woerister
b89a5d1f7c Make FixedCount partitioning handle case where codegen units have to be added. 2016-05-09 16:17:00 -04:00
Michael Woerister
0142336a2a trans: Add some explanatory comments to trans::context types. 2016-05-09 16:17:00 -04:00
Michael Woerister
a8e34dfc29 trans: Make partitioning available in LocalCrateContext. 2016-05-09 16:17:00 -04:00
Michael Woerister
bebcb285ad Restructure trans_crate() so that codegen unit partitioning happens before creating LocalCrateContexts. 2016-05-09 16:17:00 -04:00
Michael Woerister
bb8c8c58d3 Make trans::collector only depend on SharedCrateContext. 2016-05-09 16:17:00 -04:00
Michael Woerister
75bf6173e5 trans: Make glue::get_drop_glue_type() independent of CrateContext. 2016-05-09 16:17:00 -04:00
Michael Woerister
3f74c6afe0 trans: Make base::custom_coerce_unsize_info only depend on SharedCrateContext. 2016-05-09 16:17:00 -04:00
Michael Woerister
566aa54b49 trans: Make common::fulfill_obligation only depend on SharedCrateContext.
Plus make it produce a nicer dependency graph via DepTrackingMap::memoize().
2016-05-09 16:17:00 -04:00
Michael Woerister
d24ead0f93 trans: Make various trans::collector functions independent of CrateContext. 2016-05-09 16:17:00 -04:00
Michael Woerister
2564199d8f trans: Make meth::get_vtable_methods() not depend on CrateContext. 2016-05-09 16:17:00 -04:00
Michael Woerister
100a4f5699 trans: Make normalize_and_test_predicates() not depend on CrateContext. 2016-05-09 16:17:00 -04:00
Michael Woerister
60259b9d90 Make trans::collector item printing methods independent of CrateContext. 2016-05-09 16:17:00 -04:00
Michael Woerister
b2ea54d2c6 trans: Split LocalCrateContext ownership out of SharedCrateContext. 2016-05-09 16:17:00 -04:00
Eduard Burtescu
cb3a557e0c trans: deal with the fact that ZSTs are always "initialized". 2016-05-09 22:52:06 +03:00
Eduard Burtescu
d460597e33 trans: monomorphize varidiac call argument types. 2016-05-09 22:52:01 +03:00
Alex Crichton
0ec321f7b5 rustc: Implement custom panic runtimes
This commit is an implementation of [RFC 1513] which allows applications to
alter the behavior of panics at compile time. A new compiler flag, `-C panic`,
is added and accepts the values `unwind` or `panic`, with the default being
`unwind`. This model affects how code is generated for the local crate, skipping
generation of landing pads with `-C panic=abort`.

[RFC 1513]: https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md

Panic implementations are then provided by crates tagged with
`#![panic_runtime]` and lazily required by crates with
`#![needs_panic_runtime]`. The panic strategy (`-C panic` value) of the panic
runtime must match the final product, and if the panic strategy is not `abort`
then the entire DAG must have the same panic strategy.

With the `-C panic=abort` strategy, users can expect a stable method to disable
generation of landing pads, improving optimization in niche scenarios,
decreasing compile time, and decreasing output binary size. With the `-C
panic=unwind` strategy users can expect the existing ability to isolate failure
in Rust code from the outside world.

Organizationally, this commit dismantles the `sys_common::unwind` module in
favor of some bits moving part of it to `libpanic_unwind` and the rest into the
`panicking` module in libstd. The custom panic runtime support is pretty similar
to the custom allocator support with the only major difference being how the
panic runtime is injected (takes the `-C panic` flag into account).
2016-05-09 08:22:36 -07:00
Alex Crichton
96b228835a trans: Always lower to frem
Long ago LLVM unfortunately didn't handle the 32-bit MSVC case of `frem` where
it can't be lowered to `fmodf` because that symbol doesn't exist. That was since
fixed in http://reviews.llvm.org/D12099 (landed as r246615) and was released in
what appears to be LLVM 3.8. Now that we're using that branch of LLVM let's
remove our own hacks and help LLVM optimize a little better by giving it
knowledge about what we're doing.
2016-05-09 08:17:46 -07:00
bors
32683ce193 Auto merge of #33478 - xen0n:normalize-callee-trait-ref, r=eddyb
trans: callee: normalize trait_ref before use

This fixes #33436 and #33461. Ran the tests and nothing else seems to be affected.

P.S. How to write the regression test for this fix? Does this qualify as run-pass or run-make, as the test only needs to be successfully compiled to be considered passed? Will add the testcase (the minimal example in #33461 seems fit) after clarifying this.
2016-05-09 04:32:39 -07:00