@@ -7,7 +7,7 @@ use std::process::{Command, Stdio};
7
7
use std:: sync:: Arc ;
8
8
9
9
use rustc_ast:: { InlineAsmOptions , InlineAsmTemplatePiece } ;
10
- use rustc_hir:: ItemId ;
10
+ use rustc_hir:: { InlineAsmOperand , ItemId } ;
11
11
use rustc_session:: config:: { OutputFilenames , OutputType } ;
12
12
13
13
use crate :: prelude:: * ;
@@ -23,7 +23,32 @@ pub(crate) fn codegen_global_asm_item(tcx: TyCtxt<'_>, global_asm: &mut String,
23
23
for piece in asm. template {
24
24
match * piece {
25
25
InlineAsmTemplatePiece :: String ( ref s) => global_asm. push_str ( s) ,
26
- InlineAsmTemplatePiece :: Placeholder { .. } => todo ! ( ) ,
26
+ InlineAsmTemplatePiece :: Placeholder { operand_idx, modifier : _, span : op_sp } => {
27
+ match asm. operands [ operand_idx] . 0 {
28
+ InlineAsmOperand :: Const { ref anon_const } => {
29
+ let const_value =
30
+ tcx. const_eval_poly ( anon_const. def_id . to_def_id ( ) ) . unwrap_or_else (
31
+ |_| span_bug ! ( op_sp, "asm const cannot be resolved" ) ,
32
+ ) ;
33
+ let ty = tcx. typeck_body ( anon_const. body ) . node_type ( anon_const. hir_id ) ;
34
+ let string = rustc_codegen_ssa:: common:: asm_const_to_str (
35
+ tcx,
36
+ op_sp,
37
+ const_value,
38
+ RevealAllLayoutCx ( tcx) . layout_of ( ty) ,
39
+ ) ;
40
+ global_asm. push_str ( & string) ;
41
+ }
42
+ InlineAsmOperand :: SymFn { anon_const : _ } => todo ! ( ) ,
43
+ InlineAsmOperand :: SymStatic { path : _, def_id : _ } => todo ! ( ) ,
44
+ InlineAsmOperand :: In { .. }
45
+ | InlineAsmOperand :: Out { .. }
46
+ | InlineAsmOperand :: InOut { .. }
47
+ | InlineAsmOperand :: SplitInOut { .. } => {
48
+ span_bug ! ( op_sp, "invalid operand type for global_asm!" )
49
+ }
50
+ }
51
+ }
27
52
}
28
53
}
29
54
global_asm. push_str ( "\n .att_syntax\n \n " ) ;
0 commit comments