@@ -4,6 +4,7 @@ use rustc_abi::{Align, BackendRepr, ExternAbi, HasDataLayout, Reg, Size, Wrappin
44use rustc_ast as ast;
55use rustc_ast:: { InlineAsmOptions , InlineAsmTemplatePiece } ;
66use rustc_data_structures:: packed:: Pu128 ;
7+ use rustc_hir:: Attribute ;
78use rustc_hir:: lang_items:: LangItem ;
89use rustc_lint_defs:: builtin:: TAIL_CALL_TRACK_CALLER ;
910use rustc_middle:: mir:: { self , AssertKind , InlineAsmMacro , SwitchTargets , UnwindTerminateReason } ;
@@ -134,6 +135,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
134135 bx : & mut Bx ,
135136 target : mir:: BasicBlock ,
136137 mergeable_succ : bool ,
138+ attributes : & [ Attribute ] ,
137139 ) -> MergingSucc {
138140 let ( needs_landing_pad, is_cleanupret) = self . llbb_characteristics ( fx, target) ;
139141 if mergeable_succ && !needs_landing_pad && !is_cleanupret {
@@ -149,7 +151,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
149151 // to a trampoline.
150152 bx. cleanup_ret ( self . funclet ( fx) . unwrap ( ) , Some ( lltarget) ) ;
151153 } else {
152- bx. br ( lltarget) ;
154+ bx. br_with_attrs ( lltarget, attributes ) ;
153155 }
154156 MergingSucc :: False
155157 }
@@ -284,7 +286,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
284286 bx. lifetime_end ( tmp, size) ;
285287 }
286288 fx. store_return ( bx, ret_dest, & fn_abi. ret , llret) ;
287- self . funclet_br ( fx, bx, target, mergeable_succ)
289+ self . funclet_br ( fx, bx, target, mergeable_succ, & [ ] )
288290 } else {
289291 bx. unreachable ( ) ;
290292 MergingSucc :: False
@@ -352,7 +354,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
352354 bx. codegen_inline_asm ( template, operands, options, line_spans, instance, None , None ) ;
353355
354356 if let Some ( target) = destination {
355- self . funclet_br ( fx, bx, target, mergeable_succ)
357+ self . funclet_br ( fx, bx, target, mergeable_succ, & [ ] )
356358 } else {
357359 bx. unreachable ( ) ;
358360 MergingSucc :: False
@@ -607,7 +609,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
607609
608610 if let ty:: InstanceKind :: DropGlue ( _, None ) = drop_fn. def {
609611 // we don't actually need to drop anything.
610- return helper. funclet_br ( self , bx, target, mergeable_succ) ;
612+ return helper. funclet_br ( self , bx, target, mergeable_succ, & [ ] ) ;
611613 }
612614
613615 let place = self . codegen_place ( bx, location. as_ref ( ) ) ;
@@ -716,7 +718,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
716718
717719 // Don't codegen the panic block if success if known.
718720 if const_cond == Some ( expected) {
719- return helper. funclet_br ( self , bx, target, mergeable_succ) ;
721+ return helper. funclet_br ( self , bx, target, mergeable_succ, & [ ] ) ;
720722 }
721723
722724 // Because we're branching to a panic block (either a `#[cold]` one
@@ -850,7 +852,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
850852 if is_valid {
851853 // a NOP
852854 let target = target. unwrap ( ) ;
853- return Some ( helper. funclet_br ( self , bx, target, mergeable_succ) ) ;
855+ return Some ( helper. funclet_br ( self , bx, target, mergeable_succ, & [ ] ) ) ;
854856 }
855857
856858 let layout = bx. layout_of ( ty) ;
@@ -924,7 +926,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
924926 ty:: InstanceKind :: DropGlue ( _, None ) => {
925927 // Empty drop glue; a no-op.
926928 let target = target. unwrap ( ) ;
927- return helper. funclet_br ( self , bx, target, mergeable_succ) ;
929+ return helper. funclet_br ( self , bx, target, mergeable_succ, & [ ] ) ;
928930 }
929931 ty:: InstanceKind :: Intrinsic ( def_id) => {
930932 let intrinsic = bx. tcx ( ) . intrinsic ( def_id) . unwrap ( ) ;
@@ -993,7 +995,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
993995 }
994996
995997 return if let Some ( target) = target {
996- helper. funclet_br ( self , bx, target, mergeable_succ)
998+ helper. funclet_br ( self , bx, target, mergeable_succ, & [ ] )
997999 } else {
9981000 bx. unreachable ( ) ;
9991001 MergingSucc :: False
@@ -1086,7 +1088,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
10861088 & ArgAbi { layout : result_layout, mode : PassMode :: Direct ( ArgAttributes :: new ( ) ) } ,
10871089 llret,
10881090 ) ;
1089- return helper. funclet_br ( self , bx, target, mergeable_succ) ;
1091+ return helper. funclet_br ( self , bx, target, mergeable_succ, & [ ] ) ;
10901092 } else {
10911093 bx. unreachable ( ) ;
10921094 return MergingSucc :: False ;
@@ -1530,7 +1532,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
15301532 }
15311533
15321534 mir:: TerminatorKind :: Goto { target } => {
1533- helper. funclet_br ( self , bx, target, mergeable_succ ( ) )
1535+ helper. funclet_br ( self , bx, target, mergeable_succ ( ) , & terminator . attributes )
15341536 }
15351537
15361538 mir:: TerminatorKind :: SwitchInt { ref discr, ref targets } => {
0 commit comments