Commit graph

315 commits

Author SHA1 Message Date
bors
491512ba1e Auto merge of #50304 - nox:uninhabited-output, r=eddyb
Mark functions returning uninhabited types as noreturn
2018-05-01 05:52:12 +00:00
Alex Crichton
622371153c Add -C target-feature to all functions
Previously the features specified to LLVM via `-C target-feature` were only
reflected in the `TargetMachine` but this change *also* reflects these and the
base features inside each function itself. This change matches clang and...

Closes rust-lang-nursery/stdsimd#427
2018-04-28 14:28:15 -07:00
Anthony Ramine
69ec4aa97c Mark functions returning uninhabited types as noreturn 2018-04-28 21:10:01 +02:00
bors
68a09fc539 Auto merge of #50164 - nox:rval-range-metadata, r=eddyb
Emit range metadata on calls returning scalars (fixes #50157)
2018-04-28 17:59:25 +00:00
bors
e05b78daa6 Auto merge of #49420 - nox:enum-scalarpair, r=eddyb
Use ScalarPair for tagged enums
2018-04-27 01:30:10 +00:00
Anthony Ramine
90656441a9 Emit range metadata on calls returning scalars (fixes #50157) 2018-04-26 22:02:23 +02:00
Anthony Ramine
3ca6ad922e Use ScalarPair for tagged enums 2018-04-26 09:30:28 +02:00
Alex Crichton
f7439a5a45 rustc: Always emit uwtable on Android
Long ago (#40549) we enabled the `uwtable` attribute on Windows by default
(even with `-C panic=abort`) to allow unwinding binaries for [stack unwinding
information][winstack]. It looks like this same issue is [plaguing][arm1]
Gecko's Android platforms [as well][arm2]. This commit applies the same fix
as #40549 except that this time it's applied for all Android targets.

Generating a `-C panic=abort` binary for `armv7-linux-androideabi` before this
commit generated a number of `cantunwind` functions (detected with `readelf -u`)
but after this commit they all list appropriate unwind information.

Closes #49867

[winstack]: https://bugzilla.mozilla.org/show_bug.cgi?id=1302078
[arm1]: https://bugzilla.mozilla.org/show_bug.cgi?id=1453220
[arm2]: https://bugzilla.mozilla.org/show_bug.cgi?id=1451741
2018-04-21 08:38:44 -07:00
bors
47778811d9 Auto merge of #48528 - bitshifter:repr_packed, r=eddyb
Implementation of `#[repr(packed(n))]` RFC 1399.

Tracking issue https://github.com/rust-lang/rust/issues/33158.
2018-04-12 03:08:14 +00:00
Cameron Hart
15d1c4d213 Implementation of #[repr(packed(n))] RFC 1399. 2018-04-11 22:13:13 +10:00
dragan.mladjenovic
dab317f04f Small nits to make couple of tests pass on mips targets. 2018-04-10 09:11:21 +02:00
Michael Woerister
94d36cf294 Make sure that generics are internalized in executables even with -Zshare-generics 2018-04-06 12:14:08 +02:00
bors
fb44b4c0eb Auto merge of #48171 - FraGag:doc-copy-clone-impls, r=nikomatsakis
Better document the implementors of Clone and Copy

There are two parts to this change. The first part is a change to the compiler and to the standard library (specifically, libcore) to allow implementations of `Clone` and `Copy` to be written for a subset of builtin types. By adding these implementations to libcore, they now show up in the documentation. This is a [breaking-change] for users of `#![no_core]`, because they will now have to supply their own copy of the implementations of `Clone` and `Copy` that were added in libcore.

The second part is purely a documentation change to document the other implementors of `Clone` and `Copy` that cannot be described in Rust code (yet) and are thus provided by the compiler.

Fixes #25893
2018-04-04 18:11:51 +00:00
Josh Stone
b404ec4b48 Ignore stack-probes tests on powerpc/s390x too
We only support stack probes on x86 and x86_64.
Other arches are already ignored.
2018-03-29 10:25:32 -07:00
bors
bcffdf1b6d Auto merge of #49383 - nox:scalarpair, r=eddyb
Allow niche-filling dataful variants to be represented as a ScalarPair

r? @eddyb
2018-03-28 08:01:22 +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
Francis Gagné
d032a4b079 Strengthen the repeat-trusted-len test
Simply checking for the presence of `llvm.memset` is too brittle because
this instrinsic can be used for seemingly trivial operations, such as
zero-initializing a `RawVec`.
2018-03-26 23:42:30 -04:00
Anthony Ramine
bda718fd25 Allow niche-filling dataful variants to be represented as a ScalarPair 2018-03-26 17:35:29 +02:00
Mark Mansi
7ce8191775 Stabilize i128_type 2018-03-26 08:36:50 -05:00
gnzlbg
56aaf344c4 fix tests 2018-03-26 10:20:41 +02:00
gnzlbg
48fd903eae set min-llvm-version 6.0, ignore-emscripten 2018-03-26 10:20:41 +02:00
gnzlbg
d2cd57c8ff add tests 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
77e2bcb613 Auto merge of #49141 - gnzlbg:simd_select, r=alexcrichton
adds simd_select intrinsic

The select SIMD intrinsic is used to select elements from two SIMD vectors using a mask:

```rust
let mask = b8x4::new(true, false, false, true);
let a = f32x4::new(1., 2., 3., 4.);
let b = f32x4::new(5., 6., 7., 8.);
assert_eq!(simd_select(mask, a, b), f32x4::new(1., 6., 7., 4.));
```

The number of lanes between the mask and the vectors must match, but the vector width of the mask does not need to match that of the vectors. The mask is required to be a vector of signed integers.

Note: this intrinsic will be exposed via `std::simd`'s vector masks - users are not expected to use it directly.
2018-03-25 00:02:48 +00:00
Scott McMurray
d6926ca12d Add a codegen test for exact_div intrinsic 2018-03-23 23:47:22 -07:00
varkor
ca476dd8d3 Revert "Remove useless powerpc64 entry from ARCH_TABLE, closes #47737"
This reverts commit 16ac85ce4d.
2018-03-19 01:34:32 +00:00
gnzlbg
cca2604e6c add codegen test 2018-03-18 19:55:20 +01:00
James Cowgill
fb806fd9db test: fix repr-transparent-aggregates test on mips64
Since #47964 was merged, 64-bit mips started passing all structures
using 64-bit chunks regardless of their contents. The
repr-transparent-aggregates tests needs updating to cope with this.
2018-03-09 10:21:30 +00:00
James Cowgill
e0863c5155 test: ignore mips* in x86_mmx test 2018-03-09 10:17:01 +00:00
James Cowgill
bceb94e8b7 test: ignore stack probe tests on mips* 2018-03-09 10:17:01 +00:00
James Cowgill
59199ebe51 test: remove duplicate ignore-aarch64 from stack-probes test 2018-03-09 10:16:49 +00:00
James Cowgill
dcc438d633 test: ignore mips64 in abi-main-signature-16bit-c-int.rs 2018-03-08 15:29:10 +00:00
James Cowgill
6f55819a1e test: remove useless ignore-mips*el headers 2018-03-08 15:29:10 +00:00
Oliver Schneider
208d764833
Adjust test which differs between 32 bit and 64 bit
The differences are not part of what the test is testing, so they were simply removed.
2018-03-08 08:35:38 +01:00
Oliver Schneider
0595ff1009
Codegen tests 2018-03-08 08:34:08 +01:00
debris
16ac85ce4d Remove useless powerpc64 entry from ARCH_TABLE, closes #47737 2018-03-04 14:58:10 +01:00
Manish Goregaokar
12515608cb
Rollup merge of #48380 - nikomatsakis:issue-48251-master, r=acrichto
Fixes #47311.
r? @nrc
2018-02-28 15:09:26 -08:00
Manish Goregaokar
fac7d7cfb2
Rollup merge of #48359 - jsgf:remap-path-prefix, r=sanxiyn
Fixes #47311.
r? @nrc
2018-02-28 15:09:24 -08:00
Jeremy Fitzhardinge
56a6828533 Implement --remap-path-prefix
Remove experimental -Zremap-path-prefix-from/to, and replace it with
the stabilized --remap-path-prefix=from=to variant.

This is an implementation for issue of #41555.
2018-02-22 15:13:21 -08:00
Niko Matsakis
a47fd3df89 make #[unwind] attribute specify expectations more clearly
You can now choose between the following:

- `#[unwind(allowed)]`
- `#[unwind(aborts)]`

Per rust-lang/rust#48251, the default is `#[unwind(allowed)]`, though
I think we should change this eventually.
2018-02-20 19:12:52 -05:00
Eduard-Mihai Burtescu
6e5dacbd5e rustc_mir: always run the deaggregator. 2018-02-20 02:50:26 +02:00
bors
0196b20f69 Auto merge of #47614 - dotdash:x86_64_sysv_ffi, r=eddyb
Fix oversized loads on x86_64 SysV FFI calls

The x86_64 SysV ABI should use exact sizes for small structs passed in
registers, i.e. a struct that occupies 3 bytes should use an i24,
instead of the i32 it currently uses.

Refs #45543
2018-02-11 15:10:46 +00:00
Björn Steinbrink
5f3dc8b7b2 Fix oversized loads on x86_64 SysV FFI calls
The x86_64 SysV ABI should use exact sizes for small structs passed in
registers, i.e. a struct that occupies 3 bytes should use an i24,
instead of the i32 it currently uses.

Refs #45543
2018-02-08 13:50:18 +01:00
Manish Goregaokar
da6dcbc21e
Rollup merge of #47944 - oberien:unboundediterator-trustedlen, r=bluss
Implement TrustedLen for Take<Repeat> and Take<RangeFrom>

This will allow optimization of simple `repeat(x).take(n).collect()` iterators, which are currently not vectorized and have capacity checks.

This will only support a few aggregates on `Repeat` and `RangeFrom`, which might be enough for simple cases, but doesn't optimize more complex ones. Namely, Cycle, StepBy, Filter, FilterMap, Peekable, SkipWhile, Skip, FlatMap, Fuse and Inspect are not marked `TrustedLen` when the inner iterator is infinite.

Previous discussion can be found in #47082

r? @alexcrichton
2018-02-07 08:30:53 -08:00
kennytm
eb5a4617a5
Rollup merge of #46030 - Zoxc:asm-volatile, r=nikomatsakis
Make inline assembly volatile if it has no outputs. Fixes #46026
2018-02-06 02:13:44 +08:00
John Kåre Alsaker
a29d8545b5 Make inline assembly volatile if it has no outputs. Fixes #46026 2018-02-05 15:56:44 +01:00
kennytm
8b8c6ee796
Rollup merge of #47912 - cuviper:glibc-stack-guard, r=alexcrichton
Use a range to identify SIGSEGV in stack guards

Previously, the `guard::init()` and `guard::current()` functions were
returning a `usize` address representing the top of the stack guard,
respectively for the main thread and for spawned threads.  The `SIGSEGV`
handler on `unix` targets checked if a fault was within one page below that
address, if so reporting it as a stack overflow.

Now `unix` targets report a `Range<usize>` representing the guard memory,
so it can cover arbitrary guard sizes.  Non-`unix` targets which always
return `None` for guards now do so with `Option<!>`, so they don't pay any
overhead.

For `linux-gnu` in particular, the previous guard upper-bound was
`stackaddr + guardsize`, as the protected memory was *inside* the stack.
This was a glibc bug, and starting from 2.27 they are moving the guard
*past* the end of the stack.  However, there's no simple way for us to know
where the guard page actually lies, so now we declare it as the whole range
of `stackaddr ± guardsize`, and any fault therein will be called a stack
overflow.  This fixes #47863.
2018-02-04 23:28:57 +08:00
oberien
75474ff132 TrustedLen for Repeat / RangeFrom test cases 2018-02-04 16:09:32 +01:00
Josh Stone
e2de8deb09 Enable stack-probe tests with system LLVM >= 5.0 2018-01-31 11:41:26 -08:00
Eduard-Mihai Burtescu
973756d715 rustc_trans: keep LLVM types for trait objects anonymous. 2018-01-31 00:23:25 +02:00