Add FuncEnvironment hooks to generate prologue and epilogue code.
In some cases, it is useful to do some work at entry to or exit from a Cranelift function translated from WebAssembly. This PR adds two optional methods to the `FuncEnvironment` trait to do just this, analogous to the pre/post-hooks on operators that already exist. This PR also includes a drive-by compilation fix due to the latest nightly wherein `.is_empty()` on a `Range` ambiguously refers to either the `Range` impl or the `ExactSizeIterator` impl and can't resolve.
This commit is contained in:
@@ -225,6 +225,7 @@ fn parse_function_body<FE: FuncEnvironment + ?Sized>(
|
||||
// The control stack is initialized with a single block representing the whole function.
|
||||
debug_assert_eq!(state.control_stack.len(), 1, "State not initialized");
|
||||
|
||||
environ.before_translate_function(builder, state)?;
|
||||
while !reader.eof() {
|
||||
let pos = reader.original_position();
|
||||
builder.set_srcloc(cur_srcloc(&reader));
|
||||
@@ -234,6 +235,7 @@ fn parse_function_body<FE: FuncEnvironment + ?Sized>(
|
||||
translate_operator(validator, &op, builder, state, environ)?;
|
||||
environ.after_translate_operator(&op, builder, state)?;
|
||||
}
|
||||
environ.after_translate_function(builder, state)?;
|
||||
let pos = reader.original_position();
|
||||
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
|
||||
// generate a return instruction that doesn't match the signature.
|
||||
if state.reachable {
|
||||
debug_assert!(builder.is_pristine());
|
||||
if !builder.is_unreachable() {
|
||||
match environ.return_mode() {
|
||||
ReturnMode::NormalReturns => {
|
||||
|
||||
Reference in New Issue
Block a user