llvm: simplify data layout check
Don't skip the inconsistent data layout check for custom LLVMs. With #118708, all targets will have a simple test that would trigger this check if LLVM's data layouts do change - so data layouts would be corrected during the LLVM upgrade. Therefore, with builtin targets, this check won't trigger with our LLVM because each target will have been confirmed to work. With non-builtin targets, this check is probably useful to have because you can change the data layout in your target and if its wrong then that could lead to bugs. When using a custom LLVM, the same justification makes sense for non-builtin targets as with our LLVM, the user can update their target to match their LLVM and that's probably a good thing to do. However, with a custom LLVM, the user cannot change the builtin target data layouts if they don't match - though given that the compiler's data layout is used for layout computation and a bunch of other things - you could get some bugs because of the mismatch and probably want to know about that. `CFG_LLVM_ROOT` was also always set during local development with `download-ci-llvm` so this bug would never trigger locally. Signed-off-by: David Wood <david@davidtw.co>
This commit is contained in:
parent
c485ee7147
commit
46652dd254
9 changed files with 57 additions and 38 deletions
|
@ -34,6 +34,7 @@ use rustc_target::spec::{HasTargetSpec, RelocModel, Target, TlsModel};
|
|||
use smallvec::SmallVec;
|
||||
|
||||
use libc::c_uint;
|
||||
use std::borrow::Borrow;
|
||||
use std::cell::{Cell, RefCell};
|
||||
use std::ffi::CStr;
|
||||
use std::str;
|
||||
|
@ -147,8 +148,7 @@ pub unsafe fn create_module<'ll>(
|
|||
}
|
||||
|
||||
// Ensure the data-layout values hardcoded remain the defaults.
|
||||
if sess.target.is_builtin {
|
||||
// tm is disposed by its drop impl
|
||||
{
|
||||
let tm = crate::back::write::create_informational_target_machine(tcx.sess);
|
||||
llvm::LLVMRustSetDataLayoutFromTargetMachine(llmod, &tm);
|
||||
|
||||
|
@ -156,33 +156,13 @@ pub unsafe fn create_module<'ll>(
|
|||
let llvm_data_layout = str::from_utf8(CStr::from_ptr(llvm_data_layout).to_bytes())
|
||||
.expect("got a non-UTF8 data-layout from LLVM");
|
||||
|
||||
// Unfortunately LLVM target specs change over time, and right now we
|
||||
// don't have proper support to work with any more than one
|
||||
// `data_layout` than the one that is in the rust-lang/rust repo. If
|
||||
// this compiler is configured against a custom LLVM, we may have a
|
||||
// differing data layout, even though we should update our own to use
|
||||
// that one.
|
||||
//
|
||||
// As an interim hack, if CFG_LLVM_ROOT is not an empty string then we
|
||||
// disable this check entirely as we may be configured with something
|
||||
// that has a different target layout.
|
||||
//
|
||||
// Unsure if this will actually cause breakage when rustc is configured
|
||||
// as such.
|
||||
//
|
||||
// FIXME(#34960)
|
||||
let cfg_llvm_root = option_env!("CFG_LLVM_ROOT").unwrap_or("");
|
||||
let custom_llvm_used = !cfg_llvm_root.trim().is_empty();
|
||||
|
||||
if !custom_llvm_used && target_data_layout != llvm_data_layout {
|
||||
bug!(
|
||||
"data-layout for target `{rustc_target}`, `{rustc_layout}`, \
|
||||
differs from LLVM target's `{llvm_target}` default layout, `{llvm_layout}`",
|
||||
rustc_target = sess.opts.target_triple,
|
||||
rustc_layout = target_data_layout,
|
||||
llvm_target = sess.target.llvm_target,
|
||||
llvm_layout = llvm_data_layout
|
||||
);
|
||||
if target_data_layout != llvm_data_layout {
|
||||
tcx.dcx().emit_err(crate::errors::MismatchedDataLayout {
|
||||
rustc_target: sess.opts.target_triple.to_string().as_str(),
|
||||
rustc_layout: target_data_layout.as_str(),
|
||||
llvm_target: sess.target.llvm_target.borrow(),
|
||||
llvm_layout: llvm_data_layout,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue