Commit Graph

79019 Commits

Author SHA1 Message Date
bors
4f99f37b7e Auto merge of #50880 - glandium:oom, r=SimonSapin
OOM handling changes

As discussed in https://github.com/rust-lang/rust/issues/49668#issuecomment-384893456 and subsequent.

This does have codegen implications. Even without the hooks, and with a handler that ignores the arguments, the compiler doesn't eliminate calling `rust_oom` with the `Layout`. Even if it managed to eliminate that, with the hooks, I don't know if the compiler would be able to figure out it can skip it if the hook is never set.

A couple implementation notes:
- I went with explicit enums rather than bools because it makes it clearer in callers what is being requested.
- I didn't know what `feature` to put the hook setting functions behind. (and surprisingly, the compile went through without any annotation on the functions)
- There's probably some bikeshedding to do on the naming.

Cc: @Simonsapin, @sfackler
2018-05-30 11:35:00 +00:00
Nicolas Koch
c5ee3b6df1 Remobve unused import 2018-05-30 12:09:20 +02:00
bors
20af72b943 Auto merge of #51106 - davidtwco:issue-50934, r=nikomatsakis
Optimize the way that loans are killed in borrowck dataflow

Fixes #50934.
r? @nikomatsakis
2018-05-30 09:24:20 +00:00
bors
2408095f34 Auto merge of #51017 - estebank:crate-name-in-path, r=michaelwoerister
Use crate name for reexported `extern crate` paths

Fix #43189.
2018-05-30 07:10:16 +00:00
Nicolas Koch
9b6940d0b4 fs: copy: Use File::set_permissions instead of fs::set_permissions
We already got the open file descriptor at this point.
Don't make the kernel resolve the path again.
2018-05-30 06:33:54 +02:00
bors
8372e7b37e Auto merge of #50783 - pnkfelix:issue-27282-match-borrows-its-input-take-three, r=nikomatsakis
every match arm reads the match's borrowed input

This PR changes the `match` codegen under NLL (and just NLL, at least for now) to make the following adjustments:
 * It adds a `-Z disable-ast-check-for-mutation-in-guard` which, as described, turns off the naive (conservative but also not 100% sound) check for mutation in guards of match arms.
 * We now borrow the match input at the outset and emit a special `ReadForMatch` statement (that, according to the *static* semantics, reads that borrowed match input) at the start of each match arm. The intent here is to catch cases where the match guard mutates the match input, either via an independent borrow or via `ref mut` borrows in that arm's pattern.
 * In order to ensure that `ref mut` borrows do not actually conflict with the emitted `ReadForMatch` statements, I expanded the two-phase-borrow system slightly, and also changed the MIR code gen so that under NLL, when there is a guard on a match arm, then each pattern variable ends up having *three* temporaries associated with it:
   1. The first temporary will hold the substructure being matched; this is what we will move the (substructural) value into *if* the guard succeeds.
   2. The second temporary also corresponds to the same value as the first, but we are just constructing this temporarily for use during the scope of the guard; it is unaliased and its sole referrer is the third temporary.
   3. The third temporary is a reference to the second temporary.
   * (This sounds complicated, I know, but its actually *simpler* than what I was doing before and had checked into the repo, which was to sometimes construct the final value and then take a reference to it before evaluating the guard. See also PR #49870.)

Fix #27282

This also provides a path towards resolving #24535 aka rust-lang/rfcs#1006, at least once the `-Z disable-ast-check-for-mutation-in-guard` is just turned on by default (under NLL, that is. It is not sound under AST-borrowck).
 * But I did not want to make `#![feature(nll)]` imply that as part of this PR; that seemed like too drastic a change to me.
2018-05-30 02:11:59 +00:00
Mike Hommey
a4d899b4a1 Add hooks allowing to override the oom behavior 2018-05-30 10:57:38 +09:00
bors
ec99b220fe Auto merge of #50772 - nicokoch:fastcopy, r=alexcrichton
fs: copy: use copy_file_range on Linux

Linux 4.5 introduced a new system call [copy_file_range](http://man7.org/linux/man-pages/man2/copy_file_range.2.html) to copy data from one file to another.

This PR uses the new system call (if available). This has several advantages:

1. No need to constantly copy data from userspace to kernel space, if the buffer is small or the file is large
2. On some filesystems, like BTRFS, the kernel can leverage internal fs mechanisms for huge performance gains
3. Filesystems on the network dont need to copy data between the host and the client machine (they have to in the current read/write implementation)

I have created a small library that also implements the new system call for some huge performance gains here: https://github.com/nicokoch/fastcopy
Benchmark results are in the README
2018-05-29 23:49:11 +00:00
Guillaume Gomez
c7312fbae4 Fixes some style issues in rustdoc "implementations on Foreign types" 2018-05-30 01:12:23 +02:00
Esteban Küber
59b03b16b9 Fix typo 2018-05-29 14:48:23 -07:00
Nicolas Koch
c7d6a0130b Fix additional nits:
- compute bytes_to_copy more elegantly
  - add assert that written is 0 in fallback case
2018-05-29 23:42:42 +02:00
Felix S. Klock II
9d5cdc958d Review feedback: Adding test cases suggested by arielb1. 2018-05-29 23:02:40 +02:00
Felix S. Klock II
324ced89e8 Review feedback: Fix typo. 2018-05-29 23:02:40 +02:00
Felix S. Klock II
2f7f7ac14e Review feedback, remove fixme comment. 2018-05-29 23:02:40 +02:00
Felix S. Klock II
7f0c8f6638 Review feedback: Remove a fixme/tbd note and just add a note for the post-NLL future.
Driveby: just inline the two-line `fn inject_borrow` into its one call
site and remove its definition.
2018-05-29 23:02:40 +02:00
Felix S. Klock II
a4a5fa2934 Review feedback: update fixme comment to reflect reality. 2018-05-29 23:02:40 +02:00
Felix S. Klock II
2b5aa90500 review feedback: fix indentation of pattern candidates to match code elsewhere in file. 2018-05-29 23:02:40 +02:00
Felix S. Klock II
98d5e134f9 Tests illustrating the bug fixes for #27282 and #24535. 2018-05-29 23:02:40 +02:00
Felix S. Klock II
5eebd36c93 Test update: Fallout from ReadForMatch statements + changes to codegen under NLL. 2018-05-29 23:02:40 +02:00
Felix S. Klock II
3bc5073dbb Expand two-phase-borrows so that a case like this still compiles:
```rust
fn main() {
    fn reuse<X>(_: &mut X) {}
    let mut t = 2f64;
    match t {
        ref mut _b if { false } => { reuse(_b); }
        _ => {}
    }
}
```

Note: The way this is currently written is confusing; when `autoref`
is off, then the arm body bindings (introduced by
`bind_matched_candidate_for_arm_body`) are *also* used for the guard.
(Any attempt to fix this needs to still ensure that the bindings used
by the guard are introduced before the guard is evaluated.)

(Once we turn NLL on by default, we can presumably simplify all of
that.)
2018-05-29 23:02:40 +02:00
Felix S. Klock II
638acd300f Fallout from allowing some mutation in guards.
For some reason, allowing restricted mutation in match arms exposed an
obvious case where a unique borrow can indeed fail, namely something
like:

```rust
match b {
    ...
    ref mut r if { (|| { let bar = &mut *r; **bar = false; })(); false } => { &mut *r }
    //                             ~~~~~~~
    //                                |
    // This ends up holding a `&unique` borrow of `r`, but there ends up being an
    // implicit shared borrow in the guard thanks to rust-lang/rust#49870
    ...
}
```
2018-05-29 23:02:40 +02:00
Felix S. Klock II
5c30dc85c2 rust-lang/rust#41962 has a new error with my new code. Incorporate that into my code.
In particular, I am adding an implicit injected borrow on the pattern
matches, and when we go around the loop, the compiler is reporting
that this injected borrow is conflicting with the move of the original
value when the match succeeds.
2018-05-29 23:02:40 +02:00
Felix S. Klock II
173315e353 rust-lang/rust#27282: emit ReadForMatch on each match arm.
Also, turn on ReadForMatch emission by default (when using NLL).
2018-05-29 23:02:39 +02:00
Felix S. Klock II
24abe6f363 rust-lang/rust#27282: Add StatementKind::ReadForMatch to MIR.
(This is just the data structure changes and some boilerplate match
code that followed from it; the actual emission of these statements
comes in a follow-up commit.)
2018-05-29 23:01:36 +02:00
Felix S. Klock II
47bb3fd505 Debug flag to bypass restriction of mutation in match guards.
Now, if you pass `-Z disable-ast-check-for-mutation-in-guard`, then we
will just allow you to mutably-borrow and assign in guards of `match`
arms.

This is wildly unsound with AST-borrowck. It is also unsound with
MIR-borrowck without further adjustments, which come in later in the
commit series on this Pull Request.

See also rust-lang/rust#24535 and rust-lang/rfcs#1006.
2018-05-29 23:01:36 +02:00
Mike Hommey
0f4ef003ac Pass a Layout to oom
As discussed in
https://github.com/rust-lang/rust/issues/49668#issuecomment-384893456
and subsequent, there are use-cases where the OOM handler needs to know
the size of the allocation that failed. The alignment might also be a
cause for allocation failure, so providing it as well can be useful.
2018-05-30 05:35:48 +09:00
Niko Matsakis
3a9134dec5 fix off by one error 2018-05-29 15:09:48 -04:00
Niko Matsakis
948f77c71f tweak debug output some more 2018-05-29 15:09:37 -04:00
David Wood
62b1e6532a
Ensure that all statements in block are visited not just successors of a block. 2018-05-29 19:38:04 +01:00
Niko Matsakis
9c637144f5 add some debugging statements 2018-05-29 14:03:26 -04:00
David Wood
4500fe004b
Refactored DFS to be much cleaner. Added continue after noting that borrow is out of scope at location. 2018-05-29 18:22:01 +01:00
bors
524ad9b9e0 Auto merge of #51165 - SimonSapin:opt2, r=alexcrichton
Revert "Set opt-level to 3"

This reverts commit aad9840ad4.

Level 3 (possibly indirectly, the underlying bug might be in XCode’s linker) causes unit tests to sefault when compiled with some versions of XCode: https://github.com/rust-lang/rust/issues/50867

It also appears to cause some segfaults on Windows: https://github.com/rust-lang/rust/pull/50329#issuecomment-386853473, and regressions in some rustc performance benchmarks: https://github.com/rust-lang/rust/pull/50329#issuecomment-388084894
2018-05-29 17:17:53 +00:00
Simon Sapin
5067d2f133 Change the comment on opt-level = 2 to point to https://github.com/rust-lang/rust/issues/50867 2018-05-29 17:38:23 +02:00
bors
59c0f5913d Auto merge of #51133 - spastorino:make_borrowck_use_output, r=nikomatsakis
Make borrowck use polonius output
2018-05-29 15:02:39 +00:00
Niko Matsakis
c3d688962d WIP fix rustc-hash cargo.lock entry for polonius-engine 2018-05-29 09:39:32 -04:00
Santiago Pastorino
4c10a65b14
Whitelist datafrog on tidy 2018-05-29 10:19:47 -03:00
Santiago Pastorino
a8b36c9e9a
Run rustfmt 2018-05-29 10:19:47 -03:00
Santiago Pastorino
9de4e342df
Use polonius_output 2018-05-29 10:19:46 -03:00
Douglas Campos
db39ec8f9a
store output in FlowState 2018-05-29 10:19:46 -03:00
Douglas Campos
2cd09f27b8
store polonius output in MirBorrowCtx 2018-05-29 10:19:46 -03:00
Douglas Campos
b45aebfdf6
it compiles, but we do not use the output yet 2018-05-29 10:19:46 -03:00
Douglas Campos
4f88283869
expose -Zpolonius flag 2018-05-29 10:19:46 -03:00
Douglas Campos
422fe7c8e8
bump polonius engine 2018-05-29 10:19:45 -03:00
bors
889d8dcaa7 Auto merge of #51134 - RalfJung:from_raw_parts, r=SimonSapin
extend from_raw_parts docs for slices and strs to mention alignment requirement

The documentation for `str::from_raw_parts_mut` seems to not be visible because that method is private, bit I figured it could still be fixed. I also removed the reference to the no-longer-existing `str::from_raw_parts` while I was at it.

Alternatively, should I remove `str::from_raw_parts_mut` completely? it is only used in `str::split_at_mut`, where it might as well be inlined.
2018-05-29 12:50:06 +00:00
Simon Sapin
01e8616be9 Revert "Set opt-level to 3"
This reverts commit aad9840ad4.

Level 3 (possibly indirectly, the underlying bug might be in XCode’s linker)
causes unit tests to sefault when compiled with some versions of XCode:
https://github.com/rust-lang/rust/issues/50867

It also appears to cause some segfaults on Windows:
https://github.com/rust-lang/rust/pull/50329#issuecomment-386853473

… and regressions in some rustc performance benchmarks:
https://github.com/rust-lang/rust/pull/50329#issuecomment-388084894
2018-05-29 14:44:42 +02:00
bors
61f35e507a Auto merge of #51019 - Zoxc:hash-bytes, r=michaelwoerister
Hash up to 8 bytes at once with FxHasher

r? @michaelwoerister
2018-05-29 10:18:35 +00:00
bors
4f6d9bf209 Auto merge of #51142 - nickbabcock:doc-inspect, r=frewsxcv
Document additional use case for iter::inspect

Adds docs for `iter::inspect` showing the non-debug use case

Closes #49564
2018-05-29 06:50:12 +00:00
bors
fe5c45bb53 Auto merge of #51144 - tmccombs:unix-epoch-stable, r=Mark-Simulacrum
Stabilize SystemTime::UNIX_EPOCH

Fixes #49502
2018-05-29 03:22:20 +00:00
bors
5ae5361cdd Auto merge of #50475 - csmoe:debr, r=nikomatsakis
Refactor DebruijnIndex to be 0-based

Fixes #49813
2018-05-29 01:11:24 +00:00
Thayne McCombs
855ec8b6d5 Stabilize SystemTime::UNIX_EPOCH 2018-05-28 18:24:01 -06:00