mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-28 10:39:45 +00:00
Merge pull request #20210 from ChayimFriedman2/naked-asm-safe
fix: Inline asm fixes
This commit is contained in:
commit
e9968fc555
28 changed files with 303 additions and 84 deletions
|
|
@ -10,7 +10,7 @@ use tt::TextRange;
|
|||
|
||||
use crate::{
|
||||
expr_store::lower::{ExprCollector, FxIndexSet},
|
||||
hir::{AsmOperand, AsmOptions, Expr, ExprId, InlineAsm, InlineAsmRegOrRegClass},
|
||||
hir::{AsmOperand, AsmOptions, Expr, ExprId, InlineAsm, InlineAsmKind, InlineAsmRegOrRegClass},
|
||||
};
|
||||
|
||||
impl ExprCollector<'_> {
|
||||
|
|
@ -269,8 +269,17 @@ impl ExprCollector<'_> {
|
|||
}
|
||||
})
|
||||
};
|
||||
|
||||
let kind = if asm.global_asm_token().is_some() {
|
||||
InlineAsmKind::GlobalAsm
|
||||
} else if asm.naked_asm_token().is_some() {
|
||||
InlineAsmKind::NakedAsm
|
||||
} else {
|
||||
InlineAsmKind::Asm
|
||||
};
|
||||
|
||||
let idx = self.alloc_expr(
|
||||
Expr::InlineAsm(InlineAsm { operands: operands.into_boxed_slice(), options }),
|
||||
Expr::InlineAsm(InlineAsm { operands: operands.into_boxed_slice(), options, kind }),
|
||||
syntax_ptr,
|
||||
);
|
||||
self.source_map
|
||||
|
|
|
|||
|
|
@ -332,6 +332,17 @@ pub struct OffsetOf {
|
|||
pub struct InlineAsm {
|
||||
pub operands: Box<[(Option<Name>, AsmOperand)]>,
|
||||
pub options: AsmOptions,
|
||||
pub kind: InlineAsmKind,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub enum InlineAsmKind {
|
||||
/// `asm!()`.
|
||||
Asm,
|
||||
/// `global_asm!()`.
|
||||
GlobalAsm,
|
||||
/// `naked_asm!()`.
|
||||
NakedAsm,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
|
||||
|
|
|
|||
|
|
@ -143,6 +143,8 @@ impl<'a> Ctx<'a> {
|
|||
ast::Item::MacroRules(ast) => self.lower_macro_rules(ast)?.into(),
|
||||
ast::Item::MacroDef(ast) => self.lower_macro_def(ast)?.into(),
|
||||
ast::Item::ExternBlock(ast) => self.lower_extern_block(ast).into(),
|
||||
// FIXME: Handle `global_asm!()`.
|
||||
ast::Item::AsmExpr(_) => return None,
|
||||
};
|
||||
let attrs = RawAttrs::new(self.db, item, self.span_map());
|
||||
self.add_attrs(mod_item.ast_id(), attrs);
|
||||
|
|
|
|||
|
|
@ -35,10 +35,10 @@ use a::{c, d::{e}};
|
|||
#![no_std]
|
||||
#![doc = " another file comment"]
|
||||
|
||||
// AstId: ExternCrate[5A82, 0]
|
||||
// AstId: ExternCrate[070B, 0]
|
||||
pub(self) extern crate self as renamed;
|
||||
|
||||
// AstId: ExternCrate[7E1C, 0]
|
||||
// AstId: ExternCrate[1EA5, 0]
|
||||
pub(in super) extern crate bli;
|
||||
|
||||
// AstId: Use[0000, 0]
|
||||
|
|
@ -78,15 +78,15 @@ extern "C" {
|
|||
// AstId: ExternBlock[0000, 0]
|
||||
extern {
|
||||
#[on_extern_type]
|
||||
// AstId: TypeAlias[9FDF, 0]
|
||||
// AstId: TypeAlias[A09C, 0]
|
||||
pub(self) type ExType;
|
||||
|
||||
#[on_extern_static]
|
||||
// AstId: Static[43C1, 0]
|
||||
// AstId: Static[D85E, 0]
|
||||
pub(self) static EX_STATIC = _;
|
||||
|
||||
#[on_extern_fn]
|
||||
// AstId: Fn[452D, 0]
|
||||
// AstId: Fn[B240, 0]
|
||||
pub(self) fn ex_fn;
|
||||
}
|
||||
"#]],
|
||||
|
|
@ -124,20 +124,20 @@ enum E {
|
|||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
// AstId: Struct[DFF3, 0]
|
||||
// AstId: Struct[ED35, 0]
|
||||
pub(self) struct Unit;
|
||||
|
||||
#[derive(Debug)]
|
||||
// AstId: Struct[C7A1, 0]
|
||||
// AstId: Struct[A47C, 0]
|
||||
pub(self) struct Struct { ... }
|
||||
|
||||
// AstId: Struct[DAC2, 0]
|
||||
// AstId: Struct[C8C9, 0]
|
||||
pub(self) struct Tuple(...);
|
||||
|
||||
// AstId: Union[2DBB, 0]
|
||||
// AstId: Union[2797, 0]
|
||||
pub(self) union Ize { ... }
|
||||
|
||||
// AstId: Enum[7FF8, 0]
|
||||
// AstId: Enum[7D23, 0]
|
||||
pub(self) enum E { ... }
|
||||
"#]],
|
||||
);
|
||||
|
|
@ -162,18 +162,18 @@ trait Tr: SuperTrait + 'lifetime {
|
|||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
// AstId: Static[B393, 0]
|
||||
// AstId: Static[F7C1, 0]
|
||||
pub static ST = _;
|
||||
|
||||
// AstId: Const[B309, 0]
|
||||
// AstId: Const[84BB, 0]
|
||||
pub(self) const _ = _;
|
||||
|
||||
#[attr]
|
||||
#[inner_attr_in_fn]
|
||||
// AstId: Fn[75E3, 0]
|
||||
// AstId: Fn[BE8F, 0]
|
||||
pub(self) fn f;
|
||||
|
||||
// AstId: Trait[2998, 0]
|
||||
// AstId: Trait[9320, 0]
|
||||
pub(self) trait Tr { ... }
|
||||
"#]],
|
||||
);
|
||||
|
|
@ -197,16 +197,16 @@ mod outline;
|
|||
expect![[r##"
|
||||
#[doc = " outer"]
|
||||
#[doc = " inner"]
|
||||
// AstId: Module[CF93, 0]
|
||||
// AstId: Module[03AE, 0]
|
||||
pub(self) mod inline {
|
||||
// AstId: Use[0000, 0]
|
||||
pub(self) use super::*;
|
||||
|
||||
// AstId: Fn[1B26, 0]
|
||||
// AstId: Fn[2A78, 0]
|
||||
pub(self) fn fn_in_module;
|
||||
}
|
||||
|
||||
// AstId: Module[8994, 0]
|
||||
// AstId: Module[C08B, 0]
|
||||
pub(self) mod outline;
|
||||
"##]],
|
||||
);
|
||||
|
|
@ -225,13 +225,13 @@ pub macro m2() {}
|
|||
m!();
|
||||
"#,
|
||||
expect![[r#"
|
||||
// AstId: MacroRules[88CE, 0]
|
||||
// AstId: MacroRules[7E68, 0]
|
||||
macro_rules! m { ... }
|
||||
|
||||
// AstId: MacroDef[DC34, 0]
|
||||
// AstId: MacroDef[1C1E, 0]
|
||||
pub macro m2 { ... }
|
||||
|
||||
// AstId: MacroCall[612F, 0], SyntaxContextId: ROOT2024, ExpandTo: Items
|
||||
// AstId: MacroCall[7E68, 0], SyntaxContextId: ROOT2024, ExpandTo: Items
|
||||
m!(...);
|
||||
"#]],
|
||||
);
|
||||
|
|
@ -244,7 +244,7 @@ fn pub_self() {
|
|||
pub(self) struct S;
|
||||
"#,
|
||||
expect![[r#"
|
||||
// AstId: Struct[42E2, 0]
|
||||
// AstId: Struct[5024, 0]
|
||||
pub(self) struct S;
|
||||
"#]],
|
||||
)
|
||||
|
|
|
|||
|
|
@ -28,6 +28,19 @@ fn test_asm_expand() {
|
|||
r#"
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! asm {() => {}}
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! global_asm {() => {}}
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! naked_asm {() => {}}
|
||||
|
||||
global_asm! {
|
||||
""
|
||||
}
|
||||
|
||||
#[unsafe(naked)]
|
||||
extern "C" fn foo() {
|
||||
naked_asm!("");
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let i: u64 = 3;
|
||||
|
|
@ -45,6 +58,17 @@ fn main() {
|
|||
expect![[r##"
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! asm {() => {}}
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! global_asm {() => {}}
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! naked_asm {() => {}}
|
||||
|
||||
builtin #global_asm ("")
|
||||
|
||||
#[unsafe(naked)]
|
||||
extern "C" fn foo() {
|
||||
builtin #naked_asm ("");
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let i: u64 = 3;
|
||||
|
|
|
|||
|
|
@ -35,9 +35,9 @@ macro_rules! f {
|
|||
};
|
||||
}
|
||||
|
||||
struct#0:MacroRules[8C8E, 0]@58..64#14336# MyTraitMap2#0:MacroCall[D499, 0]@31..42#ROOT2024# {#0:MacroRules[8C8E, 0]@72..73#14336#
|
||||
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#
|
||||
}#0:MacroRules[8C8E, 0]@132..133#14336#
|
||||
struct#0:MacroRules[BE8F, 0]@58..64#14336# MyTraitMap2#0:MacroCall[BE8F, 0]@31..42#ROOT2024# {#0:MacroRules[BE8F, 0]@72..73#14336#
|
||||
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#
|
||||
}#0:MacroRules[BE8F, 0]@132..133#14336#
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
|
@ -75,12 +75,12 @@ macro_rules! f {
|
|||
};
|
||||
}
|
||||
|
||||
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#
|
||||
1#0:MacroCall[D499, 0]@50..51#ROOT2024#;#0:MacroCall[D499, 0]@51..52#ROOT2024#
|
||||
1.0#0:MacroCall[D499, 0]@61..64#ROOT2024#;#0:MacroCall[D499, 0]@64..65#ROOT2024#
|
||||
(#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#
|
||||
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#
|
||||
}#0:MacroCall[D499, 0]@110..111#ROOT2024#
|
||||
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#
|
||||
1#0:MacroCall[BE8F, 0]@50..51#ROOT2024#;#0:MacroCall[BE8F, 0]@51..52#ROOT2024#
|
||||
1.0#0:MacroCall[BE8F, 0]@61..64#ROOT2024#;#0:MacroCall[BE8F, 0]@64..65#ROOT2024#
|
||||
(#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#
|
||||
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#
|
||||
}#0:MacroCall[BE8F, 0]@110..111#ROOT2024#
|
||||
|
||||
|
||||
"#]],
|
||||
|
|
@ -171,7 +171,7 @@ fn main(foo: ()) {
|
|||
}
|
||||
|
||||
fn main(foo: ()) {
|
||||
/* error: unresolved macro unresolved */"helloworld!"#0:Fn[B9C7, 0]@236..321#ROOT2024#;
|
||||
/* error: unresolved macro unresolved */"helloworld!"#0:Fn[15AE, 0]@236..321#ROOT2024#;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -197,7 +197,7 @@ macro_rules! mk_struct {
|
|||
#[macro_use]
|
||||
mod foo;
|
||||
|
||||
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#
|
||||
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#
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -181,9 +181,9 @@ fn foo(&self) {
|
|||
self.0. 1;
|
||||
}
|
||||
|
||||
fn#0:Fn[4D85, 0]@45..47#ROOT2024# foo#0:Fn[4D85, 0]@48..51#ROOT2024#(#0:Fn[4D85, 0]@51..52#ROOT2024#�: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#
|
||||
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#
|
||||
}#0:Fn[4D85, 0]@76..77#ROOT2024#"#]],
|
||||
fn#0:Fn[8A31, 0]@45..47#ROOT2024# foo#0:Fn[8A31, 0]@48..51#ROOT2024#(#0:Fn[8A31, 0]@51..52#ROOT2024#�: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#
|
||||
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#
|
||||
}#0:Fn[8A31, 0]@76..77#ROOT2024#"#]],
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1052,17 +1052,6 @@ impl<'db> Scope<'db> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn resolver_for_expr(
|
||||
db: &dyn DefDatabase,
|
||||
owner: DefWithBodyId,
|
||||
expr_id: ExprId,
|
||||
) -> Resolver<'_> {
|
||||
let r = owner.resolver(db);
|
||||
let scopes = db.expr_scopes(owner);
|
||||
let scope_id = scopes.scope_for(expr_id);
|
||||
resolver_for_scope_(db, scopes, scope_id, r, owner)
|
||||
}
|
||||
|
||||
pub fn resolver_for_scope(
|
||||
db: &dyn DefDatabase,
|
||||
owner: DefWithBodyId,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue