OLD | NEW |
1 // Copyright 2017 the V8 project authors. All rights reserved. | 1 // Copyright 2017 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/wasm/wasm-code-specialization.h" | 5 #include "src/wasm/wasm-code-specialization.h" |
6 | 6 |
7 #include "src/assembler-inl.h" | 7 #include "src/assembler-inl.h" |
8 #include "src/objects-inl.h" | 8 #include "src/objects-inl.h" |
9 #include "src/source-position-table.h" | 9 #include "src/source-position-table.h" |
10 #include "src/wasm/decoder.h" | 10 #include "src/wasm/decoder.h" |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 // There must be exactly one call to WASM_FUNCTION or WASM_TO_JS_FUNCTION. | 142 // There must be exactly one call to WASM_FUNCTION or WASM_TO_JS_FUNCTION. |
143 for (RelocIterator it(export_wrapper, | 143 for (RelocIterator it(export_wrapper, |
144 RelocInfo::ModeMask(RelocInfo::CODE_TARGET)); | 144 RelocInfo::ModeMask(RelocInfo::CODE_TARGET)); |
145 ; it.next()) { | 145 ; it.next()) { |
146 DCHECK(!it.done()); | 146 DCHECK(!it.done()); |
147 // Ignore calls to other builtins like ToNumber. | 147 // Ignore calls to other builtins like ToNumber. |
148 if (!IsAtWasmDirectCallTarget(it)) continue; | 148 if (!IsAtWasmDirectCallTarget(it)) continue; |
149 Code* new_code = Code::cast(code_table->get(exp.index)); | 149 Code* new_code = Code::cast(code_table->get(exp.index)); |
150 DCHECK(new_code->kind() == Code::WASM_FUNCTION || | 150 DCHECK(new_code->kind() == Code::WASM_FUNCTION || |
151 new_code->kind() == Code::WASM_TO_JS_FUNCTION); | 151 new_code->kind() == Code::WASM_TO_JS_FUNCTION); |
152 it.rinfo()->set_target_address(new_code->instruction_start(), | 152 it.rinfo()->set_target_address(new_code->GetIsolate(), |
| 153 new_code->instruction_start(), |
153 UPDATE_WRITE_BARRIER, SKIP_ICACHE_FLUSH); | 154 UPDATE_WRITE_BARRIER, SKIP_ICACHE_FLUSH); |
154 break; | 155 break; |
155 } | 156 } |
156 changed = true; | 157 changed = true; |
157 func_index++; | 158 func_index++; |
158 } | 159 } |
159 DCHECK_EQ(code_table->length(), func_index); | 160 DCHECK_EQ(code_table->length(), func_index); |
160 return changed; | 161 return changed; |
161 } | 162 } |
162 | 163 |
(...skipping 21 matching lines...) Expand all Loading... |
184 add_mode(reloc_objects, RelocInfo::EMBEDDED_OBJECT); | 185 add_mode(reloc_objects, RelocInfo::EMBEDDED_OBJECT); |
185 | 186 |
186 std::unique_ptr<PatchDirectCallsHelper> patch_direct_calls_helper; | 187 std::unique_ptr<PatchDirectCallsHelper> patch_direct_calls_helper; |
187 bool changed = false; | 188 bool changed = false; |
188 | 189 |
189 for (RelocIterator it(code, reloc_mode); !it.done(); it.next()) { | 190 for (RelocIterator it(code, reloc_mode); !it.done(); it.next()) { |
190 RelocInfo::Mode mode = it.rinfo()->rmode(); | 191 RelocInfo::Mode mode = it.rinfo()->rmode(); |
191 switch (mode) { | 192 switch (mode) { |
192 case RelocInfo::WASM_MEMORY_REFERENCE: | 193 case RelocInfo::WASM_MEMORY_REFERENCE: |
193 DCHECK(reloc_mem_addr); | 194 DCHECK(reloc_mem_addr); |
194 it.rinfo()->update_wasm_memory_reference(old_mem_start, new_mem_start, | 195 it.rinfo()->update_wasm_memory_reference(code->GetIsolate(), |
| 196 old_mem_start, new_mem_start, |
195 icache_flush_mode); | 197 icache_flush_mode); |
196 changed = true; | 198 changed = true; |
197 break; | 199 break; |
198 case RelocInfo::WASM_MEMORY_SIZE_REFERENCE: | 200 case RelocInfo::WASM_MEMORY_SIZE_REFERENCE: |
199 DCHECK(reloc_mem_size); | 201 DCHECK(reloc_mem_size); |
200 it.rinfo()->update_wasm_memory_size(old_mem_size, new_mem_size, | 202 it.rinfo()->update_wasm_memory_size(code->GetIsolate(), old_mem_size, |
201 icache_flush_mode); | 203 new_mem_size, icache_flush_mode); |
202 changed = true; | 204 changed = true; |
203 break; | 205 break; |
204 case RelocInfo::WASM_GLOBAL_REFERENCE: | 206 case RelocInfo::WASM_GLOBAL_REFERENCE: |
205 DCHECK(reloc_globals); | 207 DCHECK(reloc_globals); |
206 it.rinfo()->update_wasm_global_reference( | 208 it.rinfo()->update_wasm_global_reference( |
207 old_globals_start, new_globals_start, icache_flush_mode); | 209 code->GetIsolate(), old_globals_start, new_globals_start, |
| 210 icache_flush_mode); |
208 changed = true; | 211 changed = true; |
209 break; | 212 break; |
210 case RelocInfo::CODE_TARGET: { | 213 case RelocInfo::CODE_TARGET: { |
211 DCHECK(reloc_direct_calls); | 214 DCHECK(reloc_direct_calls); |
212 // Skip everything which is not a wasm call (stack checks, traps, ...). | 215 // Skip everything which is not a wasm call (stack checks, traps, ...). |
213 if (!IsAtWasmDirectCallTarget(it)) continue; | 216 if (!IsAtWasmDirectCallTarget(it)) continue; |
214 // Iterate simultaneously over the relocation information and the source | 217 // Iterate simultaneously over the relocation information and the source |
215 // position table. For each call in the reloc info, move the source | 218 // position table. For each call in the reloc info, move the source |
216 // position iterator forward to that position to find the byte offset of | 219 // position iterator forward to that position to find the byte offset of |
217 // the respective call. Then extract the call index from the module wire | 220 // the respective call. Then extract the call index from the module wire |
218 // bytes to find the new compiled function. | 221 // bytes to find the new compiled function. |
219 size_t offset = it.rinfo()->pc() - code->instruction_start(); | 222 size_t offset = it.rinfo()->pc() - code->instruction_start(); |
220 if (!patch_direct_calls_helper) { | 223 if (!patch_direct_calls_helper) { |
221 patch_direct_calls_helper.reset(new PatchDirectCallsHelper( | 224 patch_direct_calls_helper.reset(new PatchDirectCallsHelper( |
222 *relocate_direct_calls_instance, code)); | 225 *relocate_direct_calls_instance, code)); |
223 } | 226 } |
224 int byte_pos = AdvanceSourcePositionTableIterator( | 227 int byte_pos = AdvanceSourcePositionTableIterator( |
225 patch_direct_calls_helper->source_pos_it, offset); | 228 patch_direct_calls_helper->source_pos_it, offset); |
226 int called_func_index = ExtractDirectCallIndex( | 229 int called_func_index = ExtractDirectCallIndex( |
227 patch_direct_calls_helper->decoder, | 230 patch_direct_calls_helper->decoder, |
228 patch_direct_calls_helper->func_bytes + byte_pos); | 231 patch_direct_calls_helper->func_bytes + byte_pos); |
229 FixedArray* code_table = | 232 FixedArray* code_table = |
230 relocate_direct_calls_instance->compiled_module() | 233 relocate_direct_calls_instance->compiled_module() |
231 ->ptr_to_code_table(); | 234 ->ptr_to_code_table(); |
232 Code* new_code = Code::cast(code_table->get(called_func_index)); | 235 Code* new_code = Code::cast(code_table->get(called_func_index)); |
233 it.rinfo()->set_target_address(new_code->instruction_start(), | 236 it.rinfo()->set_target_address(new_code->GetIsolate(), |
| 237 new_code->instruction_start(), |
234 UPDATE_WRITE_BARRIER, icache_flush_mode); | 238 UPDATE_WRITE_BARRIER, icache_flush_mode); |
235 changed = true; | 239 changed = true; |
236 } break; | 240 } break; |
237 case RelocInfo::EMBEDDED_OBJECT: { | 241 case RelocInfo::EMBEDDED_OBJECT: { |
238 DCHECK(reloc_objects); | 242 DCHECK(reloc_objects); |
239 Object* old = it.rinfo()->target_object(); | 243 Object* old = it.rinfo()->target_object(); |
240 Handle<Object>* new_obj = objects_to_relocate.Find(old); | 244 Handle<Object>* new_obj = objects_to_relocate.Find(old); |
241 if (new_obj) { | 245 if (new_obj) { |
242 it.rinfo()->set_target_object(HeapObject::cast(**new_obj), | 246 it.rinfo()->set_target_object(HeapObject::cast(**new_obj), |
243 UPDATE_WRITE_BARRIER, | 247 UPDATE_WRITE_BARRIER, |
244 icache_flush_mode); | 248 icache_flush_mode); |
245 changed = true; | 249 changed = true; |
246 } | 250 } |
247 } break; | 251 } break; |
248 case RelocInfo::WASM_FUNCTION_TABLE_SIZE_REFERENCE: | 252 case RelocInfo::WASM_FUNCTION_TABLE_SIZE_REFERENCE: |
249 DCHECK(patch_table_size); | 253 DCHECK(patch_table_size); |
250 it.rinfo()->update_wasm_function_table_size_reference( | 254 it.rinfo()->update_wasm_function_table_size_reference( |
251 old_function_table_size, new_function_table_size, | 255 code->GetIsolate(), old_function_table_size, |
252 icache_flush_mode); | 256 new_function_table_size, icache_flush_mode); |
253 changed = true; | 257 changed = true; |
254 break; | 258 break; |
255 default: | 259 default: |
256 UNREACHABLE(); | 260 UNREACHABLE(); |
257 } | 261 } |
258 } | 262 } |
259 | 263 |
260 return changed; | 264 return changed; |
261 } | 265 } |
OLD | NEW |