Index: src/compiler/wasm-compiler.cc |
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc |
index b14e0844fc413a402e43e19f7ffb894e8dcc7469..b276bb40bc64591d964a9fd26782bbb841e3252b 100644 |
--- a/src/compiler/wasm-compiler.cc |
+++ b/src/compiler/wasm-compiler.cc |
@@ -180,7 +180,8 @@ class WasmTrapHelper : public ZoneObject { |
Builtins::Name GetBuiltinIdForTrap(wasm::TrapReason reason) { |
bool in_cctest = |
- !builder_->module_ || builder_->module_->instance->context.is_null(); |
+ !builder_->module_ || (builder_->module_->instance && |
+ builder_->module_->instance->context.is_null()); |
if (in_cctest) { |
// We use Builtins::builtin_count as a marker to tell the code generator |
// to generate a call to a testing c-function instead of a runtime |
@@ -487,7 +488,8 @@ void WasmGraphBuilder::StackCheck(wasm::WasmCodePosition position, |
Node** effect, Node** control) { |
if (FLAG_wasm_no_stack_checks) return; |
// We do not generate stack checks for cctests. |
- if (!module_ || module_->instance->context.is_null()) return; |
+ if (!module_ || (module_->instance && module_->instance->context.is_null())) |
+ return; |
if (effect == nullptr) effect = effect_; |
if (control == nullptr) control = control_; |
@@ -1796,6 +1798,11 @@ Node* WasmGraphBuilder::BuildFloatToIntConversionInstruction( |
} |
Node* WasmGraphBuilder::GrowMemory(Node* input) { |
+ // GrowMemory will not be called from asm.js, hence we cannot be in |
+ // lazy-compilation mode, hence the instance will be set. |
+ DCHECK_NOT_NULL(module_); |
+ DCHECK_NOT_NULL(module_->instance); |
+ |
Diamond check_input_range( |
graph(), jsgraph()->common(), |
graph()->NewNode(jsgraph()->machine()->Uint32LessThanOrEqual(), input, |
@@ -2286,7 +2293,9 @@ Node* WasmGraphBuilder::CallDirect(uint32_t index, Node** args, Node*** rets, |
DCHECK_NULL(args[0]); |
// Add code object as constant. |
- Handle<Code> code = module_->GetFunctionCode(index); |
+ Handle<Code> code = module_->instance |
+ ? module_->GetFunctionCode(index) |
+ : jsgraph()->isolate()->builtins()->Illegal(); |
DCHECK(!code.is_null()); |
args[0] = HeapConstant(code); |
wasm::FunctionSig* sig = module_->GetFunctionSignature(index); |
@@ -2298,7 +2307,7 @@ Node* WasmGraphBuilder::CallIndirect(uint32_t sig_index, Node** args, |
Node*** rets, |
wasm::WasmCodePosition position) { |
DCHECK_NOT_NULL(args[0]); |
- DCHECK(module_ && module_->instance); |
+ DCHECK_NOT_NULL(module_); |
// Assume only one table for now. |
uint32_t table_index = 0; |
@@ -3043,22 +3052,28 @@ void WasmGraphBuilder::BuildWasmInterpreterEntry( |
} |
Node* WasmGraphBuilder::MemBuffer(uint32_t offset) { |
- DCHECK(module_ && module_->instance); |
+ DCHECK_NOT_NULL(module_); |
+ uintptr_t mem_start = reinterpret_cast<uintptr_t>( |
+ module_->instance ? module_->instance->mem_start : nullptr); |
if (offset == 0) { |
if (!mem_buffer_) { |
mem_buffer_ = jsgraph()->RelocatableIntPtrConstant( |
- reinterpret_cast<uintptr_t>(module_->instance->mem_start), |
- RelocInfo::WASM_MEMORY_REFERENCE); |
+ mem_start, RelocInfo::WASM_MEMORY_REFERENCE); |
} |
return mem_buffer_; |
} else { |
return jsgraph()->RelocatableIntPtrConstant( |
- reinterpret_cast<uintptr_t>(module_->instance->mem_start + offset), |
- RelocInfo::WASM_MEMORY_REFERENCE); |
+ mem_start + offset, RelocInfo::WASM_MEMORY_REFERENCE); |
} |
} |
Node* WasmGraphBuilder::CurrentMemoryPages() { |
+ // CurrentMemoryPages will not be called from asm.js, hence we cannot be in |
+ // lazy-compilation mode, hence the instance will be set. |
+ DCHECK_EQ(wasm::kWasmOrigin, module_->module->origin); |
+ DCHECK_NOT_NULL(module_); |
+ DCHECK_NOT_NULL(module_->instance); |
+ |
Runtime::FunctionId function_id = Runtime::kWasmMemorySize; |
const Runtime::Function* function = Runtime::FunctionForId(function_id); |
CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( |
@@ -3092,11 +3107,14 @@ Node* WasmGraphBuilder::MemSize() { |
void WasmGraphBuilder::EnsureFunctionTableNodes() { |
if (function_tables_.size() > 0) return; |
- size_t tables_size = module_->instance->function_tables.size(); |
- DCHECK(tables_size == module_->instance->signature_tables.size()); |
+ size_t tables_size = module_->module->function_tables.size(); |
+ if (module_->instance) { |
+ DCHECK_EQ(tables_size, module_->instance->function_tables.size()); |
+ DCHECK_EQ(tables_size, module_->instance->signature_tables.size()); |
+ } |
for (size_t i = 0; i < tables_size; ++i) { |
- auto function_handle = module_->instance->function_tables[i]; |
- auto signature_handle = module_->instance->signature_tables[i]; |
+ auto function_handle = module_->GetFunctionTableObj(i); |
+ auto signature_handle = module_->GetSignatureTableObj(i); |
DCHECK(!function_handle.is_null() && !signature_handle.is_null()); |
function_tables_.push_back(HeapConstant(function_handle)); |
signature_tables_.push_back(HeapConstant(signature_handle)); |
@@ -3110,10 +3128,12 @@ void WasmGraphBuilder::EnsureFunctionTableNodes() { |
Node* WasmGraphBuilder::GetGlobal(uint32_t index) { |
MachineType mem_type = |
wasm::WasmOpcodes::MachineTypeFor(module_->GetGlobalType(index)); |
+ byte* globals_start = |
+ module_->instance ? module_->instance->globals_start : nullptr; |
+ uintptr_t global_addr = reinterpret_cast<uintptr_t>( |
+ globals_start + module_->module->globals[index].offset); |
Node* addr = jsgraph()->RelocatableIntPtrConstant( |
- reinterpret_cast<uintptr_t>(module_->instance->globals_start + |
- module_->module->globals[index].offset), |
- RelocInfo::WASM_GLOBAL_REFERENCE); |
+ global_addr, RelocInfo::WASM_GLOBAL_REFERENCE); |
const Operator* op = jsgraph()->machine()->Load(mem_type); |
Node* node = graph()->NewNode(op, addr, jsgraph()->Int32Constant(0), *effect_, |
*control_); |
@@ -3124,8 +3144,10 @@ Node* WasmGraphBuilder::GetGlobal(uint32_t index) { |
Node* WasmGraphBuilder::SetGlobal(uint32_t index, Node* val) { |
MachineType mem_type = |
wasm::WasmOpcodes::MachineTypeFor(module_->GetGlobalType(index)); |
+ byte* globals_start = |
+ module_->instance ? module_->instance->globals_start : 0; |
Node* addr = jsgraph()->RelocatableIntPtrConstant( |
- reinterpret_cast<uintptr_t>(module_->instance->globals_start + |
+ reinterpret_cast<uintptr_t>(globals_start + |
module_->module->globals[index].offset), |
RelocInfo::WASM_GLOBAL_REFERENCE); |
const Operator* op = jsgraph()->machine()->Store( |