mirror of
https://github.com/fluencelabs/wasmer
synced 2024-12-13 22:25:40 +00:00
Improved offsets in module using pointer size rather than fixed numbers
# Conflicts: # src/webassembly/module.rs
This commit is contained in:
parent
c0f014fc59
commit
84b9847456
@ -39,6 +39,35 @@ use super::errors::ErrorKind;
|
|||||||
use super::memory::LinearMemory;
|
use super::memory::LinearMemory;
|
||||||
use super::instance::Instance;
|
use super::instance::Instance;
|
||||||
|
|
||||||
|
/// Get the integer type used for representing pointers on this platform.
|
||||||
|
fn native_pointer_type() -> ir::Type {
|
||||||
|
if cfg!(target_pointer_width = "64") {
|
||||||
|
ir::types::I64
|
||||||
|
} else {
|
||||||
|
ir::types::I32
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Number of bytes in a native pointer.
|
||||||
|
pub fn native_pointer_size() -> i32 {
|
||||||
|
if cfg!(target_pointer_width = "64") {
|
||||||
|
8
|
||||||
|
} else {
|
||||||
|
4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /// Convert a TlsData offset into a `Offset32` for a global decl.
|
||||||
|
// fn offset32(offset: usize) -> ir::immediates::Offset32 {
|
||||||
|
// assert!(offset <= i32::max_value() as usize);
|
||||||
|
// (offset as i32).into()
|
||||||
|
// }
|
||||||
|
|
||||||
|
// /// Convert a usize offset into a `Imm64` for an iadd_imm.
|
||||||
|
// fn imm64(offset: usize) -> ir::immediates::Imm64 {
|
||||||
|
// (offset as i64).into()
|
||||||
|
// }
|
||||||
|
|
||||||
/// Compute a `ir::ExternalName` for a given wasm function index.
|
/// Compute a `ir::ExternalName` for a given wasm function index.
|
||||||
fn get_func_name(func_index: FuncIndex) -> ir::ExternalName {
|
fn get_func_name(func_index: FuncIndex) -> ir::ExternalName {
|
||||||
ir::ExternalName::user(0, func_index.index() as u32)
|
ir::ExternalName::user(0, func_index.index() as u32)
|
||||||
@ -356,7 +385,7 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> {
|
|||||||
let base_gv = func.create_global_value(ir::GlobalValueData::Load {
|
let base_gv = func.create_global_value(ir::GlobalValueData::Load {
|
||||||
base,
|
base,
|
||||||
offset: Offset32::new(table_data_offset),
|
offset: Offset32::new(table_data_offset),
|
||||||
global_type: self.pointer_type(),
|
global_type: native_pointer_type(),
|
||||||
});
|
});
|
||||||
|
|
||||||
// Load value at the (base + table_data_offset)
|
// Load value at the (base + table_data_offset)
|
||||||
@ -384,6 +413,7 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> {
|
|||||||
// however the 32-bit wasmer may be running on 64-bit arch, which means ptr_size here will
|
// however the 32-bit wasmer may be running on 64-bit arch, which means ptr_size here will
|
||||||
// be 8 bytes. That will definitely gove the wrong offset values
|
// be 8 bytes. That will definitely gove the wrong offset values
|
||||||
fn make_heap(&mut self, func: &mut ir::Function, memory_index: MemoryIndex) -> ir::Heap {
|
fn make_heap(&mut self, func: &mut ir::Function, memory_index: MemoryIndex) -> ir::Heap {
|
||||||
|
assert_eq!(memory_index, 0, "Only one WebAssembly memory supported");
|
||||||
let instance = func.create_global_value(ir::GlobalValueData::VMContext);
|
let instance = func.create_global_value(ir::GlobalValueData::VMContext);
|
||||||
let ptr_size = self.ptr_size();
|
let ptr_size = self.ptr_size();
|
||||||
|
|
||||||
@ -444,7 +474,7 @@ impl<'environment> FuncEnvironmentTrait for FuncEnvironment<'environment> {
|
|||||||
let iadd = func.create_global_value(ir::GlobalValueData::IAddImm {
|
let iadd = func.create_global_value(ir::GlobalValueData::IAddImm {
|
||||||
base: globals_base_addr,
|
base: globals_base_addr,
|
||||||
offset: Imm64::new(offset),
|
offset: Imm64::new(offset),
|
||||||
global_type: self.pointer_type(),
|
global_type: native_pointer_type(),
|
||||||
});
|
});
|
||||||
|
|
||||||
GlobalVariable::Memory {
|
GlobalVariable::Memory {
|
||||||
|
Loading…
Reference in New Issue
Block a user