about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFolkert <folkert@folkertdev.nl>2024-07-18 12:08:23 +0200
committerFolkert <folkert@folkertdev.nl>2024-07-18 12:42:43 +0200
commit6b6b8422bafe310b911832119cbcf4d93f46871e (patch)
tree4c31edf258c70a89f9d35bdda687509fc0420a54
parent7b6373496107807327094ec990d317b98e34fd63 (diff)
downloadrust-6b6b8422bafe310b911832119cbcf4d93f46871e.tar.gz
rust-6b6b8422bafe310b911832119cbcf4d93f46871e.zip
remove cmse validation from rustc_codegen_ssa
it was moved to hir_analysis in the previous commit
-rw-r--r--compiler/rustc_codegen_ssa/messages.ftl12
-rw-r--r--compiler/rustc_codegen_ssa/src/errors.rs22
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/block.rs4
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/cmse.rs72
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/mod.rs1
-rw-r--r--compiler/rustc_hir_analysis/src/check/check.rs7
-rw-r--r--compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs6
7 files changed, 4 insertions, 120 deletions
diff --git a/compiler/rustc_codegen_ssa/messages.ftl b/compiler/rustc_codegen_ssa/messages.ftl
index 0aee5e16a53..000fe2e3ce0 100644
--- a/compiler/rustc_codegen_ssa/messages.ftl
+++ b/compiler/rustc_codegen_ssa/messages.ftl
@@ -16,18 +16,6 @@ codegen_ssa_cgu_not_recorded =
 
 codegen_ssa_check_installed_visual_studio = please ensure that Visual Studio 2017 or later, or Build Tools for Visual Studio were installed with the Visual C++ option.
 
-codegen_ssa_cmse_call_inputs_stack_spill =
-    arguments for `C-cmse-nonsecure-call` function too large to pass via registers
-    .label = this function uses the `C-cmse-nonsecure-call` ABI
-    .call = but its arguments don't fit in the available registers
-    .note = functions with the `C-cmse-nonsecure-call` ABI must pass all their arguments via the 4 32-bit available argument registers
-
-codegen_ssa_cmse_call_output_stack_spill =
-    return value of `C-cmse-nonsecure-call` function too large to pass via registers
-    .label = this function uses the `C-cmse-nonsecure-call` ABI
-    .call = but its return value doesn't fit in the available registers
-    .note = functions with the `C-cmse-nonsecure-call` ABI must pass their result via the available return registers
-
 codegen_ssa_compiler_builtins_cannot_call =
     `compiler_builtins` cannot call functions through upstream monomorphizations; encountered invalid call from `{$caller}` to `{$callee}`
 
diff --git a/compiler/rustc_codegen_ssa/src/errors.rs b/compiler/rustc_codegen_ssa/src/errors.rs
index af7835633cf..e9d31db9254 100644
--- a/compiler/rustc_codegen_ssa/src/errors.rs
+++ b/compiler/rustc_codegen_ssa/src/errors.rs
@@ -1033,25 +1033,3 @@ pub struct CompilerBuiltinsCannotCall {
     pub caller: String,
     pub callee: String,
 }
-
-#[derive(Diagnostic)]
-#[diag(codegen_ssa_cmse_call_inputs_stack_spill, code = E0798)]
-#[note]
-pub struct CmseCallInputsStackSpill {
-    #[primary_span]
-    #[label(codegen_ssa_call)]
-    pub call_site_span: Span,
-    #[label]
-    pub function_definition_span: Span,
-}
-
-#[derive(Diagnostic)]
-#[diag(codegen_ssa_cmse_call_output_stack_spill, code = E0798)]
-#[note]
-pub struct CmseCallOutputStackSpill {
-    #[primary_span]
-    #[label(codegen_ssa_call)]
-    pub call_site_span: Span,
-    #[label]
-    pub function_definition_span: Span,
-}
diff --git a/compiler/rustc_codegen_ssa/src/mir/block.rs b/compiler/rustc_codegen_ssa/src/mir/block.rs
index 24d3b8ad264..6a5525dc2b3 100644
--- a/compiler/rustc_codegen_ssa/src/mir/block.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/block.rs
@@ -7,7 +7,6 @@ use crate::base;
 use crate::common::{self, IntPredicate};
 use crate::errors::CompilerBuiltinsCannotCall;
 use crate::meth;
-use crate::mir::cmse;
 use crate::traits::*;
 use crate::MemFlags;
 
@@ -870,9 +869,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
         let sig = callee.layout.ty.fn_sig(bx.tcx());
         let abi = sig.abi();
 
-        // emit errors if cmse ABI conditions are violated
-        cmse::validate_cmse_abi(bx, &sig.skip_binder(), span, func.span(self.mir));
-
         let extra_args = &args[sig.inputs().skip_binder().len()..];
         let extra_args = bx.tcx().mk_type_list_from_iter(extra_args.iter().map(|op_arg| {
             let op_ty = op_arg.node.ty(self.mir, bx.tcx());
diff --git a/compiler/rustc_codegen_ssa/src/mir/cmse.rs b/compiler/rustc_codegen_ssa/src/mir/cmse.rs
deleted file mode 100644
index d3583d79c00..00000000000
--- a/compiler/rustc_codegen_ssa/src/mir/cmse.rs
+++ /dev/null
@@ -1,72 +0,0 @@
-use rustc_middle::ty::FnSig;
-use rustc_span::Span;
-
-use crate::errors::{CmseCallInputsStackSpill, CmseCallOutputStackSpill};
-use crate::traits::BuilderMethods;
-
-/// Check conditions on inputs and outputs that the cmse ABIs impose: arguments and results MUST be
-/// returned via registers (i.e. MUST NOT spill to the stack). LLVM will also validate these
-/// conditions, but by checking them here rustc can emit nicer error messages.
-pub fn validate_cmse_abi<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
-    bx: &Bx,
-    fn_sig: &FnSig<'tcx>,
-    call_site_span: Span,
-    function_definition_span: Span,
-) {
-    if let rustc_target::spec::abi::Abi::CCmseNonSecureCall = fn_sig.abi {
-        if !has_valid_inputs(bx, fn_sig) {
-            let err = CmseCallInputsStackSpill { call_site_span, function_definition_span };
-            bx.tcx().dcx().emit_err(err);
-        }
-
-        if !has_valid_output(bx, fn_sig) {
-            let err = CmseCallOutputStackSpill { call_site_span, function_definition_span };
-            bx.tcx().dcx().emit_err(err);
-        }
-    }
-}
-
-/// Returns whether the inputs will fit into the available registers
-fn has_valid_inputs<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(bx: &Bx, fn_sig: &FnSig<'tcx>) -> bool {
-    let mut accum = 0u64;
-
-    for arg_def in fn_sig.inputs().iter() {
-        let layout = bx.layout_of(*arg_def);
-
-        let align = layout.layout.align().abi.bytes();
-        let size = layout.layout.size().bytes();
-
-        accum += size;
-        accum = accum.next_multiple_of(Ord::max(4, align));
-    }
-
-    // the available argument space is 16 bytes (4 32-bit registers) in total
-    let available_space = 16;
-
-    accum <= available_space
-}
-
-/// Returns whether the output will fit into the available registers
-fn has_valid_output<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(bx: &Bx, fn_sig: &FnSig<'tcx>) -> bool {
-    let mut ret_layout = bx.layout_of(fn_sig.output());
-
-    // unwrap any `repr(transparent)` wrappers
-    loop {
-        if ret_layout.is_transparent::<Bx>() {
-            match ret_layout.non_1zst_field(bx) {
-                None => break,
-                Some((_, layout)) => ret_layout = layout,
-            }
-        } else {
-            break;
-        }
-    }
-
-    // Fundamental types of size 8 can be passed via registers according to the ABI
-    let valid_2register_return_types = [bx.tcx().types.i64, bx.tcx().types.u64, bx.tcx().types.f64];
-
-    // A Composite Type larger than 4 bytes is stored in memory at an address
-    // passed as an extra argument when the function was called. That is not allowed
-    // for cmse_nonsecure_entry functions.
-    ret_layout.layout.size().bytes() <= 4 || valid_2register_return_types.contains(&ret_layout.ty)
-}
diff --git a/compiler/rustc_codegen_ssa/src/mir/mod.rs b/compiler/rustc_codegen_ssa/src/mir/mod.rs
index ec28def8b83..61f57c9030a 100644
--- a/compiler/rustc_codegen_ssa/src/mir/mod.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/mod.rs
@@ -16,7 +16,6 @@ use std::iter;
 
 mod analyze;
 mod block;
-mod cmse;
 pub mod constant;
 pub mod coverageinfo;
 pub mod debuginfo;
diff --git a/compiler/rustc_hir_analysis/src/check/check.rs b/compiler/rustc_hir_analysis/src/check/check.rs
index aa302e4c25f..bf8ef18c04f 100644
--- a/compiler/rustc_hir_analysis/src/check/check.rs
+++ b/compiler/rustc_hir_analysis/src/check/check.rs
@@ -1287,10 +1287,9 @@ pub(super) fn check_transparent<'tcx>(tcx: TyCtxt<'tcx>, adt: ty::AdtDef<'tcx>)
         (span, trivial, check_non_exhaustive(tcx, ty).break_value())
     });
 
-    let non_trivial_fields =
-        field_infos.clone().filter_map(
-            |(span, trivial, _non_exhaustive)| if !trivial { Some(span) } else { None },
-        );
+    let non_trivial_fields = field_infos
+        .clone()
+        .filter_map(|(span, trivial, _non_exhaustive)| if !trivial { Some(span) } else { None });
     let non_trivial_count = non_trivial_fields.clone().count();
     if non_trivial_count >= 2 {
         bad_non_zero_sized_fields(
diff --git a/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs b/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs
index 5a98e4d79bb..c118181780a 100644
--- a/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs
+++ b/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs
@@ -1749,11 +1749,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
                     generic_segments.iter().map(|GenericPathSegment(_, index)| index).collect();
                 let _ = self.prohibit_generic_args(
                     path.segments.iter().enumerate().filter_map(|(index, seg)| {
-                        if !indices.contains(&index) {
-                            Some(seg)
-                        } else {
-                            None
-                        }
+                        if !indices.contains(&index) { Some(seg) } else { None }
                     }),
                     GenericsArgsErrExtend::DefVariant,
                 );