Make lto and linker-plugin-lto work the same for compiler_builtins
Fix #142284 by ensuring that `#![no_builtins]` crates can still emit bitcode when proper (i.e., non-rustc) LTO (i.e., -Clinker-plugin-lto) is used.
This commit is contained in:
committed by
Ramon de C Valle
parent
d9dba3a554
commit
cf8753e4f9
@@ -143,23 +143,12 @@ impl ModuleConfig {
|
||||
|
||||
let emit_obj = if !should_emit_obj {
|
||||
EmitObj::None
|
||||
} else if sess.target.obj_is_bitcode
|
||||
|| (sess.opts.cg.linker_plugin_lto.enabled() && !no_builtins)
|
||||
{
|
||||
} else if sess.target.obj_is_bitcode || sess.opts.cg.linker_plugin_lto.enabled() {
|
||||
// This case is selected if the target uses objects as bitcode, or
|
||||
// if linker plugin LTO is enabled. In the linker plugin LTO case
|
||||
// the assumption is that the final link-step will read the bitcode
|
||||
// and convert it to object code. This may be done by either the
|
||||
// native linker or rustc itself.
|
||||
//
|
||||
// Note, however, that the linker-plugin-lto requested here is
|
||||
// explicitly ignored for `#![no_builtins]` crates. These crates are
|
||||
// specifically ignored by rustc's LTO passes and wouldn't work if
|
||||
// loaded into the linker. These crates define symbols that LLVM
|
||||
// lowers intrinsics to, and these symbol dependencies aren't known
|
||||
// until after codegen. As a result any crate marked
|
||||
// `#![no_builtins]` is assumed to not participate in LTO and
|
||||
// instead goes on to generate object code.
|
||||
EmitObj::Bitcode
|
||||
} else if need_bitcode_in_object(tcx) {
|
||||
EmitObj::ObjectCode(BitcodeSection::Full)
|
||||
|
||||
22
tests/ui/sanitizer/cfi/no_builtins.rs
Normal file
22
tests/ui/sanitizer/cfi/no_builtins.rs
Normal file
@@ -0,0 +1,22 @@
|
||||
// Verifies that `#![no_builtins]` crates can be built with linker-plugin-lto and CFI.
|
||||
// See Issue #142284
|
||||
//
|
||||
//@ needs-sanitizer-cfi
|
||||
//@ compile-flags: -Clinker-plugin-lto -Copt-level=0 -Zsanitizer=cfi -Ctarget-feature=-crt-static
|
||||
//@ compile-flags: --crate-type rlib
|
||||
//@ build-pass
|
||||
|
||||
#![no_builtins]
|
||||
#![no_std]
|
||||
|
||||
pub static FUNC: fn() = initializer;
|
||||
|
||||
pub fn initializer() {
|
||||
call(fma_with_fma);
|
||||
}
|
||||
|
||||
pub fn call(fn_ptr: fn()) {
|
||||
fn_ptr();
|
||||
}
|
||||
|
||||
pub fn fma_with_fma() {}
|
||||
Reference in New Issue
Block a user