diff options
| author | Camille GILLOT <gillot.camille@gmail.com> | 2022-02-27 16:09:52 +0100 |
|---|---|---|
| committer | Camille GILLOT <gillot.camille@gmail.com> | 2022-02-27 19:05:56 +0100 |
| commit | e77e4fcf898ca4b2aa2041d2cbac200ed0f11b5b (patch) | |
| tree | 9994c3a36e798d935142a9dbee2c84c872be4b0c /compiler | |
| parent | 6cbc6c35e4b0c948114619a1c883a75b731d32c5 (diff) | |
| download | rust-e77e4fcf898ca4b2aa2041d2cbac200ed0f11b5b.tar.gz rust-e77e4fcf898ca4b2aa2041d2cbac200ed0f11b5b.zip | |
Only create a single expansion for each inline integration.
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_errors/src/emitter.rs | 4 | ||||
| -rw-r--r-- | compiler/rustc_mir_transform/src/inline.rs | 24 | ||||
| -rw-r--r-- | compiler/rustc_span/src/hygiene.rs | 21 |
3 files changed, 24 insertions, 25 deletions
diff --git a/compiler/rustc_errors/src/emitter.rs b/compiler/rustc_errors/src/emitter.rs index bfed9211cec..52c44231d8f 100644 --- a/compiler/rustc_errors/src/emitter.rs +++ b/compiler/rustc_errors/src/emitter.rs @@ -408,8 +408,8 @@ pub trait Emitter { "this derive macro expansion".into() } ExpnKind::Macro(MacroKind::Bang, _) => "this macro invocation".into(), - ExpnKind::Inlined => "the inlined copy of this code".into(), - ExpnKind::Root => "in the crate root".into(), + ExpnKind::Inlined => "this inlined function call".into(), + ExpnKind::Root => "the crate root".into(), ExpnKind::AstPass(kind) => kind.descr().into(), ExpnKind::Desugaring(kind) => { format!("this {} desugaring", kind.descr()).into() diff --git a/compiler/rustc_mir_transform/src/inline.rs b/compiler/rustc_mir_transform/src/inline.rs index 6078abcbb8f..cbd7c7964d7 100644 --- a/compiler/rustc_mir_transform/src/inline.rs +++ b/compiler/rustc_mir_transform/src/inline.rs @@ -10,7 +10,7 @@ use rustc_middle::mir::*; use rustc_middle::traits::ObligationCause; use rustc_middle::ty::subst::Subst; use rustc_middle::ty::{self, ConstKind, Instance, InstanceDef, ParamEnv, Ty, TyCtxt}; -use rustc_span::{hygiene::ExpnKind, ExpnData, Span}; +use rustc_span::{hygiene::ExpnKind, ExpnData, LocalExpnId, Span}; use rustc_target::spec::abi::Abi; use super::simplify::{remove_dead_blocks, CfgSimplifier}; @@ -543,6 +543,16 @@ impl<'tcx> Inliner<'tcx> { // Copy the arguments if needed. let args: Vec<_> = self.make_call_args(args, &callsite, caller_body, &callee_body); + let mut expn_data = ExpnData::default( + ExpnKind::Inlined, + callsite.source_info.span, + self.tcx.sess.edition(), + None, + None, + ); + expn_data.def_site = callee_body.span; + let expn_data = + LocalExpnId::fresh(expn_data, self.tcx.create_stable_hashing_context()); let mut integrator = Integrator { args: &args, new_locals: Local::new(caller_body.local_decls.len()).., @@ -553,8 +563,7 @@ impl<'tcx> Inliner<'tcx> { cleanup_block: cleanup, in_cleanup_block: false, tcx: self.tcx, - callsite_span: callsite.source_info.span, - body_span: callee_body.span, + expn_data, always_live_locals: BitSet::new_filled(callee_body.local_decls.len()), }; @@ -787,8 +796,7 @@ struct Integrator<'a, 'tcx> { cleanup_block: Option<BasicBlock>, in_cleanup_block: bool, tcx: TyCtxt<'tcx>, - callsite_span: Span, - body_span: Span, + expn_data: LocalExpnId, always_live_locals: BitSet<Local>, } @@ -835,12 +843,8 @@ impl<'tcx> MutVisitor<'tcx> for Integrator<'_, 'tcx> { } fn visit_span(&mut self, span: &mut Span) { - let mut expn_data = - ExpnData::default(ExpnKind::Inlined, *span, self.tcx.sess.edition(), None, None); - expn_data.def_site = self.body_span; // Make sure that all spans track the fact that they were inlined. - *span = - self.callsite_span.fresh_expansion(expn_data, self.tcx.create_stable_hashing_context()); + *span = span.fresh_expansion(self.expn_data); } fn visit_place(&mut self, place: &mut Place<'tcx>, context: PlaceContext, location: Location) { diff --git a/compiler/rustc_span/src/hygiene.rs b/compiler/rustc_span/src/hygiene.rs index 8265eb23c3d..5fae46d5fd8 100644 --- a/compiler/rustc_span/src/hygiene.rs +++ b/compiler/rustc_span/src/hygiene.rs @@ -874,19 +874,13 @@ impl Span { /// other compiler-generated code to set per-span properties like allowed unstable features. /// The returned span belongs to the created expansion and has the new properties, /// but its location is inherited from the current span. - pub fn fresh_expansion(self, expn_data: ExpnData, ctx: impl HashStableContext) -> Span { - self.fresh_expansion_with_transparency(expn_data, Transparency::Transparent, ctx) - } - - pub fn fresh_expansion_with_transparency( - self, - expn_data: ExpnData, - transparency: Transparency, - ctx: impl HashStableContext, - ) -> Span { - let expn_id = LocalExpnId::fresh(expn_data, ctx).to_expn_id(); + pub fn fresh_expansion(self, expn_id: LocalExpnId) -> Span { HygieneData::with(|data| { - self.with_ctxt(data.apply_mark(SyntaxContext::root(), expn_id, transparency)) + self.with_ctxt(data.apply_mark( + SyntaxContext::root(), + expn_id.to_expn_id(), + Transparency::Transparent, + )) }) } @@ -903,7 +897,8 @@ impl Span { allow_internal_unstable, ..ExpnData::default(ExpnKind::Desugaring(reason), self, edition, None, None) }; - self.fresh_expansion(expn_data, ctx) + let expn_id = LocalExpnId::fresh(expn_data, ctx); + self.fresh_expansion(expn_id) } } |
