Reconstruct locations of the original source variable
This commit is contained in:
committed by
Dan Gohman
parent
d6059d4605
commit
8f95c51730
@@ -30,7 +30,7 @@ use crate::translation_utils::{FuncIndex, MemoryIndex, SignatureIndex, TableInde
|
||||
use core::{i32, u32};
|
||||
use cranelift_codegen::ir::condcodes::{FloatCC, IntCC};
|
||||
use cranelift_codegen::ir::types::*;
|
||||
use cranelift_codegen::ir::{self, InstBuilder, JumpTableData, MemFlags};
|
||||
use cranelift_codegen::ir::{self, InstBuilder, JumpTableData, MemFlags, ValueLabel};
|
||||
use cranelift_codegen::packed_option::ReservedValue;
|
||||
use cranelift_frontend::{FunctionBuilder, Variable};
|
||||
use wasmparser::{MemoryImmediate, Operator};
|
||||
@@ -57,15 +57,22 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
||||
* disappear in the Cranelift Code
|
||||
***********************************************************************************/
|
||||
Operator::GetLocal { local_index } => {
|
||||
state.push1(builder.use_var(Variable::with_u32(local_index)))
|
||||
let val = builder.use_var(Variable::with_u32(local_index));
|
||||
state.push1(val);
|
||||
let label = ValueLabel::from_u32(local_index);
|
||||
builder.set_val_label(val, label);
|
||||
}
|
||||
Operator::SetLocal { local_index } => {
|
||||
let val = state.pop1();
|
||||
builder.def_var(Variable::with_u32(local_index), val);
|
||||
let label = ValueLabel::from_u32(local_index);
|
||||
builder.set_val_label(val, label);
|
||||
}
|
||||
Operator::TeeLocal { local_index } => {
|
||||
let val = state.peek1();
|
||||
builder.def_var(Variable::with_u32(local_index), val);
|
||||
let label = ValueLabel::from_u32(local_index);
|
||||
builder.set_val_label(val, label);
|
||||
}
|
||||
/********************************** Globals ****************************************
|
||||
* `get_global` and `set_global` are handled by the environment.
|
||||
|
||||
@@ -121,16 +121,20 @@ pub struct DummyEnvironment {
|
||||
|
||||
/// How to return from functions.
|
||||
return_mode: ReturnMode,
|
||||
|
||||
/// Instructs to collect debug data during translation.
|
||||
debug_info: bool,
|
||||
}
|
||||
|
||||
impl DummyEnvironment {
|
||||
/// Creates a new `DummyEnvironment` instance.
|
||||
pub fn new(config: TargetFrontendConfig, return_mode: ReturnMode) -> Self {
|
||||
pub fn new(config: TargetFrontendConfig, return_mode: ReturnMode, debug_info: bool) -> Self {
|
||||
Self {
|
||||
info: DummyModuleInfo::new(config),
|
||||
trans: FuncTranslator::new(),
|
||||
func_bytecode_sizes: Vec::new(),
|
||||
return_mode,
|
||||
debug_info,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -482,6 +486,9 @@ impl<'data> ModuleEnvironment<'data> for DummyEnvironment {
|
||||
let name = get_func_name(func_index);
|
||||
let sig = func_environ.vmctx_sig(self.get_func_type(func_index));
|
||||
let mut func = ir::Function::with_name_signature(name, sig);
|
||||
if self.debug_info {
|
||||
func.collect_debug_info();
|
||||
}
|
||||
self.trans
|
||||
.translate(body_bytes, body_offset, &mut func, &mut func_environ)?;
|
||||
func
|
||||
|
||||
@@ -7,8 +7,9 @@
|
||||
use crate::code_translator::translate_operator;
|
||||
use crate::environ::{FuncEnvironment, ReturnMode, WasmError, WasmResult};
|
||||
use crate::state::TranslationState;
|
||||
use crate::translation_utils::get_vmctx_value_label;
|
||||
use cranelift_codegen::entity::EntityRef;
|
||||
use cranelift_codegen::ir::{self, Ebb, InstBuilder};
|
||||
use cranelift_codegen::ir::{self, Ebb, InstBuilder, ValueLabel};
|
||||
use cranelift_codegen::timing;
|
||||
use cranelift_frontend::{FunctionBuilder, FunctionBuilderContext, Variable};
|
||||
use log::info;
|
||||
@@ -84,6 +85,7 @@ impl FuncTranslator {
|
||||
|
||||
// This clears the `FunctionBuilderContext`.
|
||||
let mut builder = FunctionBuilder::new(func, &mut self.func_ctx);
|
||||
builder.set_srcloc(cur_srcloc(&reader));
|
||||
let entry_block = builder.create_ebb();
|
||||
builder.append_ebb_params_for_function_params(entry_block);
|
||||
builder.switch_to_block(entry_block); // This also creates values for the arguments.
|
||||
@@ -127,6 +129,10 @@ fn declare_wasm_parameters(builder: &mut FunctionBuilder, entry_block: Ebb) -> u
|
||||
let param_value = builder.ebb_params(entry_block)[i];
|
||||
builder.def_var(local, param_value);
|
||||
}
|
||||
if param_type.purpose == ir::ArgumentPurpose::VMContext {
|
||||
let param_value = builder.ebb_params(entry_block)[i];
|
||||
builder.set_val_label(param_value, get_vmctx_value_label());
|
||||
}
|
||||
}
|
||||
|
||||
next_local
|
||||
@@ -177,6 +183,7 @@ fn declare_locals(
|
||||
let local = Variable::new(*next_local);
|
||||
builder.declare_var(local, ty);
|
||||
builder.def_var(local, zeroval);
|
||||
builder.set_val_label(zeroval, ValueLabel::new(*next_local));
|
||||
*next_local += 1;
|
||||
}
|
||||
Ok(())
|
||||
@@ -265,6 +272,7 @@ mod tests {
|
||||
pointer_width: PointerWidth::U64,
|
||||
},
|
||||
ReturnMode::NormalReturns,
|
||||
false,
|
||||
);
|
||||
|
||||
let mut ctx = Context::new();
|
||||
@@ -304,6 +312,7 @@ mod tests {
|
||||
pointer_width: PointerWidth::U64,
|
||||
},
|
||||
ReturnMode::NormalReturns,
|
||||
false,
|
||||
);
|
||||
let mut ctx = Context::new();
|
||||
|
||||
@@ -351,6 +360,7 @@ mod tests {
|
||||
pointer_width: PointerWidth::U64,
|
||||
},
|
||||
ReturnMode::NormalReturns,
|
||||
false,
|
||||
);
|
||||
let mut ctx = Context::new();
|
||||
|
||||
|
||||
@@ -64,9 +64,9 @@ pub use crate::environ::{
|
||||
pub use crate::func_translator::FuncTranslator;
|
||||
pub use crate::module_translator::translate_module;
|
||||
pub use crate::translation_utils::{
|
||||
DefinedFuncIndex, DefinedGlobalIndex, DefinedMemoryIndex, DefinedTableIndex, FuncIndex, Global,
|
||||
GlobalIndex, GlobalInit, Memory, MemoryIndex, SignatureIndex, Table, TableElementType,
|
||||
TableIndex,
|
||||
get_vmctx_value_label, DefinedFuncIndex, DefinedGlobalIndex, DefinedMemoryIndex,
|
||||
DefinedTableIndex, FuncIndex, Global, GlobalIndex, GlobalInit, Memory, MemoryIndex,
|
||||
SignatureIndex, Table, TableElementType, TableIndex,
|
||||
};
|
||||
|
||||
/// Version number of this crate.
|
||||
|
||||
@@ -140,3 +140,9 @@ pub fn num_return_values(ty: wasmparser::Type) -> usize {
|
||||
_ => panic!("unsupported return value type"),
|
||||
}
|
||||
}
|
||||
|
||||
/// Special VMContext value label. It is tracked as 0xffff_fffe label.
|
||||
pub fn get_vmctx_value_label() -> ir::ValueLabel {
|
||||
const VMCTX_LABEL: u32 = 0xffff_fffe;
|
||||
ir::ValueLabel::from_u32(VMCTX_LABEL)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user