Index: src/wasm/wasm-module.cc |
diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc |
index 865fc260e38eda4c72733cbec63ac303d0454de0..124ce8786d21060ed78c3f77797dcdd077638891 100644 |
--- a/src/wasm/wasm-module.cc |
+++ b/src/wasm/wasm-module.cc |
@@ -801,9 +801,37 @@ MaybeHandle<WasmCompiledModule> WasmModule::CompileFunctions( |
ret->set_module_bytes(Handle<SeqOneByteString>::cast(module_bytes_string)); |
} |
+ Handle<FixedArray> protected_instructions = |
+ PackProtectedInstructions(temp_instance.protected_instructions, factory); |
+ ret->set_protected_instructions(protected_instructions); |
+ |
return ret; |
} |
+Handle<FixedArray> WasmModule::PackProtectedInstructions( |
titzer
2016/11/16 18:06:47
I think this can also move into the compiler.
Eric Holk
2016/11/18 02:19:46
Done.
|
+ const std::vector<ProtectedInstructionList>& protected_instructions, |
+ Factory* factory) const { |
+ const int num_instructions = static_cast<int>(protected_instructions.size()); |
+ Handle<FixedArray> all_protected = |
+ factory->NewFixedArray(num_instructions, TENURED); |
+ for (int j = 0; j < num_instructions; ++j) { |
+ const ProtectedInstructionList& func = protected_instructions[j]; |
+ const int func_instructions = static_cast<int>(func.size()); |
+ Handle<FixedArray> fn_protected = |
+ factory->NewFixedArray(func_instructions * kTrapDataSize, TENURED); |
+ for (unsigned i = 0; i < func.size(); ++i) { |
+ const ProtectedInstructionData& instruction = func[i]; |
+ fn_protected->set(kTrapDataSize * i + kTrapCodeOffset, |
+ Smi::FromInt(instruction.instr_offset)); |
+ fn_protected->set(kTrapDataSize * i + kTrapLandingOffset, |
+ Smi::FromInt(instruction.landing_offset)); |
+ } |
+ |
+ all_protected->set(j, *fn_protected); |
+ } |
+ return all_protected; |
+} |
+ |
static WasmFunction* GetWasmFunctionForImportWrapper(Isolate* isolate, |
Handle<Object> target) { |
if (target->IsJSFunction()) { |
@@ -1117,6 +1145,36 @@ class WasmInstanceBuilder { |
FlushICache(isolate_, code_table); |
//-------------------------------------------------------------------------- |
+ // Unpack and notify signal handler of protected instructions. |
+ //-------------------------------------------------------------------------- |
+ { |
+ Handle<FixedArray> protected_instructions = |
+ compiled_module_->protected_instructions(); |
+ |
+ for (int i = 0; i < protected_instructions->length(); ++i) { |
+ Handle<FixedArray> fn_protect = |
+ protected_instructions->GetValueChecked<FixedArray>(isolate_, i); |
+ |
+ ProtectedInstructionList unpacked; |
+ for (int i = 0; i < fn_protect->length(); |
+ i += WasmModule::kTrapDataSize) { |
+ ProtectedInstructionData data; |
+ data.instr_offset = fn_protect |
+ ->GetValueChecked<Smi>( |
+ isolate_, i + WasmModule::kTrapCodeOffset) |
+ ->value(); |
+ data.landing_offset = |
+ fn_protect |
+ ->GetValueChecked<Smi>(isolate_, |
+ i + WasmModule::kTrapLandingOffset) |
+ ->value(); |
+ unpacked.push_back(data); |
+ } |
+ // TODO(eholk): Register the protected instruction information once the |
+ // trap handler is in place. |
+ } |
+ } |
+ |
// Set up and link the new instance. |
//-------------------------------------------------------------------------- |
{ |