Commit graph

69 commits

Author SHA1 Message Date
ljedrz
3dbb2cc864 codegen_llvm_back: improve common patterns 2018-11-10 19:25:22 +01:00
ljedrz
c4c39e9395 codegen_llvm_back: use Cow<'static, str> where applicable 2018-11-10 19:22:38 +01:00
ljedrz
1d1dc48407 codegen_llvm_back: whitespace & formatting fixes 2018-11-10 19:22:37 +01:00
Nikita Popov
66702fcd0a Run name-anon-globals after LTO passes as well
If we're going to emit bitcode (through ThinLTOBuffer), then we
need to ensure that anon globals are named. This was already done
after optimization passes, but also has to happen after LTO passes,
as we always emit the final result in a ThinLTO-compatible manner.

Fixes #51947.
2018-11-06 19:24:28 +01:00
bors
0117b42f66 Auto merge of #55593 - nikic:remove-llvm-4-checks, r=rkruppe
Remove checks for LLVM < 4.0

While we still have to support LLVM 4.0 for Emscripten, we can drop checks for LLVM >= 4.0 and < 4.0.
2018-11-05 01:41:55 +00:00
bjorn3
942864a000 Move cg_llvm:🔙:linker to cg_utils 2018-11-03 13:35:09 +01:00
Alex Crichton
14c6835e03 rustc: Wait for all codegen threads to exit
This commit updates rustc to wait for all codegen threads to exit before
allowing the main thread to exit. This is a stab in the dark to fix the
mysterious segfaults appearing on #55238, and hopefully we'll see
whether this actually fixes things in practice...
2018-11-02 06:53:25 -07:00
Nikita Popov
d794597698 Remove checks for LLVM < 4.0
While we still have to support LLVM 4.0 for Emscripten, we can
drop checks for LLVM >= 4.0 and < 4.0.
2018-11-01 21:09:02 +01:00
Alex Crichton
086f5a55be Revert "rustc: Fix (again) simd vectors by-val in ABI"
This reverts commit 3cc8f738d4.
2018-10-23 00:59:14 -07:00
Manish Goregaokar
b860765355 Rollup merge of #55073 - alexcrichton:demote-simd, r=nagisa
The issue of passing around SIMD types as values between functions has
seen [quite a lot] of [discussion], and although we thought [we fixed
it][quite a lot] it [wasn't]! This PR is a change to rustc to, again,
try to fix this issue.

The fundamental problem here remains the same, if a SIMD vector argument
is passed by-value in LLVM's function type, then if the caller and
callee disagree on target features a miscompile happens. We solve this
by never passing SIMD vectors by-value, but LLVM will still thwart us
with its argument promotion pass to promote by-ref SIMD arguments to
by-val SIMD arguments.

This commit is an attempt to thwart LLVM thwarting us. We, just before
codegen, will take yet another look at the LLVM module and demote any
by-value SIMD arguments we see. This is a very manual attempt by us to
ensure the codegen for a module keeps working, and it unfortunately is
likely producing suboptimal code, even in release mode. The saving grace
for this, in theory, is that if SIMD types are passed by-value across
a boundary in release mode it's pretty unlikely to be performance
sensitive (as it's already doing a load/store, and otherwise
perf-sensitive bits should be inlined).

The implementation here is basically a big wad of C++. It was largely
copied from LLVM's own argument promotion pass, only doing the reverse.
In local testing this...

Closes #50154
Closes #52636
Closes #54583
Closes #55059

[quite a lot]: https://github.com/rust-lang/rust/pull/47743
[discussion]: https://github.com/rust-lang/rust/issues/44367
[wasn't]: https://github.com/rust-lang/rust/issues/50154
2018-10-20 13:15:39 -07:00
Oliver Scherer
ee81739dc1 Deprecate the FxHashMap() and FxHashSet() constructor function hack 2018-10-19 14:34:44 +02:00
Alex Crichton
3cc8f738d4 rustc: Fix (again) simd vectors by-val in ABI
The issue of passing around SIMD types as values between functions has
seen [quite a lot] of [discussion], and although we thought [we fixed
it][quite a lot] it [wasn't]! This PR is a change to rustc to, again,
try to fix this issue.

The fundamental problem here remains the same, if a SIMD vector argument
is passed by-value in LLVM's function type, then if the caller and
callee disagree on target features a miscompile happens. We solve this
by never passing SIMD vectors by-value, but LLVM will still thwart us
with its argument promotion pass to promote by-ref SIMD arguments to
by-val SIMD arguments.

This commit is an attempt to thwart LLVM thwarting us. We, just before
codegen, will take yet another look at the LLVM module and demote any
by-value SIMD arguments we see. This is a very manual attempt by us to
ensure the codegen for a module keeps working, and it unfortunately is
likely producing suboptimal code, even in release mode. The saving grace
for this, in theory, is that if SIMD types are passed by-value across
a boundary in release mode it's pretty unlikely to be performance
sensitive (as it's already doing a load/store, and otherwise
perf-sensitive bits should be inlined).

The implementation here is basically a big wad of C++. It was largely
copied from LLVM's own argument promotion pass, only doing the reverse.
In local testing this...

Closes #50154
Closes #52636
Closes #54583
Closes #55059

[quite a lot]: https://github.com/rust-lang/rust/pull/47743
[discussion]: https://github.com/rust-lang/rust/issues/44367
[wasn't]: https://github.com/rust-lang/rust/issues/50154
2018-10-19 02:35:00 -07:00
Andy Russell
1811f1322a
raise ICE if LLVM worker threads panic 2018-10-12 17:30:13 -04:00
Jorge Aparicio
3c0907ce51 add -Z emit-stack-sizes 2018-09-26 15:21:26 +02:00
Michael Woerister
ca197323b9 incr.comp.: Allow for more fine-grained testing of CGU reuse and use it to test incremental ThinLTO. 2018-09-18 16:33:24 +02:00
kennytm
07dc4b3759
Rollup merge of #53950 - michaelwoerister:more-lto-cli, r=alexcrichton
Allow for opting out of ThinLTO and clean up LTO related cli flag handling.

It turns out that there currently is no way to explicitly disable ThinLTO (except for the nightly-only `-Zthinlto` flag). This PR extends `-C lto` to take `yes` and `no` in addition to `thin` and `fat`. It should be backwards compatible.

It also cleans up how LTO mode selection is handled.

Note that merging the PR in the current state would make the new values for `-C lto` available on the stable channel. I think that would be fine but maybe some team should vote on it.
2018-09-14 00:46:45 +08:00
bors
6e0f1cc158 Auto merge of #53962 - michaelwoerister:close-thinlto-file-descriptors, r=alexcrichton
ThinLTO: Don't keep files open after mmaping them.

Fixes #53947.

r? @alexcrichton
2018-09-05 20:52:42 +00:00
bors
d8af8b66d9 Auto merge of #53878 - alexcrichton:wasm-atomics-feature, r=eddyb
rustc: Prepare the `atomics` feature for wasm

This commit adds a few changes for atomic instructions on the
`wasm32-unknown-unknown` target. Atomic instructions are not yet stable in
WebAssembly itself but there are multiple implementations and LLVM has support
for the proposed instruction set, so let's work on exposing it!

Here there are a few inclusions:

* The `atomics` feature was whitelisted for LLVM, allowing code in Rust to
  enable/disable/gate on this.

* The `singlethread` option is turned off for wasm when the `atomics` feature is
  enabled. This means that by default wasm won't be lowering with atomics, but
  when atomics are enabled globally we'll turn off single-threaded mode to
  actually codegen atomics. This probably isn't what we'll want in the long term
  but for now it should work.

* Finally the maximum atomic width is increased to 64 to reflect the current
  wasm spec.
2018-09-05 13:19:19 +00:00
Michael Woerister
fc47a92336 ThinLTO: Don't keep files open after mmaping them (because it's not needed). 2018-09-05 13:52:58 +02:00
Michael Woerister
24093a6bdb Allow for opting out of ThinLTO and clean up LTO related cli flag handling. 2018-09-05 12:52:17 +02:00
Michael Woerister
21d05f64aa incr.ThinLTO: Do some cleanup and add some logging. 2018-09-03 13:26:46 +02:00
Alex Crichton
fc497d0026 rustc: Prepare the atomics feature for wasm
This commit adds a few changes for atomic instructions on the
`wasm32-unknown-unknown` target. Atomic instructions are not yet stable in
WebAssembly itself but there are multiple implementations and LLVM has support
for the proposed instruction set, so let's work on exposing it!

Here there are a few inclusions:

* The `atomics` feature was whitelisted for LLVM, allowing code in Rust to
  enable/disable/gate on this.

* The `singlethread` option is turned off for wasm when the `atomics` feature is
  enabled. This means that by default wasm won't be lowering with atomics, but
  when atomics are enabled globally we'll turn off single-threaded mode to
  actually codegen atomics. This probably isn't what we'll want in the long term
  but for now it should work.

* Finally the maximum atomic width is increased to 64 to reflect the current
  wasm spec.
2018-08-31 22:47:10 -07:00
Michael Woerister
abd5cc3364 Always add all modules to the global ThinLTO module analysis when compiling incrementally. 2018-08-31 15:22:52 +02:00
Michael Woerister
64a738d8ce Support local ThinLTO with incremental compilation. 2018-08-31 15:22:52 +02:00
Alex Crichton
1fd45a13de Fix warnings about the native target-cpu
This fixes a regression from #53031 where specifying `-C target-cpu=native` is
printing a lot of warnings from LLVM about `native` being an unknown CPU. It
turns out that `native` is indeed an unknown CPU and we have to perform a
mapping to an actual CPU name, but this mapping is only performed in one
location rather than all locations we inform LLVM about the target CPU.

This commit centralizes the mapping of `native` to LLVM's value of the native
CPU, ensuring that all locations we inform LLVM about the `target-cpu` it's
never `native`.

Closes #53322
2018-08-28 13:32:11 -07:00
kennytm
b5519db323
Rollup merge of #53496 - matthiaskrgr:codespell_08_2018, r=varkor
Fix typos found by codespell.
2018-08-21 17:51:49 +08:00
kennytm
5d4a25da05
Rollup merge of #53465 - bjorn3:remove_link_meta_struct, r=varkor
Remove LinkMeta struct

Fixes #53291
2018-08-21 17:51:46 +08:00
bors
d2048b6db3 Auto merge of #52101 - japaric:linker-flavor, r=alexcrichton
try to infer linker flavor from linker name and vice versa

This is a second take on PR #50359 that implements the logic proposed in https://github.com/rust-lang/rust/pull/50359#pullrequestreview-116663121

With this change it would become possible to link `thumb*` binaries using GNU's LD on stable as `-C linker=arm-none-eabi-ld` would be enough to change both the linker and the linker flavor from their default values of `arm-none-eabi-gcc` and `gcc`.

To link `thumb*` binaries using rustc's LLD on stable `-Z linker-flavor` would need to be stabilized as `-C linker=rust-lld -Z linker-flavor=ld.lld` are both required to change the linker and the linker flavor, but this PR doesn't propose that. We would probably need some sort of stability guarantee around `rust-lld`'s name and availability to make linking with rustc's LLD truly stable.

With this change it would also be possible to link `thumb*` binaries using a system installed LLD on stable using the `-C linker=ld.lld` flag (provided that `ld.lld` is a symlink to the system installed LLD).

r? @alexcrichton
2018-08-20 01:12:58 +00:00
Matthias Krüger
71120ef1e5 Fix typos found by codespell. 2018-08-19 17:41:28 +02:00
bjorn3
d52047faf0 Remove LinkMeta struct 2018-08-18 12:08:06 +02:00
Michael Woerister
d662083a6c Use CGU name as LLVM module name and add some caching to CGU name generation. 2018-08-15 14:50:54 +02:00
kennytm
47f66e7372
Rollup merge of #53290 - whitequark:fix-35741, r=nagisa
Make LLVM emit assembly comments with -Z asm-comments

Fixes #35741, and makes `-Z asm-comments` actually do something useful.

Before:
```
	.section	.text.main,"ax",@progbits
	.globl	main
	.p2align	4, 0x90
	.type	main,@function
main:
	.cfi_startproc
	pushq	%rax
	.cfi_def_cfa_offset 16
	movslq	%edi, %rax
	leaq	_ZN1t4main17he95a7d4f1843730eE(%rip), %rdi
	movq	%rsi, (%rsp)
	movq	%rax, %rsi
	movq	(%rsp), %rdx
	callq	_ZN3std2rt10lang_start17h3121da83b2bc3697E
	movl	%eax, %ecx
	movl	%ecx, %eax
	popq	%rcx
	.cfi_def_cfa_offset 8
	retq
.Lfunc_end8:
	.size	main, .Lfunc_end8-main
	.cfi_endproc
```

After:
```
	.section	.text.main,"ax",@progbits
	.globl	main                    # -- Begin function main
	.p2align	4, 0x90
	.type	main,@function
main:                                   # @main
	.cfi_startproc
# %bb.0:
	pushq	%rax
	.cfi_def_cfa_offset 16
	movslq	%edi, %rax
	leaq	_ZN1t4main17he95a7d4f1843730eE(%rip), %rdi
	movq	%rsi, (%rsp)            # 8-byte Spill
	movq	%rax, %rsi
	movq	(%rsp), %rdx            # 8-byte Reload
	callq	_ZN3std2rt10lang_start17h3121da83b2bc3697E
	movl	%eax, %ecx
	movl	%ecx, %eax
	popq	%rcx
	.cfi_def_cfa_offset 8
	retq
.Lfunc_end8:
	.size	main, .Lfunc_end8-main
	.cfi_endproc
                                        # -- End function
```
2018-08-14 23:59:16 +08:00
whitequark
66fd1ebfae Make LLVM emit assembly comments with -Z asm-comments.
Fixes #35741.
2018-08-12 17:59:33 +00:00
Michael Woerister
88d84b38f1 Introduce SmallCStr and use it where applicable. 2018-08-10 11:13:00 +02:00
Jorge Aparicio
a0911cf95d address review comments 2018-08-09 17:18:08 -05:00
Jorge Aparicio
eb74f21f5a try to infer linker flavor from linker name and vice versa 2018-08-09 16:08:36 -05:00
Mark Rousskov
dea13b4bc7 Move path2cstr to rustc_fs_util 2018-08-09 10:00:25 -06:00
Mark Rousskov
e3177c6f3f Move rustc::util::fs into separate (new) crate 2018-08-09 10:00:25 -06:00
Michael Woerister
3a70050377 Address review comments for #53031 and fix some merge fallout. 2018-08-08 13:40:23 +02:00
Michael Woerister
f2969ed6c3 Set 'PrepareForThinLTO' whenever doing cross-language LTO. 2018-08-07 14:48:20 +02:00
Michael Woerister
3a3b3317d9 Fix issue around dllimport and ThinLTO as LLD runs it. 2018-08-07 14:44:48 +02:00
bors
11a902431b Auto merge of #51007 - AstralSorcerer:master, r=nagisa
Make globals with private linkage unnamed. Fixes #50862.

cc @oli-obk @nagisa
2018-08-07 02:12:35 +00:00
Mark Rousskov
2bc71971e5 Normalize DebugInfoLevel to standard style 2018-08-04 06:54:34 -06:00
Mark Rousskov
b3267dcb31 Normalize variants of Passes to standard style 2018-08-04 06:53:15 -06:00
Mark Rousskov
2a9344206b Normalize variants of CrateType to standard style
This is a clippy-breaking change.
2018-08-04 06:53:15 -06:00
Colin Pronovost
3da7c65e92 Make sure we prepare for thin LTO whenever we are emitting bitcode
Emitting LLVM bitcode uses ThinLTOBuffers, so we need to prepare for
thin LTO or we will likely cause errors in LLVM.
2018-08-01 00:27:25 -04:00
Alex Crichton
f0bceba669 rustc: Handle linker diagnostic from LLVM
Previously linker diagnostic were being hidden when two modules were linked
together but failed to link. This commit fixes the situation by ensuring that we
have a diagnostic handler installed and also adds support for handling linker
diagnostics.
2018-07-31 10:47:27 -07:00
Irina Popa
265f2fa4de rustc_codegen_llvm: fix tidy errors. 2018-07-30 20:35:08 +03:00
Irina Popa
e22eebaf2b rustc_codegen_llvm: use safe references for PassManager. 2018-07-30 20:10:38 +03:00
Irina Popa
44ae6f1909 rustc_codegen_llvm: use safe references for Twine, DiagnosticInfo, SMDiagnostic. 2018-07-30 20:10:33 +03:00