From 6b6b8422bafe310b911832119cbcf4d93f46871e Mon Sep 17 00:00:00 2001 From: Folkert Date: Thu, 18 Jul 2024 12:08:23 +0200 Subject: [PATCH] remove cmse validation from rustc_codegen_ssa it was moved to hir_analysis in the previous commit --- compiler/rustc_codegen_ssa/messages.ftl | 12 ---- compiler/rustc_codegen_ssa/src/errors.rs | 22 ------ compiler/rustc_codegen_ssa/src/mir/block.rs | 4 -- compiler/rustc_codegen_ssa/src/mir/cmse.rs | 72 ------------------- compiler/rustc_codegen_ssa/src/mir/mod.rs | 1 - .../rustc_hir_analysis/src/check/check.rs | 7 +- .../src/hir_ty_lowering/mod.rs | 6 +- 7 files changed, 4 insertions(+), 120 deletions(-) delete mode 100644 compiler/rustc_codegen_ssa/src/mir/cmse.rs 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::() { - 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, );