| Index: src/wasm/wasm-code-specialization.h | 
| diff --git a/src/wasm/wasm-code-specialization.h b/src/wasm/wasm-code-specialization.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..095a65cbbc158ecb1ee3e241db9000c6ea4f3271 | 
| --- /dev/null | 
| +++ b/src/wasm/wasm-code-specialization.h | 
| @@ -0,0 +1,70 @@ | 
| +// Copyright 2017 the V8 project authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#ifndef V8_WASM_CODE_SPECIALIZATION_H_ | 
| +#define V8_WASM_CODE_SPECIALIZATION_H_ | 
| + | 
| +#include "src/assembler.h" | 
| +#include "src/identity-map.h" | 
| +#include "src/wasm/wasm-objects.h" | 
| + | 
| +namespace v8 { | 
| +namespace internal { | 
| +namespace wasm { | 
| + | 
| +// Helper class to specialize wasm code for a specific instance, or to update | 
| +// code when memory / globals / tables change. | 
| +// This class in unhandlified, and contains a DisallowHeapAllocation field to | 
| +// ensure that no allocations happen while it is alive. | 
| +// | 
| +// Set up all relocations / patching that should be performed by the Relocate* / | 
| +// Patch* methods, then apply all changes in one step using the Apply* methods. | 
| +class CodeSpecialization { | 
| + public: | 
| +  CodeSpecialization(Isolate*, Zone*); | 
| +  ~CodeSpecialization(); | 
| + | 
| +  // Update memory references. | 
| +  void RelocateMemoryReferences(Address old_start, uint32_t old_size, | 
| +                                Address new_start, uint32_t new_size); | 
| +  // Update references to global variables. | 
| +  void RelocateGlobals(Address old_start, Address new_start); | 
| +  // Update function table size. | 
| +  // TODO(wasm): Prepare this for more than one indirect function table. | 
| +  void PatchTableSize(uint32_t old_size, uint32_t new_size); | 
| +  // Update all direct call sites based on the code table in the given instance. | 
| +  void RelocateDirectCalls(Handle<WasmInstanceObject> instance); | 
| +  // Relocate an arbitrary object (e.g. function table). | 
| +  void RelocateObject(Handle<Object> old_obj, Handle<Object> new_obj); | 
| + | 
| +  // Apply all relocations and patching to all code in the instance (wasm code | 
| +  // and exported functions). | 
| +  bool ApplyToWholeInstance(WasmInstanceObject*, | 
| +                            ICacheFlushMode = FLUSH_ICACHE_IF_NEEDED); | 
| +  // Apply all relocations and patching to one wasm code object. | 
| +  bool ApplyToWasmCode(Code*, ICacheFlushMode = FLUSH_ICACHE_IF_NEEDED); | 
| + | 
| + private: | 
| +  Address old_mem_start = 0; | 
| +  uint32_t old_mem_size = 0; | 
| +  Address new_mem_start = 0; | 
| +  uint32_t new_mem_size = 0; | 
| + | 
| +  Address old_globals_start = 0; | 
| +  Address new_globals_start = 0; | 
| + | 
| +  uint32_t old_function_table_size = 0; | 
| +  uint32_t new_function_table_size = 0; | 
| + | 
| +  Handle<WasmInstanceObject> relocate_direct_calls_instance; | 
| + | 
| +  bool has_objects_to_relocate = false; | 
| +  IdentityMap<Handle<Object>> objects_to_relocate; | 
| +}; | 
| + | 
| +}  // namespace wasm | 
| +}  // namespace internal | 
| +}  // namespace v8 | 
| + | 
| +#endif  // V8_WASM_CODE_SPECIALIZATION_H_ | 
|  |