Commit Graph

1145 Commits

Author SHA1 Message Date
Wesley Wiser
2b15361298 Implement trans for the MIR Switch terminator
Fixes #29574
2015-12-14 19:00:10 -05:00
bors
50a02b43ba Auto merge of #29735 - Amanieu:asm_indirect_constraint, r=pnkfelix
This PR reverts #29543 and instead implements proper support for "=*m" and "+*m" indirect output operands. This provides a framework on top of which support for plain memory operands ("m", "=m" and "+m") can be implemented.

This also fixes the liveness analysis pass not handling read/write operands correctly.
2015-12-14 13:48:41 +00:00
bors
45a73c8c0c Auto merge of #30110 - oli-obk:pretty_const_trans, r=pnkfelix
turned some `match`es into `if let`s.
2015-12-12 14:35:43 +00:00
bors
e583ab6281 Auto merge of #30279 - Aatch:dst-ref-binding, r=pnkfelix
We shouldn't load DSTs when recursing into the sub-pattern of `& ref ident`.

Fixes #30277
2015-12-12 11:01:12 +00:00
bors
81dd3824ff Auto merge of #30265 - oli-obk:const_val_trans, r=pnkfelix
r? @nagisa

I'm going to need the `ConstVal` -> `ValueRef` translation to start removing trans/consts piece by piece. If you need anything implemented in the translation, feel free to assign an issue to me.
2015-12-11 08:12:41 +00:00
Michael Woerister
5addc31adb Make MIR encodable and store it in crate metadata. 2015-12-10 16:59:31 -05:00
Michael Woerister
70398d5ad0 MIR: Make Mir take ownership of InlineAsm values. 2015-12-10 16:39:17 -05:00
Michael Woerister
33d29700b3 MIR: Refactor mir::Terminator to use tuples instead of a fixed-size arrays. 2015-12-10 15:46:40 -05:00
James Miller
93154dd29c Fix & ref ident patterns for DSTs
We shouldn't load DSTs when recursing into the sub-pattern of `& ref ident`.

Fixes #30277
2015-12-10 00:35:55 +13:00
bors
4005d43765 Auto merge of #30245 - Aatch:dynamic-align-dst, r=pnkfelix
Fixes #26403

This adjusts the pointer, if needed, to the correct alignment by using the alignment information in the vtable.

Handling zero might not be necessary, as it shouldn't actually occur. I've left it as it's own commit so it can be removed fairly easily if people don't think it's worth doing. The way it's handled though means that there shouldn't be much impact on performance.
2015-12-09 04:22:05 +00:00
bors
462ec05764 Auto merge of #30145 - petrochenkov:hyg, r=nrc
Instead of `ast::Ident`, bindings, paths and labels in HIR now keep a new structure called `hir::Ident` containing mtwt-renamed `name` and the original not-renamed `unhygienic_name`. `name` is supposed to be used by default, `unhygienic_name` is rarely used.

This is not ideal, but better than the status quo for two reasons:
- MTWT tables can be cleared immediately after lowering to HIR
- This is less bug-prone, because it is impossible now to forget applying `mtwt::resolve` to a name. It is still possible to use `name` instead of `unhygienic_name` by mistake, but `unhygienic_name`s are used only in few very special circumstances, so it shouldn't be a problem.

Besides name resolution `unhygienic_name` is used in some lints and debuginfo. `unhygienic_name` can be very well approximated by "reverse renaming" `token::intern(name.as_str())` or even plain string `name.as_str()`, except that it would break gensyms like `iter` in desugared `for` loops. This approximation is likely good enough for lints and debuginfo, but not for name resolution, unfortunately (see https://github.com/rust-lang/rust/issues/27639), so `unhygienic_name` has to be kept.

cc https://github.com/rust-lang/rust/issues/29782

r? @nrc
2015-12-09 00:41:26 +00:00
Oliver Schneider
b85311506d prettify some statements 2015-12-08 16:00:35 +01:00
Oliver Schneider
9a63bb6661 move ConstVal -> ValueRef translation to trans::consts 2015-12-08 14:59:45 +01:00
James Miller
d6eb063fe8 Fix unsized structs with destructors
The presence of the drop flag caused the offset calculation to be
incorrect, leading to the pointer being incorrect. This has been fixed
by calculating the offset based on the field index (and not assuming
that the field is always the last one).

However, I've also stopped the drop flag from being added to the end of
unsized structs to begin with. Since it's not actually accessed for
unsized structs, and isn't actually where we would say it is, this made
more sense.
2015-12-08 15:55:00 +13:00
bors
acf4e0be22 Auto merge of #30087 - petrochenkov:indi, r=nrc
I've measured the time/memory consumption before and after - the difference is lost in statistical noise, so it's mostly a code simplification.
Sizes of `enum`s are not affected.

r? @nrc

I wonder if AST/HIR visitors could run faster if `P`s are systematically removed (except for cases where they control `enum` sizes). Theoretically they should.
Remaining unnecessary `P`s can't be easily removed because many folders accept `P<X>`s as arguments, but these folders can be converted to accept `X`s instead without loss of efficiency.
When I have a mood for some mindless refactoring again, I'll probably try to convert the folders, remove remaining `P`s and measure again.
2015-12-07 22:28:45 +00:00
Vadim Petrochenkov
ca88e9c536 Remove some unnecessary indirection from HIR structures 2015-12-07 17:17:41 +03:00
James Miller
a2557d472e Align pointers to DST fields properly
DST fields, being of an unknown type, are not automatically aligned
properly, so a pointer to the field needs to be aligned using the
information in the vtable.

Fixes #26403 and a number of other DST-related bugs discovered while
implementing this.
2015-12-08 00:03:45 +13:00
Alex Crichton
464cdff102 std: Stabilize APIs for the 1.6 release
This commit is the standard API stabilization commit for the 1.6 release cycle.
The list of issues and APIs below have all been through their cycle-long FCP and
the libs team decisions are listed below

Stabilized APIs

* `Read::read_exact`
* `ErrorKind::UnexpectedEof` (renamed from `UnexpectedEOF`)
* libcore -- this was a bit of a nuanced stabilization, the crate itself is now
  marked as `#[stable]` and the methods appearing via traits for primitives like
  `char` and `str` are now also marked as stable. Note that the extension traits
  themeselves are marked as unstable as they're imported via the prelude. The
  `try!` macro was also moved from the standard library into libcore to have the
  same interface. Otherwise the functions all have copied stability from the
  standard library now.
* The `#![no_std]` attribute
* `fs::DirBuilder`
* `fs::DirBuilder::new`
* `fs::DirBuilder::recursive`
* `fs::DirBuilder::create`
* `os::unix::fs::DirBuilderExt`
* `os::unix::fs::DirBuilderExt::mode`
* `vec::Drain`
* `vec::Vec::drain`
* `string::Drain`
* `string::String::drain`
* `vec_deque::Drain`
* `vec_deque::VecDeque::drain`
* `collections::hash_map::Drain`
* `collections::hash_map::HashMap::drain`
* `collections::hash_set::Drain`
* `collections::hash_set::HashSet::drain`
* `collections::binary_heap::Drain`
* `collections::binary_heap::BinaryHeap::drain`
* `Vec::extend_from_slice` (renamed from `push_all`)
* `Mutex::get_mut`
* `Mutex::into_inner`
* `RwLock::get_mut`
* `RwLock::into_inner`
* `Iterator::min_by_key` (renamed from `min_by`)
* `Iterator::max_by_key` (renamed from `max_by`)

Deprecated APIs

* `ErrorKind::UnexpectedEOF` (renamed to `UnexpectedEof`)
* `OsString::from_bytes`
* `OsStr::to_cstring`
* `OsStr::to_bytes`
* `fs::walk_dir` and `fs::WalkDir`
* `path::Components::peek`
* `slice::bytes::MutableByteVector`
* `slice::bytes::copy_memory`
* `Vec::push_all` (renamed to `extend_from_slice`)
* `Duration::span`
* `IpAddr`
* `SocketAddr::ip`
* `Read::tee`
* `io::Tee`
* `Write::broadcast`
* `io::Broadcast`
* `Iterator::min_by` (renamed to `min_by_key`)
* `Iterator::max_by` (renamed to `max_by_key`)
* `net::lookup_addr`

New APIs (still unstable)

* `<[T]>::sort_by_key` (added to mirror `min_by_key`)

Closes #27585
Closes #27704
Closes #27707
Closes #27710
Closes #27711
Closes #27727
Closes #27740
Closes #27744
Closes #27799
Closes #27801
cc #27801 (doesn't close as `Chars` is still unstable)
Closes #28968
2015-12-05 15:09:44 -08:00
Amanieu d'Antras
65707dfc00 Use a struct instead of a tuple for inline asm output operands 2015-12-05 10:11:20 +00:00
Amanieu d'Antras
9d7b113b44 Add proper support for indirect output constraints in inline asm 2015-12-05 08:18:30 +00:00
Vadim Petrochenkov
eb789de803 Do MTWT resolution during lowering to HIR 2015-12-05 00:40:21 +03:00
Tobias Bucher
57dad535f5 s/isize/i32 2015-12-02 09:06:28 +00:00
Steve Klabnik
8fd7f1e614 Rollup merge of #30136 - fhahn:remove-int-from-doc-examples, r=steveklabnik
This PR replaces uses of int/uint in some doc examples in various crates.
2015-12-01 19:01:41 -05:00
Florian Hahn
e48030d7d1 Replace uses of int/uint with isize/uzsize in doc examples 2015-12-01 21:21:45 +01:00
bors
eb1d018c01 Auto merge of #25570 - oli-obk:const_indexing, r=nikomatsakis
This PR allows the constant evaluation of index operations on constant arrays and repeat expressions. This allows index expressions to appear in the expression path of the length expression of a repeat expression or an array type.

An example is

```rust
const ARR: [usize; 5] = [1, 2, 3, 4, 5];
const ARR2: [usize; ARR[1]] = [42, 99];
```

In most other locations llvm's const evaluator figures it out already. This is not specific to index expressions and could be remedied in the future.
2015-12-01 19:47:38 +00:00
Michael Woerister
f28a4e93b4 Also move the MIR visitor to librustc. 2015-11-30 10:03:33 +01:00
Michael Woerister
bbe1d28496 Move the core MIR datastructures to librustc.
This is done mostly so that we can refer to MIR types in csearch and other metadata related area.
2015-11-30 10:03:33 +01:00
bors
e9ac44026d Auto merge of #29383 - petrochenkov:empstr, r=pnkfelix
Fixes https://github.com/rust-lang/rust/issues/28692
Fixes https://github.com/rust-lang/rust/issues/28992
Fixes some other similar issues (see the tests)

[breaking-change], needs crater run (cc @brson or @alexcrichton )

The pattern with parens `UnitVariant(..)` for unit variants seems to be popular in rustc (see the second commit), but mostly used by one person (@nikomatsakis), according to git blame. If it causes breakage on crates.io I'll add an exceptional case for it.
2015-11-28 00:45:34 +00:00
Ariel Ben-Yehuda
0a8bb4c509 split the metadata code into rustc_metadata
tests & rustdoc still broken
2015-11-26 18:22:40 +02:00
Ariel Ben-Yehuda
d45dd9423e make CrateStore a trait object
rustdoc still broken
2015-11-26 18:21:17 +02:00
Ariel Ben-Yehuda
11dbb69bd1 remove csearch from the rest of rustc 2015-11-26 18:21:17 +02:00
Michael Woerister
3be1d8ca7d Avoid some code duplication around getting names of numeric types. 2015-11-23 15:59:36 +01:00
Björn Steinbrink
6741f3315a Avoid FCA loads and extractvalue when copying fat pointers
Since fat pointers do not qualify as structural types, they got copied
using load_ty and store_ty, which means that we load an FCA and use
extractvalue to get the components of the fat pointer. This breaks
certain optimizations in LLVM.

Found via apasel422/ref_count#13
2015-11-20 21:42:13 +01:00
Ms2ger
83b636930d Avoid a string allocation. 2015-11-19 12:37:13 +01:00
Ms2ger
3ccef0fdc5 Rustfmt trans/base.rs. 2015-11-19 12:36:31 +01:00
Vadim Petrochenkov
35749923ee Fix the fallout 2015-11-19 11:41:09 +03:00
Niko Matsakis
06f2d9da87 Modify trans to use an outer walk and ensure that we rotate as we
encounter each module. This is somewhat different than how it used to
work; it should ensure a more equitable distribution of work than
before. The reason is that, before, when we rotated, we would rotate
before we had seen the full contents of the current module. So e.g.  if
we have `mod a { mod b { .. } .. }`, then we rotate when we encounter
`b`, but we haven't processed the remainder of `a` yet. Unclear if this
makes any difference in practice, but it seemed suboptimal. Also, this
structure (with an outer walk over modules) is closer to what we will
want for an incremental setting.
2015-11-18 19:23:29 -05:00
Niko Matsakis
1e941f8e97 Port trans to use visit_all_items: this was mostly straight-forward, but
noteworthy because trans got mildly simpler, since it doesn't have to
ensure that we walk the contents of all things just to find all the
hidden items.
2015-11-18 19:23:29 -05:00
Michael Woerister
c533902285 MIR: Add pass that erases all regions right before trans 2015-11-18 17:26:24 +01:00
Oliver Schneider
6683fa4d42 allow indexing into constant arrays 2015-11-18 10:57:52 +01:00
Oliver Schneider
e36872da5b ImplItem_ -> ImplItemKind rename 2015-11-16 10:35:30 +01:00
Oliver Schneider
eaaa60dbea rename ImplItem_::*ImplItem to ImplItem_::*
[breaking change]
2015-11-16 10:34:45 +01:00
Eli Friedman
82ab7079dd Consistently normalize fn types after erasing lifetimes.
Fixes #23406.
Fixes #23958.
Fixes #29832.
2015-11-14 14:47:49 -08:00
Ariel Ben-Yehuda
b9b45a0e96 address review comments 2015-11-14 00:09:36 +02:00
Ariel Ben-Yehuda
e82f5d4f54 implement coercions in MIR 2015-11-14 00:09:36 +02:00
Ariel Ben-Yehuda
c1bfd0ca6b implement lvalue_len
no tests - sorry
2015-11-13 22:47:02 +02:00
Ariel Ben-Yehuda
dcb64b52a2 represent fat ptr operands as 2 separate pointers
this does add some complexity, but to do otherwise would require unsized
lvalues to have their own allocas, which would be ugly.
2015-11-13 22:47:02 +02:00
Ariel Ben-Yehuda
602cf7ec3c MIR: implement fat raw pointer comparisons
The implementation itself only requires changes to trans, but
a few additional bugs concerning the handling of fat pointers
had to be fixed.
2015-11-13 22:47:02 +02:00
bors
3beb159809 Auto merge of #29759 - nagisa:mir-static, r=nikomatsakis
Fixes #29578

r? @nikomatsakis

My own observations are posted inline as comments.
2015-11-13 17:10:25 +00:00
bors
35decad781 Auto merge of #29616 - nagisa:mir-repeat, r=nikomatsakis
r? @nikomatsakis

I went ahead and replaced repeat count with a `Constant`, because it cannot be non-constant to the best of my knowledge.
2015-11-12 02:24:06 +00:00