Merge pull request #2449 from bytecodealliance/cfallin/add-pre-host-hooks
Add FuncEnvironment hooks to generate prologue and epilogue code.
This commit is contained in:
@@ -104,7 +104,7 @@ impl UnwindInfoGenerator<Inst> for AArch64UnwindInfo {
|
|||||||
|
|
||||||
// TODO epilogues
|
// TODO epilogues
|
||||||
|
|
||||||
let prologue_size = if context.prologue.is_empty() {
|
let prologue_size = if context.prologue.len() == 0 {
|
||||||
0
|
0
|
||||||
} else {
|
} else {
|
||||||
context.insts_layout[context.prologue.end as usize - 1]
|
context.insts_layout[context.prologue.end as usize - 1]
|
||||||
|
|||||||
@@ -628,6 +628,26 @@ pub trait FuncEnvironment: TargetEnvironment {
|
|||||||
) -> WasmResult<()> {
|
) -> WasmResult<()> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Optional callback for the `FunctionEnvironment` performing this translation to perform work
|
||||||
|
/// before the function body is translated.
|
||||||
|
fn before_translate_function(
|
||||||
|
&mut self,
|
||||||
|
_builder: &mut FunctionBuilder,
|
||||||
|
_state: &FuncTranslationState,
|
||||||
|
) -> WasmResult<()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Optional callback for the `FunctionEnvironment` performing this translation to perform work
|
||||||
|
/// after the function body is translated.
|
||||||
|
fn after_translate_function(
|
||||||
|
&mut self,
|
||||||
|
_builder: &mut FunctionBuilder,
|
||||||
|
_state: &FuncTranslationState,
|
||||||
|
) -> WasmResult<()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An object satisfying the `ModuleEnvironment` trait can be passed as argument to the
|
/// An object satisfying the `ModuleEnvironment` trait can be passed as argument to the
|
||||||
|
|||||||
@@ -225,6 +225,7 @@ fn parse_function_body<FE: FuncEnvironment + ?Sized>(
|
|||||||
// The control stack is initialized with a single block representing the whole function.
|
// The control stack is initialized with a single block representing the whole function.
|
||||||
debug_assert_eq!(state.control_stack.len(), 1, "State not initialized");
|
debug_assert_eq!(state.control_stack.len(), 1, "State not initialized");
|
||||||
|
|
||||||
|
environ.before_translate_function(builder, state)?;
|
||||||
while !reader.eof() {
|
while !reader.eof() {
|
||||||
let pos = reader.original_position();
|
let pos = reader.original_position();
|
||||||
builder.set_srcloc(cur_srcloc(&reader));
|
builder.set_srcloc(cur_srcloc(&reader));
|
||||||
@@ -234,6 +235,7 @@ fn parse_function_body<FE: FuncEnvironment + ?Sized>(
|
|||||||
translate_operator(validator, &op, builder, state, environ)?;
|
translate_operator(validator, &op, builder, state, environ)?;
|
||||||
environ.after_translate_operator(&op, builder, state)?;
|
environ.after_translate_operator(&op, builder, state)?;
|
||||||
}
|
}
|
||||||
|
environ.after_translate_function(builder, state)?;
|
||||||
let pos = reader.original_position();
|
let pos = reader.original_position();
|
||||||
validator.finish(pos)?;
|
validator.finish(pos)?;
|
||||||
|
|
||||||
@@ -243,7 +245,6 @@ fn parse_function_body<FE: FuncEnvironment + ?Sized>(
|
|||||||
// If the exit block is unreachable, it may not have the correct arguments, so we would
|
// If the exit block is unreachable, it may not have the correct arguments, so we would
|
||||||
// generate a return instruction that doesn't match the signature.
|
// generate a return instruction that doesn't match the signature.
|
||||||
if state.reachable {
|
if state.reachable {
|
||||||
debug_assert!(builder.is_pristine());
|
|
||||||
if !builder.is_unreachable() {
|
if !builder.is_unreachable() {
|
||||||
match environ.return_mode() {
|
match environ.return_mode() {
|
||||||
ReturnMode::NormalReturns => {
|
ReturnMode::NormalReturns => {
|
||||||
|
|||||||
Reference in New Issue
Block a user