summaryrefslogtreecommitdiff
path: root/compiler/rustc_codegen_cranelift
diff options
context:
space:
mode:
authorNilstrieb <48135649+Nilstrieb@users.noreply.github.com>2023-02-26 21:50:19 +0000
committerNilstrieb <48135649+Nilstrieb@users.noreply.github.com>2023-02-27 13:30:44 +0000
commit5f593da4e6976fe27f7cd31ce0fb9a9293b3a00b (patch)
tree72a1620a46caf8b13f65c543190f3481584082ba /compiler/rustc_codegen_cranelift
parent49b9cc5139dd4d11ef78dc08c1f9170de5b1ca39 (diff)
downloadrust-5f593da4e6976fe27f7cd31ce0fb9a9293b3a00b.tar.gz
Unify all validity check intrinsics
Also merges the inhabitedness check into the query to further unify the code paths.
Diffstat (limited to 'compiler/rustc_codegen_cranelift')
-rw-r--r--compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs80
1 files changed, 31 insertions, 49 deletions
diff --git a/compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs b/compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs
index f00e9321070..e74aabf2fcb 100644
--- a/compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs
+++ b/compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs
@@ -22,7 +22,7 @@ pub(crate) use cpuid::codegen_cpuid_call;
pub(crate) use llvm::codegen_llvm_intrinsic_call;
use rustc_middle::ty;
-use rustc_middle::ty::layout::{HasParamEnv, InitKind};
+use rustc_middle::ty::layout::{HasParamEnv, ValidityRequirement};
use rustc_middle::ty::print::with_no_trimmed_paths;
use rustc_middle::ty::subst::SubstsRef;
use rustc_span::symbol::{kw, sym, Symbol};
@@ -628,57 +628,39 @@ fn codegen_regular_intrinsic_call<'tcx>(
intrinsic_args!(fx, args => (); intrinsic);
let ty = substs.type_at(0);
- let layout = fx.layout_of(ty);
- if layout.abi.is_uninhabited() {
- with_no_trimmed_paths!({
- crate::base::codegen_panic_nounwind(
- fx,
- &format!("attempted to instantiate uninhabited type `{}`", layout.ty),
- source_info,
- )
- });
- return;
- }
- if intrinsic == sym::assert_zero_valid
- && !fx
- .tcx
- .check_validity_of_init((InitKind::Zero, fx.param_env().and(ty)))
- .expect("expected to have layout during codegen")
- {
- with_no_trimmed_paths!({
- crate::base::codegen_panic_nounwind(
- fx,
- &format!(
- "attempted to zero-initialize type `{}`, which is invalid",
- layout.ty
- ),
- source_info,
- );
- });
- return;
- }
+ let requirement = ValidityRequirement::from_intrinsic(intrinsic);
- if intrinsic == sym::assert_mem_uninitialized_valid
- && !fx
+ if let Some(requirement) = requirement {
+ let do_panic = !fx
.tcx
- .check_validity_of_init((
- InitKind::UninitMitigated0x01Fill,
- fx.param_env().and(ty),
- ))
- .expect("expected to have layout during codegen")
- {
- with_no_trimmed_paths!({
- crate::base::codegen_panic_nounwind(
- fx,
- &format!(
- "attempted to leave type `{}` uninitialized, which is invalid",
- layout.ty
- ),
- source_info,
- )
- });
- return;
+ .check_validity_requirement((requirement, fx.param_env().and(ty)))
+ .expect("expect to have layout during codegen");
+
+ if do_panic {
+ let layout = fx.layout_of(ty);
+
+ with_no_trimmed_paths!({
+ crate::base::codegen_panic_nounwind(
+ fx,
+ &if layout.abi.is_uninhabited() {
+ format!("attempted to instantiate uninhabited type `{}`", layout.ty)
+ } else if requirement == ValidityRequirement::Zero {
+ format!(
+ "attempted to zero-initialize type `{}`, which is invalid",
+ layout.ty
+ )
+ } else {
+ format!(
+ "attempted to leave type `{}` uninitialized, which is invalid",
+ layout.ty
+ )
+ },
+ source_info,
+ )
+ });
+ return;
+ }
}
}