@@ -2,9 +2,10 @@ use rustc_ast as ast;
2
2
use rustc_ast::ptr::P;
3
3
use rustc_ast::token::{self, Delimiter};
4
4
use rustc_ast::tokenstream::TokenStream;
5
- use rustc_data_structures::fx::{FxHashMap, FxHashSet };
5
+ use rustc_data_structures::fx::{FxHashMap, FxIndexMap };
6
6
use rustc_errors::PResult;
7
7
use rustc_expand::base::{self, *};
8
+ use rustc_index::bit_set::GrowableBitSet;
8
9
use rustc_parse::parser::Parser;
9
10
use rustc_parse_format as parse;
10
11
use rustc_session::lint;
@@ -20,8 +21,8 @@ use crate::errors;
20
21
pub struct AsmArgs {
21
22
pub templates: Vec<P<ast::Expr>>,
22
23
pub operands: Vec<(ast::InlineAsmOperand, Span)>,
23
- named_args: FxHashMap <Symbol, usize>,
24
- reg_args: FxHashSet <usize>,
24
+ named_args: FxIndexMap <Symbol, usize>,
25
+ reg_args: GrowableBitSet <usize>,
25
26
pub clobber_abis: Vec<(Symbol, Span)>,
26
27
options: ast::InlineAsmOptions,
27
28
pub options_spans: Vec<Span>,
@@ -56,8 +57,8 @@ pub fn parse_asm_args<'a>(
56
57
let mut args = AsmArgs {
57
58
templates: vec![first_template],
58
59
operands: vec![],
59
- named_args: FxHashMap ::default(),
60
- reg_args: FxHashSet ::default(),
60
+ named_args: Default ::default(),
61
+ reg_args: Default ::default(),
61
62
clobber_abis: Vec::new(),
62
63
options: ast::InlineAsmOptions::empty(),
63
64
options_spans: vec![],
@@ -213,7 +214,7 @@ pub fn parse_asm_args<'a>(
213
214
} else {
214
215
if !args.named_args.is_empty() || !args.reg_args.is_empty() {
215
216
let named = args.named_args.values().map(|p| args.operands[*p].1).collect();
216
- let explicit = args.reg_args.iter().map(|p| args.operands[* p].1).collect();
217
+ let explicit = args.reg_args.iter().map(|p| args.operands[p].1).collect();
217
218
218
219
diag.emit_err(errors::AsmPositionalAfter { span, named, explicit });
219
220
}
@@ -446,8 +447,8 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, args: AsmArgs) -> Option<ast::Inl
446
447
// Register operands are implicitly used since they are not allowed to be
447
448
// referenced in the template string.
448
449
let mut used = vec![false; args.operands.len()];
449
- for pos in & args.reg_args {
450
- used[* pos] = true;
450
+ for pos in args.reg_args.iter() {
451
+ used[pos] = true;
451
452
}
452
453
let named_pos: FxHashMap<usize, Symbol> =
453
454
args.named_args.iter().map(|(&sym, &idx)| (idx, sym)).collect();
@@ -581,7 +582,7 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, args: AsmArgs) -> Option<ast::Inl
581
582
parse::ArgumentIs(idx) | parse::ArgumentImplicitlyIs(idx) => {
582
583
if idx >= args.operands.len()
583
584
|| named_pos.contains_key(&idx)
584
- || args.reg_args.contains(& idx)
585
+ || args.reg_args.contains(idx)
585
586
{
586
587
let msg = format!("invalid reference to argument at index {}", idx);
587
588
let mut err = ecx.struct_span_err(span, &msg);
@@ -608,7 +609,7 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, args: AsmArgs) -> Option<ast::Inl
608
609
args.operands[idx].1,
609
610
"named arguments cannot be referenced by position",
610
611
);
611
- } else if args.reg_args.contains(& idx) {
612
+ } else if args.reg_args.contains(idx) {
612
613
err.span_label(
613
614
args.operands[idx].1,
614
615
"explicit register argument",
0 commit comments