Commit graph

21780 commits

Author SHA1 Message Date
bors
849a0e9c40 Auto merge of #53933 - GuillaumeGomez:codeblock-error-display, r=QuietMisdreavus
Improve error display for codeblocks in rustdoc

Part of #53919.

r? @QuietMisdreavus
2018-10-12 09:23:10 +00:00
bors
77af314083 Auto merge of #54592 - GabrielMajeri:no-plt, r=nagisa
Support for disabling PLT for better function call performance

This PR gives `rustc` the ability to skip the PLT when generating function calls into shared libraries. This can improve performance by reducing branch indirection.

AFAIK, the only advantage of using the PLT is to allow for ELF lazy binding. However, since Rust already [enables full relro for security](https://github.com/rust-lang/rust/pull/43170), lazy binding was disabled anyway.

This is a little known feature which is supported by [GCC](https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html) and [Clang](https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fplt) as `-fno-plt` (some Linux distros [enable it by default](https://git.archlinux.org/svntogit/packages.git/tree/trunk/makepkg.conf?h=packages/pacman#n40) for all builds).

Implementation inspired by [this patch](https://reviews.llvm.org/D39079#change-YvkpNDlMs_LT) which adds `-fno-plt` support to Clang.

## Performance

I didn't run a lot of benchmarks, but these are the results on my machine for a `clap` [benchmark](https://github.com/clap-rs/clap/blob/master/benches/05_ripgrep.rs):

```
 name              control ns/iter  no-plt ns/iter  diff ns/iter  diff %  speedup
 build_app_long    11,097           10,733                  -364  -3.28%   x 1.03
 build_app_short   11,089           10,742                  -347  -3.13%   x 1.03
 build_help_long   186,835          182,713               -4,122  -2.21%   x 1.02
 build_help_short  80,949           78,455                -2,494  -3.08%   x 1.03
 parse_clean       12,385           12,044                  -341  -2.75%   x 1.03
 parse_complex     19,438           19,017                  -421  -2.17%   x 1.02
 parse_lots        431,493          421,421              -10,072  -2.33%   x 1.02
```

A small performance improvement across the board, with no downsides. It's likely binaries which make a lot of function calls into dynamic libraries could see even more improvements. [This comment](https://patchwork.ozlabs.org/patch/468993/#1028255) suggests that, in some cases, `-fno-plt` could improve PIC/PIE code performance by 10%.

## Security benefits

**Bonus**: some of the speculative execution attacks rely on the PLT, by disabling it we reduce a big attack surface and reduce the need for [`retpoline`](https://reviews.llvm.org/D41723).

## Remaining PLT calls

The compiled binaries still have plenty of PLT calls, coming from C/C++ libraries. Building dependencies with `CFLAGS=-fno-plt CXXFLAGS=-fno-plt` removes them.
2018-10-11 19:38:15 +00:00
Gabriel Majeri
6009da0794 Support for disabling the PLT on ELF targets
Disable the PLT where possible to improve performance
for indirect calls into shared libraries.

This optimization is enabled by default where possible.

- Add the `NonLazyBind` attribute to `rustllvm`:
  This attribute informs LLVM to skip PLT calls in codegen.

- Disable PLT unconditionally:
  Apply the `NonLazyBind` attribute on every function.

- Only enable no-plt when full relro is enabled:
  Ensures we only enable it when we have linker support.

- Add `-Z plt` as a compiler option
2018-10-11 21:11:00 +03:00
bors
a534216fa6 Auto merge of #54850 - mcr431:fix-54707-trait-function-from-macro, r=nikomatsakis
Fix #54707 - parse_trait_item_ now handles interpolated blocks as function body decls

Fix #54707 - parse_trait_item_ now handles interpolated blocks as function body decls

Previously parsing trait items only handled opening brace token and semicolon, I added a branch to the match statement that will also handle interpolated blocks.
2018-10-11 09:19:23 +00:00
bors
cb6eeddd4d Auto merge of #54969 - Manishearth:rollup, r=Manishearth
Rollup of 9 pull requests

Successful merges:

 - #54747 (codegen_llvm: verify that inline assembly operands are scalars)
 - #54848 (Better Diagnostic for Trait Object Capture)
 - #54850 (Fix #54707 - parse_trait_item_ now handles interpolated blocks as function body decls)
 - #54858 (second round of refactorings for universes)
 - #54862 (Implement RFC 2539: cfg_attr with multiple attributes)
 - #54869 (Fix mobile docs)
 - #54870 (Stabilize tool lints)
 - #54893 (Fix internal compiler error on malformed match arm pattern.)
 - #54904 (Stabilize the `Option::replace` method)

Failed merges:

 - #54909 ( Add chalk rules related to associated type defs)

r? @ghost
2018-10-11 06:26:03 +00:00
bors
9746a2d40d Auto merge of #54848 - davidtwco:issue-52663-trait-object, r=nikomatsakis
Better Diagnostic for Trait Object Capture

Part of #52663.

This commit enhances `LaterUseKind` detection to identify when a borrow
is captured by a trait object which helps explain why there is a borrow
error.

r? @nikomatsakis
cc @pnkfelix
2018-10-11 03:32:12 +00:00
Manish Goregaokar
be64bf3b9d Rollup merge of #54909 - scalexm:finish-rules, r=nikomatsakis
Fixes #47311.
r? @nrc
2018-10-10 15:59:25 -07:00
Manish Goregaokar
e1e628ec87 Rollup merge of #54893 - dsciarra:issue-54379, r=pnkfelix
Fixes #47311.
r? @nrc
2018-10-10 15:59:21 -07:00
Manish Goregaokar
50e410c240 Rollup merge of #54870 - flip1995:stabilize_tool_lints, r=Manishearth
Fixes #47311.
r? @nrc
2018-10-10 15:59:20 -07:00
Manish Goregaokar
8ebc6d6dbb Rollup merge of #54862 - Havvy:cfg_attr_multi, r=petrochenkov
Fixes #47311.
r? @nrc
2018-10-10 15:58:40 -07:00
Manish Goregaokar
a267b3a9ff Rollup merge of #54848 - davidtwco:issue-52663-trait-object, r=nikomatsakis
Fixes #47311.
r? @nrc
2018-10-10 15:58:38 -07:00
bors
f42c510f2f Auto merge of #54747 - levex:inline-asm-bad-operands, r=nagisa
codegen_llvm: verify that inline assembly operands are scalars

Another set of inline assembly fixes. This time let's emit an error message when the operand value cannot be coerced into the operand constraint.

Two questions:

1) Should I reuse `E0668` which was introduced in #54568 or just use `E0669` as it stands because they do mean different things, but maybe that's not too user-friendly. Just a thought.
2) The `try_fold` returns the operand which failed to be converted into a scalar value, any suggestions on how to use that in the error message?

Thanks!
2018-10-10 22:24:48 +00:00
bors
e1041c6cd1 Auto merge of #54802 - davidtwco:issue-53040, r=pnkfelix
[nll] better error message when returning refs to upvars

Fixes #53040.

r? @nikomatsakis
2018-10-10 14:51:01 +00:00
bors
71d3a71572 Auto merge of #54831 - davidtwco:issue-52663-struct-field-suggestion, r=nikomatsakis
NLL is missing struct field suggestion

Part of #52663.

This commit adds suggestions to change the definitions of fields in
struct definitions from immutable references to mutable references.

r? @nikomatsakis
cc @pnkfelix
2018-10-10 06:36:11 +00:00
bors
4623d48893 Auto merge of #54764 - tromey:test-rust-lldb, r=alexcrichton
Run debuginfo tests against rust-enabled lldb, when possible

If the rust-enabled lldb was built, then use it when running the
debuginfo tests.  Updating the lldb submodule was necessary as this
needed a way to differentiate the rust-enabled lldb, so I added a line
to the --version output.

This adds compiletest commands to differentiate between the
rust-enabled and non-rust-enabled lldb, as is already done for gdb.  A
new "rust-lldb" header directive is also added, but not used in this
patch; I plan to use it in #54004.

This updates all the tests.
2018-10-10 02:08:23 +00:00
flip1995
a249981a43 Remove feature-gate tests 2018-10-09 16:38:38 -07:00
flip1995
5e9084ccc3 Remove feature(tool_lints) from tests 2018-10-09 16:38:38 -07:00
bors
eae47a4048 Auto merge of #54734 - pawroman:fix_range_borrowing_suggestion, r=varkor
Fix range literals borrowing suggestions

Fixes #54505. The compiler issued incorrect range borrowing suggestions (missing `()` around borrows of range literals). This was not correct syntax (see the issue for an example).

With changes in this PR, this is fixed for all types of `Range` literals.

Thanks again to @varkor and @estebank for their invaluable help and guidance.

r? @varkor
2018-10-09 22:36:14 +00:00
bors
0e07c4281c Auto merge of #54762 - RalfJung:miri-validate, r=oli-obk
Prepare miri engine for enforcing validity invariant during execution

In particular, make recursive checking of references optional, and add a `const_mode` parameter that says whether `usize` is allowed to contain a pointer. Also refactor validation a bit to be type-driven at the "leafs" (primitive types), and separately validate scalar layout to catch `NonNull` violations (which it did not properly validate before).

Fixes https://github.com/rust-lang/rust/issues/53826
Also fixes https://github.com/rust-lang/rust/issues/54751

r? @oli-obk
2018-10-09 17:19:56 +00:00
Ralf Jung
e09e3c898c fix nits and handling of extern static 2018-10-09 13:08:00 +02:00
Ralf Jung
322017b2bc unify handling of thin and fat pointers by moving primitive type handling out of aggregate handling
Also, make enum variant handling a bit nicer
2018-10-09 13:08:00 +02:00
Ralf Jung
95593331bf add some tests with constants that better be valid 2018-10-09 13:08:00 +02:00
Ralf Jung
13bdc1673d move a test to a better place 2018-10-09 13:08:00 +02:00
Ralf Jung
69a320f40d also validate everything that has a Scalar layout, to catch NonNull 2018-10-09 13:08:00 +02:00
Ralf Jung
0a2fae6cb7 fix validating arrays of ZSTs
Fixes #54751
2018-10-09 13:08:00 +02:00
Ralf Jung
f65d3b5491 switch validation of scalars to be type-driven
This does not actually regress anything.  It would regress NonNull, but we
didn't handle that correctly previously either.
2018-10-09 13:08:00 +02:00
Ralf Jung
ff5a245f52 check that entire ref is in-bounds before recursing; add macro for validation msgs on error 2018-10-09 13:08:00 +02:00
David Wood
98633b458b
Improve message for closure returning a closure.
Now when a `FnMut` closure is returning a closure that contains a
reference to a captured variable, we provide an error that makes it more
clear what is happening.
2018-10-09 12:31:51 +02:00
David Wood
c65e119229
Improve errors for FnMut closures.
This commit improves the errors for `FnMut` closures where a reference
to a captured variable is escaping.
2018-10-09 12:31:47 +02:00
bors
e1643a8968 Auto merge of #54757 - nikomatsakis:nll-issue-54573-user-annot, r=pnkfelix
user annotations in patterns

Fixes https://github.com/rust-lang/rust/issues/54573

r? @pnkfelix
2018-10-09 10:15:44 +00:00
bors
607243b6f9 Auto merge of #54798 - matthewjasper:free-region-closure-errors, r=nikomatsakis
[NLL]  Improve closure region bound errors

Previously, we would report free region errors that originate from closure with the span of the closure and a "closure body requires ..." message. This is now updated to use a reason and span from inside the closure.
2018-10-09 07:22:14 +00:00
Paweł Romanowski
1f7dafbb77 Fix test for windows os 2018-10-09 08:24:29 +02:00
Matthew Russo
344747330c parse_trait_item_ now handles interpolated blocks as function body decls 2018-10-08 22:50:34 -04:00
Niko Matsakis
40ab41fd18 add pattern type ascriptions for tuple/brace structs/enums 2018-10-08 19:20:37 -04:00
Tom Tromey
ac33b2e578 Run debuginfo tests against rust-enabled lldb, when possible
If the rust-enabled lldb was built, then use it when running the
debuginfo tests.  Updating the lldb submodule was necessary as this
needed a way to differentiate the rust-enabled lldb, so I added a line
to the --version output.

This adds compiletest commands to differentiate between the
rust-enabled and non-rust-enabled lldb, as is already done for gdb.  A
new "rust-lldb" header directive is also added, but not used in this
patch; I plan to use it in #54004.

This updates all the tests.
2018-10-08 11:04:24 -06:00
Paweł Romanowski
882e373275 Attempt to fix #54505 tests for wasm 2018-10-08 18:39:09 +02:00
scalexm
96ff827395 Add chalk rules related to associated type defs
* Rule ProjectionEq-Skolemize
* Rule WellFormed-AssocTy
* Rule Implied-Trait-From-AssocTy
2018-10-08 15:26:22 +02:00
David Wood
9e49ac067f
Change from label to suggestion.
This commit changes the label to a maybe incorrect suggestion for better
integration with RLS.
2018-10-08 12:26:56 +02:00
David Wood
f8c1b0cd5b
Add struct field suggestions.
This commit adds suggestions to change the definitions of fields in
struct definitions from immutable references to mutable references.
2018-10-08 12:26:55 +02:00
Havvy (Ryan Scheel)
bbe832d570 cfg-attr-multi: Change issue number to actual tracking issue 2018-10-07 21:48:28 -07:00
Zack M. Davis
b1b684ef23 structured suggestions for unused-lifetimes lint 2018-10-07 19:17:39 -07:00
bors
b2d6ea98b0 Auto merge of #54810 - 1aim:unused-impl-trait, r=oli-obk
Fix dead code lint for functions using impl Trait

Fixes https://github.com/rust-lang/rust/issues/54754

This is a minimal fix that doesn't add any new queries or touches unnecessary code. Please nominate for beta backport if wanted.
2018-10-07 19:30:24 +00:00
David Wood
72911fbbd0
Update logic to search for casts.
This commit updates the captured trait object search logic to look for
unsized casts to boxed types rather than for functions that returned
trait objects.
2018-10-07 16:14:22 +02:00
David Wood
91b71f5e94
Identify borrows captured by trait objects.
This commit enhances `LaterUseKind` detection to identify when a borrow
is captured by a trait object which helps explain why there is a borrow
error.
2018-10-07 16:03:06 +02:00
bors
0ee045ea09 Auto merge of #54835 - oli-obk:mögen_konstante_funktionen_doch_bitte_endlich_stabil_sein, r=Centril
Stabilize `min_const_fn`

tracking issue: #53555

r? @Centril
2018-10-07 13:37:07 +00:00
Donato Sciarra
b7248d5988 Fix internal compiler error on malformed match arm pattern.
Issue: 54379
2018-10-07 13:14:21 +02:00
bors
5a6f122126 Auto merge of #54813 - petrochenkov:uilocale, r=alexcrichton
Fix two UI tests with locale-dependent output

Closes https://github.com/rust-lang/rust/issues/54719
2018-10-07 11:10:39 +00:00
Havvy (Ryan Scheel)
35e6c65628 cfg_attr_multi: Feature gate 2018-10-07 02:08:24 -07:00
bors
987a50bab3 Auto merge of #54823 - euclio:needs-test, r=alexcrichton
Add tests for some E-needstest issues

Fixes #28134.
Fixes #24338.
Fixes #29743.
2018-10-07 08:32:19 +00:00
bors
13429136b8 Auto merge of #54451 - alexcrichton:no-mangle-extern-linkage, r=michaelwoerister
rustc: Allow `#[no_mangle]` anywhere in a crate

This commit updates the compiler to allow the `#[no_mangle]` (and
`#[export_name]` attributes) to be located anywhere within a crate.
These attributes are unconditionally processed, causing the compiler to
always generate an exported symbol with the appropriate name.

After some discussion on #54135 it was found that not a great reason
this hasn't been allowed already, and it seems to match the behavior
that many expect! Previously the compiler would only export a
`#[no_mangle]` symbol if it were *publicly reachable*, meaning that it
itself is `pub` and it's otherwise publicly reachable from the root of
the crate. This new definition is that `#[no_mangle]` *is always
reachable*, no matter where it is in a crate or whether it has `pub` or
not.

This should make it much easier to declare an exported symbol with a
known and unique name, even when it's an internal implementation detail
of the crate itself. Note that these symbols will persist beyond LTO as
well, always making their way to the linker.

Along the way this commit removes the `private_no_mangle_functions` lint
(also for statics) as there's no longer any need to lint these
situations. Furthermore a good number of tests were updated now that
symbol visibility has been changed.

Closes #54135
2018-10-07 03:07:16 +00:00