Skip to content

Commit e9968fc

Browse files
authored
Merge pull request #20210 from ChayimFriedman2/naked-asm-safe
fix: Inline asm fixes
2 parents 69c8a68 + f8e2fa0 commit e9968fc

File tree

28 files changed

+303
-84
lines changed

28 files changed

+303
-84
lines changed

crates/hir-def/src/expr_store/lower/asm.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use tt::TextRange;
1010

1111
use crate::{
1212
expr_store::lower::{ExprCollector, FxIndexSet},
13-
hir::{AsmOperand, AsmOptions, Expr, ExprId, InlineAsm, InlineAsmRegOrRegClass},
13+
hir::{AsmOperand, AsmOptions, Expr, ExprId, InlineAsm, InlineAsmKind, InlineAsmRegOrRegClass},
1414
};
1515

1616
impl ExprCollector<'_> {
@@ -269,8 +269,17 @@ impl ExprCollector<'_> {
269269
}
270270
})
271271
};
272+
273+
let kind = if asm.global_asm_token().is_some() {
274+
InlineAsmKind::GlobalAsm
275+
} else if asm.naked_asm_token().is_some() {
276+
InlineAsmKind::NakedAsm
277+
} else {
278+
InlineAsmKind::Asm
279+
};
280+
272281
let idx = self.alloc_expr(
273-
Expr::InlineAsm(InlineAsm { operands: operands.into_boxed_slice(), options }),
282+
Expr::InlineAsm(InlineAsm { operands: operands.into_boxed_slice(), options, kind }),
274283
syntax_ptr,
275284
);
276285
self.source_map

crates/hir-def/src/hir.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,17 @@ pub struct OffsetOf {
332332
pub struct InlineAsm {
333333
pub operands: Box<[(Option<Name>, AsmOperand)]>,
334334
pub options: AsmOptions,
335+
pub kind: InlineAsmKind,
336+
}
337+
338+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
339+
pub enum InlineAsmKind {
340+
/// `asm!()`.
341+
Asm,
342+
/// `global_asm!()`.
343+
GlobalAsm,
344+
/// `naked_asm!()`.
345+
NakedAsm,
335346
}
336347

337348
#[derive(Clone, Copy, PartialEq, Eq, Hash)]

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ impl<'a> Ctx<'a> {
143143
ast::Item::MacroRules(ast) => self.lower_macro_rules(ast)?.into(),
144144
ast::Item::MacroDef(ast) => self.lower_macro_def(ast)?.into(),
145145
ast::Item::ExternBlock(ast) => self.lower_extern_block(ast).into(),
146+
// FIXME: Handle `global_asm!()`.
147+
ast::Item::AsmExpr(_) => return None,
146148
};
147149
let attrs = RawAttrs::new(self.db, item, self.span_map());
148150
self.add_attrs(mod_item.ast_id(), attrs);

crates/hir-def/src/item_tree/tests.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ use a::{c, d::{e}};
3535
#![no_std]
3636
#![doc = " another file comment"]
3737
38-
// AstId: ExternCrate[5A82, 0]
38+
// AstId: ExternCrate[070B, 0]
3939
pub(self) extern crate self as renamed;
4040
41-
// AstId: ExternCrate[7E1C, 0]
41+
// AstId: ExternCrate[1EA5, 0]
4242
pub(in super) extern crate bli;
4343
4444
// AstId: Use[0000, 0]
@@ -78,15 +78,15 @@ extern "C" {
7878
// AstId: ExternBlock[0000, 0]
7979
extern {
8080
#[on_extern_type]
81-
// AstId: TypeAlias[9FDF, 0]
81+
// AstId: TypeAlias[A09C, 0]
8282
pub(self) type ExType;
8383
8484
#[on_extern_static]
85-
// AstId: Static[43C1, 0]
85+
// AstId: Static[D85E, 0]
8686
pub(self) static EX_STATIC = _;
8787
8888
#[on_extern_fn]
89-
// AstId: Fn[452D, 0]
89+
// AstId: Fn[B240, 0]
9090
pub(self) fn ex_fn;
9191
}
9292
"#]],
@@ -124,20 +124,20 @@ enum E {
124124
}
125125
"#,
126126
expect![[r#"
127-
// AstId: Struct[DFF3, 0]
127+
// AstId: Struct[ED35, 0]
128128
pub(self) struct Unit;
129129
130130
#[derive(Debug)]
131-
// AstId: Struct[C7A1, 0]
131+
// AstId: Struct[A47C, 0]
132132
pub(self) struct Struct { ... }
133133
134-
// AstId: Struct[DAC2, 0]
134+
// AstId: Struct[C8C9, 0]
135135
pub(self) struct Tuple(...);
136136
137-
// AstId: Union[2DBB, 0]
137+
// AstId: Union[2797, 0]
138138
pub(self) union Ize { ... }
139139
140-
// AstId: Enum[7FF8, 0]
140+
// AstId: Enum[7D23, 0]
141141
pub(self) enum E { ... }
142142
"#]],
143143
);
@@ -162,18 +162,18 @@ trait Tr: SuperTrait + 'lifetime {
162162
}
163163
"#,
164164
expect![[r#"
165-
// AstId: Static[B393, 0]
165+
// AstId: Static[F7C1, 0]
166166
pub static ST = _;
167167
168-
// AstId: Const[B309, 0]
168+
// AstId: Const[84BB, 0]
169169
pub(self) const _ = _;
170170
171171
#[attr]
172172
#[inner_attr_in_fn]
173-
// AstId: Fn[75E3, 0]
173+
// AstId: Fn[BE8F, 0]
174174
pub(self) fn f;
175175
176-
// AstId: Trait[2998, 0]
176+
// AstId: Trait[9320, 0]
177177
pub(self) trait Tr { ... }
178178
"#]],
179179
);
@@ -197,16 +197,16 @@ mod outline;
197197
expect![[r##"
198198
#[doc = " outer"]
199199
#[doc = " inner"]
200-
// AstId: Module[CF93, 0]
200+
// AstId: Module[03AE, 0]
201201
pub(self) mod inline {
202202
// AstId: Use[0000, 0]
203203
pub(self) use super::*;
204204
205-
// AstId: Fn[1B26, 0]
205+
// AstId: Fn[2A78, 0]
206206
pub(self) fn fn_in_module;
207207
}
208208
209-
// AstId: Module[8994, 0]
209+
// AstId: Module[C08B, 0]
210210
pub(self) mod outline;
211211
"##]],
212212
);
@@ -225,13 +225,13 @@ pub macro m2() {}
225225
m!();
226226
"#,
227227
expect![[r#"
228-
// AstId: MacroRules[88CE, 0]
228+
// AstId: MacroRules[7E68, 0]
229229
macro_rules! m { ... }
230230
231-
// AstId: MacroDef[DC34, 0]
231+
// AstId: MacroDef[1C1E, 0]
232232
pub macro m2 { ... }
233233
234-
// AstId: MacroCall[612F, 0], SyntaxContextId: ROOT2024, ExpandTo: Items
234+
// AstId: MacroCall[7E68, 0], SyntaxContextId: ROOT2024, ExpandTo: Items
235235
m!(...);
236236
"#]],
237237
);
@@ -244,7 +244,7 @@ fn pub_self() {
244244
pub(self) struct S;
245245
"#,
246246
expect![[r#"
247-
// AstId: Struct[42E2, 0]
247+
// AstId: Struct[5024, 0]
248248
pub(self) struct S;
249249
"#]],
250250
)

crates/hir-def/src/macro_expansion_tests/builtin_fn_macro.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,19 @@ fn test_asm_expand() {
2828
r#"
2929
#[rustc_builtin_macro]
3030
macro_rules! asm {() => {}}
31+
#[rustc_builtin_macro]
32+
macro_rules! global_asm {() => {}}
33+
#[rustc_builtin_macro]
34+
macro_rules! naked_asm {() => {}}
35+
36+
global_asm! {
37+
""
38+
}
39+
40+
#[unsafe(naked)]
41+
extern "C" fn foo() {
42+
naked_asm!("");
43+
}
3144
3245
fn main() {
3346
let i: u64 = 3;
@@ -45,6 +58,17 @@ fn main() {
4558
expect![[r##"
4659
#[rustc_builtin_macro]
4760
macro_rules! asm {() => {}}
61+
#[rustc_builtin_macro]
62+
macro_rules! global_asm {() => {}}
63+
#[rustc_builtin_macro]
64+
macro_rules! naked_asm {() => {}}
65+
66+
builtin #global_asm ("")
67+
68+
#[unsafe(naked)]
69+
extern "C" fn foo() {
70+
builtin #naked_asm ("");
71+
}
4872
4973
fn main() {
5074
let i: u64 = 3;

crates/hir-def/src/macro_expansion_tests/mbe.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ macro_rules! f {
3535
};
3636
}
3737
38-
struct#0:MacroRules[8C8E, 0]@58..64#14336# MyTraitMap2#0:MacroCall[D499, 0]@31..42#ROOT2024# {#0:MacroRules[8C8E, 0]@72..73#14336#
39-
map#0:MacroRules[8C8E, 0]@86..89#14336#:#0:MacroRules[8C8E, 0]@89..90#14336# #0:MacroRules[8C8E, 0]@89..90#14336#::#0:MacroRules[8C8E, 0]@91..93#14336#std#0:MacroRules[8C8E, 0]@93..96#14336#::#0:MacroRules[8C8E, 0]@96..98#14336#collections#0:MacroRules[8C8E, 0]@98..109#14336#::#0:MacroRules[8C8E, 0]@109..111#14336#HashSet#0:MacroRules[8C8E, 0]@111..118#14336#<#0:MacroRules[8C8E, 0]@118..119#14336#(#0:MacroRules[8C8E, 0]@119..120#14336#)#0:MacroRules[8C8E, 0]@120..121#14336#>#0:MacroRules[8C8E, 0]@121..122#14336#,#0:MacroRules[8C8E, 0]@122..123#14336#
40-
}#0:MacroRules[8C8E, 0]@132..133#14336#
38+
struct#0:MacroRules[BE8F, 0]@58..64#14336# MyTraitMap2#0:MacroCall[BE8F, 0]@31..42#ROOT2024# {#0:MacroRules[BE8F, 0]@72..73#14336#
39+
map#0:MacroRules[BE8F, 0]@86..89#14336#:#0:MacroRules[BE8F, 0]@89..90#14336# #0:MacroRules[BE8F, 0]@89..90#14336#::#0:MacroRules[BE8F, 0]@91..93#14336#std#0:MacroRules[BE8F, 0]@93..96#14336#::#0:MacroRules[BE8F, 0]@96..98#14336#collections#0:MacroRules[BE8F, 0]@98..109#14336#::#0:MacroRules[BE8F, 0]@109..111#14336#HashSet#0:MacroRules[BE8F, 0]@111..118#14336#<#0:MacroRules[BE8F, 0]@118..119#14336#(#0:MacroRules[BE8F, 0]@119..120#14336#)#0:MacroRules[BE8F, 0]@120..121#14336#>#0:MacroRules[BE8F, 0]@121..122#14336#,#0:MacroRules[BE8F, 0]@122..123#14336#
40+
}#0:MacroRules[BE8F, 0]@132..133#14336#
4141
"#]],
4242
);
4343
}
@@ -75,12 +75,12 @@ macro_rules! f {
7575
};
7676
}
7777
78-
fn#0:MacroCall[D499, 0]@30..32#ROOT2024# main#0:MacroCall[D499, 0]@33..37#ROOT2024#(#0:MacroCall[D499, 0]@37..38#ROOT2024#)#0:MacroCall[D499, 0]@38..39#ROOT2024# {#0:MacroCall[D499, 0]@40..41#ROOT2024#
79-
1#0:MacroCall[D499, 0]@50..51#ROOT2024#;#0:MacroCall[D499, 0]@51..52#ROOT2024#
80-
1.0#0:MacroCall[D499, 0]@61..64#ROOT2024#;#0:MacroCall[D499, 0]@64..65#ROOT2024#
81-
(#0:MacroCall[D499, 0]@74..75#ROOT2024#(#0:MacroCall[D499, 0]@75..76#ROOT2024#1#0:MacroCall[D499, 0]@76..77#ROOT2024#,#0:MacroCall[D499, 0]@77..78#ROOT2024# )#0:MacroCall[D499, 0]@78..79#ROOT2024#,#0:MacroCall[D499, 0]@79..80#ROOT2024# )#0:MacroCall[D499, 0]@80..81#ROOT2024#.#0:MacroCall[D499, 0]@81..82#ROOT2024#0#0:MacroCall[D499, 0]@82..85#ROOT2024#.#0:MacroCall[D499, 0]@82..85#ROOT2024#0#0:MacroCall[D499, 0]@82..85#ROOT2024#;#0:MacroCall[D499, 0]@85..86#ROOT2024#
82-
let#0:MacroCall[D499, 0]@95..98#ROOT2024# x#0:MacroCall[D499, 0]@99..100#ROOT2024# =#0:MacroCall[D499, 0]@101..102#ROOT2024# 1#0:MacroCall[D499, 0]@103..104#ROOT2024#;#0:MacroCall[D499, 0]@104..105#ROOT2024#
83-
}#0:MacroCall[D499, 0]@110..111#ROOT2024#
78+
fn#0:MacroCall[BE8F, 0]@30..32#ROOT2024# main#0:MacroCall[BE8F, 0]@33..37#ROOT2024#(#0:MacroCall[BE8F, 0]@37..38#ROOT2024#)#0:MacroCall[BE8F, 0]@38..39#ROOT2024# {#0:MacroCall[BE8F, 0]@40..41#ROOT2024#
79+
1#0:MacroCall[BE8F, 0]@50..51#ROOT2024#;#0:MacroCall[BE8F, 0]@51..52#ROOT2024#
80+
1.0#0:MacroCall[BE8F, 0]@61..64#ROOT2024#;#0:MacroCall[BE8F, 0]@64..65#ROOT2024#
81+
(#0:MacroCall[BE8F, 0]@74..75#ROOT2024#(#0:MacroCall[BE8F, 0]@75..76#ROOT2024#1#0:MacroCall[BE8F, 0]@76..77#ROOT2024#,#0:MacroCall[BE8F, 0]@77..78#ROOT2024# )#0:MacroCall[BE8F, 0]@78..79#ROOT2024#,#0:MacroCall[BE8F, 0]@79..80#ROOT2024# )#0:MacroCall[BE8F, 0]@80..81#ROOT2024#.#0:MacroCall[BE8F, 0]@81..82#ROOT2024#0#0:MacroCall[BE8F, 0]@82..85#ROOT2024#.#0:MacroCall[BE8F, 0]@82..85#ROOT2024#0#0:MacroCall[BE8F, 0]@82..85#ROOT2024#;#0:MacroCall[BE8F, 0]@85..86#ROOT2024#
82+
let#0:MacroCall[BE8F, 0]@95..98#ROOT2024# x#0:MacroCall[BE8F, 0]@99..100#ROOT2024# =#0:MacroCall[BE8F, 0]@101..102#ROOT2024# 1#0:MacroCall[BE8F, 0]@103..104#ROOT2024#;#0:MacroCall[BE8F, 0]@104..105#ROOT2024#
83+
}#0:MacroCall[BE8F, 0]@110..111#ROOT2024#
8484
8585
8686
"#]],
@@ -171,7 +171,7 @@ fn main(foo: ()) {
171171
}
172172
173173
fn main(foo: ()) {
174-
/* error: unresolved macro unresolved */"helloworld!"#0:Fn[B9C7, 0]@236..321#ROOT2024#;
174+
/* error: unresolved macro unresolved */"helloworld!"#0:Fn[15AE, 0]@236..321#ROOT2024#;
175175
}
176176
}
177177
@@ -197,7 +197,7 @@ macro_rules! mk_struct {
197197
#[macro_use]
198198
mod foo;
199199
200-
struct#1:MacroRules[E572, 0]@59..65#14336# Foo#0:MacroCall[BDD3, 0]@32..35#ROOT2024#(#1:MacroRules[E572, 0]@70..71#14336#u32#0:MacroCall[BDD3, 0]@41..44#ROOT2024#)#1:MacroRules[E572, 0]@74..75#14336#;#1:MacroRules[E572, 0]@75..76#14336#
200+
struct#1:MacroRules[DB0C, 0]@59..65#14336# Foo#0:MacroCall[DB0C, 0]@32..35#ROOT2024#(#1:MacroRules[DB0C, 0]@70..71#14336#u32#0:MacroCall[DB0C, 0]@41..44#ROOT2024#)#1:MacroRules[DB0C, 0]@74..75#14336#;#1:MacroRules[DB0C, 0]@75..76#14336#
201201
"#]],
202202
);
203203
}

crates/hir-def/src/macro_expansion_tests/proc_macros.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,9 @@ fn foo(&self) {
181181
self.0. 1;
182182
}
183183
184-
fn#0:Fn[4D85, 0]@45..47#ROOT2024# foo#0:Fn[4D85, 0]@48..51#ROOT2024#(#0:Fn[4D85, 0]@51..52#ROOT2024#&#0:Fn[4D85, 0]@52..53#ROOT2024#self#0:Fn[4D85, 0]@53..57#ROOT2024# )#0:Fn[4D85, 0]@57..58#ROOT2024# {#0:Fn[4D85, 0]@59..60#ROOT2024#
185-
self#0:Fn[4D85, 0]@65..69#ROOT2024# .#0:Fn[4D85, 0]@69..70#ROOT2024#0#0:Fn[4D85, 0]@70..71#ROOT2024#.#0:Fn[4D85, 0]@71..72#ROOT2024#1#0:Fn[4D85, 0]@73..74#ROOT2024#;#0:Fn[4D85, 0]@74..75#ROOT2024#
186-
}#0:Fn[4D85, 0]@76..77#ROOT2024#"#]],
184+
fn#0:Fn[8A31, 0]@45..47#ROOT2024# foo#0:Fn[8A31, 0]@48..51#ROOT2024#(#0:Fn[8A31, 0]@51..52#ROOT2024#&#0:Fn[8A31, 0]@52..53#ROOT2024#self#0:Fn[8A31, 0]@53..57#ROOT2024# )#0:Fn[8A31, 0]@57..58#ROOT2024# {#0:Fn[8A31, 0]@59..60#ROOT2024#
185+
self#0:Fn[8A31, 0]@65..69#ROOT2024# .#0:Fn[8A31, 0]@69..70#ROOT2024#0#0:Fn[8A31, 0]@70..71#ROOT2024#.#0:Fn[8A31, 0]@71..72#ROOT2024#1#0:Fn[8A31, 0]@73..74#ROOT2024#;#0:Fn[8A31, 0]@74..75#ROOT2024#
186+
}#0:Fn[8A31, 0]@76..77#ROOT2024#"#]],
187187
);
188188
}
189189

crates/hir-def/src/resolver.rs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,17 +1052,6 @@ impl<'db> Scope<'db> {
10521052
}
10531053
}
10541054

1055-
pub fn resolver_for_expr(
1056-
db: &dyn DefDatabase,
1057-
owner: DefWithBodyId,
1058-
expr_id: ExprId,
1059-
) -> Resolver<'_> {
1060-
let r = owner.resolver(db);
1061-
let scopes = db.expr_scopes(owner);
1062-
let scope_id = scopes.scope_for(expr_id);
1063-
resolver_for_scope_(db, scopes, scope_id, r, owner)
1064-
}
1065-
10661055
pub fn resolver_for_scope(
10671056
db: &dyn DefDatabase,
10681057
owner: DefWithBodyId,

crates/hir-expand/src/builtin/fn_macro.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ register_builtin! {
125125
(assert, Assert) => assert_expand,
126126
(stringify, Stringify) => stringify_expand,
127127
(asm, Asm) => asm_expand,
128-
(global_asm, GlobalAsm) => asm_expand,
129-
(naked_asm, NakedAsm) => asm_expand,
128+
(global_asm, GlobalAsm) => global_asm_expand,
129+
(naked_asm, NakedAsm) => naked_asm_expand,
130130
(cfg, Cfg) => cfg_expand,
131131
(core_panic, CorePanic) => panic_expand,
132132
(std_panic, StdPanic) => panic_expand,
@@ -325,6 +325,36 @@ fn asm_expand(
325325
ExpandResult::ok(expanded)
326326
}
327327

328+
fn global_asm_expand(
329+
_db: &dyn ExpandDatabase,
330+
_id: MacroCallId,
331+
tt: &tt::TopSubtree,
332+
span: Span,
333+
) -> ExpandResult<tt::TopSubtree> {
334+
let mut tt = tt.clone();
335+
tt.top_subtree_delimiter_mut().kind = tt::DelimiterKind::Parenthesis;
336+
let pound = mk_pound(span);
337+
let expanded = quote! {span =>
338+
builtin #pound global_asm #tt
339+
};
340+
ExpandResult::ok(expanded)
341+
}
342+
343+
fn naked_asm_expand(
344+
_db: &dyn ExpandDatabase,
345+
_id: MacroCallId,
346+
tt: &tt::TopSubtree,
347+
span: Span,
348+
) -> ExpandResult<tt::TopSubtree> {
349+
let mut tt = tt.clone();
350+
tt.top_subtree_delimiter_mut().kind = tt::DelimiterKind::Parenthesis;
351+
let pound = mk_pound(span);
352+
let expanded = quote! {span =>
353+
builtin #pound naked_asm #tt
354+
};
355+
ExpandResult::ok(expanded)
356+
}
357+
328358
fn cfg_expand(
329359
db: &dyn ExpandDatabase,
330360
id: MacroCallId,

crates/hir-ty/src/diagnostics/unsafe_check.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use either::Either;
77
use hir_def::{
88
AdtId, DefWithBodyId, FieldId, FunctionId, VariantId,
99
expr_store::{Body, path::Path},
10-
hir::{AsmOperand, Expr, ExprId, ExprOrPatId, Pat, PatId, Statement, UnaryOp},
10+
hir::{AsmOperand, Expr, ExprId, ExprOrPatId, InlineAsmKind, Pat, PatId, Statement, UnaryOp},
1111
resolver::{HasResolver, ResolveValueResult, Resolver, ValueNs},
1212
signatures::StaticFlags,
1313
type_ref::Rawness,
@@ -315,7 +315,12 @@ impl<'db> UnsafeVisitor<'db> {
315315
self.inside_assignment = old_inside_assignment;
316316
}
317317
Expr::InlineAsm(asm) => {
318-
self.on_unsafe_op(current.into(), UnsafetyReason::InlineAsm);
318+
if asm.kind == InlineAsmKind::Asm {
319+
// `naked_asm!()` requires `unsafe` on the attribute (`#[unsafe(naked)]`),
320+
// and `global_asm!()` doesn't require it at all.
321+
self.on_unsafe_op(current.into(), UnsafetyReason::InlineAsm);
322+
}
323+
319324
asm.operands.iter().for_each(|(_, op)| match op {
320325
AsmOperand::In { expr, .. }
321326
| AsmOperand::Out { expr: Some(expr), .. }

0 commit comments

Comments
 (0)