Commit graph

3925 commits

Author SHA1 Message Date
varkor
2cc52f08b3 Use cmp::Reverse instead of subtraction 2018-04-09 16:45:14 +01:00
varkor
eacfb330e6 Convert sort_by_key to sort_by_cached_key 2018-04-09 16:43:48 +01:00
bors
780707490f Auto merge of #49672 - alexcrichton:fix-another-std-core-cycle, r=michaelwoerister
Fix another circular deps link args issue

It turns out that the support in #49316 wasn't enough to handle all cases
notably the example in #48661. The underlying bug was connected to panic=abort
where lang items were listed in the `missing_lang_items` sets but didn't
actually exist anywhere.

This caused the linker backend to deduce that start-group/end-group wasn't
needed because not all items were defined. Instead the missing lang items that
don't actually need to have a definition are filtered out and not considered for
the start-group/end-group arguments

Closes #48661
2018-04-07 17:14:46 +00:00
bors
8228d8e176 Auto merge of #49692 - sinkuu:main_fix, r=arielb1
Fix ICE with `main`'s return type containing lifetimes

Fixes #48890
2018-04-07 14:33:48 +00:00
bors
8c2d7b2da3 Auto merge of #49661 - alexcrichton:bump-bootstrap, r=nikomatsakis
Bump the bootstrap compiler to 1.26.0 beta

Holy cow that's a lot of `cfg(stage0)` removed and a lot of new stable language
features!
2018-04-07 11:58:38 +00:00
kennytm
c3eb990716
Rollup merge of #49728 - japaric:no-debug_gdb_scripts, r=alexcrichton
add emit_debug_gdb_scripts target option and ..

set it to false for no-std targets like ARM Cortex-M and MSP430. For the rationale of this change see the comment in thumb_base.rs

this is a temporary workaround until #44993 is implemented

r? @alexcrichton or @michaelwoerister
2018-04-07 14:51:30 +08:00
Jorge Aparicio
1eed662fc4 refactor: simplify needs_gdb_debug_scripts_section 2018-04-06 15:48:06 +02:00
Jorge Aparicio
ea08bdf30c add emit_debug_gdb_scripts target option and ..
set it to false for no-std targets like ARM Cortex-M and MSP430. For the rationale of this change
see the comment in thumb_base.rs
2018-04-06 15:47:57 +02:00
Michael Woerister
07704a4e1d Allow for re-using hidden monomorphizations on platforms that don't support Rust dylibs. 2018-04-06 12:14:08 +02:00
Michael Woerister
ec55390387 Update a few comments about symbol visibility. 2018-04-06 12:14:08 +02:00
Michael Woerister
a1a986cfae Fix some rebasing fallout. 2018-04-06 12:14:08 +02:00
Michael Woerister
213ef111cf Select upstream monomorphizations in a stable way. 2018-04-06 12:14:08 +02:00
Michael Woerister
9b90674d01 Allow for internalizing monomorphizations that cannot be shared. 2018-04-06 12:14:08 +02:00
Michael Woerister
e203b3ab71 Remove the (inaccurate) symbol_export_level query. 2018-04-06 12:14:08 +02:00
Michael Woerister
4f6d05dc48 Allow for re-using monomorphizations from upstream crates. 2018-04-06 12:14:08 +02:00
Michael Woerister
435477dc65 Move export level computation to reachable_non_generics query. 2018-04-06 12:14:08 +02:00
Michael Woerister
dad194a10d Allow for representing exported monomorphizations in crate metadata. 2018-04-06 12:14:08 +02:00
Shotaro Yamada
dc9128fff8 Fix ICE with main's return type containing lifetimes 2018-04-06 00:39:36 +09:00
Alex Crichton
8958815916 Bump the bootstrap compiler to 1.26.0 beta
Holy cow that's a lot of `cfg(stage0)` removed and a lot of new stable language
features!
2018-04-05 07:13:45 -07:00
kennytm
19c69082f5
Rollup merge of #49432 - nabijaczleweli:master, r=michaelwoerister
Flush executables to disk after linkage

A problem caused by not doing so in Chrome has been reported [here](https://randomascii.wordpress.com/2018/02/25/compiler-bug-linker-bug-windows-kernel-bug/amp/).

`File::sync_all()` calls `FlushFileBuffers()` down the line, causing potentially unflushed buffers on high I/O-load systems to flush and preventing nasty non-reproducible bugs.

Closes #48545
2018-04-05 16:51:20 +08:00
Alex Crichton
48ede3f031 Fix another circulare deps link args issue
It turns out that the support in #49316 wasn't enough to handle all cases
notably the example in #48661. The underlying bug was connected to panic=abort
where lang items were listed in the `missing_lang_items` sets but didn't
actually exist anywhere.

This caused the linker backend to deduce that start-group/end-group wasn't
needed because not all items were defined. Instead the missing lang items that
don't actually need to have a definition are filtered out and not considered for
the start-group/end-group arguments

Closes #48661
2018-04-04 16:54:30 -07:00
nabijaczleweli
e1d3c471d7
Open the file as write before trying to flush it
This should be enough and shouldn't require append(true) since we're not
explicitly writing anything so we're not flushing it so we've no risk of
overwriting it
2018-03-31 19:12:29 +02:00
Alex Crichton
88114f61b4 rustc: Group linked libraries where needed
This commit fixes a longstanding issue with the compiler with circular
dependencies between libcore and libstd. The `core` crate requires at least one
symbol, the ability to unwind. The `std` crate is the crate which actually
defines this symbol, but the `std` crate also depends on the `core` crate.

This circular dependency is in general disallowed in Rust as crates cannot have
cycles amongst them. A special exception is made just for core/std, but this is
also unfortunately incompatible with how GNU linkers work. GNU linkers will
process undefined symbols in a left-to-right fashion, only actually linking an
rlib like libstd if there are any symbols used from it. This strategy is
incompatible with circular dependencies because if we otherwise don't use
symbols from libstd we don't discover that we needed it until we're later
processing libcore's symbols!

To fix this GNU linkers support the `--start-group` and `--end-group` options
which indicate "libraries between these markers may have circular dependencies
amongst them. The linker invocation has been updated to automatically pass these
arguments when we're invoking a GNU linker and automatically calculate where the
arguments need to go (around libstd and libcore)

Closes #18807
Closes #47074
2018-03-29 15:07:51 -07:00
nabijaczleweli
3787106be6
Also protect first attempt 2018-03-29 17:50:57 +02:00
nabijaczleweli
cd09c2b2ab
Flush executables to disk after linkage
A problem caused by not doing so in Chrome has been reported here:
https://randomascii.wordpress.com/2018/02/25/compiler-bug-linker-bug-windows-kernel-bug/amp/

File::sync_all() calls FlushFileBuffers() down the line,
causing potentially unflushed buffers on high I/O-load systems to flush
and prevent nasty non-reproducible bugs.

The force-flush is only done on Windows and if the linker exited successfully

Closes #48545
2018-03-29 16:47:06 +02:00
kennytm
4285e1cad4
Rollup merge of #49329 - canarysnort01:fix-no-pie, r=pnkfelix
don't pass -no-pie to gnu ld

fixes #48884
2018-03-28 17:55:07 +02:00
bors
d87c19db6d Auto merge of #49019 - phil-opp:target-spec, r=pnkfelix
Introduce a TargetTriple enum to support absolute target paths

This PR replaces target triple strings with a `TargetTriple` enum, which represents either a target triple or a path to a JSON target file. The path variant is used if the `--target` argument has a `.json` extension, else the target triple variant is used.

The motivation of this PR is support for absolute target paths to avoid the need for setting the `RUST_TARGET_PATH` environment variable (see rust-lang/cargo#4905 for more information). For places where some kind of triple is needed (e.g. in the sysroot folder), we use the file name (without extension).

For compatibility, we keep the old behavior of searching for a file named `$(target_triple).json` in `RUST_TARGET_PATH` for non-official target triples.
2018-03-28 12:56:09 +00:00
bors
31ae4f9fde Auto merge of #49249 - gnzlbg:simd_minmax, r=alexcrichton
implement minmax intrinsics

This adds the `simd_{fmin,fmax}` intrinsics, which do a vertical (lane-wise) `min`/`max` for floating point vectors that's equivalent to Rust's `min`/`max` for `f32`/`f64`.

It might make sense to make `{f32,f64}::{min,max}` use the `minnum` and `minmax` intrinsics as well.

---

~~HELP: I need some help with these. Either I should go to sleep or there must be something that I must be missing. AFAICT I am calling the `maxnum` builder correctly, yet rustc/LLVM seem to insert a call to `llvm.minnum` there instead...~~ EDIT: Rust's LLVM version is too old :/
2018-03-27 04:46:32 +00:00
bors
188e693b39 Auto merge of #49101 - mark-i-m:stabilize_i128, r=nagisa
Stabilize 128-bit integers 🎉

cc #35118

EDIT: This should be merged only after the following have been merged:
- [x] https://github.com/rust-lang-nursery/compiler-builtins/pull/236
- [x] https://github.com/rust-lang/book/pull/1230
2018-03-26 18:41:38 +00:00
Philipp Oppermann
3908b2e443 Introduce a TargetTriple enum to support absolute target paths 2018-03-26 18:57:23 +02:00
Mark Mansi
db7d9ea480 Stabilize i128 feature too 2018-03-26 08:37:56 -05:00
Mark Mansi
7ce8191775 Stabilize i128_type 2018-03-26 08:36:50 -05:00
bors
13a86f4d85 Auto merge of #48346 - emilio:pgo, r=alexcrichton
Add basic PGO support.

This PR adds two mutually exclusive options for profile usage and generation using LLVM's instruction profile generation (the same as clang uses), `-C pgo-use` and `-C pgo-gen`.

See each commit for details.
2018-03-26 13:00:18 +00:00
Taylor Cramer
0f5b52e4a8 Stabilize conservative_impl_trait 2018-03-26 10:43:03 +02:00
gnzlbg
1841f40d21 properly handle the case when LLVM does not have min/maxnum 2018-03-26 10:20:41 +02:00
gnzlbg
066c2ec9ba require llvm 6 2018-03-26 10:20:41 +02:00
gnzlbg
7d5343a670 implement minmax intrinsics 2018-03-26 10:20:41 +02:00
bors
39ee3aaa13 Auto merge of #49297 - scottmcm:offset-from, r=dtolnay
Introduce unsafe offset_from on pointers

Adds intrinsics::exact_div to take advantage of the unsafe, which reduces the implementation from
```asm
    sub rcx, rdx
    mov rax, rcx
    sar rax, 63
    shr rax, 62
    lea rax, [rax + rcx]
    sar rax, 2
    ret
```
down to
```asm
    sub rcx, rdx
    sar rcx, 2
    mov rax, rcx
    ret
```
(for `*const i32`)

See discussion on the `offset_to` tracking issue https://github.com/rust-lang/rust/issues/41079

Some open questions
- Would you rather I split the intrinsic PR from the library PR?
- Do we even want the safe version of the API?  https://github.com/rust-lang/rust/issues/41079#issuecomment-374426786  I've added some text to its documentation that even if it's not UB, it's useless to use it between pointers into different objects.

and todos
- [x] ~~I need to make a codegen test~~ Done
- [x] ~~Can the subtraction use nsw/nuw?~~ No, it can't https://github.com/rust-lang/rust/pull/49297#discussion_r176697574
- [x] ~~Should there be `usize` variants of this, like there are now `add` and `sub` that you almost always want over `offset`?  For example, I imagine `sub_ptr` that returns `usize` and where it's UB if the distance is negative.~~ Can wait for later; C gives a signed result https://github.com/rust-lang/rust/issues/41079#issuecomment-375842235, so we might as well, and this existing to go with `offset` makes sense.
2018-03-26 00:15:34 +00:00
bors
d3518058e2 Auto merge of #49212 - kyrias:strip-debug-no-debuginfo, r=michaelwoerister
Pass --strip-debug to GccLinker when building without debuginfo

C.f. #46034

---

This brings a hello-world built by passing rustc no command line options from 2.9M to 592K on Linux.

(This might need to special case MacOS or Windows, not sure if the linkers there support `--strip-debug`, and there is an annoying lack of dependable docs for the linkers there.)
2018-03-25 21:46:15 +00:00
Emilio Cobos Álvarez
96b87296ce
Move linker code to the Linker trait instead. 2018-03-25 03:30:07 +02:00
Emilio Cobos Álvarez
e155ecdc97
try to fix the build on older LLVM versions. 2018-03-25 03:30:06 +02:00
Emilio Cobos Álvarez
4053e25bfb
librustc_trans: Mark some profiler symbols as exported to avoid LTO removing them. 2018-03-25 03:30:06 +02:00
Emilio Cobos Álvarez
8a4cebd16f
librustc_trans: Turn PGO diagnostics into warnings.
They should at least be that, they usually warn about control flow mismatches,
and or the profile being useless, which looks like at least a warning to me.

Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
2018-03-25 03:30:06 +02:00
Emilio Cobos Álvarez
e31addf7c3
librustc_trans: Gate the preinliner with another -Z flag.
Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
2018-03-25 03:30:06 +02:00
Emilio Cobos Álvarez
688275a400
librustc: Convert -C pgo-gen and -C pgo-use into -Z flags.
Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
2018-03-25 03:30:06 +02:00
Emilio Cobos Álvarez
036e0d7943
librustc_trans: disable profiling pre-inlining.
It destroys performance actually.

Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
2018-03-25 03:30:05 +02:00
Emilio Cobos Álvarez
a95c8c66a7
librustc_llvm: Show PGO diagnostics properly.
Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
2018-03-25 03:30:05 +02:00
Emilio Cobos Álvarez
9c61c7284a
rustc_trans: Fix PGO generation linking on Linux by adding the relevant linker commands.
See the linked LLVM reviews for the clang counter-parts.

Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
2018-03-25 03:30:05 +02:00
Emilio Cobos Álvarez
99127abca8
rustc_trans: disable probestack when using pgo-gen.
Executables crash in the probestack function otherwise... I haven't debugged
much further than that.

Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
2018-03-25 03:30:05 +02:00
Emilio Cobos Álvarez
324ca7acd5
rustc_llvm: rustc_trans: Thread the PGO config down to the pass manager builder.
Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
2018-03-25 03:30:04 +02:00