Rollup merge of #101402 - saethlin:inline-asm-hook, r=oli-obk
Add a Machine hook for inline assembly I'm sketching out some support in Miri to "execute" inline assembly. I want this because there are codebases which have very simple inline assembly like hand-written syscall wrappers, and it would be nice to test such code without modification. r? ``@oli-obk``
This commit is contained in:
commit
957b44a13c
2 changed files with 21 additions and 2 deletions
|
@ -6,6 +6,7 @@ use std::borrow::{Borrow, Cow};
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
|
|
||||||
|
use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece};
|
||||||
use rustc_middle::mir;
|
use rustc_middle::mir;
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
use rustc_span::def_id::DefId;
|
use rustc_span::def_id::DefId;
|
||||||
|
@ -323,6 +324,15 @@ pub trait Machine<'mir, 'tcx>: Sized {
|
||||||
kind: Option<MemoryKind<Self::MemoryKind>>,
|
kind: Option<MemoryKind<Self::MemoryKind>>,
|
||||||
) -> InterpResult<'tcx, Cow<'b, Allocation<Self::Provenance, Self::AllocExtra>>>;
|
) -> InterpResult<'tcx, Cow<'b, Allocation<Self::Provenance, Self::AllocExtra>>>;
|
||||||
|
|
||||||
|
fn eval_inline_asm(
|
||||||
|
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
|
||||||
|
_template: &'tcx [InlineAsmTemplatePiece],
|
||||||
|
_operands: &[mir::InlineAsmOperand<'tcx>],
|
||||||
|
_options: InlineAsmOptions,
|
||||||
|
) -> InterpResult<'tcx> {
|
||||||
|
throw_unsup_format!("inline assembly is not supported")
|
||||||
|
}
|
||||||
|
|
||||||
/// Hook for performing extra checks on a memory read access.
|
/// Hook for performing extra checks on a memory read access.
|
||||||
///
|
///
|
||||||
/// Takes read-only access to the allocation so we can keep all the memory read
|
/// Takes read-only access to the allocation so we can keep all the memory read
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
|
||||||
|
use rustc_ast::ast::InlineAsmOptions;
|
||||||
use rustc_middle::ty::layout::{FnAbiOf, LayoutOf};
|
use rustc_middle::ty::layout::{FnAbiOf, LayoutOf};
|
||||||
use rustc_middle::ty::Instance;
|
use rustc_middle::ty::Instance;
|
||||||
use rustc_middle::{
|
use rustc_middle::{
|
||||||
|
@ -166,8 +167,16 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
terminator.kind
|
terminator.kind
|
||||||
),
|
),
|
||||||
|
|
||||||
// Inline assembly can't be interpreted.
|
InlineAsm { template, ref operands, options, destination, .. } => {
|
||||||
InlineAsm { .. } => throw_unsup_format!("inline assembly is not supported"),
|
M::eval_inline_asm(self, template, operands, options)?;
|
||||||
|
if options.contains(InlineAsmOptions::NORETURN) {
|
||||||
|
throw_ub_format!("returned from noreturn inline assembly");
|
||||||
|
}
|
||||||
|
self.go_to_block(
|
||||||
|
destination
|
||||||
|
.expect("InlineAsm terminators without noreturn must have a destination"),
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue