Rollup merge of #104543 - JhonnyBillM:migrate-codegen-ssa-to-diagnostics-structs-pt3, r=davidtwco
Migrate `codegen_ssa` to diagnostics structs - [Part 3] Completes migrating `codegen_ssa` module except 2 outstanding errors that depend on other crates: 1. [`rustc_middle::mir::interpret::InterpError`](b6097f2e1b/compiler/rustc_middle/src/mir/interpret/error.rs (L475)
): I saw `rustc_middle` is unassigned, I am open to take this work. 2. `codegen_llvm`'s use of `fn span_invalid_monomorphization_error`, which I started to replace in the [last commit](9a31b3cdda
) of this PR, but would like to know the team's preference on how we should keep replacing the other macros: 2.1. Update macros to expect a `Diagnostic` 2.2. Remove macros and expand the code on each use. See [some examples of the different options in this experimental commit](64aee83e80
) _Part 2 - https://github.com/rust-lang/rust/pull/103792_ r? ``@davidtwco`` Cc ``@compiler-errors``
This commit is contained in:
commit
771cfa5581
@ -3890,6 +3890,7 @@ dependencies = [
|
|||||||
"rustc_span",
|
"rustc_span",
|
||||||
"rustc_symbol_mangling",
|
"rustc_symbol_mangling",
|
||||||
"rustc_target",
|
"rustc_target",
|
||||||
|
"rustc_type_ir",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"snap",
|
"snap",
|
||||||
@ -4024,6 +4025,7 @@ dependencies = [
|
|||||||
"rustc_serialize",
|
"rustc_serialize",
|
||||||
"rustc_span",
|
"rustc_span",
|
||||||
"rustc_target",
|
"rustc_target",
|
||||||
|
"rustc_type_ir",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"termcolor",
|
"termcolor",
|
||||||
|
@ -8,8 +8,8 @@
|
|||||||
use crate::value::Value;
|
use crate::value::Value;
|
||||||
|
|
||||||
use rustc_codegen_ssa::base::{compare_simd_types, wants_msvc_seh};
|
use rustc_codegen_ssa::base::{compare_simd_types, wants_msvc_seh};
|
||||||
use rustc_codegen_ssa::common::span_invalid_monomorphization_error;
|
|
||||||
use rustc_codegen_ssa::common::{IntPredicate, TypeKind};
|
use rustc_codegen_ssa::common::{IntPredicate, TypeKind};
|
||||||
|
use rustc_codegen_ssa::errors::{ExpectedPointerMutability, InvalidMonomorphization};
|
||||||
use rustc_codegen_ssa::mir::operand::OperandRef;
|
use rustc_codegen_ssa::mir::operand::OperandRef;
|
||||||
use rustc_codegen_ssa::mir::place::PlaceRef;
|
use rustc_codegen_ssa::mir::place::PlaceRef;
|
||||||
use rustc_codegen_ssa::traits::*;
|
use rustc_codegen_ssa::traits::*;
|
||||||
@ -284,15 +284,11 @@ fn codegen_intrinsic_call(
|
|||||||
_ => bug!(),
|
_ => bug!(),
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
span_invalid_monomorphization_error(
|
tcx.sess.emit_err(InvalidMonomorphization::BasicIntegerType {
|
||||||
tcx.sess,
|
|
||||||
span,
|
span,
|
||||||
&format!(
|
name,
|
||||||
"invalid monomorphization of `{}` intrinsic: \
|
ty,
|
||||||
expected basic integer type, found `{}`",
|
});
|
||||||
name, ty
|
|
||||||
),
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -838,40 +834,24 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
|||||||
llret_ty: &'ll Type,
|
llret_ty: &'ll Type,
|
||||||
span: Span,
|
span: Span,
|
||||||
) -> Result<&'ll Value, ()> {
|
) -> Result<&'ll Value, ()> {
|
||||||
// macros for error handling:
|
|
||||||
#[allow(unused_macro_rules)]
|
|
||||||
macro_rules! emit_error {
|
|
||||||
($msg: tt) => {
|
|
||||||
emit_error!($msg, )
|
|
||||||
};
|
|
||||||
($msg: tt, $($fmt: tt)*) => {
|
|
||||||
span_invalid_monomorphization_error(
|
|
||||||
bx.sess(), span,
|
|
||||||
&format!(concat!("invalid monomorphization of `{}` intrinsic: ", $msg),
|
|
||||||
name, $($fmt)*));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! return_error {
|
macro_rules! return_error {
|
||||||
($($fmt: tt)*) => {
|
($diag: expr) => {{
|
||||||
{
|
bx.sess().emit_err($diag);
|
||||||
emit_error!($($fmt)*);
|
return Err(());
|
||||||
return Err(());
|
}};
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! require {
|
macro_rules! require {
|
||||||
($cond: expr, $($fmt: tt)*) => {
|
($cond: expr, $diag: expr) => {
|
||||||
if !$cond {
|
if !$cond {
|
||||||
return_error!($($fmt)*);
|
return_error!($diag);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! require_simd {
|
macro_rules! require_simd {
|
||||||
($ty: expr, $position: expr) => {
|
($ty: expr, $diag: expr) => {
|
||||||
require!($ty.is_simd(), "expected SIMD {} type, found non-SIMD `{}`", $position, $ty)
|
require!($ty.is_simd(), $diag)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -881,7 +861,11 @@ macro_rules! require_simd {
|
|||||||
let arg_tys = sig.inputs();
|
let arg_tys = sig.inputs();
|
||||||
|
|
||||||
if name == sym::simd_select_bitmask {
|
if name == sym::simd_select_bitmask {
|
||||||
require_simd!(arg_tys[1], "argument");
|
require_simd!(
|
||||||
|
arg_tys[1],
|
||||||
|
InvalidMonomorphization::SimdArgument { span, name, ty: arg_tys[1] }
|
||||||
|
);
|
||||||
|
|
||||||
let (len, _) = arg_tys[1].simd_size_and_type(bx.tcx());
|
let (len, _) = arg_tys[1].simd_size_and_type(bx.tcx());
|
||||||
|
|
||||||
let expected_int_bits = (len.max(8) - 1).next_power_of_two();
|
let expected_int_bits = (len.max(8) - 1).next_power_of_two();
|
||||||
@ -902,12 +886,13 @@ macro_rules! require_simd {
|
|||||||
let ptr = bx.pointercast(place.llval, bx.cx.type_ptr_to(int_ty));
|
let ptr = bx.pointercast(place.llval, bx.cx.type_ptr_to(int_ty));
|
||||||
bx.load(int_ty, ptr, Align::ONE)
|
bx.load(int_ty, ptr, Align::ONE)
|
||||||
}
|
}
|
||||||
_ => return_error!(
|
_ => return_error!(InvalidMonomorphization::InvalidBitmask {
|
||||||
"invalid bitmask `{}`, expected `u{}` or `[u8; {}]`",
|
span,
|
||||||
|
name,
|
||||||
mask_ty,
|
mask_ty,
|
||||||
expected_int_bits,
|
expected_int_bits,
|
||||||
expected_bytes
|
expected_bytes
|
||||||
),
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
let i1 = bx.type_i1();
|
let i1 = bx.type_i1();
|
||||||
@ -919,7 +904,7 @@ macro_rules! require_simd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// every intrinsic below takes a SIMD vector as its first argument
|
// every intrinsic below takes a SIMD vector as its first argument
|
||||||
require_simd!(arg_tys[0], "input");
|
require_simd!(arg_tys[0], InvalidMonomorphization::SimdInput { span, name, ty: arg_tys[0] });
|
||||||
let in_ty = arg_tys[0];
|
let in_ty = arg_tys[0];
|
||||||
|
|
||||||
let comparison = match name {
|
let comparison = match name {
|
||||||
@ -934,23 +919,24 @@ macro_rules! require_simd {
|
|||||||
|
|
||||||
let (in_len, in_elem) = arg_tys[0].simd_size_and_type(bx.tcx());
|
let (in_len, in_elem) = arg_tys[0].simd_size_and_type(bx.tcx());
|
||||||
if let Some(cmp_op) = comparison {
|
if let Some(cmp_op) = comparison {
|
||||||
require_simd!(ret_ty, "return");
|
require_simd!(ret_ty, InvalidMonomorphization::SimdReturn { span, name, ty: ret_ty });
|
||||||
|
|
||||||
let (out_len, out_ty) = ret_ty.simd_size_and_type(bx.tcx());
|
let (out_len, out_ty) = ret_ty.simd_size_and_type(bx.tcx());
|
||||||
|
|
||||||
require!(
|
require!(
|
||||||
in_len == out_len,
|
in_len == out_len,
|
||||||
"expected return type with length {} (same as input type `{}`), \
|
InvalidMonomorphization::ReturnLengthInputType {
|
||||||
found `{}` with length {}",
|
span,
|
||||||
in_len,
|
name,
|
||||||
in_ty,
|
in_len,
|
||||||
ret_ty,
|
in_ty,
|
||||||
out_len
|
ret_ty,
|
||||||
|
out_len
|
||||||
|
}
|
||||||
);
|
);
|
||||||
require!(
|
require!(
|
||||||
bx.type_kind(bx.element_type(llret_ty)) == TypeKind::Integer,
|
bx.type_kind(bx.element_type(llret_ty)) == TypeKind::Integer,
|
||||||
"expected return type with integer elements, found `{}` with non-integer `{}`",
|
InvalidMonomorphization::ReturnIntegerType { span, name, ret_ty, out_ty }
|
||||||
ret_ty,
|
|
||||||
out_ty
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return Ok(compare_simd_types(
|
return Ok(compare_simd_types(
|
||||||
@ -975,10 +961,11 @@ macro_rules! require_simd {
|
|||||||
span_bug!(span, "could not evaluate shuffle index array length")
|
span_bug!(span, "could not evaluate shuffle index array length")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
_ => return_error!(
|
_ => return_error!(InvalidMonomorphization::SimdShuffle {
|
||||||
"simd_shuffle index must be an array of `u32`, got `{}`",
|
span,
|
||||||
args[2].layout.ty
|
name,
|
||||||
),
|
ty: args[2].layout.ty
|
||||||
|
}),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
stripped.parse().unwrap_or_else(|_| {
|
stripped.parse().unwrap_or_else(|_| {
|
||||||
@ -986,23 +973,15 @@ macro_rules! require_simd {
|
|||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
require_simd!(ret_ty, "return");
|
require_simd!(ret_ty, InvalidMonomorphization::SimdReturn { span, name, ty: ret_ty });
|
||||||
let (out_len, out_ty) = ret_ty.simd_size_and_type(bx.tcx());
|
let (out_len, out_ty) = ret_ty.simd_size_and_type(bx.tcx());
|
||||||
require!(
|
require!(
|
||||||
out_len == n,
|
out_len == n,
|
||||||
"expected return type of length {}, found `{}` with length {}",
|
InvalidMonomorphization::ReturnLength { span, name, in_len: n, ret_ty, out_len }
|
||||||
n,
|
|
||||||
ret_ty,
|
|
||||||
out_len
|
|
||||||
);
|
);
|
||||||
require!(
|
require!(
|
||||||
in_elem == out_ty,
|
in_elem == out_ty,
|
||||||
"expected return element type `{}` (element of input `{}`), \
|
InvalidMonomorphization::ReturnElement { span, name, in_elem, in_ty, ret_ty, out_ty }
|
||||||
found `{}` with element type `{}`",
|
|
||||||
in_elem,
|
|
||||||
in_ty,
|
|
||||||
ret_ty,
|
|
||||||
out_ty
|
|
||||||
);
|
);
|
||||||
|
|
||||||
let total_len = u128::from(in_len) * 2;
|
let total_len = u128::from(in_len) * 2;
|
||||||
@ -1015,15 +994,20 @@ macro_rules! require_simd {
|
|||||||
let val = bx.const_get_elt(vector, i as u64);
|
let val = bx.const_get_elt(vector, i as u64);
|
||||||
match bx.const_to_opt_u128(val, true) {
|
match bx.const_to_opt_u128(val, true) {
|
||||||
None => {
|
None => {
|
||||||
emit_error!("shuffle index #{} is not a constant", arg_idx);
|
bx.sess().emit_err(InvalidMonomorphization::ShuffleIndexNotConstant {
|
||||||
|
span,
|
||||||
|
name,
|
||||||
|
arg_idx,
|
||||||
|
});
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
Some(idx) if idx >= total_len => {
|
Some(idx) if idx >= total_len => {
|
||||||
emit_error!(
|
bx.sess().emit_err(InvalidMonomorphization::ShuffleIndexOutOfBounds {
|
||||||
"shuffle index #{} is out of bounds (limit {})",
|
span,
|
||||||
|
name,
|
||||||
arg_idx,
|
arg_idx,
|
||||||
total_len
|
total_len,
|
||||||
);
|
});
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
Some(idx) => Some(bx.const_i32(idx as i32)),
|
Some(idx) => Some(bx.const_i32(idx as i32)),
|
||||||
@ -1044,10 +1028,13 @@ macro_rules! require_simd {
|
|||||||
if name == sym::simd_insert {
|
if name == sym::simd_insert {
|
||||||
require!(
|
require!(
|
||||||
in_elem == arg_tys[2],
|
in_elem == arg_tys[2],
|
||||||
"expected inserted type `{}` (element of input `{}`), found `{}`",
|
InvalidMonomorphization::InsertedType {
|
||||||
in_elem,
|
span,
|
||||||
in_ty,
|
name,
|
||||||
arg_tys[2]
|
in_elem,
|
||||||
|
in_ty,
|
||||||
|
out_ty: arg_tys[2]
|
||||||
|
}
|
||||||
);
|
);
|
||||||
return Ok(bx.insert_element(
|
return Ok(bx.insert_element(
|
||||||
args[0].immediate(),
|
args[0].immediate(),
|
||||||
@ -1058,10 +1045,7 @@ macro_rules! require_simd {
|
|||||||
if name == sym::simd_extract {
|
if name == sym::simd_extract {
|
||||||
require!(
|
require!(
|
||||||
ret_ty == in_elem,
|
ret_ty == in_elem,
|
||||||
"expected return type `{}` (element of input `{}`), found `{}`",
|
InvalidMonomorphization::ReturnType { span, name, in_elem, in_ty, ret_ty }
|
||||||
in_elem,
|
|
||||||
in_ty,
|
|
||||||
ret_ty
|
|
||||||
);
|
);
|
||||||
return Ok(bx.extract_element(args[0].immediate(), args[1].immediate()));
|
return Ok(bx.extract_element(args[0].immediate(), args[1].immediate()));
|
||||||
}
|
}
|
||||||
@ -1069,17 +1053,18 @@ macro_rules! require_simd {
|
|||||||
if name == sym::simd_select {
|
if name == sym::simd_select {
|
||||||
let m_elem_ty = in_elem;
|
let m_elem_ty = in_elem;
|
||||||
let m_len = in_len;
|
let m_len = in_len;
|
||||||
require_simd!(arg_tys[1], "argument");
|
require_simd!(
|
||||||
|
arg_tys[1],
|
||||||
|
InvalidMonomorphization::SimdArgument { span, name, ty: arg_tys[1] }
|
||||||
|
);
|
||||||
let (v_len, _) = arg_tys[1].simd_size_and_type(bx.tcx());
|
let (v_len, _) = arg_tys[1].simd_size_and_type(bx.tcx());
|
||||||
require!(
|
require!(
|
||||||
m_len == v_len,
|
m_len == v_len,
|
||||||
"mismatched lengths: mask length `{}` != other vector length `{}`",
|
InvalidMonomorphization::MismatchedLengths { span, name, m_len, v_len }
|
||||||
m_len,
|
|
||||||
v_len
|
|
||||||
);
|
);
|
||||||
match m_elem_ty.kind() {
|
match m_elem_ty.kind() {
|
||||||
ty::Int(_) => {}
|
ty::Int(_) => {}
|
||||||
_ => return_error!("mask element type is `{}`, expected `i_`", m_elem_ty),
|
_ => return_error!(InvalidMonomorphization::MaskType { span, name, ty: m_elem_ty }),
|
||||||
}
|
}
|
||||||
// truncate the mask to a vector of i1s
|
// truncate the mask to a vector of i1s
|
||||||
let i1 = bx.type_i1();
|
let i1 = bx.type_i1();
|
||||||
@ -1111,11 +1096,12 @@ macro_rules! require_simd {
|
|||||||
args[0].immediate(),
|
args[0].immediate(),
|
||||||
i.bit_width().unwrap_or_else(|| bx.data_layout().pointer_size.bits()),
|
i.bit_width().unwrap_or_else(|| bx.data_layout().pointer_size.bits()),
|
||||||
),
|
),
|
||||||
_ => return_error!(
|
_ => return_error!(InvalidMonomorphization::VectorArgument {
|
||||||
"vector argument `{}`'s element type `{}`, expected integer element type",
|
span,
|
||||||
|
name,
|
||||||
in_ty,
|
in_ty,
|
||||||
in_elem
|
in_elem
|
||||||
),
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Shift the MSB to the right by "in_elem_bitwidth - 1" into the first bit position.
|
// Shift the MSB to the right by "in_elem_bitwidth - 1" into the first bit position.
|
||||||
@ -1150,12 +1136,13 @@ macro_rules! require_simd {
|
|||||||
let ptr = bx.pointercast(ptr, bx.cx.type_ptr_to(array_ty));
|
let ptr = bx.pointercast(ptr, bx.cx.type_ptr_to(array_ty));
|
||||||
return Ok(bx.load(array_ty, ptr, Align::ONE));
|
return Ok(bx.load(array_ty, ptr, Align::ONE));
|
||||||
}
|
}
|
||||||
_ => return_error!(
|
_ => return_error!(InvalidMonomorphization::CannotReturn {
|
||||||
"cannot return `{}`, expected `u{}` or `[u8; {}]`",
|
span,
|
||||||
|
name,
|
||||||
ret_ty,
|
ret_ty,
|
||||||
expected_int_bits,
|
expected_int_bits,
|
||||||
expected_bytes
|
expected_bytes
|
||||||
),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1168,25 +1155,11 @@ fn simd_simple_float_intrinsic<'ll, 'tcx>(
|
|||||||
span: Span,
|
span: Span,
|
||||||
args: &[OperandRef<'tcx, &'ll Value>],
|
args: &[OperandRef<'tcx, &'ll Value>],
|
||||||
) -> Result<&'ll Value, ()> {
|
) -> Result<&'ll Value, ()> {
|
||||||
#[allow(unused_macro_rules)]
|
|
||||||
macro_rules! emit_error {
|
|
||||||
($msg: tt) => {
|
|
||||||
emit_error!($msg, )
|
|
||||||
};
|
|
||||||
($msg: tt, $($fmt: tt)*) => {
|
|
||||||
span_invalid_monomorphization_error(
|
|
||||||
bx.sess(), span,
|
|
||||||
&format!(concat!("invalid monomorphization of `{}` intrinsic: ", $msg),
|
|
||||||
name, $($fmt)*));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
macro_rules! return_error {
|
macro_rules! return_error {
|
||||||
($($fmt: tt)*) => {
|
($diag: expr) => {{
|
||||||
{
|
bx.sess().emit_err($diag);
|
||||||
emit_error!($($fmt)*);
|
return Err(());
|
||||||
return Err(());
|
}};
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let (elem_ty_str, elem_ty) = if let ty::Float(f) = in_elem.kind() {
|
let (elem_ty_str, elem_ty) = if let ty::Float(f) = in_elem.kind() {
|
||||||
@ -1194,16 +1167,15 @@ macro_rules! return_error {
|
|||||||
match f.bit_width() {
|
match f.bit_width() {
|
||||||
32 => ("f32", elem_ty),
|
32 => ("f32", elem_ty),
|
||||||
64 => ("f64", elem_ty),
|
64 => ("f64", elem_ty),
|
||||||
_ => {
|
_ => return_error!(InvalidMonomorphization::FloatingPointVector {
|
||||||
return_error!(
|
span,
|
||||||
"unsupported element type `{}` of floating-point vector `{}`",
|
name,
|
||||||
f.name_str(),
|
f_ty: *f,
|
||||||
in_ty
|
in_ty,
|
||||||
);
|
}),
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return_error!("`{}` is not a floating-point type", in_ty);
|
return_error!(InvalidMonomorphization::FloatingPointType { span, name, in_ty });
|
||||||
};
|
};
|
||||||
|
|
||||||
let vec_ty = bx.type_vector(elem_ty, in_len);
|
let vec_ty = bx.type_vector(elem_ty, in_len);
|
||||||
@ -1225,7 +1197,7 @@ macro_rules! return_error {
|
|||||||
sym::simd_fsqrt => ("sqrt", bx.type_func(&[vec_ty], vec_ty)),
|
sym::simd_fsqrt => ("sqrt", bx.type_func(&[vec_ty], vec_ty)),
|
||||||
sym::simd_round => ("round", bx.type_func(&[vec_ty], vec_ty)),
|
sym::simd_round => ("round", bx.type_func(&[vec_ty], vec_ty)),
|
||||||
sym::simd_trunc => ("trunc", bx.type_func(&[vec_ty], vec_ty)),
|
sym::simd_trunc => ("trunc", bx.type_func(&[vec_ty], vec_ty)),
|
||||||
_ => return_error!("unrecognized intrinsic `{}`", name),
|
_ => return_error!(InvalidMonomorphization::UnrecognizedIntrinsic { span, name }),
|
||||||
};
|
};
|
||||||
let llvm_name = &format!("llvm.{0}.v{1}{2}", intr_name, in_len, elem_ty_str);
|
let llvm_name = &format!("llvm.{0}.v{1}{2}", intr_name, in_len, elem_ty_str);
|
||||||
let f = bx.declare_cfn(llvm_name, llvm::UnnamedAddr::No, fn_ty);
|
let f = bx.declare_cfn(llvm_name, llvm::UnnamedAddr::No, fn_ty);
|
||||||
@ -1319,37 +1291,48 @@ fn llvm_vector_ty<'ll>(
|
|||||||
// * M: any integer width is supported, will be truncated to i1
|
// * M: any integer width is supported, will be truncated to i1
|
||||||
|
|
||||||
// All types must be simd vector types
|
// All types must be simd vector types
|
||||||
require_simd!(in_ty, "first");
|
require_simd!(in_ty, InvalidMonomorphization::SimdFirst { span, name, ty: in_ty });
|
||||||
require_simd!(arg_tys[1], "second");
|
require_simd!(
|
||||||
require_simd!(arg_tys[2], "third");
|
arg_tys[1],
|
||||||
require_simd!(ret_ty, "return");
|
InvalidMonomorphization::SimdSecond { span, name, ty: arg_tys[1] }
|
||||||
|
);
|
||||||
|
require_simd!(
|
||||||
|
arg_tys[2],
|
||||||
|
InvalidMonomorphization::SimdThird { span, name, ty: arg_tys[2] }
|
||||||
|
);
|
||||||
|
require_simd!(ret_ty, InvalidMonomorphization::SimdReturn { span, name, ty: ret_ty });
|
||||||
|
|
||||||
// Of the same length:
|
// Of the same length:
|
||||||
let (out_len, _) = arg_tys[1].simd_size_and_type(bx.tcx());
|
let (out_len, _) = arg_tys[1].simd_size_and_type(bx.tcx());
|
||||||
let (out_len2, _) = arg_tys[2].simd_size_and_type(bx.tcx());
|
let (out_len2, _) = arg_tys[2].simd_size_and_type(bx.tcx());
|
||||||
require!(
|
require!(
|
||||||
in_len == out_len,
|
in_len == out_len,
|
||||||
"expected {} argument with length {} (same as input type `{}`), \
|
InvalidMonomorphization::SecondArgumentLength {
|
||||||
found `{}` with length {}",
|
span,
|
||||||
"second",
|
name,
|
||||||
in_len,
|
in_len,
|
||||||
in_ty,
|
in_ty,
|
||||||
arg_tys[1],
|
arg_ty: arg_tys[1],
|
||||||
out_len
|
out_len
|
||||||
|
}
|
||||||
);
|
);
|
||||||
require!(
|
require!(
|
||||||
in_len == out_len2,
|
in_len == out_len2,
|
||||||
"expected {} argument with length {} (same as input type `{}`), \
|
InvalidMonomorphization::ThirdArgumentLength {
|
||||||
found `{}` with length {}",
|
span,
|
||||||
"third",
|
name,
|
||||||
in_len,
|
in_len,
|
||||||
in_ty,
|
in_ty,
|
||||||
arg_tys[2],
|
arg_ty: arg_tys[2],
|
||||||
out_len2
|
out_len: out_len2
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// The return type must match the first argument type
|
// The return type must match the first argument type
|
||||||
require!(ret_ty == in_ty, "expected return type `{}`, found `{}`", in_ty, ret_ty);
|
require!(
|
||||||
|
ret_ty == in_ty,
|
||||||
|
InvalidMonomorphization::ExpectedReturnType { span, name, in_ty, ret_ty }
|
||||||
|
);
|
||||||
|
|
||||||
// This counts how many pointers
|
// This counts how many pointers
|
||||||
fn ptr_count(t: Ty<'_>) -> usize {
|
fn ptr_count(t: Ty<'_>) -> usize {
|
||||||
@ -1376,15 +1359,15 @@ fn non_ptr(t: Ty<'_>) -> Ty<'_> {
|
|||||||
_ => {
|
_ => {
|
||||||
require!(
|
require!(
|
||||||
false,
|
false,
|
||||||
"expected element type `{}` of second argument `{}` \
|
InvalidMonomorphization::ExpectedElementType {
|
||||||
to be a pointer to the element type `{}` of the first \
|
span,
|
||||||
argument `{}`, found `{}` != `*_ {}`",
|
name,
|
||||||
element_ty1,
|
expected_element: element_ty1,
|
||||||
arg_tys[1],
|
second_arg: arg_tys[1],
|
||||||
in_elem,
|
in_elem,
|
||||||
in_ty,
|
in_ty,
|
||||||
element_ty1,
|
mutability: ExpectedPointerMutability::Not,
|
||||||
in_elem
|
}
|
||||||
);
|
);
|
||||||
unreachable!();
|
unreachable!();
|
||||||
}
|
}
|
||||||
@ -1400,10 +1383,12 @@ fn non_ptr(t: Ty<'_>) -> Ty<'_> {
|
|||||||
_ => {
|
_ => {
|
||||||
require!(
|
require!(
|
||||||
false,
|
false,
|
||||||
"expected element type `{}` of third argument `{}` \
|
InvalidMonomorphization::ThirdArgElementType {
|
||||||
to be a signed integer type",
|
span,
|
||||||
element_ty2,
|
name,
|
||||||
arg_tys[2]
|
expected_element: element_ty2,
|
||||||
|
third_arg: arg_tys[2]
|
||||||
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1452,32 +1437,40 @@ fn non_ptr(t: Ty<'_>) -> Ty<'_> {
|
|||||||
// * M: any integer width is supported, will be truncated to i1
|
// * M: any integer width is supported, will be truncated to i1
|
||||||
|
|
||||||
// All types must be simd vector types
|
// All types must be simd vector types
|
||||||
require_simd!(in_ty, "first");
|
require_simd!(in_ty, InvalidMonomorphization::SimdFirst { span, name, ty: in_ty });
|
||||||
require_simd!(arg_tys[1], "second");
|
require_simd!(
|
||||||
require_simd!(arg_tys[2], "third");
|
arg_tys[1],
|
||||||
|
InvalidMonomorphization::SimdSecond { span, name, ty: arg_tys[1] }
|
||||||
|
);
|
||||||
|
require_simd!(
|
||||||
|
arg_tys[2],
|
||||||
|
InvalidMonomorphization::SimdThird { span, name, ty: arg_tys[2] }
|
||||||
|
);
|
||||||
|
|
||||||
// Of the same length:
|
// Of the same length:
|
||||||
let (element_len1, _) = arg_tys[1].simd_size_and_type(bx.tcx());
|
let (element_len1, _) = arg_tys[1].simd_size_and_type(bx.tcx());
|
||||||
let (element_len2, _) = arg_tys[2].simd_size_and_type(bx.tcx());
|
let (element_len2, _) = arg_tys[2].simd_size_and_type(bx.tcx());
|
||||||
require!(
|
require!(
|
||||||
in_len == element_len1,
|
in_len == element_len1,
|
||||||
"expected {} argument with length {} (same as input type `{}`), \
|
InvalidMonomorphization::SecondArgumentLength {
|
||||||
found `{}` with length {}",
|
span,
|
||||||
"second",
|
name,
|
||||||
in_len,
|
in_len,
|
||||||
in_ty,
|
in_ty,
|
||||||
arg_tys[1],
|
arg_ty: arg_tys[1],
|
||||||
element_len1
|
out_len: element_len1
|
||||||
|
}
|
||||||
);
|
);
|
||||||
require!(
|
require!(
|
||||||
in_len == element_len2,
|
in_len == element_len2,
|
||||||
"expected {} argument with length {} (same as input type `{}`), \
|
InvalidMonomorphization::ThirdArgumentLength {
|
||||||
found `{}` with length {}",
|
span,
|
||||||
"third",
|
name,
|
||||||
in_len,
|
in_len,
|
||||||
in_ty,
|
in_ty,
|
||||||
arg_tys[2],
|
arg_ty: arg_tys[2],
|
||||||
element_len2
|
out_len: element_len2
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// This counts how many pointers
|
// This counts how many pointers
|
||||||
@ -1508,15 +1501,15 @@ fn non_ptr(t: Ty<'_>) -> Ty<'_> {
|
|||||||
_ => {
|
_ => {
|
||||||
require!(
|
require!(
|
||||||
false,
|
false,
|
||||||
"expected element type `{}` of second argument `{}` \
|
InvalidMonomorphization::ExpectedElementType {
|
||||||
to be a pointer to the element type `{}` of the first \
|
span,
|
||||||
argument `{}`, found `{}` != `*mut {}`",
|
name,
|
||||||
element_ty1,
|
expected_element: element_ty1,
|
||||||
arg_tys[1],
|
second_arg: arg_tys[1],
|
||||||
in_elem,
|
in_elem,
|
||||||
in_ty,
|
in_ty,
|
||||||
element_ty1,
|
mutability: ExpectedPointerMutability::Mut,
|
||||||
in_elem
|
}
|
||||||
);
|
);
|
||||||
unreachable!();
|
unreachable!();
|
||||||
}
|
}
|
||||||
@ -1531,10 +1524,12 @@ fn non_ptr(t: Ty<'_>) -> Ty<'_> {
|
|||||||
_ => {
|
_ => {
|
||||||
require!(
|
require!(
|
||||||
false,
|
false,
|
||||||
"expected element type `{}` of third argument `{}` \
|
InvalidMonomorphization::ThirdArgElementType {
|
||||||
be a signed integer type",
|
span,
|
||||||
element_ty2,
|
name,
|
||||||
arg_tys[2]
|
expected_element: element_ty2,
|
||||||
|
third_arg: arg_tys[2]
|
||||||
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1581,10 +1576,7 @@ macro_rules! arith_red {
|
|||||||
if name == sym::$name {
|
if name == sym::$name {
|
||||||
require!(
|
require!(
|
||||||
ret_ty == in_elem,
|
ret_ty == in_elem,
|
||||||
"expected return type `{}` (element of input `{}`), found `{}`",
|
InvalidMonomorphization::ReturnType { span, name, in_elem, in_ty, ret_ty }
|
||||||
in_elem,
|
|
||||||
in_ty,
|
|
||||||
ret_ty
|
|
||||||
);
|
);
|
||||||
return match in_elem.kind() {
|
return match in_elem.kind() {
|
||||||
ty::Int(_) | ty::Uint(_) => {
|
ty::Int(_) | ty::Uint(_) => {
|
||||||
@ -1607,25 +1599,28 @@ macro_rules! arith_red {
|
|||||||
32 => bx.const_real(bx.type_f32(), $identity),
|
32 => bx.const_real(bx.type_f32(), $identity),
|
||||||
64 => bx.const_real(bx.type_f64(), $identity),
|
64 => bx.const_real(bx.type_f64(), $identity),
|
||||||
v => return_error!(
|
v => return_error!(
|
||||||
r#"
|
InvalidMonomorphization::UnsupportedSymbolOfSize {
|
||||||
unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#,
|
span,
|
||||||
sym::$name,
|
name,
|
||||||
in_ty,
|
symbol: sym::$name,
|
||||||
in_elem,
|
in_ty,
|
||||||
v,
|
in_elem,
|
||||||
ret_ty
|
size: v,
|
||||||
|
ret_ty
|
||||||
|
}
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Ok(bx.$float_reduce(acc, args[0].immediate()))
|
Ok(bx.$float_reduce(acc, args[0].immediate()))
|
||||||
}
|
}
|
||||||
_ => return_error!(
|
_ => return_error!(InvalidMonomorphization::UnsupportedSymbol {
|
||||||
"unsupported {} from `{}` with element `{}` to `{}`",
|
span,
|
||||||
sym::$name,
|
name,
|
||||||
|
symbol: sym::$name,
|
||||||
in_ty,
|
in_ty,
|
||||||
in_elem,
|
in_elem,
|
||||||
ret_ty
|
ret_ty
|
||||||
),
|
}),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -1653,22 +1648,20 @@ macro_rules! minmax_red {
|
|||||||
if name == sym::$name {
|
if name == sym::$name {
|
||||||
require!(
|
require!(
|
||||||
ret_ty == in_elem,
|
ret_ty == in_elem,
|
||||||
"expected return type `{}` (element of input `{}`), found `{}`",
|
InvalidMonomorphization::ReturnType { span, name, in_elem, in_ty, ret_ty }
|
||||||
in_elem,
|
|
||||||
in_ty,
|
|
||||||
ret_ty
|
|
||||||
);
|
);
|
||||||
return match in_elem.kind() {
|
return match in_elem.kind() {
|
||||||
ty::Int(_i) => Ok(bx.$int_red(args[0].immediate(), true)),
|
ty::Int(_i) => Ok(bx.$int_red(args[0].immediate(), true)),
|
||||||
ty::Uint(_u) => Ok(bx.$int_red(args[0].immediate(), false)),
|
ty::Uint(_u) => Ok(bx.$int_red(args[0].immediate(), false)),
|
||||||
ty::Float(_f) => Ok(bx.$float_red(args[0].immediate())),
|
ty::Float(_f) => Ok(bx.$float_red(args[0].immediate())),
|
||||||
_ => return_error!(
|
_ => return_error!(InvalidMonomorphization::UnsupportedSymbol {
|
||||||
"unsupported {} from `{}` with element `{}` to `{}`",
|
span,
|
||||||
sym::$name,
|
name,
|
||||||
|
symbol: sym::$name,
|
||||||
in_ty,
|
in_ty,
|
||||||
in_elem,
|
in_elem,
|
||||||
ret_ty
|
ret_ty
|
||||||
),
|
}),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -1686,22 +1679,20 @@ macro_rules! bitwise_red {
|
|||||||
let input = if !$boolean {
|
let input = if !$boolean {
|
||||||
require!(
|
require!(
|
||||||
ret_ty == in_elem,
|
ret_ty == in_elem,
|
||||||
"expected return type `{}` (element of input `{}`), found `{}`",
|
InvalidMonomorphization::ReturnType { span, name, in_elem, in_ty, ret_ty }
|
||||||
in_elem,
|
|
||||||
in_ty,
|
|
||||||
ret_ty
|
|
||||||
);
|
);
|
||||||
args[0].immediate()
|
args[0].immediate()
|
||||||
} else {
|
} else {
|
||||||
match in_elem.kind() {
|
match in_elem.kind() {
|
||||||
ty::Int(_) | ty::Uint(_) => {}
|
ty::Int(_) | ty::Uint(_) => {}
|
||||||
_ => return_error!(
|
_ => return_error!(InvalidMonomorphization::UnsupportedSymbol {
|
||||||
"unsupported {} from `{}` with element `{}` to `{}`",
|
span,
|
||||||
sym::$name,
|
name,
|
||||||
|
symbol: sym::$name,
|
||||||
in_ty,
|
in_ty,
|
||||||
in_elem,
|
in_elem,
|
||||||
ret_ty
|
ret_ty
|
||||||
),
|
}),
|
||||||
}
|
}
|
||||||
|
|
||||||
// boolean reductions operate on vectors of i1s:
|
// boolean reductions operate on vectors of i1s:
|
||||||
@ -1714,13 +1705,14 @@ macro_rules! bitwise_red {
|
|||||||
let r = bx.$red(input);
|
let r = bx.$red(input);
|
||||||
Ok(if !$boolean { r } else { bx.zext(r, bx.type_bool()) })
|
Ok(if !$boolean { r } else { bx.zext(r, bx.type_bool()) })
|
||||||
}
|
}
|
||||||
_ => return_error!(
|
_ => return_error!(InvalidMonomorphization::UnsupportedSymbol {
|
||||||
"unsupported {} from `{}` with element `{}` to `{}`",
|
span,
|
||||||
sym::$name,
|
name,
|
||||||
|
symbol: sym::$name,
|
||||||
in_ty,
|
in_ty,
|
||||||
in_elem,
|
in_elem,
|
||||||
ret_ty
|
ret_ty
|
||||||
),
|
}),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -1733,16 +1725,18 @@ macro_rules! bitwise_red {
|
|||||||
bitwise_red!(simd_reduce_any: vector_reduce_or, true);
|
bitwise_red!(simd_reduce_any: vector_reduce_or, true);
|
||||||
|
|
||||||
if name == sym::simd_cast_ptr {
|
if name == sym::simd_cast_ptr {
|
||||||
require_simd!(ret_ty, "return");
|
require_simd!(ret_ty, InvalidMonomorphization::SimdReturn { span, name, ty: ret_ty });
|
||||||
let (out_len, out_elem) = ret_ty.simd_size_and_type(bx.tcx());
|
let (out_len, out_elem) = ret_ty.simd_size_and_type(bx.tcx());
|
||||||
require!(
|
require!(
|
||||||
in_len == out_len,
|
in_len == out_len,
|
||||||
"expected return type with length {} (same as input type `{}`), \
|
InvalidMonomorphization::ReturnLengthInputType {
|
||||||
found `{}` with length {}",
|
span,
|
||||||
in_len,
|
name,
|
||||||
in_ty,
|
in_len,
|
||||||
ret_ty,
|
in_ty,
|
||||||
out_len
|
ret_ty,
|
||||||
|
out_len
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
match in_elem.kind() {
|
match in_elem.kind() {
|
||||||
@ -1751,9 +1745,14 @@ macro_rules! bitwise_red {
|
|||||||
bx.tcx.normalize_erasing_regions(ty::ParamEnv::reveal_all(), ty)
|
bx.tcx.normalize_erasing_regions(ty::ParamEnv::reveal_all(), ty)
|
||||||
});
|
});
|
||||||
assert!(!check_sized); // we are in codegen, so we shouldn't see these types
|
assert!(!check_sized); // we are in codegen, so we shouldn't see these types
|
||||||
require!(metadata.is_unit(), "cannot cast fat pointer `{}`", in_elem)
|
require!(
|
||||||
|
metadata.is_unit(),
|
||||||
|
InvalidMonomorphization::CastFatPointer { span, name, ty: in_elem }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
return_error!(InvalidMonomorphization::ExpectedPointer { span, name, ty: in_elem })
|
||||||
}
|
}
|
||||||
_ => return_error!("expected pointer, got `{}`", in_elem),
|
|
||||||
}
|
}
|
||||||
match out_elem.kind() {
|
match out_elem.kind() {
|
||||||
ty::RawPtr(p) => {
|
ty::RawPtr(p) => {
|
||||||
@ -1761,9 +1760,14 @@ macro_rules! bitwise_red {
|
|||||||
bx.tcx.normalize_erasing_regions(ty::ParamEnv::reveal_all(), ty)
|
bx.tcx.normalize_erasing_regions(ty::ParamEnv::reveal_all(), ty)
|
||||||
});
|
});
|
||||||
assert!(!check_sized); // we are in codegen, so we shouldn't see these types
|
assert!(!check_sized); // we are in codegen, so we shouldn't see these types
|
||||||
require!(metadata.is_unit(), "cannot cast to fat pointer `{}`", out_elem)
|
require!(
|
||||||
|
metadata.is_unit(),
|
||||||
|
InvalidMonomorphization::CastFatPointer { span, name, ty: out_elem }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
return_error!(InvalidMonomorphization::ExpectedPointer { span, name, ty: out_elem })
|
||||||
}
|
}
|
||||||
_ => return_error!("expected pointer, got `{}`", out_elem),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if in_elem == out_elem {
|
if in_elem == out_elem {
|
||||||
@ -1774,66 +1778,76 @@ macro_rules! bitwise_red {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if name == sym::simd_expose_addr {
|
if name == sym::simd_expose_addr {
|
||||||
require_simd!(ret_ty, "return");
|
require_simd!(ret_ty, InvalidMonomorphization::SimdReturn { span, name, ty: ret_ty });
|
||||||
let (out_len, out_elem) = ret_ty.simd_size_and_type(bx.tcx());
|
let (out_len, out_elem) = ret_ty.simd_size_and_type(bx.tcx());
|
||||||
require!(
|
require!(
|
||||||
in_len == out_len,
|
in_len == out_len,
|
||||||
"expected return type with length {} (same as input type `{}`), \
|
InvalidMonomorphization::ReturnLengthInputType {
|
||||||
found `{}` with length {}",
|
span,
|
||||||
in_len,
|
name,
|
||||||
in_ty,
|
in_len,
|
||||||
ret_ty,
|
in_ty,
|
||||||
out_len
|
ret_ty,
|
||||||
|
out_len
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
match in_elem.kind() {
|
match in_elem.kind() {
|
||||||
ty::RawPtr(_) => {}
|
ty::RawPtr(_) => {}
|
||||||
_ => return_error!("expected pointer, got `{}`", in_elem),
|
_ => {
|
||||||
|
return_error!(InvalidMonomorphization::ExpectedPointer { span, name, ty: in_elem })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
match out_elem.kind() {
|
match out_elem.kind() {
|
||||||
ty::Uint(ty::UintTy::Usize) => {}
|
ty::Uint(ty::UintTy::Usize) => {}
|
||||||
_ => return_error!("expected `usize`, got `{}`", out_elem),
|
_ => return_error!(InvalidMonomorphization::ExpectedUsize { span, name, ty: out_elem }),
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ok(bx.ptrtoint(args[0].immediate(), llret_ty));
|
return Ok(bx.ptrtoint(args[0].immediate(), llret_ty));
|
||||||
}
|
}
|
||||||
|
|
||||||
if name == sym::simd_from_exposed_addr {
|
if name == sym::simd_from_exposed_addr {
|
||||||
require_simd!(ret_ty, "return");
|
require_simd!(ret_ty, InvalidMonomorphization::SimdReturn { span, name, ty: ret_ty });
|
||||||
let (out_len, out_elem) = ret_ty.simd_size_and_type(bx.tcx());
|
let (out_len, out_elem) = ret_ty.simd_size_and_type(bx.tcx());
|
||||||
require!(
|
require!(
|
||||||
in_len == out_len,
|
in_len == out_len,
|
||||||
"expected return type with length {} (same as input type `{}`), \
|
InvalidMonomorphization::ReturnLengthInputType {
|
||||||
found `{}` with length {}",
|
span,
|
||||||
in_len,
|
name,
|
||||||
in_ty,
|
in_len,
|
||||||
ret_ty,
|
in_ty,
|
||||||
out_len
|
ret_ty,
|
||||||
|
out_len
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
match in_elem.kind() {
|
match in_elem.kind() {
|
||||||
ty::Uint(ty::UintTy::Usize) => {}
|
ty::Uint(ty::UintTy::Usize) => {}
|
||||||
_ => return_error!("expected `usize`, got `{}`", in_elem),
|
_ => return_error!(InvalidMonomorphization::ExpectedUsize { span, name, ty: in_elem }),
|
||||||
}
|
}
|
||||||
match out_elem.kind() {
|
match out_elem.kind() {
|
||||||
ty::RawPtr(_) => {}
|
ty::RawPtr(_) => {}
|
||||||
_ => return_error!("expected pointer, got `{}`", out_elem),
|
_ => {
|
||||||
|
return_error!(InvalidMonomorphization::ExpectedPointer { span, name, ty: out_elem })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ok(bx.inttoptr(args[0].immediate(), llret_ty));
|
return Ok(bx.inttoptr(args[0].immediate(), llret_ty));
|
||||||
}
|
}
|
||||||
|
|
||||||
if name == sym::simd_cast || name == sym::simd_as {
|
if name == sym::simd_cast || name == sym::simd_as {
|
||||||
require_simd!(ret_ty, "return");
|
require_simd!(ret_ty, InvalidMonomorphization::SimdReturn { span, name, ty: ret_ty });
|
||||||
let (out_len, out_elem) = ret_ty.simd_size_and_type(bx.tcx());
|
let (out_len, out_elem) = ret_ty.simd_size_and_type(bx.tcx());
|
||||||
require!(
|
require!(
|
||||||
in_len == out_len,
|
in_len == out_len,
|
||||||
"expected return type with length {} (same as input type `{}`), \
|
InvalidMonomorphization::ReturnLengthInputType {
|
||||||
found `{}` with length {}",
|
span,
|
||||||
in_len,
|
name,
|
||||||
in_ty,
|
in_len,
|
||||||
ret_ty,
|
in_ty,
|
||||||
out_len
|
ret_ty,
|
||||||
|
out_len
|
||||||
|
}
|
||||||
);
|
);
|
||||||
// casting cares about nominal type, not just structural type
|
// casting cares about nominal type, not just structural type
|
||||||
if in_elem == out_elem {
|
if in_elem == out_elem {
|
||||||
@ -1912,11 +1926,14 @@ enum Style {
|
|||||||
}
|
}
|
||||||
require!(
|
require!(
|
||||||
false,
|
false,
|
||||||
"unsupported cast from `{}` with element `{}` to `{}` with element `{}`",
|
InvalidMonomorphization::UnsupportedCast {
|
||||||
in_ty,
|
span,
|
||||||
in_elem,
|
name,
|
||||||
ret_ty,
|
in_ty,
|
||||||
out_elem
|
in_elem,
|
||||||
|
ret_ty,
|
||||||
|
out_elem
|
||||||
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
macro_rules! arith_binary {
|
macro_rules! arith_binary {
|
||||||
@ -1928,10 +1945,10 @@ macro_rules! arith_binary {
|
|||||||
})*
|
})*
|
||||||
_ => {},
|
_ => {},
|
||||||
}
|
}
|
||||||
require!(false,
|
require!(
|
||||||
"unsupported operation on `{}` with element `{}`",
|
false,
|
||||||
in_ty,
|
InvalidMonomorphization::UnsupportedOperation { span, name, in_ty, in_elem }
|
||||||
in_elem)
|
);
|
||||||
})*
|
})*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1959,10 +1976,10 @@ macro_rules! arith_unary {
|
|||||||
})*
|
})*
|
||||||
_ => {},
|
_ => {},
|
||||||
}
|
}
|
||||||
require!(false,
|
require!(
|
||||||
"unsupported operation on `{}` with element `{}`",
|
false,
|
||||||
in_ty,
|
InvalidMonomorphization::UnsupportedOperation { span, name, in_ty, in_elem }
|
||||||
in_elem)
|
);
|
||||||
})*
|
})*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2000,12 +2017,12 @@ macro_rules! arith_unary {
|
|||||||
ty::Int(i) => (true, i.bit_width().unwrap_or(ptr_bits), bx.cx.type_int_from_ty(i)),
|
ty::Int(i) => (true, i.bit_width().unwrap_or(ptr_bits), bx.cx.type_int_from_ty(i)),
|
||||||
ty::Uint(i) => (false, i.bit_width().unwrap_or(ptr_bits), bx.cx.type_uint_from_ty(i)),
|
ty::Uint(i) => (false, i.bit_width().unwrap_or(ptr_bits), bx.cx.type_uint_from_ty(i)),
|
||||||
_ => {
|
_ => {
|
||||||
return_error!(
|
return_error!(InvalidMonomorphization::ExpectedVectorElementType {
|
||||||
"expected element type `{}` of vector type `{}` \
|
span,
|
||||||
to be a signed or unsigned integer type",
|
name,
|
||||||
arg_tys[0].simd_size_and_type(bx.tcx()).1,
|
expected_element: arg_tys[0].simd_size_and_type(bx.tcx()).1,
|
||||||
arg_tys[0]
|
vector_type: arg_tys[0]
|
||||||
);
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let llvm_intrinsic = &format!(
|
let llvm_intrinsic = &format!(
|
||||||
|
@ -27,6 +27,7 @@ rustc_arena = { path = "../rustc_arena" }
|
|||||||
rustc_ast = { path = "../rustc_ast" }
|
rustc_ast = { path = "../rustc_ast" }
|
||||||
rustc_span = { path = "../rustc_span" }
|
rustc_span = { path = "../rustc_span" }
|
||||||
rustc_middle = { path = "../rustc_middle" }
|
rustc_middle = { path = "../rustc_middle" }
|
||||||
|
rustc_type_ir = { path = "../rustc_type_ir" }
|
||||||
rustc_attr = { path = "../rustc_attr" }
|
rustc_attr = { path = "../rustc_attr" }
|
||||||
rustc_symbol_mangling = { path = "../rustc_symbol_mangling" }
|
rustc_symbol_mangling = { path = "../rustc_symbol_mangling" }
|
||||||
rustc_data_structures = { path = "../rustc_data_structures" }
|
rustc_data_structures = { path = "../rustc_data_structures" }
|
||||||
|
@ -2616,7 +2616,7 @@ fn add_static_crate<'a>(
|
|||||||
sess.target.no_builtins || !codegen_results.crate_info.is_no_builtins.contains(&cnum);
|
sess.target.no_builtins || !codegen_results.crate_info.is_no_builtins.contains(&cnum);
|
||||||
|
|
||||||
let mut archive = archive_builder_builder.new_archive_builder(sess);
|
let mut archive = archive_builder_builder.new_archive_builder(sess);
|
||||||
if let Err(e) = archive.add_archive(
|
if let Err(error) = archive.add_archive(
|
||||||
cratepath,
|
cratepath,
|
||||||
Box::new(move |f| {
|
Box::new(move |f| {
|
||||||
if f == METADATA_FILENAME {
|
if f == METADATA_FILENAME {
|
||||||
@ -2656,7 +2656,7 @@ fn add_static_crate<'a>(
|
|||||||
false
|
false
|
||||||
}),
|
}),
|
||||||
) {
|
) {
|
||||||
sess.fatal(&format!("failed to build archive from rlib: {}", e));
|
sess.emit_fatal(errors::RlibArchiveBuildFailure { error });
|
||||||
}
|
}
|
||||||
if archive.build(&dst) {
|
if archive.build(&dst) {
|
||||||
link_upstream(&dst);
|
link_upstream(&dst);
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
submit_post_lto_module_to_llvm, submit_pre_lto_module_to_llvm, ComputedLtoType, OngoingCodegen,
|
submit_post_lto_module_to_llvm, submit_pre_lto_module_to_llvm, ComputedLtoType, OngoingCodegen,
|
||||||
};
|
};
|
||||||
use crate::common::{IntPredicate, RealPredicate, TypeKind};
|
use crate::common::{IntPredicate, RealPredicate, TypeKind};
|
||||||
|
use crate::errors;
|
||||||
use crate::meth;
|
use crate::meth;
|
||||||
use crate::mir;
|
use crate::mir;
|
||||||
use crate::mir::operand::OperandValue;
|
use crate::mir::operand::OperandValue;
|
||||||
@ -451,10 +452,7 @@ fn create_entry_fn<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||||||
let Some(llfn) = cx.declare_c_main(llfty) else {
|
let Some(llfn) = cx.declare_c_main(llfty) else {
|
||||||
// FIXME: We should be smart and show a better diagnostic here.
|
// FIXME: We should be smart and show a better diagnostic here.
|
||||||
let span = cx.tcx().def_span(rust_main_def_id);
|
let span = cx.tcx().def_span(rust_main_def_id);
|
||||||
cx.sess()
|
cx.sess().emit_err(errors::MultipleMainFunctions { span });
|
||||||
.struct_span_err(span, "entry symbol `main` declared multiple times")
|
|
||||||
.help("did you use `#[no_mangle]` on `fn main`? Use `#[start]` instead")
|
|
||||||
.emit();
|
|
||||||
cx.sess().abort_if_errors();
|
cx.sess().abort_if_errors();
|
||||||
bug!();
|
bug!();
|
||||||
};
|
};
|
||||||
@ -595,8 +593,8 @@ pub fn codegen_crate<B: ExtraBackendMethods>(
|
|||||||
&metadata,
|
&metadata,
|
||||||
&exported_symbols::metadata_symbol_name(tcx),
|
&exported_symbols::metadata_symbol_name(tcx),
|
||||||
);
|
);
|
||||||
if let Err(err) = std::fs::write(&file_name, data) {
|
if let Err(error) = std::fs::write(&file_name, data) {
|
||||||
tcx.sess.fatal(&format!("error writing metadata object file: {}", err));
|
tcx.sess.emit_fatal(errors::MetadataObjectFileWrite { error });
|
||||||
}
|
}
|
||||||
Some(CompiledModule {
|
Some(CompiledModule {
|
||||||
name: metadata_cgu_name,
|
name: metadata_cgu_name,
|
||||||
@ -815,11 +813,7 @@ pub fn new(tcx: TyCtxt<'_>, target_cpu: String) -> CrateInfo {
|
|||||||
let subsystem = tcx.sess.first_attr_value_str_by_name(crate_attrs, sym::windows_subsystem);
|
let subsystem = tcx.sess.first_attr_value_str_by_name(crate_attrs, sym::windows_subsystem);
|
||||||
let windows_subsystem = subsystem.map(|subsystem| {
|
let windows_subsystem = subsystem.map(|subsystem| {
|
||||||
if subsystem != sym::windows && subsystem != sym::console {
|
if subsystem != sym::windows && subsystem != sym::console {
|
||||||
tcx.sess.fatal(&format!(
|
tcx.sess.emit_fatal(errors::InvalidWindowsSubsystem { subsystem });
|
||||||
"invalid windows subsystem `{}`, only \
|
|
||||||
`windows` and `console` are allowed",
|
|
||||||
subsystem
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
subsystem.to_string()
|
subsystem.to_string()
|
||||||
});
|
});
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
#![allow(non_camel_case_types)]
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
use rustc_errors::struct_span_err;
|
|
||||||
use rustc_hir::LangItem;
|
use rustc_hir::LangItem;
|
||||||
use rustc_middle::mir::interpret::ConstValue;
|
use rustc_middle::mir::interpret::ConstValue;
|
||||||
use rustc_middle::ty::{self, layout::TyAndLayout, Ty, TyCtxt};
|
use rustc_middle::ty::{self, layout::TyAndLayout, Ty, TyCtxt};
|
||||||
use rustc_session::Session;
|
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
use crate::base;
|
use crate::base;
|
||||||
@ -193,10 +191,6 @@ pub fn shift_mask_val<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn span_invalid_monomorphization_error(a: &Session, b: Span, c: &str) {
|
|
||||||
struct_span_err!(a, b, E0511, "{}", c).emit();
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn asm_const_to_str<'tcx>(
|
pub fn asm_const_to_str<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
sp: Span,
|
sp: Span,
|
||||||
|
@ -93,6 +93,7 @@ fn push_debuginfo_type_name<'tcx>(
|
|||||||
Err(e) => {
|
Err(e) => {
|
||||||
// Computing the layout can still fail here, e.g. if the target architecture
|
// Computing the layout can still fail here, e.g. if the target architecture
|
||||||
// cannot represent the type. See https://github.com/rust-lang/rust/issues/94961.
|
// cannot represent the type. See https://github.com/rust-lang/rust/issues/94961.
|
||||||
|
// FIXME: migrate once `rustc_middle::mir::interpret::InterpError` is translatable.
|
||||||
tcx.sess.fatal(&format!("{}", e));
|
tcx.sess.fatal(&format!("{}", e));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,9 @@
|
|||||||
IntoDiagnosticArg,
|
IntoDiagnosticArg,
|
||||||
};
|
};
|
||||||
use rustc_macros::Diagnostic;
|
use rustc_macros::Diagnostic;
|
||||||
|
use rustc_middle::ty::Ty;
|
||||||
use rustc_span::{Span, Symbol};
|
use rustc_span::{Span, Symbol};
|
||||||
|
use rustc_type_ir::FloatTy;
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::io::Error;
|
use std::io::Error;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
@ -549,3 +551,432 @@ pub struct ExpectedUsedSymbol {
|
|||||||
#[primary_span]
|
#[primary_span]
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_multiple_main_functions)]
|
||||||
|
#[help]
|
||||||
|
pub struct MultipleMainFunctions {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_metadata_object_file_write)]
|
||||||
|
pub struct MetadataObjectFileWrite {
|
||||||
|
pub error: Error,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_invalid_windows_subsystem)]
|
||||||
|
pub struct InvalidWindowsSubsystem {
|
||||||
|
pub subsystem: Symbol,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_erroneous_constant)]
|
||||||
|
pub struct ErroneousConstant {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_polymorphic_constant_too_generic)]
|
||||||
|
pub struct PolymorphicConstantTooGeneric {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_shuffle_indices_evaluation)]
|
||||||
|
pub struct ShuffleIndicesEvaluation {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_missing_memory_ordering)]
|
||||||
|
pub struct MissingMemoryOrdering;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_unknown_atomic_ordering)]
|
||||||
|
pub struct UnknownAtomicOrdering;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_atomic_compare_exchange)]
|
||||||
|
pub struct AtomicCompareExchange;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_unknown_atomic_operation)]
|
||||||
|
pub struct UnknownAtomicOperation;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
pub enum InvalidMonomorphization<'tcx> {
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_basic_integer_type, code = "E0511")]
|
||||||
|
BasicIntegerType {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_basic_float_type, code = "E0511")]
|
||||||
|
BasicFloatType {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_float_to_int_unchecked, code = "E0511")]
|
||||||
|
FloatToIntUnchecked {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_floating_point_vector, code = "E0511")]
|
||||||
|
FloatingPointVector {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
f_ty: FloatTy,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_floating_point_type, code = "E0511")]
|
||||||
|
FloatingPointType {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_unrecognized_intrinsic, code = "E0511")]
|
||||||
|
UnrecognizedIntrinsic {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_simd_argument, code = "E0511")]
|
||||||
|
SimdArgument {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_simd_input, code = "E0511")]
|
||||||
|
SimdInput {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_simd_first, code = "E0511")]
|
||||||
|
SimdFirst {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_simd_second, code = "E0511")]
|
||||||
|
SimdSecond {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_simd_third, code = "E0511")]
|
||||||
|
SimdThird {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_simd_return, code = "E0511")]
|
||||||
|
SimdReturn {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_invalid_bitmask, code = "E0511")]
|
||||||
|
InvalidBitmask {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
mask_ty: Ty<'tcx>,
|
||||||
|
expected_int_bits: u64,
|
||||||
|
expected_bytes: u64,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_return_length_input_type, code = "E0511")]
|
||||||
|
ReturnLengthInputType {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
in_len: u64,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
ret_ty: Ty<'tcx>,
|
||||||
|
out_len: u64,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_second_argument_length, code = "E0511")]
|
||||||
|
SecondArgumentLength {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
in_len: u64,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
arg_ty: Ty<'tcx>,
|
||||||
|
out_len: u64,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_third_argument_length, code = "E0511")]
|
||||||
|
ThirdArgumentLength {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
in_len: u64,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
arg_ty: Ty<'tcx>,
|
||||||
|
out_len: u64,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_return_integer_type, code = "E0511")]
|
||||||
|
ReturnIntegerType {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ret_ty: Ty<'tcx>,
|
||||||
|
out_ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_simd_shuffle, code = "E0511")]
|
||||||
|
SimdShuffle {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_return_length, code = "E0511")]
|
||||||
|
ReturnLength {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
in_len: u64,
|
||||||
|
ret_ty: Ty<'tcx>,
|
||||||
|
out_len: u64,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_return_element, code = "E0511")]
|
||||||
|
ReturnElement {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
in_elem: Ty<'tcx>,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
ret_ty: Ty<'tcx>,
|
||||||
|
out_ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_shuffle_index_not_constant, code = "E0511")]
|
||||||
|
ShuffleIndexNotConstant {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
arg_idx: u64,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_shuffle_index_out_of_bounds, code = "E0511")]
|
||||||
|
ShuffleIndexOutOfBounds {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
arg_idx: u64,
|
||||||
|
total_len: u128,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_inserted_type, code = "E0511")]
|
||||||
|
InsertedType {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
in_elem: Ty<'tcx>,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
out_ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_return_type, code = "E0511")]
|
||||||
|
ReturnType {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
in_elem: Ty<'tcx>,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
ret_ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_expected_return_type, code = "E0511")]
|
||||||
|
ExpectedReturnType {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
ret_ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_mismatched_lengths, code = "E0511")]
|
||||||
|
MismatchedLengths {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
m_len: u64,
|
||||||
|
v_len: u64,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_mask_type, code = "E0511")]
|
||||||
|
MaskType {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_vector_argument, code = "E0511")]
|
||||||
|
VectorArgument {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
in_elem: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_cannot_return, code = "E0511")]
|
||||||
|
CannotReturn {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ret_ty: Ty<'tcx>,
|
||||||
|
expected_int_bits: u64,
|
||||||
|
expected_bytes: u64,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_expected_element_type, code = "E0511")]
|
||||||
|
ExpectedElementType {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
expected_element: Ty<'tcx>,
|
||||||
|
second_arg: Ty<'tcx>,
|
||||||
|
in_elem: Ty<'tcx>,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
mutability: ExpectedPointerMutability,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_third_arg_element_type, code = "E0511")]
|
||||||
|
ThirdArgElementType {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
expected_element: Ty<'tcx>,
|
||||||
|
third_arg: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_unsupported_symbol_of_size, code = "E0511")]
|
||||||
|
UnsupportedSymbolOfSize {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
symbol: Symbol,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
in_elem: Ty<'tcx>,
|
||||||
|
size: u64,
|
||||||
|
ret_ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_unsupported_symbol, code = "E0511")]
|
||||||
|
UnsupportedSymbol {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
symbol: Symbol,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
in_elem: Ty<'tcx>,
|
||||||
|
ret_ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_cast_fat_pointer, code = "E0511")]
|
||||||
|
CastFatPointer {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_expected_pointer, code = "E0511")]
|
||||||
|
ExpectedPointer {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_expected_usize, code = "E0511")]
|
||||||
|
ExpectedUsize {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
ty: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_unsupported_cast, code = "E0511")]
|
||||||
|
UnsupportedCast {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
in_elem: Ty<'tcx>,
|
||||||
|
ret_ty: Ty<'tcx>,
|
||||||
|
out_elem: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_unsupported_operation, code = "E0511")]
|
||||||
|
UnsupportedOperation {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
in_ty: Ty<'tcx>,
|
||||||
|
in_elem: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_invalid_monomorphization_expected_vector_element_type, code = "E0511")]
|
||||||
|
ExpectedVectorElementType {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
name: Symbol,
|
||||||
|
expected_element: Ty<'tcx>,
|
||||||
|
vector_type: Ty<'tcx>,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum ExpectedPointerMutability {
|
||||||
|
Mut,
|
||||||
|
Not,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IntoDiagnosticArg for ExpectedPointerMutability {
|
||||||
|
fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
|
||||||
|
match self {
|
||||||
|
ExpectedPointerMutability::Mut => DiagnosticArgValue::Str(Cow::Borrowed("*mut")),
|
||||||
|
ExpectedPointerMutability::Not => DiagnosticArgValue::Str(Cow::Borrowed("*_")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
use crate::errors;
|
||||||
use crate::mir::operand::OperandRef;
|
use crate::mir::operand::OperandRef;
|
||||||
use crate::traits::*;
|
use crate::traits::*;
|
||||||
use rustc_middle::mir;
|
use rustc_middle::mir;
|
||||||
@ -44,10 +45,14 @@ pub fn eval_mir_constant(
|
|||||||
self.cx.tcx().const_eval_resolve(ty::ParamEnv::reveal_all(), uv, None).map_err(|err| {
|
self.cx.tcx().const_eval_resolve(ty::ParamEnv::reveal_all(), uv, None).map_err(|err| {
|
||||||
match err {
|
match err {
|
||||||
ErrorHandled::Reported(_) => {
|
ErrorHandled::Reported(_) => {
|
||||||
self.cx.tcx().sess.span_err(constant.span, "erroneous constant encountered");
|
self.cx.tcx().sess.emit_err(errors::ErroneousConstant { span: constant.span });
|
||||||
}
|
}
|
||||||
ErrorHandled::TooGeneric => {
|
ErrorHandled::TooGeneric => {
|
||||||
span_bug!(constant.span, "codegen encountered polymorphic constant: {:?}", err);
|
self.cx
|
||||||
|
.tcx()
|
||||||
|
.sess
|
||||||
|
.diagnostic()
|
||||||
|
.emit_bug(errors::PolymorphicConstantTooGeneric { span: constant.span });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err
|
err
|
||||||
@ -87,7 +92,7 @@ pub fn simd_shuffle_indices(
|
|||||||
(llval, c.ty())
|
(llval, c.ty())
|
||||||
})
|
})
|
||||||
.unwrap_or_else(|_| {
|
.unwrap_or_else(|_| {
|
||||||
bx.tcx().sess.span_err(span, "could not evaluate shuffle_indices at compile time");
|
bx.tcx().sess.emit_err(errors::ShuffleIndicesEvaluation { span });
|
||||||
// We've errored, so we don't have to produce working code.
|
// We've errored, so we don't have to produce working code.
|
||||||
let ty = self.monomorphize(ty);
|
let ty = self.monomorphize(ty);
|
||||||
let llty = bx.backend_type(bx.layout_of(ty));
|
let llty = bx.backend_type(bx.layout_of(ty));
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
use super::operand::{OperandRef, OperandValue};
|
use super::operand::{OperandRef, OperandValue};
|
||||||
use super::place::PlaceRef;
|
use super::place::PlaceRef;
|
||||||
use super::FunctionCx;
|
use super::FunctionCx;
|
||||||
use crate::common::{span_invalid_monomorphization_error, IntPredicate};
|
use crate::common::IntPredicate;
|
||||||
|
use crate::errors;
|
||||||
|
use crate::errors::InvalidMonomorphization;
|
||||||
use crate::glue;
|
use crate::glue;
|
||||||
use crate::meth;
|
use crate::meth;
|
||||||
use crate::traits::*;
|
use crate::traits::*;
|
||||||
@ -305,15 +307,7 @@ pub fn codegen_intrinsic_call(
|
|||||||
_ => bug!(),
|
_ => bug!(),
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
span_invalid_monomorphization_error(
|
bx.tcx().sess.emit_err(InvalidMonomorphization::BasicIntegerType { span, name, ty });
|
||||||
bx.tcx().sess,
|
|
||||||
span,
|
|
||||||
&format!(
|
|
||||||
"invalid monomorphization of `{}` intrinsic: \
|
|
||||||
expected basic integer type, found `{}`",
|
|
||||||
name, ty
|
|
||||||
),
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -329,15 +323,7 @@ pub fn codegen_intrinsic_call(
|
|||||||
_ => bug!(),
|
_ => bug!(),
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
span_invalid_monomorphization_error(
|
bx.tcx().sess.emit_err(InvalidMonomorphization::BasicFloatType { span, name, ty: arg_tys[0] });
|
||||||
bx.tcx().sess,
|
|
||||||
span,
|
|
||||||
&format!(
|
|
||||||
"invalid monomorphization of `{}` intrinsic: \
|
|
||||||
expected basic float type, found `{}`",
|
|
||||||
name, arg_tys[0]
|
|
||||||
),
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -345,29 +331,11 @@ pub fn codegen_intrinsic_call(
|
|||||||
|
|
||||||
sym::float_to_int_unchecked => {
|
sym::float_to_int_unchecked => {
|
||||||
if float_type_width(arg_tys[0]).is_none() {
|
if float_type_width(arg_tys[0]).is_none() {
|
||||||
span_invalid_monomorphization_error(
|
bx.tcx().sess.emit_err(InvalidMonomorphization::FloatToIntUnchecked { span, ty: arg_tys[0] });
|
||||||
bx.tcx().sess,
|
|
||||||
span,
|
|
||||||
&format!(
|
|
||||||
"invalid monomorphization of `float_to_int_unchecked` \
|
|
||||||
intrinsic: expected basic float type, \
|
|
||||||
found `{}`",
|
|
||||||
arg_tys[0]
|
|
||||||
),
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let Some((_width, signed)) = int_type_width_signed(ret_ty, bx.tcx()) else {
|
let Some((_width, signed)) = int_type_width_signed(ret_ty, bx.tcx()) else {
|
||||||
span_invalid_monomorphization_error(
|
bx.tcx().sess.emit_err(InvalidMonomorphization::FloatToIntUnchecked { span, ty: ret_ty });
|
||||||
bx.tcx().sess,
|
|
||||||
span,
|
|
||||||
&format!(
|
|
||||||
"invalid monomorphization of `float_to_int_unchecked` \
|
|
||||||
intrinsic: expected basic integer type, \
|
|
||||||
found `{}`",
|
|
||||||
ret_ty
|
|
||||||
),
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
if signed {
|
if signed {
|
||||||
@ -402,7 +370,7 @@ pub fn codegen_intrinsic_call(
|
|||||||
use crate::common::{AtomicRmwBinOp, SynchronizationScope};
|
use crate::common::{AtomicRmwBinOp, SynchronizationScope};
|
||||||
|
|
||||||
let Some((instruction, ordering)) = atomic.split_once('_') else {
|
let Some((instruction, ordering)) = atomic.split_once('_') else {
|
||||||
bx.sess().fatal("Atomic intrinsic missing memory ordering");
|
bx.sess().emit_fatal(errors::MissingMemoryOrdering);
|
||||||
};
|
};
|
||||||
|
|
||||||
let parse_ordering = |bx: &Bx, s| match s {
|
let parse_ordering = |bx: &Bx, s| match s {
|
||||||
@ -412,25 +380,17 @@ pub fn codegen_intrinsic_call(
|
|||||||
"release" => Release,
|
"release" => Release,
|
||||||
"acqrel" => AcquireRelease,
|
"acqrel" => AcquireRelease,
|
||||||
"seqcst" => SequentiallyConsistent,
|
"seqcst" => SequentiallyConsistent,
|
||||||
_ => bx.sess().fatal("unknown ordering in atomic intrinsic"),
|
_ => bx.sess().emit_fatal(errors::UnknownAtomicOrdering),
|
||||||
};
|
};
|
||||||
|
|
||||||
let invalid_monomorphization = |ty| {
|
let invalid_monomorphization = |ty| {
|
||||||
span_invalid_monomorphization_error(
|
bx.tcx().sess.emit_err(InvalidMonomorphization::BasicIntegerType { span, name, ty });
|
||||||
bx.tcx().sess,
|
|
||||||
span,
|
|
||||||
&format!(
|
|
||||||
"invalid monomorphization of `{}` intrinsic: \
|
|
||||||
expected basic integer type, found `{}`",
|
|
||||||
name, ty
|
|
||||||
),
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
match instruction {
|
match instruction {
|
||||||
"cxchg" | "cxchgweak" => {
|
"cxchg" | "cxchgweak" => {
|
||||||
let Some((success, failure)) = ordering.split_once('_') else {
|
let Some((success, failure)) = ordering.split_once('_') else {
|
||||||
bx.sess().fatal("Atomic compare-exchange intrinsic missing failure memory ordering");
|
bx.sess().emit_fatal(errors::AtomicCompareExchange);
|
||||||
};
|
};
|
||||||
let ty = substs.type_at(0);
|
let ty = substs.type_at(0);
|
||||||
if int_type_width_signed(ty, bx.tcx()).is_some() || ty.is_unsafe_ptr() {
|
if int_type_width_signed(ty, bx.tcx()).is_some() || ty.is_unsafe_ptr() {
|
||||||
@ -529,7 +489,7 @@ pub fn codegen_intrinsic_call(
|
|||||||
"min" => AtomicRmwBinOp::AtomicMin,
|
"min" => AtomicRmwBinOp::AtomicMin,
|
||||||
"umax" => AtomicRmwBinOp::AtomicUMax,
|
"umax" => AtomicRmwBinOp::AtomicUMax,
|
||||||
"umin" => AtomicRmwBinOp::AtomicUMin,
|
"umin" => AtomicRmwBinOp::AtomicUMin,
|
||||||
_ => bx.sess().fatal("unknown atomic operation"),
|
_ => bx.sess().emit_fatal(errors::UnknownAtomicOperation),
|
||||||
};
|
};
|
||||||
|
|
||||||
let ty = substs.type_at(0);
|
let ty = substs.type_at(0);
|
||||||
|
@ -192,3 +192,102 @@ codegen_ssa_unknown_archive_kind =
|
|||||||
Don't know how to build archive of type: {$kind}
|
Don't know how to build archive of type: {$kind}
|
||||||
|
|
||||||
codegen_ssa_expected_used_symbol = expected `used`, `used(compiler)` or `used(linker)`
|
codegen_ssa_expected_used_symbol = expected `used`, `used(compiler)` or `used(linker)`
|
||||||
|
|
||||||
|
codegen_ssa_multiple_main_functions = entry symbol `main` declared multiple times
|
||||||
|
.help = did you use `#[no_mangle]` on `fn main`? Use `#[start]` instead
|
||||||
|
|
||||||
|
codegen_ssa_metadata_object_file_write = error writing metadata object file: {$error}
|
||||||
|
|
||||||
|
codegen_ssa_invalid_windows_subsystem = invalid windows subsystem `{$subsystem}`, only `windows` and `console` are allowed
|
||||||
|
|
||||||
|
codegen_ssa_erroneous_constant = erroneous constant encountered
|
||||||
|
|
||||||
|
codegen_ssa_shuffle_indices_evaluation = could not evaluate shuffle_indices at compile time
|
||||||
|
|
||||||
|
codegen_ssa_missing_memory_ordering = Atomic intrinsic missing memory ordering
|
||||||
|
|
||||||
|
codegen_ssa_unknown_atomic_ordering = unknown ordering in atomic intrinsic
|
||||||
|
|
||||||
|
codegen_ssa_atomic_compare_exchange = Atomic compare-exchange intrinsic missing failure memory ordering
|
||||||
|
|
||||||
|
codegen_ssa_unknown_atomic_operation = unknown atomic operation
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_basic_integer_type = invalid monomorphization of `{$name}` intrinsic: expected basic integer type, found `{$ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_basic_float_type = invalid monomorphization of `{$name}` intrinsic: expected basic float type, found `{$ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_float_to_int_unchecked = invalid monomorphization of `float_to_int_unchecked` intrinsic: expected basic float type, found `{$ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_floating_point_vector = invalid monomorphization of `{$name}` intrinsic: unsupported element type `{$f_ty}` of floating-point vector `{$in_ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_floating_point_type = invalid monomorphization of `{$name}` intrinsic: `{$in_ty}` is not a floating-point type
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_unrecognized_intrinsic = invalid monomorphization of `{$name}` intrinsic: unrecognized intrinsic `{$name}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_simd_argument = invalid monomorphization of `{$name}` intrinsic: expected SIMD argument type, found non-SIMD `{$ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_simd_input = invalid monomorphization of `{$name}` intrinsic: expected SIMD input type, found non-SIMD `{$ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_simd_first = invalid monomorphization of `{$name}` intrinsic: expected SIMD first type, found non-SIMD `{$ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_simd_second = invalid monomorphization of `{$name}` intrinsic: expected SIMD second type, found non-SIMD `{$ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_simd_third = invalid monomorphization of `{$name}` intrinsic: expected SIMD third type, found non-SIMD `{$ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_simd_return = invalid monomorphization of `{$name}` intrinsic: expected SIMD return type, found non-SIMD `{$ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_invalid_bitmask = invalid monomorphization of `{$name}` intrinsic: invalid bitmask `{$mask_ty}`, expected `u{$expected_int_bits}` or `[u8; {$expected_bytes}]`
|
||||||
|
|
||||||
|
codegen_ssa_polymorphic_constant_too_generic = codegen encountered polymorphic constant: TooGeneric
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_return_length_input_type = invalid monomorphization of `{$name}` intrinsic: expected return type with length {$in_len} (same as input type `{$in_ty}`), found `{$ret_ty}` with length {$out_len}
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_second_argument_length = invalid monomorphization of `{$name}` intrinsic: expected second argument with length {$in_len} (same as input type `{$in_ty}`), found `{$arg_ty}` with length {$out_len}
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_third_argument_length = invalid monomorphization of `{$name}` intrinsic: expected third argument with length {$in_len} (same as input type `{$in_ty}`), found `{$arg_ty}` with length {$out_len}
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_return_integer_type = invalid monomorphization of `{$name}` intrinsic: expected return type with integer elements, found `{$ret_ty}` with non-integer `{$out_ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_simd_shuffle = invalid monomorphization of `{$name}` intrinsic: simd_shuffle index must be an array of `u32`, got `{$ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_return_length = invalid monomorphization of `{$name}` intrinsic: expected return type of length {$in_len}, found `{$ret_ty}` with length {$out_len}
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_return_element = invalid monomorphization of `{$name}` intrinsic: expected return element type `{$in_elem}` (element of input `{$in_ty}`), found `{$ret_ty}` with element type `{$out_ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_shuffle_index_not_constant = invalid monomorphization of `{$name}` intrinsic: shuffle index #{$arg_idx} is not a constant
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_shuffle_index_out_of_bounds = invalid monomorphization of `{$name}` intrinsic: shuffle index #{$arg_idx} is out of bounds (limit {$total_len})
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_inserted_type = invalid monomorphization of `{$name}` intrinsic: expected inserted type `{$in_elem}` (element of input `{$in_ty}`), found `{$out_ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_return_type = invalid monomorphization of `{$name}` intrinsic: expected return type `{$in_elem}` (element of input `{$in_ty}`), found `{$ret_ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_expected_return_type = invalid monomorphization of `{$name}` intrinsic: expected return type `{$in_ty}`, found `{$ret_ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_mismatched_lengths = invalid monomorphization of `{$name}` intrinsic: mismatched lengths: mask length `{$m_len}` != other vector length `{$v_len}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_mask_type = invalid monomorphization of `{$name}` intrinsic: mask element type is `{$ty}`, expected `i_`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_vector_argument = invalid monomorphization of `{$name}` intrinsic: vector argument `{$in_ty}`'s element type `{$in_elem}`, expected integer element type
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_cannot_return = invalid monomorphization of `{$name}` intrinsic: cannot return `{$ret_ty}`, expected `u{$expected_int_bits}` or `[u8; {$expected_bytes}]`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_expected_element_type = invalid monomorphization of `{$name}` intrinsic: expected element type `{$expected_element}` of second argument `{$second_arg}` to be a pointer to the element type `{$in_elem}` of the first argument `{$in_ty}`, found `{$expected_element}` != `{$mutability} {$in_elem}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_third_arg_element_type = invalid monomorphization of `{$name}` intrinsic: expected element type `{$expected_element}` of third argument `{$third_arg}` to be a signed integer type
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_unsupported_symbol_of_size = invalid monomorphization of `{$name}` intrinsic: unsupported {$symbol} from `{$in_ty}` with element `{$in_elem}` of size `{$size}` to `{$ret_ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_unsupported_symbol = invalid monomorphization of `{$name}` intrinsic: unsupported {$symbol} from `{$in_ty}` with element `{$in_elem}` to `{$ret_ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_cast_fat_pointer = invalid monomorphization of `{$name}` intrinsic: cannot cast fat pointer `{$ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_expected_pointer = invalid monomorphization of `{$name}` intrinsic: expected pointer, got `{$ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_expected_usize = invalid monomorphization of `{$name}` intrinsic: expected `usize`, got `{$ty}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_unsupported_cast = invalid monomorphization of `{$name}` intrinsic: unsupported cast from `{$in_ty}` with element `{$in_elem}` to `{$ret_ty}` with element `{$out_elem}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_unsupported_operation = invalid monomorphization of `{$name}` intrinsic: unsupported operation on `{$in_ty}` with element `{$in_elem}`
|
||||||
|
|
||||||
|
codegen_ssa_invalid_monomorphization_expected_vector_element_type = invalid monomorphization of `{$name}` intrinsic: expected element type `{$expected_element}` of vector type `{$vector_type}` to be a signed or unsigned integer type
|
||||||
|
@ -17,6 +17,7 @@ rustc_data_structures = { path = "../rustc_data_structures" }
|
|||||||
rustc_target = { path = "../rustc_target" }
|
rustc_target = { path = "../rustc_target" }
|
||||||
rustc_hir = { path = "../rustc_hir" }
|
rustc_hir = { path = "../rustc_hir" }
|
||||||
rustc_lint_defs = { path = "../rustc_lint_defs" }
|
rustc_lint_defs = { path = "../rustc_lint_defs" }
|
||||||
|
rustc_type_ir = { path = "../rustc_type_ir" }
|
||||||
unicode-width = "0.1.4"
|
unicode-width = "0.1.4"
|
||||||
termcolor = "1.0"
|
termcolor = "1.0"
|
||||||
annotate-snippets = "0.9"
|
annotate-snippets = "0.9"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use crate::diagnostic::IntoDiagnosticArg;
|
use crate::diagnostic::IntoDiagnosticArg;
|
||||||
use crate::{
|
use crate::{
|
||||||
Diagnostic, DiagnosticId, DiagnosticMessage, DiagnosticStyledString, ErrorGuaranteed,
|
Diagnostic, DiagnosticId, DiagnosticMessage, DiagnosticStyledString, ErrorGuaranteed,
|
||||||
SubdiagnosticMessage,
|
ExplicitBug, SubdiagnosticMessage,
|
||||||
};
|
};
|
||||||
use crate::{Handler, Level, MultiSpan, StashKey};
|
use crate::{Handler, Level, MultiSpan, StashKey};
|
||||||
use rustc_lint_defs::Applicability;
|
use rustc_lint_defs::Applicability;
|
||||||
@ -12,6 +12,7 @@
|
|||||||
use std::fmt::{self, Debug};
|
use std::fmt::{self, Debug};
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
|
use std::panic;
|
||||||
use std::thread::panicking;
|
use std::thread::panicking;
|
||||||
|
|
||||||
/// Trait implemented by error types. This should not be implemented manually. Instead, use
|
/// Trait implemented by error types. This should not be implemented manually. Instead, use
|
||||||
@ -308,6 +309,58 @@ fn make_diagnostic_builder(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Marker type which enables implementation of `create_bug` and `emit_bug` functions for
|
||||||
|
/// bug struct diagnostics.
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
pub struct Bug;
|
||||||
|
|
||||||
|
impl<'a> DiagnosticBuilder<'a, Bug> {
|
||||||
|
/// Convenience function for internal use, clients should use one of the
|
||||||
|
/// `struct_*` methods on [`Handler`].
|
||||||
|
#[track_caller]
|
||||||
|
pub(crate) fn new_bug(handler: &'a Handler, message: impl Into<DiagnosticMessage>) -> Self {
|
||||||
|
let diagnostic = Diagnostic::new_with_code(Level::Bug, None, message);
|
||||||
|
Self::new_diagnostic_bug(handler, diagnostic)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates a new `DiagnosticBuilder` with an already constructed
|
||||||
|
/// diagnostic.
|
||||||
|
pub(crate) fn new_diagnostic_bug(handler: &'a Handler, diagnostic: Diagnostic) -> Self {
|
||||||
|
debug!("Created new diagnostic bug");
|
||||||
|
Self {
|
||||||
|
inner: DiagnosticBuilderInner {
|
||||||
|
state: DiagnosticBuilderState::Emittable(handler),
|
||||||
|
diagnostic: Box::new(diagnostic),
|
||||||
|
},
|
||||||
|
_marker: PhantomData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl EmissionGuarantee for Bug {
|
||||||
|
fn diagnostic_builder_emit_producing_guarantee(db: &mut DiagnosticBuilder<'_, Self>) -> Self {
|
||||||
|
match db.inner.state {
|
||||||
|
// First `.emit()` call, the `&Handler` is still available.
|
||||||
|
DiagnosticBuilderState::Emittable(handler) => {
|
||||||
|
db.inner.state = DiagnosticBuilderState::AlreadyEmittedOrDuringCancellation;
|
||||||
|
|
||||||
|
handler.emit_diagnostic(&mut db.inner.diagnostic);
|
||||||
|
}
|
||||||
|
// `.emit()` was previously called, disallowed from repeating it.
|
||||||
|
DiagnosticBuilderState::AlreadyEmittedOrDuringCancellation => {}
|
||||||
|
}
|
||||||
|
// Then panic. No need to return the marker type.
|
||||||
|
panic::panic_any(ExplicitBug);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_diagnostic_builder(
|
||||||
|
handler: &Handler,
|
||||||
|
msg: impl Into<DiagnosticMessage>,
|
||||||
|
) -> DiagnosticBuilder<'_, Self> {
|
||||||
|
DiagnosticBuilder::new_bug(handler, msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a> DiagnosticBuilder<'a, !> {
|
impl<'a> DiagnosticBuilder<'a, !> {
|
||||||
/// Convenience function for internal use, clients should use one of the
|
/// Convenience function for internal use, clients should use one of the
|
||||||
/// `struct_*` methods on [`Handler`].
|
/// `struct_*` methods on [`Handler`].
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
use rustc_span::symbol::{Ident, MacroRulesNormalizedIdent, Symbol};
|
use rustc_span::symbol::{Ident, MacroRulesNormalizedIdent, Symbol};
|
||||||
use rustc_target::abi::TargetDataLayoutErrors;
|
use rustc_target::abi::TargetDataLayoutErrors;
|
||||||
use rustc_target::spec::{PanicStrategy, SplitDebuginfo, StackProtector, TargetTriple};
|
use rustc_target::spec::{PanicStrategy, SplitDebuginfo, StackProtector, TargetTriple};
|
||||||
|
use rustc_type_ir as type_ir;
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::num::ParseIntError;
|
use std::num::ParseIntError;
|
||||||
@ -170,6 +171,12 @@ fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl IntoDiagnosticArg for type_ir::FloatTy {
|
||||||
|
fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
|
||||||
|
DiagnosticArgValue::Str(Cow::Borrowed(self.name_str()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl IntoDiagnosticArg for Level {
|
impl IntoDiagnosticArg for Level {
|
||||||
fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
|
fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
|
||||||
DiagnosticArgValue::Str(Cow::Borrowed(match self {
|
DiagnosticArgValue::Str(Cow::Borrowed(match self {
|
||||||
|
@ -1133,6 +1133,20 @@ pub fn emit_fatal<'a>(&'a self, fatal: impl IntoDiagnostic<'a, !>) -> ! {
|
|||||||
self.create_fatal(fatal).emit()
|
self.create_fatal(fatal).emit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn create_bug<'a>(
|
||||||
|
&'a self,
|
||||||
|
bug: impl IntoDiagnostic<'a, diagnostic_builder::Bug>,
|
||||||
|
) -> DiagnosticBuilder<'a, diagnostic_builder::Bug> {
|
||||||
|
bug.into_diagnostic(self)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn emit_bug<'a>(
|
||||||
|
&'a self,
|
||||||
|
bug: impl IntoDiagnostic<'a, diagnostic_builder::Bug>,
|
||||||
|
) -> diagnostic_builder::Bug {
|
||||||
|
self.create_bug(bug).emit()
|
||||||
|
}
|
||||||
|
|
||||||
fn emit_diag_at_span(
|
fn emit_diag_at_span(
|
||||||
&self,
|
&self,
|
||||||
mut diag: Diagnostic,
|
mut diag: Diagnostic,
|
||||||
|
Loading…
Reference in New Issue
Block a user