From 39b8b2b623087fa643daeed424bd2fa79076f463 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Sat, 14 Nov 2020 19:16:43 +0100 Subject: [PATCH] Remove StructRet arg attr It is applied exactly when the return value has an indirect pass mode. Except for InReg on x86 fastcall, arg attrs are now only used for optimization purposes and thus are fine to ignore. --- compiler/rustc_codegen_llvm/src/abi.rs | 9 ++++++--- compiler/rustc_middle/src/ty/layout.rs | 4 ---- compiler/rustc_target/src/abi/call/mod.rs | 5 ----- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/compiler/rustc_codegen_llvm/src/abi.rs b/compiler/rustc_codegen_llvm/src/abi.rs index e988fdb9d5c5..bb152104d64d 100644 --- a/compiler/rustc_codegen_llvm/src/abi.rs +++ b/compiler/rustc_codegen_llvm/src/abi.rs @@ -36,7 +36,7 @@ fn for_each_kind(&self, mut f: F) where F: FnMut(llvm::Attribute), { - for_each_kind!(self, f, NoAlias, NoCapture, NonNull, ReadOnly, StructRet, InReg) + for_each_kind!(self, f, NoAlias, NoCapture, NonNull, ReadOnly, InReg) } } @@ -429,7 +429,8 @@ fn apply_attrs_llfn(&self, cx: &CodegenCx<'ll, 'tcx>, llfn: &'ll Value) { } PassMode::Indirect { ref attrs, extra_attrs: _, on_stack } => { assert!(!on_stack); - apply(attrs); + let i = apply(attrs); + llvm::Attribute::StructRet.apply_llfn(llvm::AttributePlace::Argument(i), llfn); } _ => {} } @@ -484,7 +485,9 @@ fn apply_attrs_callsite(&self, bx: &mut Builder<'a, 'll, 'tcx>, callsite: &'ll V } PassMode::Indirect { ref attrs, extra_attrs: _, on_stack } => { assert!(!on_stack); - apply(attrs); + let i = apply(attrs); + llvm::Attribute::StructRet + .apply_callsite(llvm::AttributePlace::Argument(i), callsite); } _ => {} } diff --git a/compiler/rustc_middle/src/ty/layout.rs b/compiler/rustc_middle/src/ty/layout.rs index 24d2ee6ec34a..666160ba4976 100644 --- a/compiler/rustc_middle/src/ty/layout.rs +++ b/compiler/rustc_middle/src/ty/layout.rs @@ -2801,10 +2801,6 @@ fn adjust_for_abi(&mut self, cx: &C, abi: SpecAbi) { for arg in &mut self.args { fixup(arg, false); } - if let PassMode::Indirect { ref mut attrs, extra_attrs: _, on_stack: _ } = self.ret.mode - { - attrs.set(ArgAttribute::StructRet); - } return; } diff --git a/compiler/rustc_target/src/abi/call/mod.rs b/compiler/rustc_target/src/abi/call/mod.rs index 0931e8a37714..91b004c41d95 100644 --- a/compiler/rustc_target/src/abi/call/mod.rs +++ b/compiler/rustc_target/src/abi/call/mod.rs @@ -59,7 +59,6 @@ pub struct ArgAttribute: u16 { const NoCapture = 1 << 2; const NonNull = 1 << 3; const ReadOnly = 1 << 4; - const StructRet = 1 << 6; const InReg = 1 << 8; } } @@ -619,10 +618,6 @@ pub fn adjust_for_cabi(&mut self, cx: &C, abi: spec::abi::Abi) -> Result<(), a => return Err(format!("unrecognized arch \"{}\" in target specification", a)), } - if let PassMode::Indirect { ref mut attrs, extra_attrs: _, on_stack: _ } = self.ret.mode { - attrs.set(ArgAttribute::StructRet); - } - Ok(()) } }