Commit graph

67 commits

Author SHA1 Message Date
Nikita Popov
4a4186e4d1 Use LLVM intrinsics for saturating add/sub 2019-01-29 22:32:13 +01:00
Simonas Kazlauskas
f38d0da893 Implement optimize(size) and optimize(speed) 2019-01-24 20:13:50 +02:00
Ariel Ben-Yehuda
3aa1503a61 add support for principal-less trait object types
should be a pure refactoring.
2019-01-04 00:34:52 +02:00
Mark Rousskov
2a663555dd Remove licenses 2018-12-25 21:08:33 -07:00
bors
63f8e6e12b Auto merge of #56642 - nikic:llvm-6, r=alexcrichton
Bump minimum required LLVM version to 6.0

Based on the discussion in #55842, while the overall position of Rust wrt LLVM continues to be contentious, there does seem to be a consensus that there is no need for continued support of LLVM 5. This PR bumps our version requirement to LLVM 6.0 and makes Travis run against that.

I hope that this is going to unblock #52694. If I understand correctly, while this issue still exists in LLVM 6, Ubuntu has backported the relevant patch.

r? @alexcrichton
2018-12-17 04:18:14 +00:00
Alex Crichton
1091eee65b rustc: Switch extern functions to abort by default on panic
This was intended to land way back in 1.24, but it was backed out due to
breakage which has long since been fixed. An unstable `#[unwind]`
attribute can be used to tweak the behavior here, but this is currently
simply switching rustc's internal default to abort-by-default if an
`extern` function panics, making our codegen sound primarily (as
currently you can produce UB with safe code)

Closes #52652
2018-12-12 08:07:28 -08:00
Nikita Popov
6c2d704950 Remove env_alloca hack
This is no longer necessary for LLVM >= 6.
2018-12-11 10:34:02 +01:00
Alexander Regueiro
ee89c088b0 Various minor/cosmetic improvements to code 2018-12-07 23:53:34 +00:00
bors
21f2684950 Auto merge of #56198 - bjorn3:cg_ssa_refactor, r=eddyb
Refactor rustc_codegen_ssa

cc #56108 (not all things are done yet)

This removes an unsafe method from cg_ssa.

r? @eddyb
cc @sunfishcode
2018-12-02 18:02:20 +00:00
bjorn3
b8d55d45ce Remove an unnecessary reference 2018-11-29 18:19:43 +01:00
bjorn3
15a5009af0 Don't use llvm intrinsic names in cg_ssa 2018-11-29 18:19:41 +01:00
bjorn3
2d46ee26fb Remove static_replace_all_uses and statics_to_rauw from cg_ssa 2018-11-29 18:19:41 +01:00
Dan Robertson
08140878fe
libcore: Add va_list lang item and intrinsics
- Add the llvm intrinsics used to manipulate a va_list.
 - Add the va_list lang item in order to allow implementing
   VaList in libcore.
2018-11-26 22:56:19 +00:00
Eduard-Mihai Burtescu
756f84d7ce [eddyb] rustc_codegen_llvm: remove unused parametrization of CodegenCx and Builder over Values. 2018-11-16 15:08:18 +02:00
Eduard-Mihai Burtescu
0b569249c8 [eddyb] rustc_codegen_ssa: rename interfaces to traits. 2018-11-16 15:08:18 +02:00
Denis Merigoux
015e4441f5 Finished moving backend-agnostic code to rustc_codegen_ssa 2018-11-16 15:08:18 +02:00
Denis Merigoux
c0a428ee70 Great separation of librustc_codegen_llvm: librustc_codegen_ssa compiles 2018-11-16 15:07:24 +02:00
Denis Merigoux
6819e6e6e1 Preparing the generalization of base:compile_coodegen_unit 2018-11-16 14:38:15 +02:00
Denis Merigoux
91a2a80692 Renamed lifetimes for better understanding 2018-11-16 14:36:43 +02:00
Denis Merigoux
97825a36be Move doc to trait declarations 2018-11-16 14:36:38 +02:00
Denis Merigoux
ac34068ed9 Generalized base:maybe_create_entry_wrapper 2018-11-16 14:34:26 +02:00
Denis Merigoux
441a7c1092 Generalized mono_item.rs and base.rs:codegen_instance 2018-11-16 14:34:26 +02:00
Denis Merigoux
6a993fe353 Generalized mir::codegen_mir (and all subsequent functions) 2018-11-16 14:33:10 +02:00
Denis Merigoux
78dd95f4c7 Generalized base::unsize_thin_ptr 2018-11-16 14:15:13 +02:00
Denis Merigoux
034f69753b Generalized base::unsized_info 2018-11-16 14:15:13 +02:00
Eduard-Mihai Burtescu
484e07c231 [eddyb/rebase cleanup] s/&self./self. 2018-11-16 14:15:13 +02:00
Denis Merigoux
0a1c50955b Traitified IntrinsicCallMethods 2018-11-16 14:12:49 +02:00
Denis Merigoux
d77e34f35b Generalized memset and memcpy 2018-11-16 14:11:59 +02:00
Denis Merigoux
e224f063e8 Prefixed type methods & removed trait impl for write::CodegenContext 2018-11-16 14:11:59 +02:00
Denis Merigoux
730b13ab51 Traitification of type_ methods
The methods are now attached to CodegenCx instead of Type
2018-11-16 14:11:59 +02:00
Denis Merigoux
9c41e1aa10 Removed genericity over Value in various functions
Prelude to using associated types in traits rather than type parameters
2018-11-16 14:11:34 +02:00
Denis Merigoux
34c5dc045f Generalized base.rs#call_memcpy and everything that it uses
Generalized operand.rs#nontemporal_store and fixed tidy issues

Generalized operand.rs#nontemporal_store's implem even more
With a BuilderMethod trait implemented by Builder for LLVM

Cleaned builder.rs : no more code duplication, no more ValueTrait

Full traitification of builder.rs
2018-11-16 14:11:09 +02:00
Denis Merigoux
83b2152ce4 Reduced line length to pass tidy
Generalized FunctionCx

Added ValueTrait and first change

Generalize CondegenCx

Generalized the Builder struct defined in librustc_codegen_llvm/builder.rs
2018-11-16 14:11:09 +02:00
Oliver Scherer
4a9ed3f25a Use type safe VariantIdx instead of usize everywhere 2018-11-12 14:24:45 +01:00
bors
6e9b842962 Auto merge of #55650 - nikic:funnel-shift, r=nagisa
Implement rotate using funnel shift on LLVM >= 7

Implement the rotate_left and rotate_right operations using
llvm.fshl and llvm.fshr if they are available (LLVM >= 7).

Originally I wanted to expose the funnel_shift_left and
funnel_shift_right intrinsics and implement rotate_left and
rotate_right on top of them. However, emulation of funnel
shifts requires emitting a conditional to check for zero shift
amount, which is not necessary for rotates. I was uncomfortable
doing that here, as I don't want to rely on LLVM to optimize
away that conditional (and for variable rotates, I'm not sure it
can). We should revisit that question when we raise our minimum
version requirement to LLVM 7 and don't need emulation code
anymore.

Fixes #52457.
2018-11-10 19:58:14 +00:00
Mark Rousskov
78cab36139
Rollup merge of #55633 - nikic:memcpy-align, r=nagisa
Support memcpy/memmove with differing src/dst alignment

If LLVM 7 is used, generate memcpy/memmove with differing src/dst alignment. I've added new FFI functions to construct these through the builder API, which is more convenient than dealing with differing intrinsic signatures depending on the LLVM version.

Fixes #49740.
2018-11-08 18:14:49 -07:00
Eduard-Mihai Burtescu
d00d42d079 rustc_target: pass contexts by reference, not value. 2018-11-04 20:33:57 +02:00
Nikita Popov
463ad9098e Support memcpy/memmove with differing src/dst alignment
If LLVM 7 is used, generate memcpy/memmove with differing
src/dst alignment. I've added new FFI functions to construct
these through the builder API, which is more convenient than
dealing with differing intrinsic signatures depending on the
LLVM version.
2018-11-04 18:54:37 +01:00
Nikita Popov
4c40ff6a24 Implement rotate using funnel shift on LLVM >= 7
Implement the rotate_left and rotate_right operations using
llvm.fshl and llvm.fshr if they are available (LLVM >= 7).

Originally I wanted to expose the funnel_shift_left and
funnel_shift_right intrinsics and implement rotate_left and
rotate_right on top of them. However, emulation of funnel
shifts requires emitting a conditional to check for zero shift
amount, which is not necessary for rotates. I was uncomfortable
doing that here, as I don't want to rely on LLVM to optimize
away that conditional (and for variable rotates, I'm not sure it
can). We should revisit that question when we raise our minimum
version requirement to LLVM 7 and don't need emulation code
anymore.
2018-11-03 23:50:55 +01:00
Masaki Hara
06b6b1c790 Make declare_fn accept PolyFnSig instead of Ty. 2018-10-24 21:59:07 +09:00
Masaki Hara
1fb085511e Make declare_fn aware of vtable shims. 2018-10-24 21:59:06 +09:00
Oliver Scherer
3c9258e604 Prefer Default::default over FxHash*::default in struct constructors 2018-10-19 14:34:44 +02:00
Oliver Scherer
ee81739dc1 Deprecate the FxHashMap() and FxHashSet() constructor function hack 2018-10-19 14:34:44 +02:00
Oliver Scherer
78aaa3e546 Check the invariant for principal inside the method 2018-10-13 11:32:49 +02: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
ljedrz
a0fc2e6ddc codegen_llvm: remove explicit returns 2018-10-08 19:17:25 +02:00
ljedrz
0af79143ae codegen_llvm: improve common patterns 2018-10-08 19:17:24 +02:00
ljedrz
61f47737b5 codegen_llvm: whitespace & formatting improvements 2018-10-08 16:52:34 +02:00
varkor
8a5dccde2a Remove Ty prefix from Ty{Bool|Char|Int|Uint|Float|Str} 2018-08-22 16:08:49 +01:00