Commit Graph

652 Commits

Author SHA1 Message Date
bors
e91bf6c881 Auto merge of #69478 - avr-rust:avr-support-upstream, r=jonas-schievink
Enable AVR as a Tier 3 target upstream

Tracking issue: #44052.

Things intentionally left out of the initial upstream:

* The `target_cpu` flag

I have made the cleanup suggestions by @jplatte and @jplatte in 043550d9db.

Anybody feel free to give the branch a test and see how it fares, or make suggestions on the code patch itself.
2020-06-12 01:28:37 +00:00
Amanieu d'Antras
5541f689e9 Handle assembler warnings properly 2020-06-09 15:01:02 +01:00
Jake Goulding
690bb8af51 [AVR] Add AVR platform support 2020-06-09 17:34:07 +12:00
Amanieu d'Antras
b78b15665b Improve inline asm error diagnostics 2020-05-29 17:05:35 +01:00
Vadim Petrochenkov
d0a48d19f5 rustllvm: Fix warnings about unused function parameters 2020-05-21 22:05:19 +03:00
Amanieu d'Antras
abed45ff9f Implement asm! codegen 2020-05-18 14:41:32 +01:00
bors
5f472813df Auto merge of #72248 - petrochenkov:codemodel, r=Amanieu
Cleanup and document `-C code-model`

r? @Amanieu
2020-05-17 21:22:48 +00:00
Vadim Petrochenkov
55a94bdc38 rustc_target: Stop using "string typing" for code models
Introduce `enum CodeModel` instead.
2020-05-16 12:02:11 +03:00
Tomasz Miąsko
bbb63d4554 Consistently use LLVM lifetime markers during codegen
Ensure that inliner inserts lifetime markers if they have been emitted during
codegen. Otherwise if allocas from inlined functions are merged together,
lifetime markers from one function might invalidate load & stores performed
by the other one.
2020-05-14 15:23:24 +02:00
Ralf Jung
ce05553c62 Rollup merge of #71234 - maurer:init-array, r=cuviper
rustllvm: Use .init_array rather than .ctors

LLVM TargetMachines default to using the (now-legacy) .ctors
representation of init functions. Mixing .ctors and .init_array
representations can cause issues when linking with lld.

This happens in practice for:

* Our profiling runtime which is currently implicitly built with
  .init_array since it is built by clang, which sets this field.
* External C/C++ code that may be linked into the same process.

Fixes: #71233
2020-05-09 13:36:32 +02:00
bors
1357af3a55 Auto merge of #71528 - alexcrichton:no-more-bitcode, r=nnethercote
Store LLVM bitcode in object files, not compressed

This commit is an attempted resurrection of #70458 where LLVM bitcode
emitted by rustc into rlibs is stored into object file sections rather
than in a separate file. The main rationale for doing this is that when
rustc emits bitcode it will no longer use a custom compression scheme
which makes it both easier to interoperate with existing tools and also
cuts down on compile time since this compression isn't happening.

The blocker for this in #70458 turned out to be that native linkers
didn't handle the new sections well, causing the sections to either
trigger bugs in the linker or actually end up in the final linked
artifact. This commit attempts to address these issues by ensuring that
native linkers ignore the new sections by inserting custom flags with
module-level inline assembly.

Note that this does not currently change the API of the compiler at all.
The pre-existing `-C bitcode-in-rlib` flag is co-opted to indicate
whether the bitcode should be present in the object file or not.

Finally, note that an important consequence of this commit, which is also
one of its primary purposes, is to enable rustc's `-Clto` bitcode
loading to load rlibs produced with `-Clinker-plugin-lto`. The goal here
is that when you're building with LTO Cargo will tell rustc to skip
codegen of all intermediate crates and only generate LLVM IR. Today
rustc will generate both object code and LLVM IR, but the object code is
later simply thrown away, wastefully.
2020-04-29 23:47:27 +00:00
Matthew Maurer
0e7d5be4b8 Use .init_array rather than .ctors
LLVM TargetMachines default to using the (now-legacy) .ctors
representation of init functions. Mixing .ctors and .init_array
representations can cause issues when linking with lld.

This happens in practice for:

* Our profiling runtime which is currently implicitly built with
  .init_array since it is built by clang, which sets this field.
* External C/C++ code that may be linked into the same process.

To support legacy systems which may use .ctors, targets may now specify
that they use .ctors via the use_ctors attribute which defaults to
false.

For debugging and manual control, -Z use-ctors-section=yes/no will allow
manual override.

Fixes: #71233
2020-04-29 13:38:59 -07:00
Alex Crichton
ef89cc8f04 Store LLVM bitcode in object files, not compressed
This commit is an attempted resurrection of #70458 where LLVM bitcode
emitted by rustc into rlibs is stored into object file sections rather
than in a separate file. The main rationale for doing this is that when
rustc emits bitcode it will no longer use a custom compression scheme
which makes it both easier to interoperate with existing tools and also
cuts down on compile time since this compression isn't happening.

The blocker for this in #70458 turned out to be that native linkers
didn't handle the new sections well, causing the sections to either
trigger bugs in the linker or actually end up in the final linked
artifact. This commit attempts to address these issues by ensuring that
native linkers ignore the new sections by inserting custom flags with
module-level inline assembly.

Note that this does not currently change the API of the compiler at all.
The pre-existing `-C bitcode-in-rlib` flag is co-opted to indicate
whether the bitcode should be present in the object file or not.

Finally, note that an important consequence of this commit, which is also
one of its primary purposes, is to enable rustc's `-Clto` bitcode
loading to load rlibs produced with `-Clinker-plugin-lto`. The goal here
is that when you're building with LTO Cargo will tell rustc to skip
codegen of all intermediate crates and only generate LLVM IR. Today
rustc will generate both object code and LLVM IR, but the object code is
later simply thrown away, wastefully.
2020-04-29 11:57:26 -07:00
Vadim Petrochenkov
0452725583 codegen_llvm: RelocMode -> RelocModel 2020-04-26 11:18:48 +03:00
Vadim Petrochenkov
fb91e5ed2f rustc_target: Stop using "string typing" for relocation models
Introduce `enum RelocModel` instead.
2020-04-26 11:18:47 +03:00
Josh Stone
8506bb0060 Update the minimum external LLVM to 8
LLVM 8 was released on March 20, 2019, over a year ago.
2020-04-14 12:44:41 -07:00
Arlo Siemsen
f86b078e2d Add hash of source files in debug info
* Adds either an MD5 or SHA1 hash to the debug info.
* Adds new unstable option `-Z src-hash-algorithm` to control the hashing algorithm.
2020-04-02 14:13:19 -07:00
Nikita Popov
497f879b1e Update CreateMemSet() usage for LLVM 10 2020-03-19 20:09:57 +01:00
Nikita Popov
a94fa896cc Fix timeTraceProfilerInitialize for LLVM 10 2020-03-19 20:09:57 +01:00
Tomasz Miąsko
1106579c78 librustc_codegen_llvm: Use slices instead of 0-terminated strings
Changed functions:
* LLVMRustGetOrInsertFunction
* LLVMRustGetNamedValue
* LLVMRustBuildCall (removed unused name argument)
* LLVMRustInlineAsm
* LLVMRustInlineAsmVerify
* LLVMRustAppendModuleInlineAsm
2020-03-11 08:10:21 +01:00
Tomasz Miąsko
58303b77e0 Use slices in preference to 0-terminated strings
Additionally whenever possible match C API provided by the LLVM.
2020-03-09 02:05:22 +01:00
Tomasz Miąsko
e54a16cffc Change DIBuilderCreateEnumerator signature to match LLVM 9
No functional changes intended.
2020-03-05 15:34:50 +01:00
Tomasz Miąsko
a61e13423e Invoke OptimizerLastEPCallbacks in PreLinkThinLTO
The default ThinLTO pre-link pipeline does not include optimizer last
extension points. Thus, when using the new LLVM pass manager & ThinLTO
& sanitizers on any opt-level different from zero, the sanitizer
function passes would be omitted from the pipeline.

Add optimizer last extensions points manually to the pipeline, but guard
registration with stage check in the case this behaviour changes in the
future.
2020-03-03 08:37:44 +01:00
bors
10104085e4 Auto merge of #69144 - Dylan-DPC:rollup-apt6zjj, r=Dylan-DPC
Rollup of 9 pull requests

Successful merges:

 - #68728 (parse: merge `fn` syntax + cleanup item parsing)
 - #68938 (fix lifetime shadowing check in GATs)
 - #69057 (expand: misc cleanups and simplifications)
 - #69108 (Use HirId in TraitCandidate.)
 - #69125 (Add comment to SGX entry code)
 - #69126 (miri: fix exact_div)
 - #69127 (Enable use after scope detection in the new LLVM pass manager)
 - #69135 (Spelling error "represening" to "representing")
 - #69141 (Don't error on network failures)

Failed merges:

r? @ghost
2020-02-13 22:20:58 +00:00
Andreas Jonson
cec0ed0219 add selfprofiling for new llvm passmanager 2020-02-13 08:02:18 +01:00
Tomasz Miąsko
91b4a24219 Enable use after scope detection in the new LLVM pass manager
Implementation of 08a1c566a7 for the new
LLVM pass manager, support for which landed in the meantime.
2020-02-13 00:00:00 +00:00
Dylan DPC
f127aba96d Rollup merge of #67954 - nikic:new-pm, r=nagisa
Support new LLVM pass manager

Add support for the new LLVM pass manager behind a `-Z new-llvm-pass-manager=on` option. Both the pre-link optimization and LTO pipelines use the new pass manager. There's some bits that are not supported yet:

 * `-C passes`. NewPM requires an entirely different way of specifying custom pass pipelines. We should probably expose that functionality, but it doesn't directly map to what `-C passes` does.
 * NewPM has no support for custom inline parameters right now. We'd have to add upstream support for that first.
 * NewPM does not support PGO at O0 in LLVM 9 (which is why those tests fail with NewPM enabled). This is supported in LLVM 10.
 * NewPM does not support MergeFunctions in LLVM 9. I've landed this upstream just before the cut, so we'll be able to re-enable that with LLVM 10.

Closes #64289.

r? @ghost
2020-02-12 20:36:51 +01:00
Nikita Popov
c6b0803202 Add support for new pass manager
The new pass manager can be enabled using
-Z new-llvm-pass-manager=on.
2020-02-12 15:34:16 +01:00
Nikita Popov
03a73fa2cf Use IRBuilder to create memset
To avoid creating memsets with outdated signature. For some reason
SROA chokes on this when using NewPM.
2020-02-12 15:30:51 +01:00
Anthony Ramine
15adbf6e08 Properly use the darwin archive format on Apple targets
See https://github.com/servo/servo/issues/25550.
2020-02-12 12:06:14 +01:00
Wesley Wiser
f5f86be1d4 Add support for enabling the LLVM time-trace feature
I found this helpful while investigating an LLVM performance issue.
Passing `-Z llvm-time-trace` causes a `llvm_timings.json` file to be
created. This file can be inspected in either the Chrome Profiler tools
or with any other compatible tool like SpeedScope.

More information on the LLVM feature:

- https://aras-p.info/blog/2019/01/16/time-trace-timeline-flame-chart-profiler-for-Clang/

- https://reviews.llvm.org/rL357340
2020-02-01 14:19:17 -05:00
Tomasz Miąsko
08a1c566a7 Detect use-after-scope bugs with AddressSanitizer
Enable use-after-scope checks by default when using AddressSanitizer.
They allow to detect incorrect use of stack objects after their scope
have already ended. The detection is based on LLVM lifetime intrinsics.

To facilitate the use of this functionality, the lifetime intrinsics are
now emitted regardless of optimization level if enabled sanitizer makes
use of them.
2020-01-27 16:56:25 +01:00
Nikita Popov
c3ab84bb4f Switch to using MaybeAlign APIs
The integer versions are deprecated
2020-01-07 21:28:22 +01:00
Nikita Popov
6d59017132 Handle switch to Expected<StringRef> for section name 2020-01-07 21:28:22 +01:00
Nikita Popov
aa9d02ea53 Pass isDefined parameter to createGlobalVariableExpression() 2020-01-07 21:28:22 +01:00
Nikita Popov
f77f338151 Don't handle removed FlagBlockByrefStruct 2020-01-07 21:28:22 +01:00
Nikita Popov
8010f4037a Update thinLTOInternalizeAndPromoteInIndex() usage 2020-01-07 21:28:22 +01:00
Nikita Popov
30ec68a545 Handle removal of llvm::make_unique() 2020-01-07 21:28:22 +01:00
Nikita Popov
3ec3aa72d4 CodeGenFileType moved outside TargetMachine 2020-01-07 21:28:21 +01:00
Nikita Popov
2fd4e76d88 Explicitly include InitializePasses.h 2020-01-07 21:28:21 +01:00
Yuki Okushi
0b471bffc3 Rollup merge of #67033 - cuviper:ValueName2, r=rkruppe
Migrate to LLVM{Get,Set}ValueName2

The deprecated `LLVM{Get,Set}ValueName` only work with NUL-terminated
strings, but the `2` variants use explicit lengths, which fits better
with Rust strings and slices. We now use these in new helper functions
`llvm::{get,set}_value_name` that convert to/from `&[u8]`.

Closes #64223.
r? @rkruppe
2019-12-07 00:10:02 +09:00
bors
1e2a73867d Auto merge of #66952 - 0dvictor:print, r=rkruppe
Use Module::print() instead of a PrintModulePass

llvm::Module has a print() method. It is unnecessary to create a pass just for the purpose of printing LLVM IR.
2019-12-05 11:23:26 +00:00
Josh Stone
16d21783d6 Migrate to LLVM{Get,Set}ValueName2
The deprecated `LLVM{Get,Set}ValueName` only work with NUL-terminated
strings, but the `2` variants use explicit lengths, which fits better
with Rust strings and slices. We now use these in new helper functions
`llvm::{get,set}_value_name` that convert to/from `&[u8]`.
2019-12-04 12:00:28 -08:00
Mazdak Farrokhzad
8dcb5326dd Rollup merge of #66973 - cuviper:min-llvm7, r=alexcrichton
Update the minimum external LLVM to 7

LLVM 7 is over a year old, which should be plenty for compatibility. The
last LLVM 6 holdout was llvm-emscripten, which went away in #65501.

I've also included a fix for LLVM 8 lacking `MemorySanitizerOptions`,
which was broken by #66522.
2019-12-03 19:41:57 +01:00
Parth Sane
54b206034f Change linker for x86_64-fortanix-unknown-sgx to rust-lld
For SGX, the relocation using the relocation table is done by
the code in rust/src/libstd/sys/sgx/abi/reloc.rs and this code
should not require relocation. Setting RelaxELFRelocations flag
if allows this to happen, hence adding a Target Option for it.
2019-12-03 14:44:14 +05:30
Josh Stone
2304c25f31 Update the minimum external LLVM to 7
LLVM 7 is over a year old, which should be plenty for compatibility. The
last LLVM 6 holdout was llvm-emscripten, which went away in #65501.

I've also included a fix for LLVM 8 lacking `MemorySanitizerOptions`,
which was broken by #66522.
2019-12-02 11:36:21 -08:00
Victor Ding
85df207ecc Use Module::print() instead of a PrintModulePass
llvm::Module has a print() method. It is unnecessary to create a
pass just for the purpose of printing LLVM IR.
2019-12-02 21:04:44 +11:00
Victor Ding
b41b1d3407 Use LLVMAddAnalysisPasses instead of Rust's wrapper
LLVM exposes a C API `LLVMAddAnalysisPasses` and hence Rust's own
wrapper `LLVMRustAddAnalysisPasses` is not needed anymore.
2019-11-29 14:31:09 +11:00
Tyler Mandry
b05f14cc40 Rollup merge of #66761 - yuyoyuppe:rust_llvm_minor_fix, r=alexcrichton
Use LLVMDisposePassManager instead of raw delete in rustllvm

LLVM has a dedicated API call which wraps the destructor invocation for the PassManager.
Rust invokes it [otherwhere](d63b24ffcc/src/librustc_codegen_llvm/back/write.rs (L446-L447)), but not in the `LLVMRustWriteOutputFile`.

Since `LLVMDisposePassManager` might be extended to perform additional cleanup actions in the future, this change replaces raw destructor invocation with that API call.
2019-11-27 15:28:45 -06:00
yuyoyuppe
e846ea1112 Use LLVMDisposePassManager instead of raw delete in rustllvm 2019-11-25 23:52:10 +03:00