Report an error on incompatible symbol definitions
This commit is contained in:
parent
a6b602dc32
commit
3207c9faec
@ -4,6 +4,7 @@ mod comments;
|
|||||||
mod pass_mode;
|
mod pass_mode;
|
||||||
mod returning;
|
mod returning;
|
||||||
|
|
||||||
|
use cranelift_module::ModuleError;
|
||||||
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
||||||
use rustc_middle::ty::layout::FnAbiOf;
|
use rustc_middle::ty::layout::FnAbiOf;
|
||||||
use rustc_target::abi::call::{Conv, FnAbi};
|
use rustc_target::abi::call::{Conv, FnAbi};
|
||||||
@ -69,7 +70,17 @@ pub(crate) fn import_function<'tcx>(
|
|||||||
) -> FuncId {
|
) -> FuncId {
|
||||||
let name = tcx.symbol_name(inst).name;
|
let name = tcx.symbol_name(inst).name;
|
||||||
let sig = get_function_sig(tcx, module.isa().triple(), inst);
|
let sig = get_function_sig(tcx, module.isa().triple(), inst);
|
||||||
module.declare_function(name, Linkage::Import, &sig).unwrap()
|
match module.declare_function(name, Linkage::Import, &sig) {
|
||||||
|
Ok(func_id) => func_id,
|
||||||
|
Err(ModuleError::IncompatibleDeclaration(_)) => tcx.sess.fatal(&format!(
|
||||||
|
"attempt to declare `{name}` as function, but it was already declared as static"
|
||||||
|
)),
|
||||||
|
Err(ModuleError::IncompatibleSignature(_, prev_sig, new_sig)) => tcx.sess.fatal(&format!(
|
||||||
|
"attempt to declare `{name}` with signature {new_sig:?}, \
|
||||||
|
but it was already declared with signature {prev_sig:?}"
|
||||||
|
)),
|
||||||
|
Err(err) => Err::<_, _>(err).unwrap(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> FunctionCx<'_, '_, 'tcx> {
|
impl<'tcx> FunctionCx<'_, '_, 'tcx> {
|
||||||
|
@ -316,14 +316,18 @@ fn data_id_for_static(
|
|||||||
|
|
||||||
let attrs = tcx.codegen_fn_attrs(def_id);
|
let attrs = tcx.codegen_fn_attrs(def_id);
|
||||||
|
|
||||||
let data_id = module
|
let data_id = match module.declare_data(
|
||||||
.declare_data(
|
&*symbol_name,
|
||||||
&*symbol_name,
|
linkage,
|
||||||
linkage,
|
is_mutable,
|
||||||
is_mutable,
|
attrs.flags.contains(CodegenFnAttrFlags::THREAD_LOCAL),
|
||||||
attrs.flags.contains(CodegenFnAttrFlags::THREAD_LOCAL),
|
) {
|
||||||
)
|
Ok(data_id) => data_id,
|
||||||
.unwrap();
|
Err(ModuleError::IncompatibleDeclaration(_)) => tcx.sess.fatal(&format!(
|
||||||
|
"attempt to declare `{symbol_name}` as static, but it was already declared as function"
|
||||||
|
)),
|
||||||
|
Err(err) => Err::<_, _>(err).unwrap(),
|
||||||
|
};
|
||||||
|
|
||||||
if rlinkage.is_some() {
|
if rlinkage.is_some() {
|
||||||
// Comment copied from https://github.com/rust-lang/rust/blob/45060c2a66dfd667f88bd8b94261b28a58d85bd5/src/librustc_codegen_llvm/consts.rs#L141
|
// Comment copied from https://github.com/rust-lang/rust/blob/45060c2a66dfd667f88bd8b94261b28a58d85bd5/src/librustc_codegen_llvm/consts.rs#L141
|
||||||
|
Loading…
x
Reference in New Issue
Block a user