| Index: src/wasm/wasm-module.cc
|
| diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc
|
| index 5cd89f52be12f4dc51d9bf93f0440be3be8e72e0..6f44991cf979be0404a21542e43ce0bc3e633c7e 100644
|
| --- a/src/wasm/wasm-module.cc
|
| +++ b/src/wasm/wasm-module.cc
|
| @@ -41,7 +41,6 @@ namespace base = v8::base;
|
| namespace {
|
|
|
| static const int kInvalidSigIndex = -1;
|
| -static const int kPlaceholderMarker = 1000000000;
|
|
|
| byte* raw_buffer_ptr(MaybeHandle<JSArrayBuffer> buffer, int offset) {
|
| return static_cast<byte*>(buffer.ToHandleChecked()->backing_store()) + offset;
|
| @@ -148,52 +147,12 @@ void RelocateGlobals(Handle<FixedArray> code_table, Address old_start,
|
| }
|
| }
|
|
|
| -Handle<Code> CreatePlaceholder(Factory* factory, uint32_t index,
|
| - Code::Kind kind) {
|
| - // Create a placeholder code object and encode the corresponding index in
|
| - // the {constant_pool_offset} field of the code object.
|
| - // TODO(titzer): instead of placeholders, use a reloc_info mode.
|
| - static byte buffer[] = {0, 0, 0, 0}; // fake instructions.
|
| - static CodeDesc desc = {
|
| +Handle<Code> CreatePlaceholder(Factory* factory, Code::Kind kind) {
|
| + byte buffer[] = {0, 0, 0, 0}; // fake instructions.
|
| + CodeDesc desc = {
|
| buffer, arraysize(buffer), arraysize(buffer), 0, 0, nullptr, 0, nullptr};
|
| - Handle<Code> code = factory->NewCode(desc, Code::KindField::encode(kind),
|
| - Handle<Object>::null());
|
| - code->set_constant_pool_offset(static_cast<int>(index) + kPlaceholderMarker);
|
| - return code;
|
| -}
|
| -
|
| -bool LinkFunction(Handle<Code> unlinked,
|
| - std::vector<Handle<Code>>& code_table) {
|
| - bool modified = false;
|
| - int mode_mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET);
|
| - AllowDeferredHandleDereference embedding_raw_address;
|
| - for (RelocIterator it(*unlinked, mode_mask); !it.done(); it.next()) {
|
| - RelocInfo::Mode mode = it.rinfo()->rmode();
|
| - if (RelocInfo::IsCodeTarget(mode)) {
|
| - Code* target =
|
| - Code::GetCodeFromTargetAddress(it.rinfo()->target_address());
|
| - if (target->constant_pool_offset() < kPlaceholderMarker) continue;
|
| - switch (target->kind()) {
|
| - case Code::WASM_FUNCTION: // fall through
|
| - case Code::WASM_TO_JS_FUNCTION: // fall through
|
| - case Code::JS_TO_WASM_FUNCTION: {
|
| - // Patch direct calls to placeholder code objects.
|
| - uint32_t index = target->constant_pool_offset() - kPlaceholderMarker;
|
| - Handle<Code> new_target = code_table[index];
|
| - if (target != *new_target) {
|
| - it.rinfo()->set_target_address(new_target->instruction_start(),
|
| - UPDATE_WRITE_BARRIER,
|
| - SKIP_ICACHE_FLUSH);
|
| - modified = true;
|
| - }
|
| - break;
|
| - }
|
| - default:
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - return modified;
|
| + return factory->NewCode(desc, Code::KindField::encode(kind),
|
| + Handle<Object>::null());
|
| }
|
|
|
| void FlushICache(Isolate* isolate, Handle<FixedArray> code_table) {
|
| @@ -550,7 +509,8 @@ void PatchDirectCallsAndContext(Handle<FixedArray> new_functions,
|
| continue;
|
| ++num_wasm_calls;
|
| Code* new_code = Code::cast(new_functions->get(exp.index));
|
| - DCHECK_EQ(kind, new_code->kind());
|
| + DCHECK(new_code->kind() == Code::WASM_FUNCTION ||
|
| + new_code->kind() == Code::WASM_TO_JS_FUNCTION);
|
| it.rinfo()->set_target_address(new_code->instruction_start(),
|
| UPDATE_WRITE_BARRIER, SKIP_ICACHE_FLUSH);
|
| }
|
| @@ -954,12 +914,11 @@ MaybeHandle<WasmCompiledModule> WasmModule::CompileFunctions(
|
| factory->NewFixedArray(static_cast<int>(code_table_size), TENURED);
|
|
|
| // Initialize the code table with placeholders.
|
| + Handle<Code> code_placeholder =
|
| + CreatePlaceholder(factory, Code::WASM_FUNCTION);
|
| for (uint32_t i = 0; i < functions.size(); ++i) {
|
| - Code::Kind kind = Code::WASM_FUNCTION;
|
| - if (i < num_imported_functions) kind = Code::WASM_TO_JS_FUNCTION;
|
| - Handle<Code> placeholder = CreatePlaceholder(factory, i, kind);
|
| - code_table->set(static_cast<int>(i), *placeholder);
|
| - temp_instance.function_code[i] = placeholder;
|
| + code_table->set(static_cast<int>(i), *code_placeholder);
|
| + temp_instance.function_code[i] = code_placeholder;
|
| }
|
|
|
| isolate->counters()->wasm_functions_per_module()->AddSample(
|
| @@ -990,18 +949,6 @@ MaybeHandle<WasmCompiledModule> WasmModule::CompileFunctions(
|
| RecordStats(isolate, code);
|
| }
|
|
|
| - // Link the functions in the module.
|
| - for (size_t i = FLAG_skip_compiling_wasm_funcs;
|
| - i < temp_instance.function_code.size(); ++i) {
|
| - Handle<Code> code = temp_instance.function_code[i];
|
| - bool modified = LinkFunction(code, temp_instance.function_code);
|
| - if (modified) {
|
| - // TODO(mtrofin): do we need to flush the cache here?
|
| - Assembler::FlushICache(isolate, code->instruction_start(),
|
| - code->instruction_size());
|
| - }
|
| - }
|
| -
|
| // Create heap objects for script, module bytes and asm.js offset table to be
|
| // stored in the shared module data.
|
| Handle<Script> script;
|
|
|