@@ -974,20 +974,18 @@ impl<'hir> LoweringContext<'_, 'hir> {
974
974
}
975
975
976
976
fn lower_expr_asm ( & mut self , sp : Span , asm : & InlineAsm ) -> hir:: ExprKind < ' hir > {
977
- let asm_arch = if let Some ( asm_arch) = self . sess . asm_arch {
978
- asm_arch
979
- } else {
977
+ if self . sess . asm_arch . is_none ( ) {
980
978
struct_span_err ! ( self . sess, sp, E0472 , "asm! is unsupported on this target" ) . emit ( ) ;
981
- return hir :: ExprKind :: Err ;
982
- } ;
983
- if asm . options . contains ( InlineAsmOptions :: ATT_SYNTAX ) {
984
- match asm_arch {
985
- asm:: InlineAsmArch :: X86 | asm:: InlineAsmArch :: X86_64 => { }
986
- _ => self
987
- . sess
988
- . struct_span_err ( sp , "the `att_syntax` option is only supported on x86" )
989
- . emit ( ) ,
990
- }
979
+ }
980
+ if asm . options . contains ( InlineAsmOptions :: ATT_SYNTAX )
981
+ && ! matches ! (
982
+ self . sess . asm_arch ,
983
+ Some ( asm:: InlineAsmArch :: X86 | asm:: InlineAsmArch :: X86_64 )
984
+ )
985
+ {
986
+ self . sess
987
+ . struct_span_err ( sp , "the `att_syntax` option is only supported on x86" )
988
+ . emit ( ) ;
991
989
}
992
990
993
991
// Lower operands to HIR, filter_map skips any operands with invalid
@@ -1001,10 +999,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
1001
999
Some ( match reg {
1002
1000
InlineAsmRegOrRegClass :: Reg ( s) => asm:: InlineAsmRegOrRegClass :: Reg (
1003
1001
asm:: InlineAsmReg :: parse (
1004
- asm_arch,
1005
- |feature| {
1006
- self . sess . target_features . contains ( & Symbol :: intern ( feature) )
1007
- } ,
1002
+ sess. asm_arch ?,
1003
+ |feature| sess. target_features . contains ( & Symbol :: intern ( feature) ) ,
1008
1004
s,
1009
1005
)
1010
1006
. map_err ( |e| {
@@ -1015,7 +1011,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1015
1011
) ,
1016
1012
InlineAsmRegOrRegClass :: RegClass ( s) => {
1017
1013
asm:: InlineAsmRegOrRegClass :: RegClass (
1018
- asm:: InlineAsmRegClass :: parse ( asm_arch, s)
1014
+ asm:: InlineAsmRegClass :: parse ( sess . asm_arch ? , s)
1019
1015
. map_err ( |e| {
1020
1016
let msg = format ! (
1021
1017
"invalid register class `{}`: {}" ,
@@ -1029,33 +1025,38 @@ impl<'hir> LoweringContext<'_, 'hir> {
1029
1025
}
1030
1026
} )
1031
1027
} ;
1032
- let op = match op {
1033
- InlineAsmOperand :: In { reg, expr } => hir:: InlineAsmOperand :: In {
1034
- reg : lower_reg ( * reg) ?,
1028
+
1029
+ // lower_reg is executed last because we need to lower all
1030
+ // sub-expressions even if we throw them away later.
1031
+ let op = match * op {
1032
+ InlineAsmOperand :: In { reg, ref expr } => hir:: InlineAsmOperand :: In {
1035
1033
expr : self . lower_expr_mut ( expr) ,
1034
+ reg : lower_reg ( reg) ?,
1036
1035
} ,
1037
- InlineAsmOperand :: Out { reg, late, expr } => hir:: InlineAsmOperand :: Out {
1038
- reg : lower_reg ( * reg) ?,
1039
- late : * late,
1036
+ InlineAsmOperand :: Out { reg, late, ref expr } => hir:: InlineAsmOperand :: Out {
1037
+ late,
1040
1038
expr : expr. as_ref ( ) . map ( |expr| self . lower_expr_mut ( expr) ) ,
1039
+ reg : lower_reg ( reg) ?,
1041
1040
} ,
1042
- InlineAsmOperand :: InOut { reg, late, expr } => hir:: InlineAsmOperand :: InOut {
1043
- reg : lower_reg ( * reg) ?,
1044
- late : * late,
1045
- expr : self . lower_expr_mut ( expr) ,
1046
- } ,
1047
- InlineAsmOperand :: SplitInOut { reg, late, in_expr, out_expr } => {
1041
+ InlineAsmOperand :: InOut { reg, late, ref expr } => {
1042
+ hir:: InlineAsmOperand :: InOut {
1043
+ late,
1044
+ expr : self . lower_expr_mut ( expr) ,
1045
+ reg : lower_reg ( reg) ?,
1046
+ }
1047
+ }
1048
+ InlineAsmOperand :: SplitInOut { reg, late, ref in_expr, ref out_expr } => {
1048
1049
hir:: InlineAsmOperand :: SplitInOut {
1049
- reg : lower_reg ( * reg) ?,
1050
- late : * late,
1050
+ late,
1051
1051
in_expr : self . lower_expr_mut ( in_expr) ,
1052
1052
out_expr : out_expr. as_ref ( ) . map ( |expr| self . lower_expr_mut ( expr) ) ,
1053
+ reg : lower_reg ( reg) ?,
1053
1054
}
1054
1055
}
1055
- InlineAsmOperand :: Const { expr } => {
1056
+ InlineAsmOperand :: Const { ref expr } => {
1056
1057
hir:: InlineAsmOperand :: Const { expr : self . lower_expr_mut ( expr) }
1057
1058
}
1058
- InlineAsmOperand :: Sym { expr } => {
1059
+ InlineAsmOperand :: Sym { ref expr } => {
1059
1060
hir:: InlineAsmOperand :: Sym { expr : self . lower_expr_mut ( expr) }
1060
1061
}
1061
1062
} ;
@@ -1069,6 +1070,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1069
1070
}
1070
1071
1071
1072
// Validate template modifiers against the register classes for the operands
1073
+ let asm_arch = sess. asm_arch . unwrap ( ) ;
1072
1074
for p in & asm. template {
1073
1075
if let InlineAsmTemplatePiece :: Placeholder {
1074
1076
operand_idx,
0 commit comments