@@ -42,8 +42,6 @@ pub(crate) fn codegen_inline_asm_terminator<'tcx>(
4242 options : InlineAsmOptions ,
4343 destination : Option < mir:: BasicBlock > ,
4444) {
45- // FIXME add .eh_frame unwind info directives
46-
4745 // Used by panic_abort on Windows, but uses a syntax which only happens to work with
4846 // asm!() by accident and breaks with the GNU assembler as well as global_asm!() for
4947 // the LLVM backend.
@@ -135,12 +133,33 @@ pub(crate) fn codegen_inline_asm_terminator<'tcx>(
135133 } )
136134 . collect :: < Vec < _ > > ( ) ;
137135
136+ codegen_inline_asm_inner ( fx, template, & operands, options) ;
137+
138+ match destination {
139+ Some ( destination) => {
140+ let destination_block = fx. get_block ( destination) ;
141+ fx. bcx . ins ( ) . jump ( destination_block, & [ ] ) ;
142+ }
143+ None => {
144+ fx. bcx . ins ( ) . trap ( TrapCode :: UnreachableCodeReached ) ;
145+ }
146+ }
147+ }
148+
149+ fn codegen_inline_asm_inner < ' tcx > (
150+ fx : & mut FunctionCx < ' _ , ' _ , ' tcx > ,
151+ template : & [ InlineAsmTemplatePiece ] ,
152+ operands : & [ CInlineAsmOperand < ' tcx > ] ,
153+ options : InlineAsmOptions ,
154+ ) {
155+ // FIXME add .eh_frame unwind info directives
156+
138157 let mut asm_gen = InlineAssemblyGenerator {
139158 tcx : fx. tcx ,
140159 arch : fx. tcx . sess . asm_arch . unwrap ( ) ,
141160 enclosing_def_id : fx. instance . def_id ( ) ,
142161 template,
143- operands : & operands ,
162+ operands,
144163 options,
145164 registers : Vec :: new ( ) ,
146165 stack_slots_clobber : Vec :: new ( ) ,
@@ -185,16 +204,6 @@ pub(crate) fn codegen_inline_asm_terminator<'tcx>(
185204 }
186205
187206 call_inline_asm ( fx, & asm_name, asm_gen. stack_slot_size , inputs, outputs) ;
188-
189- match destination {
190- Some ( destination) => {
191- let destination_block = fx. get_block ( destination) ;
192- fx. bcx . ins ( ) . jump ( destination_block, & [ ] ) ;
193- }
194- None => {
195- fx. bcx . ins ( ) . trap ( TrapCode :: UnreachableCodeReached ) ;
196- }
197- }
198207}
199208
200209struct InlineAssemblyGenerator < ' a , ' tcx > {
@@ -754,14 +763,9 @@ pub(crate) fn codegen_xgetbv<'tcx>(
754763 ] ;
755764 let options = InlineAsmOptions :: NOSTACK | InlineAsmOptions :: PURE | InlineAsmOptions :: NOMEM ;
756765
757- let mut inputs = Vec :: new ( ) ;
758- let mut outputs = Vec :: new ( ) ;
759-
760- let mut asm_gen = InlineAssemblyGenerator {
761- tcx : fx. tcx ,
762- arch : fx. tcx . sess . asm_arch . unwrap ( ) ,
763- enclosing_def_id : fx. instance . def_id ( ) ,
764- template : & [ InlineAsmTemplatePiece :: String (
766+ codegen_inline_asm_inner (
767+ fx,
768+ & [ InlineAsmTemplatePiece :: String (
765769 "
766770 xgetbv
767771 // out = rdx << 32 | rax
@@ -770,41 +774,7 @@ pub(crate) fn codegen_xgetbv<'tcx>(
770774 "
771775 . to_string ( ) ,
772776 ) ] ,
773- operands : & operands,
777+ & operands,
774778 options,
775- registers : Vec :: new ( ) ,
776- stack_slots_clobber : Vec :: new ( ) ,
777- stack_slots_input : Vec :: new ( ) ,
778- stack_slots_output : Vec :: new ( ) ,
779- stack_slot_size : Size :: from_bytes ( 0 ) ,
780- } ;
781- asm_gen. allocate_registers ( ) ;
782- asm_gen. allocate_stack_slots ( ) ;
783-
784- let inline_asm_index = fx. cx . inline_asm_index . get ( ) ;
785- fx. cx . inline_asm_index . set ( inline_asm_index + 1 ) ;
786- let asm_name = format ! (
787- "__inline_asm_{}_n{}" ,
788- fx. cx. cgu_name. as_str( ) . replace( '.' , "__" ) . replace( '-' , "_" ) ,
789- inline_asm_index
790779 ) ;
791-
792- let generated_asm = asm_gen. generate_asm_wrapper ( & asm_name) ;
793- fx. cx . global_asm . push_str ( & generated_asm) ;
794-
795- for ( i, operand) in operands. iter ( ) . enumerate ( ) {
796- match operand {
797- CInlineAsmOperand :: In { reg : _, value } => {
798- inputs. push ( ( asm_gen. stack_slots_input [ i] . unwrap ( ) , * value) ) ;
799- }
800- CInlineAsmOperand :: Out { reg : _, late : _, place } => {
801- if let Some ( place) = place {
802- outputs. push ( ( asm_gen. stack_slots_output [ i] . unwrap ( ) , * place) ) ;
803- }
804- }
805- _ => unreachable ! ( ) ,
806- }
807- }
808-
809- call_inline_asm ( fx, & asm_name, asm_gen. stack_slot_size , inputs, outputs) ;
810780}
0 commit comments