Commit Graph

69877 Commits

Author SHA1 Message Date
Eduard-Mihai Burtescu 3fd6b00082 rustc_trans: query LLVM types from a layout instead of a Ty. 2017-11-19 02:14:32 +02:00
Eduard-Mihai Burtescu 1477119344 rustc_trans: keep a layout instead of a type in {Lvalue,Operand}Ref. 2017-11-19 02:14:32 +02:00
Eduard-Mihai Burtescu 88f70323e4 rustc_trans: nest abi::ArgType's for fat pointers instead of eagerly flattening. 2017-11-19 02:14:31 +02:00
Eduard-Mihai Burtescu f2e7e17d9e rustc_trans: pass OperandRef arguments to trans_intrinsic_call. 2017-11-19 02:14:31 +02:00
Eduard-Mihai Burtescu b2d52d2132 rustc: do not pub use Layout::* in layout. 2017-11-19 02:14:31 +02:00
Eduard-Mihai Burtescu d0ab6e8644 rustc_trans: compute LLVM types from type layouts, not Rust types. 2017-11-19 02:14:31 +02:00
Eduard-Mihai Burtescu fad99542c8 rustc: split layout::FieldPlacement::Linear back into Union and Array. 2017-11-19 02:14:31 +02:00
Eduard-Mihai Burtescu 18d54aa7d5 rustc: move layout::Struct into FieldPlacement/Abi. 2017-11-19 02:14:31 +02:00
Eduard-Mihai Burtescu 08f9f134fd rustc: hide details in Layout in favor of Abi or FieldPlacement. 2017-11-19 02:14:31 +02:00
Eduard-Mihai Burtescu ed788a62f6 rustc: store CachedLayout for each variant of enum Layout's instead of Struct. 2017-11-19 02:14:31 +02:00
Eduard-Mihai Burtescu bd51a2bc19 rustc: move size/alignment from Layout into layout::Abi. 2017-11-19 02:14:31 +02:00
Eduard-Mihai Burtescu bd86f3739e rustc: make Layout::NullablePointer a lot more like Layout::General. 2017-11-19 02:14:30 +02:00
Eduard-Mihai Burtescu 33a205b56f rustc: collapse Layout::CEnum into Layout::General. 2017-11-19 02:14:30 +02:00
Eduard-Mihai Burtescu 658ebfc788 rustc: give Layout::CEnum a discriminant field like Layout::General. 2017-11-19 02:14:30 +02:00
Eduard-Mihai Burtescu d318b9c27b rustc: move CEnum's signedness into Primitive::Int. 2017-11-19 02:14:30 +02:00
Eduard-Mihai Burtescu 61c2bd9ca4 rustc: use Primitive instead of Integer for CEnum and General discriminants. 2017-11-19 02:14:30 +02:00
Eduard-Mihai Burtescu 335bd8ea1b rustc: do not track `non_zero` in Layout. 2017-11-19 02:14:30 +02:00
Eduard-Mihai Burtescu 02276e9f49 rustc: collapse Layout::{Raw,StructWrapped}NullablePointer into one variant. 2017-11-19 02:14:30 +02:00
Eduard-Mihai Burtescu caef91d7c6 rustc: introduce layout::Abi for reduced general ABI "passing style". 2017-11-19 02:14:30 +02:00
Eduard-Mihai Burtescu 1dc572b85e rustc: represent the discriminant as a field for Layout::{Raw,StructWrapped}NullablePointer. 2017-11-19 02:14:29 +02:00
Eduard-Mihai Burtescu 30710609c0 rustc_trans: treat General enums like unions. 2017-11-19 02:14:29 +02:00
Eduard-Mihai Burtescu 9a0efea4c2 rustc: pre-compute field placements out of Layout. 2017-11-19 02:14:29 +02:00
Eduard-Mihai Burtescu 8c4d5af52b rustc: remove Ty::layout and move everything to layout_of. 2017-11-19 02:14:29 +02:00
Eduard-Mihai Burtescu 8864668d53 rustc: re-complicate the TyLayout API and use better names. 2017-11-19 02:14:29 +02:00
Eduard-Mihai Burtescu aa811d728a rustc: remove source field path from Layout::StructWrappedNullablePointer. 2017-11-19 02:14:29 +02:00
Eduard-Mihai Burtescu bc8e1f7efa rustc: use an offset instead of a field path in Layout::StructWrappedNullablePointer. 2017-11-19 02:14:29 +02:00
Eduard-Mihai Burtescu 50a3fd0097 rustc: remove useless 0 prefix from Layout::StructWrappedNullablePointer's discrfield. 2017-11-19 02:14:29 +02:00
Eduard-Mihai Burtescu 44eef7c9ac rustc: do not inject discriminant fields into Layout::General's variants. 2017-11-19 02:14:28 +02:00
Eduard-Mihai Burtescu 8afa3a01e6 rustc_trans: always insert alignment padding, even before the first field. 2017-11-19 02:14:28 +02:00
Eduard-Mihai Burtescu 0a1fcc32a6 rustc_trans: use *[T; 0] for slice data pointers instead of *T. 2017-11-19 02:14:28 +02:00
Eduard-Mihai Burtescu 84b5a3d84d rustc_trans: remove the in_memory_type_of distinction. 2017-11-19 02:14:28 +02:00
Eduard-Mihai Burtescu 5b1fdaeb80 rustc_trans: use more of the trans::mir and ty::layout APIs throughout. 2017-11-19 02:14:28 +02:00
Eduard-Mihai Burtescu 260c41b4b8 rustc_trans: do not introspect LLVM aggregate field types. 2017-11-19 02:14:28 +02:00
Eduard-Mihai Burtescu b8671bef97 rustc_trans: remove obsolete Type methods. 2017-11-19 02:14:28 +02:00
Eduard-Mihai Burtescu 386d59dc89 rustc_trans: use a predictable layout for constant ADTs. 2017-11-19 02:14:28 +02:00
Eduard-Mihai Burtescu f44b099187 rustc_trans: avoid working with sizes/offsets and alignments as integers. 2017-11-19 02:14:24 +02:00
Eduard-Mihai Burtescu 9deea47c96 rustc_mir: always downcast enums, even if univariant. 2017-11-18 20:52:38 +02:00
Eduard-Mihai Burtescu fab2532ef9 rustc_trans: move const & lvalue access helpers from adt. 2017-11-17 18:25:31 +02:00
bors aabfed5e0c Auto merge of #45996 - eddyb:even-mirer-1, r=arielb1
MIR: hide .rodata constants vs by-ref ABI clash in trans.

Back in #45380, constants were copied into locals during MIR creation to ensure that arguments ' memory can be used by the callee, if the constant is placed in `.rodata` and the ABI passes it by-ref.

However, there are several drawbacks (see https://github.com/rust-lang/rust/pull/45380#discussion_r150447709), most importantly the complication of constant propagation (UB if a constant ends up in `Call` arguments) and inconveniencing analyses.

Instead, I've modified the `rustc_trans` implementation of calls to copy an `Operand::Constant` argument locally if it's not immediate, and added a test that segfaults without the copy.

cc @dotdash @arielb1
2017-11-17 13:30:24 +00:00
bors 02eed2e9a5 Auto merge of #46004 - michaelwoerister:cached-mir-wip-3, r=nikomatsakis
incr.comp.: Implement query result cache and use it to cache type checking tables.

This is a spike implementation of caching more than LLVM IR and object files when doing incremental compilation. At the moment, only the `typeck_tables_of` query is cached but MIR and borrow-check will follow shortly. The feature is activated by running with `-Zincremental-queries` in addition to `-Zincremental`, it is not yet active by default.

r? @nikomatsakis
2017-11-17 10:12:21 +00:00
bors b32267f2c1 Auto merge of #45595 - scottmcm:iter-try-fold, r=dtolnay
Short-circuiting internal iteration with Iterator::try_fold & try_rfold

These are the core methods in terms of which the other methods (`fold`, `all`, `any`, `find`, `position`, `nth`, ...) can be implemented, allowing Iterator implementors to get the full goodness of internal iteration by only overriding one method (per direction).

Based off the `Try` trait, so works with both `Result` and `Option` (🎉 https://github.com/rust-lang/rust/pull/42526).  The `try_fold` rustdoc examples use `Option` and the `try_rfold` ones use `Result`.

AKA continuing in the vein of PRs https://github.com/rust-lang/rust/pull/44682 & https://github.com/rust-lang/rust/pull/44856 for more of `Iterator`.

New bench following the pattern from the latter of those:
```
test iter::bench_take_while_chain_ref_sum          ... bench:   1,130,843 ns/iter (+/- 25,110)
test iter::bench_take_while_chain_sum              ... bench:     362,530 ns/iter (+/- 391)
```

I also ran the benches without the `fold` & `rfold` overrides to test their new default impls, with basically no change.  I left them there, though, to take advantage of existing overrides and because `AlwaysOk` has some sub-optimality due to https://github.com/rust-lang/rust/issues/43278 (which 45225 should fix).

If you're wondering why there are three type parameters, see issue https://github.com/rust-lang/rust/issues/45462

Thanks for @bluss for the [original IRLO thread](https://internals.rust-lang.org/t/pre-rfc-fold-ok-is-composable-internal-iteration/4434) and the rfold PR and to @cuviper for adding so many folds, [encouraging me](https://github.com/rust-lang/rust/pull/45379#issuecomment-339424670) to make this PR, and finding a catastrophic bug in a pre-review.
2017-11-17 07:43:08 +00:00
bors 3bcb00dbc2 Auto merge of #45991 - gnzlbg:fix_i586, r=alexcrichton
fix linking error on i586

Try to fix this linking error on i586 in cross:

https://travis-ci.org/japaric/cross/builds/302095949#L8670

The problem is that `std` is built in Ubuntu 16.04 and `cross` uses a linker from 12.04.

Currently this fix solves the problem for `i686-musl`  making it "supercompatible", this PR applies the fix to `i586` as well.

The cross PR is here: https://github.com/japaric/cross/pull/157
2017-11-17 05:18:45 +00:00
bors 8fbb46c4a1 Auto merge of #45980 - Keruspe:master, r=alexcrichton
rustbuild: Install rustfmt as part of extended build

Now that we distribute it, this allows `./x.py install` to install it too
2017-11-17 02:34:08 +00:00
Eduard-Mihai Burtescu 6db68938ac MIR: hide .rodata constants vs by-ref ABI clash in trans. 2017-11-17 01:37:10 +02:00
bors d59f66d9b8 Auto merge of #45897 - tromey:trait-object-debug, r=michaelwoerister
Trait object debug

This enables better debugging of trait objects.  See the individual commits for explanations.  This required an LLVM bump.
2017-11-16 23:28:00 +00:00
bors d0f8e2913a Auto merge of #45825 - nikomatsakis:nll-factor-region-inference, r=arielb1
integrate MIR type-checker with NLL inference

This branch refactors NLL type inference so that it uses the MIR type-checker to gather constraints. Along the way, it also refactors how region constraints are gathered in the normal inference context mildly. The new setup is like this:

- What used to be `region_inference` is split into two parts:
    - `region_constraints`, which just collects up sets of constraints
    - `lexical_region_resolve`, which does the iterative, lexical region resolution
- When `resolve_regions_and_report_errors` is invoked, the inference engine converts the constraints into final values.
- In the MIR type checker, however, we do not invoke this method, but instead periodically take the region constraints and package them up for the NLL solver to use later.
    - This allows us to track when and where those constraints were incurred.
    - We also remove the central fulfillment context from the MIR type checker, instead instantiating new fulfillment contexts at each point. This allows us to capture the set of obligations that occurred at a particular point, and also to ensure that if the same obligation arises at two points, we will enforce the region constraints at both locations.
- The MIR type checker is also enhanced to instantiate late-bound-regions with fresh variables and handle a few other corner cases that arose.
- I also extracted some of the 'outlives' logic from the regionck, which will be needed later (see future work) to handle the type-outlives relationships.

One concern I have with this branch: since the MIR type checker is used even without the `-Znll` switch, I'm not sure if it will impact performance. One simple fix here would be to only enable the MIR type-checker if debug-assertions are enabled, since it just serves to validate the MIR. Longer term I hope to address this by improving the interface to the trait solver to be more query-based (ongoing work).

There is plenty of future work left. Here are two things that leap to mind:

- **Type-region outlives.** Currently, the NLL solver will ICE if it is required to handle a constraint like `T: 'a`. Fixing this will require a small amount of refactoring to extract the implied bounds code. I plan to follow a file-up bug on this (hopefully with mentoring instructions).
- **Testing.** It's a good idea to enumerate some of the tricky scenarios that need testing, but I think it'd be nice to try and parallelize some of the actual test writing (and resulting bug fixing):
    - Same obligation occurring at two points.
    - Well-formedness and trait obligations of various kinds (which are not all processed by the current MIR type-checker).
    - More tests for how subtyping and region inferencing interact.
    - More suggestions welcome!

r? @arielb1
2017-11-16 20:56:26 +00:00
bors 58d8761ab3 Auto merge of #46029 - GuillaumeGomez:rollup, r=GuillaumeGomez
Rollup of 6 pull requests

- Successful merges: #45951, #45973, #45984, #45993, #46005, #46010
- Failed merges:
2017-11-16 18:24:17 +00:00
Michael Woerister 0a1f6dd8a8 Add doc comment for LocalDefId. 2017-11-16 18:09:04 +01:00
Michael Woerister 4c4f7a3189 Fix some tidy errors in ty::codec. 2017-11-16 17:42:39 +01:00
Michael Woerister cb1ff24425 incr.comp.: Remove default serialization implementations for things in rustc::hir::def_id so that we get an ICE instead of silently doing the wrong thing. 2017-11-16 17:13:39 +01:00