Support more IDE features for asm operands
This commit is contained in:
parent
f3b6965f90
commit
bdb734b63a
@ -105,7 +105,7 @@ pub struct BodySourceMap {
|
||||
// format_args!
|
||||
FxHashMap<ExprId, Vec<(syntax::TextRange, Name)>>,
|
||||
// asm!
|
||||
FxHashMap<ExprId, Vec<(syntax::TextRange, usize)>>,
|
||||
FxHashMap<ExprId, Vec<(syntax::TextRange, usize, Option<Name>)>>,
|
||||
)>,
|
||||
>,
|
||||
|
||||
@ -439,7 +439,7 @@ pub fn implicit_format_args(
|
||||
pub fn asm_template_args(
|
||||
&self,
|
||||
node: InFile<&ast::AsmExpr>,
|
||||
) -> Option<(ExprId, &[(syntax::TextRange, usize)])> {
|
||||
) -> Option<(ExprId, &[(syntax::TextRange, usize, Option<Name>)])> {
|
||||
let src = node.map(AstPtr::new).map(AstPtr::upcast::<ast::Expr>);
|
||||
let expr = self.expr_map.get(&src)?;
|
||||
Some(*expr).zip(self.template_map.as_ref()?.1.get(expr).map(std::ops::Deref::deref))
|
||||
@ -482,4 +482,13 @@ fn shrink_to_fit(&mut self) {
|
||||
diagnostics.shrink_to_fit();
|
||||
binding_definitions.shrink_to_fit();
|
||||
}
|
||||
|
||||
pub fn template_map(
|
||||
&self,
|
||||
) -> Option<&(
|
||||
FxHashMap<Idx<Expr>, Vec<(tt::TextRange, Name)>>,
|
||||
FxHashMap<Idx<Expr>, Vec<(tt::TextRange, usize, Option<Name>)>>,
|
||||
)> {
|
||||
self.template_map.as_deref()
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
use hir_expand::name::Name;
|
||||
use intern::Symbol;
|
||||
use rustc_hash::{FxHashMap, FxHashSet};
|
||||
use syntax::{
|
||||
@ -202,27 +203,30 @@ pub(super) fn lower_inline_asm(
|
||||
rustc_parse_format::Piece::NextArgument(arg) => {
|
||||
// let span = arg_spans.next();
|
||||
|
||||
let operand_idx = match arg.position {
|
||||
let (operand_idx, name) = match arg.position {
|
||||
rustc_parse_format::ArgumentIs(idx)
|
||||
| rustc_parse_format::ArgumentImplicitlyIs(idx) => {
|
||||
if idx >= operands.len()
|
||||
|| named_pos.contains_key(&idx)
|
||||
|| reg_args.contains(&idx)
|
||||
{
|
||||
None
|
||||
(None, None)
|
||||
} else {
|
||||
Some(idx)
|
||||
(Some(idx), None)
|
||||
}
|
||||
}
|
||||
rustc_parse_format::ArgumentNamed(name) => {
|
||||
let name = Symbol::intern(name);
|
||||
named_args.get(&name).copied()
|
||||
(
|
||||
named_args.get(&name).copied(),
|
||||
Some(Name::new_symbol_root(name)),
|
||||
)
|
||||
}
|
||||
};
|
||||
|
||||
if let Some(operand_idx) = operand_idx {
|
||||
if let Some(position_span) = to_span(arg.position_span) {
|
||||
mappings.push((position_span, operand_idx));
|
||||
mappings.push((position_span, operand_idx, name));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,8 +14,8 @@
|
||||
|
||||
use crate::{
|
||||
db::HirDatabase, Adt, Callee, Const, Enum, ExternCrateDecl, Field, FieldSource, Function, Impl,
|
||||
Label, LifetimeParam, LocalSource, Macro, Module, Param, SelfParam, Static, Struct, Trait,
|
||||
TraitAlias, TypeAlias, TypeOrConstParam, Union, Variant,
|
||||
InlineAsmOperand, Label, LifetimeParam, LocalSource, Macro, Module, Param, SelfParam, Static,
|
||||
Struct, Trait, TraitAlias, TypeAlias, TypeOrConstParam, Union, Variant,
|
||||
};
|
||||
|
||||
pub trait HasSource {
|
||||
@ -292,3 +292,26 @@ fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> {
|
||||
Some(self.id.lookup(db.upcast()).source(db.upcast()))
|
||||
}
|
||||
}
|
||||
|
||||
impl HasSource for InlineAsmOperand {
|
||||
type Ast = ast::AsmOperandNamed;
|
||||
fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> {
|
||||
let (_body, source_map) = db.body_with_source_map(self.owner);
|
||||
if let Ok(src) = source_map.expr_syntax(self.expr) {
|
||||
let root = src.file_syntax(db.upcast());
|
||||
return src
|
||||
.map(|ast| match ast.to_node(&root) {
|
||||
ast::Expr::AsmExpr(asm) => asm
|
||||
.asm_pieces()
|
||||
.filter_map(|it| match it {
|
||||
ast::AsmPiece::AsmOperandNamed(it) => Some(it),
|
||||
_ => None,
|
||||
})
|
||||
.nth(self.index),
|
||||
_ => None,
|
||||
})
|
||||
.transpose();
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
|
@ -5253,6 +5253,22 @@ pub struct InlineAsmOperand {
|
||||
index: usize,
|
||||
}
|
||||
|
||||
impl InlineAsmOperand {
|
||||
pub fn parent(self, _db: &dyn HirDatabase) -> DefWithBody {
|
||||
self.owner.into()
|
||||
}
|
||||
|
||||
pub fn name(&self, db: &dyn HirDatabase) -> Option<Name> {
|
||||
db.body_with_source_map(self.owner)
|
||||
.1
|
||||
.template_map()?
|
||||
.1
|
||||
.get(&self.expr)?
|
||||
.get(self.index)
|
||||
.and_then(|(_, _, name)| name.clone())
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: Document this
|
||||
#[derive(Debug)]
|
||||
pub struct Callable {
|
||||
|
@ -576,7 +576,7 @@ pub fn as_format_args_parts(
|
||||
let (owner, (expr, asm_parts)) = source_analyzer.as_asm_parts(asm.as_ref())?;
|
||||
let res = asm_parts
|
||||
.iter()
|
||||
.map(|&(range, index)| {
|
||||
.map(|&(range, index, _)| {
|
||||
(
|
||||
range + quote.end(),
|
||||
Some(Either::Right(InlineAsmOperand { owner, expr, index })),
|
||||
|
@ -913,8 +913,8 @@ pub(crate) fn resolve_offset_in_asm_template(
|
||||
let (expr, args) = body_source_map.asm_template_args(asm)?;
|
||||
Some(*def).zip(
|
||||
args.iter()
|
||||
.find(|(range, _)| range.contains_inclusive(offset))
|
||||
.map(|(range, idx)| (expr, *range, *idx)),
|
||||
.find(|(range, _, _)| range.contains_inclusive(offset))
|
||||
.map(|(range, idx, _)| (expr, *range, *idx)),
|
||||
)
|
||||
}
|
||||
|
||||
@ -944,7 +944,7 @@ pub(crate) fn as_format_args_parts<'a>(
|
||||
pub(crate) fn as_asm_parts(
|
||||
&self,
|
||||
asm: InFile<&ast::AsmExpr>,
|
||||
) -> Option<(DefWithBodyId, (ExprId, &[(TextRange, usize)]))> {
|
||||
) -> Option<(DefWithBodyId, (ExprId, &[(TextRange, usize, Option<Name>)]))> {
|
||||
let (def, _, body_source_map) = self.def.as_ref()?;
|
||||
Some(*def).zip(body_source_map.asm_template_args(asm))
|
||||
}
|
||||
|
@ -85,13 +85,13 @@ pub fn module(&self, db: &RootDatabase) -> Option<Module> {
|
||||
Definition::Label(it) => it.module(db),
|
||||
Definition::ExternCrateDecl(it) => it.module(db),
|
||||
Definition::DeriveHelper(it) => it.derive().module(db),
|
||||
Definition::InlineAsmOperand(it) => it.parent(db).module(db),
|
||||
Definition::BuiltinAttr(_)
|
||||
| Definition::BuiltinType(_)
|
||||
| Definition::BuiltinLifetime(_)
|
||||
| Definition::TupleField(_)
|
||||
| Definition::ToolModule(_)
|
||||
| Definition::InlineAsmRegOrRegClass(_)
|
||||
| Definition::InlineAsmOperand(_) => return None,
|
||||
| Definition::InlineAsmRegOrRegClass(_) => return None,
|
||||
};
|
||||
Some(module)
|
||||
}
|
||||
@ -156,7 +156,8 @@ pub fn name(&self, db: &RootDatabase) -> Option<Name> {
|
||||
Definition::ToolModule(_) => return None, // FIXME
|
||||
Definition::DeriveHelper(it) => it.name(db),
|
||||
Definition::ExternCrateDecl(it) => return it.alias_or_name(db),
|
||||
Definition::InlineAsmRegOrRegClass(_) | Definition::InlineAsmOperand(_) => return None, // FIXME
|
||||
Definition::InlineAsmRegOrRegClass(_) => return None,
|
||||
Definition::InlineAsmOperand(op) => return op.name(db),
|
||||
};
|
||||
Some(name)
|
||||
}
|
||||
|
@ -200,6 +200,7 @@ pub fn range_for_rename(self, sema: &Semantics<'_, RootDatabase>) -> Option<File
|
||||
.and_then(syn_ctx_is_root)
|
||||
}
|
||||
}
|
||||
Definition::InlineAsmOperand(it) => name_range(it, sema).and_then(syn_ctx_is_root),
|
||||
Definition::BuiltinType(_)
|
||||
| Definition::BuiltinLifetime(_)
|
||||
| Definition::BuiltinAttr(_)
|
||||
@ -207,8 +208,6 @@ pub fn range_for_rename(self, sema: &Semantics<'_, RootDatabase>) -> Option<File
|
||||
| Definition::ToolModule(_)
|
||||
| Definition::TupleField(_)
|
||||
| Definition::InlineAsmRegOrRegClass(_) => return None,
|
||||
// FIXME:
|
||||
Definition::InlineAsmOperand(_) => return None,
|
||||
// FIXME: This should be doable in theory
|
||||
Definition::DeriveHelper(_) => return None,
|
||||
};
|
||||
|
@ -319,6 +319,23 @@ fn search_scope(&self, db: &RootDatabase) -> SearchScope {
|
||||
};
|
||||
}
|
||||
|
||||
if let Definition::InlineAsmOperand(op) = self {
|
||||
let def = match op.parent(db) {
|
||||
DefWithBody::Function(f) => f.source(db).map(|src| src.syntax().cloned()),
|
||||
DefWithBody::Const(c) => c.source(db).map(|src| src.syntax().cloned()),
|
||||
DefWithBody::Static(s) => s.source(db).map(|src| src.syntax().cloned()),
|
||||
DefWithBody::Variant(v) => v.source(db).map(|src| src.syntax().cloned()),
|
||||
// FIXME: implement
|
||||
DefWithBody::InTypeConst(_) => return SearchScope::empty(),
|
||||
};
|
||||
return match def {
|
||||
Some(def) => SearchScope::file_range(
|
||||
def.as_ref().original_file_range_with_macro_call_body(db),
|
||||
),
|
||||
None => SearchScope::single_file(file_id),
|
||||
};
|
||||
}
|
||||
|
||||
if let Definition::SelfType(impl_) = self {
|
||||
return match impl_.source(db).map(|src| src.syntax().cloned()) {
|
||||
Some(def) => SearchScope::file_range(
|
||||
@ -909,7 +926,6 @@ pub fn search(&self, sink: &mut dyn FnMut(EditionedFileId, FileReference) -> boo
|
||||
let finder = &Finder::new(name);
|
||||
let include_self_kw_refs =
|
||||
self.include_self_kw_refs.as_ref().map(|ty| (ty, Finder::new("Self")));
|
||||
|
||||
for (text, file_id, search_range) in Self::scope_files(sema.db, &search_scope) {
|
||||
self.sema.db.unwind_if_cancelled();
|
||||
let tree = LazyCell::new(move || sema.parse(file_id).syntax().clone());
|
||||
|
@ -237,15 +237,14 @@ fn try_to_nav(&self, db: &RootDatabase) -> Option<UpmappingResult<NavigationTarg
|
||||
Definition::Trait(it) => it.try_to_nav(db),
|
||||
Definition::TraitAlias(it) => it.try_to_nav(db),
|
||||
Definition::TypeAlias(it) => it.try_to_nav(db),
|
||||
Definition::ExternCrateDecl(it) => Some(it.try_to_nav(db)?),
|
||||
Definition::ExternCrateDecl(it) => it.try_to_nav(db),
|
||||
Definition::InlineAsmOperand(it) => it.try_to_nav(db),
|
||||
Definition::BuiltinLifetime(_)
|
||||
| Definition::BuiltinType(_)
|
||||
| Definition::TupleField(_)
|
||||
| Definition::ToolModule(_)
|
||||
| Definition::InlineAsmRegOrRegClass(_)
|
||||
| Definition::BuiltinAttr(_) => None,
|
||||
// FIXME
|
||||
Definition::InlineAsmOperand(_) => None,
|
||||
// FIXME: The focus range should be set to the helper declaration
|
||||
Definition::DeriveHelper(it) => it.derive().try_to_nav(db),
|
||||
}
|
||||
@ -696,6 +695,31 @@ fn try_to_nav(&self, db: &RootDatabase) -> Option<UpmappingResult<NavigationTarg
|
||||
}
|
||||
}
|
||||
|
||||
impl TryToNav for hir::InlineAsmOperand {
|
||||
fn try_to_nav(&self, db: &RootDatabase) -> Option<UpmappingResult<NavigationTarget>> {
|
||||
let InFile { file_id, value } = &self.source(db)?;
|
||||
let file_id = *file_id;
|
||||
Some(orig_range_with_focus(db, file_id, value.syntax(), value.name()).map(
|
||||
|(FileRange { file_id, range: full_range }, focus_range)| {
|
||||
let edition = self.parent(db).module(db).krate().edition(db);
|
||||
NavigationTarget {
|
||||
file_id,
|
||||
name: self
|
||||
.name(db)
|
||||
.map_or_else(|| "_".into(), |it| it.display(db, edition).to_smolstr()),
|
||||
alias: None,
|
||||
kind: Some(SymbolKind::Local),
|
||||
full_range,
|
||||
focus_range,
|
||||
container_name: None,
|
||||
description: None,
|
||||
docs: None,
|
||||
}
|
||||
},
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct UpmappingResult<T> {
|
||||
/// The macro call site.
|
||||
|
@ -2975,6 +2975,54 @@ fn test() {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn asm_operand() {
|
||||
check(
|
||||
"bose",
|
||||
r#"
|
||||
//- minicore: asm
|
||||
fn test() {
|
||||
core::arch::asm!(
|
||||
"push {base}",
|
||||
base$0 = const 0
|
||||
);
|
||||
}
|
||||
"#,
|
||||
r#"
|
||||
fn test() {
|
||||
core::arch::asm!(
|
||||
"push {bose}",
|
||||
bose = const 0
|
||||
);
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn asm_operand2() {
|
||||
check(
|
||||
"bose",
|
||||
r#"
|
||||
//- minicore: asm
|
||||
fn test() {
|
||||
core::arch::asm!(
|
||||
"push {base$0}",
|
||||
base = const 0
|
||||
);
|
||||
}
|
||||
"#,
|
||||
r#"
|
||||
fn test() {
|
||||
core::arch::asm!(
|
||||
"push {bose}",
|
||||
bose = const 0
|
||||
);
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rename_path_inside_use_tree() {
|
||||
check(
|
||||
|
@ -50,17 +50,17 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
|
||||
<span class="keyword">let</span> <span class="variable declaration">foo</span> <span class="operator">=</span> <span class="numeric_literal">1</span><span class="semicolon">;</span>
|
||||
<span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable declaration mutable">o</span> <span class="operator">=</span> <span class="numeric_literal">0</span><span class="semicolon">;</span>
|
||||
<span class="module crate_root default_library library">core</span><span class="operator">::</span><span class="module default_library library">arch</span><span class="operator">::</span><span class="macro default_library library unsafe">asm</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span>
|
||||
<span class="string_literal macro">"%input = </span><span class="variable library">O</span><span class="string_literal macro">pLoad _ {</span><span class="variable library">0</span><span class="string_literal macro">}"</span><span class="comma macro">,</span>
|
||||
<span class="string_literal macro">"%input = </span><span class="variable">O</span><span class="string_literal macro">pLoad _ {</span><span class="variable">0</span><span class="string_literal macro">}"</span><span class="comma macro">,</span>
|
||||
<span class="macro default_library library macro">concat</span><span class="macro_bang macro">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"%result = "</span><span class="comma macro">,</span> <span class="string_literal macro">"bar"</span><span class="comma macro">,</span> <span class="string_literal macro">" _ %input"</span><span class="parenthesis macro">)</span><span class="comma macro">,</span>
|
||||
<span class="string_literal macro">"OpStore {</span><span class="variable library">1</span><span class="string_literal macro">} %result</span><span class="variable library">"</span><span class="comma macro">,</span>
|
||||
<span class="string_literal macro">"OpStore {</span><span class="variable">1</span><span class="string_literal macro">} %result</span><span class="variable">"</span><span class="comma macro">,</span>
|
||||
<span class="keyword control macro">in</span><span class="parenthesis macro">(</span><span class="reg library macro">reg</span><span class="parenthesis macro">)</span> <span class="operator macro">&</span><span class="variable macro">foo</span><span class="comma macro">,</span>
|
||||
<span class="keyword control macro">in</span><span class="parenthesis macro">(</span><span class="reg library macro">reg</span><span class="parenthesis macro">)</span> <span class="operator macro">&</span><span class="keyword macro">mut</span> <span class="variable macro mutable">o</span><span class="comma macro">,</span>
|
||||
<span class="parenthesis macro">)</span><span class="semicolon">;</span>
|
||||
|
||||
<span class="keyword">let</span> <span class="variable declaration">thread_id</span><span class="colon">:</span> <span class="builtin_type">usize</span><span class="semicolon">;</span>
|
||||
<span class="module crate_root default_library library">core</span><span class="operator">::</span><span class="module default_library library">arch</span><span class="operator">::</span><span class="macro default_library library unsafe">asm</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"
|
||||
mov {</span><span class="variable library">0</span><span class="string_literal macro">}, gs:[0x30]
|
||||
mov {</span><span class="variable library">0</span><span class="string_literal macro">}, [{</span><span class="variable library">0</span><span class="string_literal macro">}+0x48]
|
||||
mov {</span><span class="variable">0</span><span class="string_literal macro">}, gs:[0x30]
|
||||
mov {</span><span class="variable">0</span><span class="string_literal macro">}, [{</span><span class="variable">0</span><span class="string_literal macro">}+0x48]
|
||||
"</span><span class="comma macro">,</span> <span class="keyword macro">out</span><span class="parenthesis macro">(</span><span class="reg library macro">reg</span><span class="parenthesis macro">)</span> <span class="variable macro">thread_id</span><span class="comma macro">,</span> <span class="keyword macro">options</span><span class="parenthesis macro">(</span><span class="keyword macro">pure</span><span class="comma macro">,</span> <span class="keyword macro">readonly</span><span class="comma macro">,</span> <span class="keyword macro">nostack</span><span class="parenthesis macro">)</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
|
||||
|
||||
<span class="keyword">static</span> <span class="static declaration">UNMAP_BASE</span><span class="colon">:</span> <span class="builtin_type">usize</span><span class="semicolon">;</span>
|
||||
@ -69,28 +69,28 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
|
||||
<span class="keyword const">const</span> <span class="constant const declaration">OffPtr</span><span class="colon">:</span> <span class="builtin_type">usize</span><span class="semicolon">;</span>
|
||||
<span class="keyword const">const</span> <span class="constant const declaration">OffFn</span><span class="colon">:</span> <span class="builtin_type">usize</span><span class="semicolon">;</span>
|
||||
<span class="module crate_root default_library library">core</span><span class="operator">::</span><span class="module default_library library">arch</span><span class="operator">::</span><span class="macro default_library library unsafe">asm</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"
|
||||
push {</span><span class="variable library">free_type</span><span class="string_literal macro">}
|
||||
push {</span><span class="variable library">free_size</span><span class="string_literal macro">}
|
||||
push {</span><span class="variable library">base</span><span class="string_literal macro">}
|
||||
push {</span><span class="variable">free_type</span><span class="string_literal macro">}
|
||||
push {</span><span class="variable">free_size</span><span class="string_literal macro">}
|
||||
push {</span><span class="variable">base</span><span class="string_literal macro">}
|
||||
|
||||
mov eax, fs:[30h]
|
||||
mov eax, [eax+8h]
|
||||
add eax, {</span><span class="variable library">off_fn</span><span class="string_literal macro">}
|
||||
mov [eax-{</span><span class="variable library">off_fn</span><span class="string_literal macro">}+{</span><span class="variable library">off_ptr</span><span class="string_literal macro">}], eax
|
||||
add eax, {</span><span class="variable">off_fn</span><span class="string_literal macro">}
|
||||
mov [eax-{</span><span class="variable">off_fn</span><span class="string_literal macro">}+{</span><span class="variable">off_ptr</span><span class="string_literal macro">}], eax
|
||||
|
||||
push eax
|
||||
|
||||
jmp {</span><span class="variable library">virtual_free</span><span class="string_literal macro">}
|
||||
jmp {</span><span class="variable">virtual_free</span><span class="string_literal macro">}
|
||||
"</span><span class="comma macro">,</span>
|
||||
<span class="variable declaration library macro">off_ptr</span> <span class="operator macro">=</span> <span class="keyword macro">const</span> <span class="constant const macro">OffPtr</span><span class="comma macro">,</span>
|
||||
<span class="variable declaration library macro">off_fn</span> <span class="operator macro">=</span> <span class="keyword macro">const</span> <span class="constant const macro">OffFn</span><span class="comma macro">,</span>
|
||||
<span class="variable declaration macro">off_ptr</span> <span class="operator macro">=</span> <span class="keyword macro">const</span> <span class="constant const macro">OffPtr</span><span class="comma macro">,</span>
|
||||
<span class="variable declaration macro">off_fn</span> <span class="operator macro">=</span> <span class="keyword macro">const</span> <span class="constant const macro">OffFn</span><span class="comma macro">,</span>
|
||||
|
||||
<span class="variable declaration library macro">free_size</span> <span class="operator macro">=</span> <span class="keyword macro">const</span> <span class="numeric_literal macro">0</span><span class="comma macro">,</span>
|
||||
<span class="variable declaration library macro">free_type</span> <span class="operator macro">=</span> <span class="keyword macro">const</span> <span class="constant const macro">MEM_RELEASE</span><span class="comma macro">,</span>
|
||||
<span class="variable declaration macro">free_size</span> <span class="operator macro">=</span> <span class="keyword macro">const</span> <span class="numeric_literal macro">0</span><span class="comma macro">,</span>
|
||||
<span class="variable declaration macro">free_type</span> <span class="operator macro">=</span> <span class="keyword macro">const</span> <span class="constant const macro">MEM_RELEASE</span><span class="comma macro">,</span>
|
||||
|
||||
<span class="variable declaration library macro">virtual_free</span> <span class="operator macro">=</span> <span class="keyword macro">sym</span> <span class="static macro">VirtualFree</span><span class="comma macro">,</span>
|
||||
<span class="variable declaration macro">virtual_free</span> <span class="operator macro">=</span> <span class="keyword macro">sym</span> <span class="static macro">VirtualFree</span><span class="comma macro">,</span>
|
||||
|
||||
<span class="variable declaration library macro">base</span> <span class="operator macro">=</span> <span class="keyword macro">sym</span> <span class="static macro">UNMAP_BASE</span><span class="comma macro">,</span>
|
||||
<span class="variable declaration macro">base</span> <span class="operator macro">=</span> <span class="keyword macro">sym</span> <span class="static macro">UNMAP_BASE</span><span class="comma macro">,</span>
|
||||
<span class="keyword macro">options</span><span class="parenthesis macro">(</span><span class="keyword macro">noreturn</span><span class="parenthesis macro">)</span><span class="comma macro">,</span>
|
||||
<span class="parenthesis macro">)</span><span class="semicolon">;</span>
|
||||
<span class="brace">}</span>
|
||||
|
@ -166,8 +166,8 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
|
||||
<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>
|
||||
<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>
|
||||
<span class="module crate_root default_library library">core</span><span class="operator">::</span><span class="module default_library library">arch</span><span class="operator">::</span><span class="macro default_library library unsafe">asm</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span>
|
||||
<span class="string_literal macro">"mov {</span><span class="variable library">0</span><span class="string_literal macro">}, {</span><span class="variable library">1</span><span class="string_literal macro">}"</span><span class="comma macro">,</span>
|
||||
<span class="string_literal macro">"add {</span><span class="variable library">0</span><span class="string_literal macro">}, 5</span><span class="variable library">"</span><span class="comma macro">,</span>
|
||||
<span class="string_literal macro">"mov {</span><span class="variable">0</span><span class="string_literal macro">}, {</span><span class="variable">1</span><span class="string_literal macro">}"</span><span class="comma macro">,</span>
|
||||
<span class="string_literal macro">"add {</span><span class="variable">0</span><span class="string_literal macro">}, 5</span><span class="variable">"</span><span class="comma macro">,</span>
|
||||
<span class="keyword macro">out</span><span class="parenthesis macro">(</span><span class="reg library macro">reg</span><span class="parenthesis macro">)</span> <span class="variable macro">o</span><span class="comma macro">,</span>
|
||||
<span class="keyword control macro">in</span><span class="parenthesis macro">(</span><span class="reg library macro">reg</span><span class="parenthesis macro">)</span> <span class="variable macro">i</span><span class="comma macro">,</span>
|
||||
<span class="parenthesis macro">)</span><span class="semicolon">;</span>
|
||||
|
Loading…
Reference in New Issue
Block a user