From 7b51195f496fbea4be29a3d7e306aa5e23440be1 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Thu, 6 Dec 2018 17:54:10 -0500 Subject: [PATCH] Add an offset to cranelift-wasm's `GlobalVariable`. --- lib/wasm/Cargo.toml | 1 + lib/wasm/src/code_translator.rs | 9 +++++---- lib/wasm/src/environ/dummy.rs | 11 ++++------- lib/wasm/src/environ/spec.rs | 3 +++ lib/wasm/src/lib.rs | 1 + 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/wasm/Cargo.toml b/lib/wasm/Cargo.toml index 6a768c87ba..a88550d1e1 100644 --- a/lib/wasm/Cargo.toml +++ b/lib/wasm/Cargo.toml @@ -18,6 +18,7 @@ hashmap_core = { version = "0.1.9", optional = true } failure = { version = "0.1.1", default-features = false, features = ["derive"] } failure_derive = { version = "0.1.1", default-features = false } log = { version = "0.4.4", default-features = false } +cast = { version = "0.2.2" } [dev-dependencies] wabt = "0.7.0" diff --git a/lib/wasm/src/code_translator.rs b/lib/wasm/src/code_translator.rs index 8866eeef36..f62ac89f77 100644 --- a/lib/wasm/src/code_translator.rs +++ b/lib/wasm/src/code_translator.rs @@ -75,12 +75,12 @@ pub fn translate_operator( Operator::GetGlobal { global_index } => { let val = match state.get_global(builder.func, global_index, environ) { GlobalVariable::Const(val) => val, - GlobalVariable::Memory { gv, ty } => { + GlobalVariable::Memory { gv, offset, ty } => { let addr = builder.ins().global_value(environ.pointer_type(), gv); let mut flags = ir::MemFlags::new(); flags.set_notrap(); flags.set_aligned(); - builder.ins().load(ty, flags, addr, 0) + builder.ins().load(ty, flags, addr, offset) } }; state.push1(val); @@ -88,13 +88,14 @@ pub fn translate_operator( Operator::SetGlobal { global_index } => { match state.get_global(builder.func, global_index, environ) { GlobalVariable::Const(_) => panic!("global #{} is a constant", global_index), - GlobalVariable::Memory { gv, .. } => { + GlobalVariable::Memory { gv, offset, ty } => { let addr = builder.ins().global_value(environ.pointer_type(), gv); let mut flags = ir::MemFlags::new(); flags.set_notrap(); flags.set_aligned(); let val = state.pop1(); - builder.ins().store(flags, val, addr, 0); + debug_assert_eq!(ty, builder.func.dfg.value_type(val)); + builder.ins().store(flags, val, addr, offset); } } } diff --git a/lib/wasm/src/environ/dummy.rs b/lib/wasm/src/environ/dummy.rs index 70c13fd0e6..0a31b17b6a 100644 --- a/lib/wasm/src/environ/dummy.rs +++ b/lib/wasm/src/environ/dummy.rs @@ -1,6 +1,7 @@ //! "Dummy" implementations of `ModuleEnvironment` and `FuncEnvironment` for testing //! wasm translation. +use cast; use cranelift_codegen::cursor::FuncCursor; use cranelift_codegen::ir::immediates::{Offset32, Uimm64}; use cranelift_codegen::ir::types::*; @@ -169,15 +170,11 @@ impl<'dummy_environment> FuncEnvironment for DummyFuncEnvironment<'dummy_environ fn make_global(&mut self, func: &mut ir::Function, index: GlobalIndex) -> GlobalVariable { // Just create a dummy `vmctx` global. - let offset = ((index.index() * 8) as i64 + 8).into(); + let offset = cast::i32((index.index() * 8) + 8).unwrap().into(); let vmctx = func.create_global_value(ir::GlobalValueData::VMContext {}); - let iadd = func.create_global_value(ir::GlobalValueData::IAddImm { - base: vmctx, - offset, - global_type: self.pointer_type(), - }); GlobalVariable::Memory { - gv: iadd, + gv: vmctx, + offset: offset, ty: self.mod_info.globals[index].entity.ty, } } diff --git a/lib/wasm/src/environ/spec.rs b/lib/wasm/src/environ/spec.rs index ab2bc62a9f..7aeeb43c92 100644 --- a/lib/wasm/src/environ/spec.rs +++ b/lib/wasm/src/environ/spec.rs @@ -1,6 +1,7 @@ //! All the runtime support necessary for the wasm to cranelift translation is formalized by the //! traits `FunctionEnvironment` and `ModuleEnvironment`. use cranelift_codegen::cursor::FuncCursor; +use cranelift_codegen::ir::immediates::Offset32; use cranelift_codegen::ir::{self, InstBuilder}; use cranelift_codegen::isa::TargetFrontendConfig; use std::convert::From; @@ -20,6 +21,8 @@ pub enum GlobalVariable { Memory { /// The address of the global variable storage. gv: ir::GlobalValue, + /// An offset to add to the address. + offset: Offset32, /// The global variable's type. ty: ir::Type, }, diff --git a/lib/wasm/src/lib.rs b/lib/wasm/src/lib.rs index 354a62f9e8..acd63bedb4 100644 --- a/lib/wasm/src/lib.rs +++ b/lib/wasm/src/lib.rs @@ -36,6 +36,7 @@ extern crate cranelift_codegen; #[macro_use] extern crate cranelift_entity; +extern crate cast; extern crate cranelift_frontend; #[cfg(test)] extern crate target_lexicon;