Skip to content

Commit 3431d58

Browse files
committed
Insert builtin#asm into asm! expansion
1 parent 1504830 commit 3431d58

File tree

13 files changed

+103
-6
lines changed

13 files changed

+103
-6
lines changed

crates/hir-def/src/body/lower.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ use crate::{
3030
expander::Expander,
3131
hir::{
3232
dummy_expr_id, Array, Binding, BindingAnnotation, BindingId, BindingProblems, CaptureBy,
33-
ClosureKind, Expr, ExprId, Label, LabelId, Literal, LiteralOrConst, MatchArm, Movability,
34-
OffsetOf, Pat, PatId, RecordFieldPat, RecordLitField, Statement,
33+
ClosureKind, Expr, ExprId, InlineAsm, Label, LabelId, Literal, LiteralOrConst, MatchArm,
34+
Movability, OffsetOf, Pat, PatId, RecordFieldPat, RecordLitField, Statement,
3535
},
3636
item_scope::BuiltinShadowMode,
3737
lang_item::LangItem,
@@ -648,7 +648,10 @@ impl ExprCollector<'_> {
648648
}
649649
}
650650
ast::Expr::UnderscoreExpr(_) => self.alloc_expr(Expr::Underscore, syntax_ptr),
651-
ast::Expr::AsmExpr(_) => self.missing_expr(),
651+
ast::Expr::AsmExpr(e) => {
652+
let expr = Expr::InlineAsm(InlineAsm { e: self.collect_expr_opt(e.expr()) });
653+
self.alloc_expr(expr, syntax_ptr)
654+
}
652655
ast::Expr::OffsetOfExpr(e) => {
653656
let container = Interned::new(TypeRef::from_ast_opt(&self.ctx(), e.ty()));
654657
let fields = e.fields().map(|it| it.as_name()).collect();

crates/hir-def/src/body/pretty.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,9 @@ impl Printer<'_> {
155155
match expr {
156156
Expr::Missing => w!(self, "�"),
157157
Expr::Underscore => w!(self, "_"),
158+
Expr::InlineAsm(_) => w!(self, "builtin#asm(_)"),
158159
Expr::OffsetOf(offset_of) => {
159-
w!(self, "builtin#offset_of!(");
160+
w!(self, "builtin#offset_of(");
160161
self.print_type_ref(&offset_of.container);
161162
w!(
162163
self,

crates/hir-def/src/hir.rs

+7
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ pub enum Expr {
282282
Literal(Literal),
283283
Underscore,
284284
OffsetOf(OffsetOf),
285+
InlineAsm(InlineAsm),
285286
}
286287

287288
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -290,6 +291,11 @@ pub struct OffsetOf {
290291
pub fields: Box<[Name]>,
291292
}
292293

294+
#[derive(Debug, Clone, PartialEq, Eq)]
295+
pub struct InlineAsm {
296+
pub e: ExprId,
297+
}
298+
293299
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
294300
pub enum ClosureKind {
295301
Closure,
@@ -349,6 +355,7 @@ impl Expr {
349355
match self {
350356
Expr::Missing => {}
351357
Expr::Path(_) | Expr::OffsetOf(_) => {}
358+
Expr::InlineAsm(e) => f(e.e),
352359
Expr::If { condition, then_branch, else_branch } => {
353360
f(*condition);
354361
f(*then_branch);

crates/hir-ty/src/infer/closure.rs

+1
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@ impl InferenceContext<'_> {
453453
fn walk_expr_without_adjust(&mut self, tgt_expr: ExprId) {
454454
match &self.body[tgt_expr] {
455455
Expr::OffsetOf(_) => (),
456+
Expr::InlineAsm(e) => self.walk_expr_without_adjust(e.e),
456457
Expr::If { condition, then_branch, else_branch } => {
457458
self.consume_expr(*condition);
458459
self.consume_expr(*then_branch);

crates/hir-ty/src/infer/expr.rs

+4
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,10 @@ impl InferenceContext<'_> {
844844
expected
845845
}
846846
Expr::OffsetOf(_) => TyKind::Scalar(Scalar::Uint(UintTy::Usize)).intern(Interner),
847+
Expr::InlineAsm(it) => {
848+
self.infer_expr_no_expect(it.e);
849+
self.result.standard_types.unit.clone()
850+
}
847851
};
848852
// use a new type variable if we got unknown here
849853
let ty = self.insert_type_vars_shallow(ty);

crates/hir-ty/src/infer/mutability.rs

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ impl InferenceContext<'_> {
3535
fn infer_mut_expr_without_adjust(&mut self, tgt_expr: ExprId, mutability: Mutability) {
3636
match &self.body[tgt_expr] {
3737
Expr::Missing => (),
38+
Expr::InlineAsm(e) => self.infer_mut_expr_without_adjust(e.e, Mutability::Not),
3839
Expr::OffsetOf(_) => (),
3940
&Expr::If { condition, then_branch, else_branch } => {
4041
self.infer_mut_expr(condition, Mutability::Not);

crates/hir-ty/src/mir/lower.rs

+3
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,9 @@ impl<'ctx> MirLowerCtx<'ctx> {
373373
Expr::OffsetOf(_) => {
374374
not_supported!("builtin#offset_of")
375375
}
376+
Expr::InlineAsm(_) => {
377+
not_supported!("builtin#asm")
378+
}
376379
Expr::Missing => {
377380
if let DefWithBodyId::FunctionId(f) = self.owner {
378381
let assoc = f.lookup(self.db.upcast());

crates/ide/src/syntax_highlighting/test_data/highlight_strings.html

+9-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,15 @@
176176
<span class="macro">assert</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="bool_literal macro">true</span><span class="comma macro">,</span> <span class="string_literal macro">"</span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro">"</span><span class="comma macro">,</span> <span class="numeric_literal macro">1</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
177177
<span class="macro">assert</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="bool_literal macro">true</span><span class="comma macro">,</span> <span class="string_literal macro">"</span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro"> asdasd"</span><span class="comma macro">,</span> <span class="numeric_literal macro">1</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
178178
<span class="macro">toho</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"</span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro">fmt"</span><span class="comma macro">,</span> <span class="numeric_literal macro">0</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
179-
<span class="macro unsafe">asm</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"mov eax, </span><span class="format_specifier">{</span><span class="numeric_literal">0</span><span class="format_specifier">}</span><span class="string_literal macro">"</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
179+
<span class="keyword">let</span> <span class="variable declaration">i</span><span class="colon">:</span> <span class="builtin_type">u64</span> <span class="operator">=</span> <span class="numeric_literal">3</span><span class="semicolon">;</span>
180+
<span class="keyword">let</span> <span class="variable declaration">o</span><span class="colon">:</span> <span class="builtin_type">u64</span><span class="semicolon">;</span>
181+
<span class="macro unsafe">asm</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span>
182+
<span class="string_literal macro">"mov </span><span class="format_specifier">{</span><span class="numeric_literal">0</span><span class="format_specifier">}</span><span class="string_literal macro">, </span><span class="format_specifier">{</span><span class="numeric_literal">1</span><span class="format_specifier">}</span><span class="string_literal macro">"</span><span class="comma macro">,</span>
183+
<span class="string_literal macro">"add </span><span class="format_specifier">{</span><span class="numeric_literal">0</span><span class="format_specifier">}</span><span class="string_literal macro">, 5"</span><span class="comma macro">,</span>
184+
<span class="none macro">out</span><span class="parenthesis macro">(</span><span class="none macro">reg</span><span class="parenthesis macro">)</span> <span class="none macro">o</span><span class="comma macro">,</span>
185+
<span class="keyword control macro">in</span><span class="parenthesis macro">(</span><span class="none macro">reg</span><span class="parenthesis macro">)</span> <span class="none macro">i</span><span class="comma macro">,</span>
186+
<span class="parenthesis macro">)</span><span class="semicolon">;</span>
187+
180188
<span class="macro">format_args</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="none macro">concat</span><span class="punctuation macro">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"</span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro">"</span><span class="parenthesis macro">)</span><span class="comma macro">,</span> <span class="string_literal macro">"{}"</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
181189
<span class="macro">format_args</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"</span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro"> </span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro"> </span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro"> </span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro"> </span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro"> </span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro">"</span><span class="comma macro">,</span> <span class="variable macro reference">backslash</span><span class="comma macro">,</span> <span class="none macro">format_args</span><span class="punctuation macro">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"</span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro">"</span><span class="comma macro">,</span> <span class="numeric_literal macro">0</span><span class="parenthesis macro">)</span><span class="comma macro">,</span> <span class="unresolved_reference macro">foo</span><span class="comma macro">,</span> <span class="string_literal macro">"bar"</span><span class="comma macro">,</span> <span class="none macro">toho</span><span class="punctuation macro">!</span><span class="parenthesis macro">(</span><span class="parenthesis macro">)</span><span class="comma macro">,</span> <span class="variable macro reference">backslash</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
182190
<span class="brace">}</span></code></pre>

crates/parser/src/grammar/expressions/atom.rs

+1
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ fn builtin_expr(p: &mut Parser<'_>) -> Option<CompletedMarker> {
254254
} else if p.at_contextual_kw(T![asm]) {
255255
p.bump_remap(T![asm]);
256256
p.expect(T!['(']);
257+
// FIXME: We just put expression here so highlighting kind of keeps working
257258
expr(p);
258259
p.expect(T![')']);
259260
Some(m.complete(p, ASM_EXPR))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
SOURCE_FILE
2+
FN
3+
FN_KW "fn"
4+
WHITESPACE " "
5+
NAME
6+
IDENT "foo"
7+
PARAM_LIST
8+
L_PAREN "("
9+
R_PAREN ")"
10+
WHITESPACE " "
11+
BLOCK_EXPR
12+
STMT_LIST
13+
L_CURLY "{"
14+
WHITESPACE "\n "
15+
EXPR_STMT
16+
ASM_EXPR
17+
BUILTIN_KW "builtin"
18+
POUND "#"
19+
ASM_KW "asm"
20+
L_PAREN "("
21+
LITERAL
22+
INT_NUMBER "0"
23+
R_PAREN ")"
24+
SEMICOLON ";"
25+
WHITESPACE "\n "
26+
EXPR_STMT
27+
FORMAT_ARGS_EXPR
28+
BUILTIN_KW "builtin"
29+
POUND "#"
30+
FORMAT_ARGS_KW "format_args"
31+
L_PAREN "("
32+
LITERAL
33+
INT_NUMBER "0"
34+
R_PAREN ")"
35+
SEMICOLON ";"
36+
WHITESPACE "\n "
37+
EXPR_STMT
38+
OFFSET_OF_EXPR
39+
BUILTIN_KW "builtin"
40+
POUND "#"
41+
OFFSET_OF_KW "offset_of"
42+
L_PAREN "("
43+
PATH_TYPE
44+
PATH
45+
PATH_SEGMENT
46+
NAME_REF
47+
IDENT "Foo"
48+
COMMA ","
49+
WHITESPACE " "
50+
NAME_REF
51+
IDENT "bar"
52+
DOT "."
53+
NAME_REF
54+
IDENT "baz"
55+
DOT "."
56+
NAME_REF
57+
INT_NUMBER "0"
58+
R_PAREN ")"
59+
SEMICOLON ";"
60+
WHITESPACE "\n"
61+
R_CURLY "}"
62+
WHITESPACE "\n"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
fn foo() {
2+
builtin#asm(0);
3+
builtin#format_args(0);
4+
builtin#offset_of(Foo, bar.baz.0);
5+
}

crates/syntax/rust.ungram

+1-1
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ OffsetOfExpr =
379379
Attr* 'builtin' '#' 'offset_of' '(' Type ',' fields:(NameRef ('.' NameRef)* ) ')'
380380

381381
AsmExpr =
382-
Attr* 'builtin' '#' 'asm' '(' ')'
382+
Attr* 'builtin' '#' 'asm' '(' Expr ')'
383383

384384
FormatArgsExpr =
385385
Attr* 'builtin' '#' 'format_args' '(' ')'

crates/syntax/src/ast/generated/nodes.rs

+1
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,7 @@ impl AsmExpr {
814814
pub fn pound_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![#]) }
815815
pub fn asm_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![asm]) }
816816
pub fn l_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['(']) }
817+
pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
817818
pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }
818819
}
819820

0 commit comments

Comments
 (0)