Index: src/assembler.cc |
diff --git a/src/assembler.cc b/src/assembler.cc |
index c226111a17b09391801bc09eec4e0614e5a0a2d3..eaf15516858aef167bed3556dcb2ce860bd8a255 100644 |
--- a/src/assembler.cc |
+++ b/src/assembler.cc |
@@ -138,35 +138,40 @@ const char* const RelocInfo::kFillerCommentString = "DEOPTIMIZATION PADDING"; |
// ----------------------------------------------------------------------------- |
// Implementation of AssemblerBase |
-AssemblerBase::AssemblerBase(Isolate* isolate, void* buffer, int buffer_size) |
- : isolate_(isolate), |
- jit_cookie_(0), |
+AssemblerBase::IsolateData::IsolateData(Isolate* isolate) |
+ : serializer_enabled_(isolate->serializer_enabled()) |
+#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X64 |
+ , |
+ max_old_generation_size_(isolate->heap()->MaxOldGenerationSize()) |
+#endif |
+#if V8_TARGET_ARCH_X64 |
+ , |
+ code_range_start_( |
+ isolate->heap()->memory_allocator()->code_range()->start()) |
+#endif |
+{ |
+} |
+ |
+AssemblerBase::AssemblerBase(IsolateData isolate_data, void* buffer, |
+ int buffer_size) |
+ : isolate_data_(isolate_data), |
enabled_cpu_features_(0), |
emit_debug_code_(FLAG_debug_code), |
predictable_code_size_(false), |
- // We may use the assembler without an isolate. |
- serializer_enabled_(isolate && isolate->serializer_enabled()), |
constant_pool_available_(false) { |
- DCHECK_NOT_NULL(isolate); |
- if (FLAG_mask_constants_with_cookie) { |
- jit_cookie_ = isolate->random_number_generator()->NextInt(); |
- } |
own_buffer_ = buffer == NULL; |
if (buffer_size == 0) buffer_size = kMinimalBufferSize; |
DCHECK(buffer_size > 0); |
if (own_buffer_) buffer = NewArray<byte>(buffer_size); |
buffer_ = static_cast<byte*>(buffer); |
buffer_size_ = buffer_size; |
- |
pc_ = buffer_; |
} |
- |
AssemblerBase::~AssemblerBase() { |
if (own_buffer_) DeleteArray(buffer_); |
} |
- |
void AssemblerBase::FlushICache(Isolate* isolate, void* start, size_t size) { |
if (size == 0) return; |
@@ -178,10 +183,9 @@ void AssemblerBase::FlushICache(Isolate* isolate, void* start, size_t size) { |
#endif // USE_SIMULATOR |
} |
- |
-void AssemblerBase::Print() { |
+void AssemblerBase::Print(Isolate* isolate) { |
OFStream os(stdout); |
- v8::internal::Disassembler::Decode(isolate(), &os, buffer_, pc_, nullptr); |
+ v8::internal::Disassembler::Decode(isolate, &os, buffer_, pc_, nullptr); |
} |
@@ -308,54 +312,62 @@ const int kCodeWithIdTag = 0; |
const int kDeoptReasonTag = 1; |
void RelocInfo::update_wasm_memory_reference( |
- Address old_base, Address new_base, ICacheFlushMode icache_flush_mode) { |
+ Isolate* isolate, Address old_base, Address new_base, |
+ ICacheFlushMode icache_flush_mode) { |
DCHECK(IsWasmMemoryReference(rmode_)); |
DCHECK_GE(wasm_memory_reference(), old_base); |
Address updated_reference = new_base + (wasm_memory_reference() - old_base); |
// The reference is not checked here but at runtime. Validity of references |
// may change over time. |
- unchecked_update_wasm_memory_reference(updated_reference, icache_flush_mode); |
+ unchecked_update_wasm_memory_reference(isolate, updated_reference, |
+ icache_flush_mode); |
} |
-void RelocInfo::update_wasm_memory_size(uint32_t old_size, uint32_t new_size, |
+void RelocInfo::update_wasm_memory_size(Isolate* isolate, uint32_t old_size, |
+ uint32_t new_size, |
ICacheFlushMode icache_flush_mode) { |
DCHECK(IsWasmMemorySizeReference(rmode_)); |
uint32_t current_size_reference = wasm_memory_size_reference(); |
uint32_t updated_size_reference = |
new_size + (current_size_reference - old_size); |
- unchecked_update_wasm_size(updated_size_reference, icache_flush_mode); |
+ unchecked_update_wasm_size(isolate, updated_size_reference, |
+ icache_flush_mode); |
} |
void RelocInfo::update_wasm_global_reference( |
- Address old_base, Address new_base, ICacheFlushMode icache_flush_mode) { |
+ Isolate* isolate, Address old_base, Address new_base, |
+ ICacheFlushMode icache_flush_mode) { |
DCHECK(IsWasmGlobalReference(rmode_)); |
Address updated_reference; |
DCHECK_LE(old_base, wasm_global_reference()); |
updated_reference = new_base + (wasm_global_reference() - old_base); |
DCHECK_LE(new_base, updated_reference); |
- unchecked_update_wasm_memory_reference(updated_reference, icache_flush_mode); |
+ unchecked_update_wasm_memory_reference(isolate, updated_reference, |
+ icache_flush_mode); |
} |
void RelocInfo::update_wasm_function_table_size_reference( |
- uint32_t old_size, uint32_t new_size, ICacheFlushMode icache_flush_mode) { |
+ Isolate* isolate, uint32_t old_size, uint32_t new_size, |
+ ICacheFlushMode icache_flush_mode) { |
DCHECK(IsWasmFunctionTableSizeReference(rmode_)); |
uint32_t current_size_reference = wasm_function_table_size_reference(); |
uint32_t updated_size_reference = |
new_size + (current_size_reference - old_size); |
- unchecked_update_wasm_size(updated_size_reference, icache_flush_mode); |
+ unchecked_update_wasm_size(isolate, updated_size_reference, |
+ icache_flush_mode); |
} |
-void RelocInfo::set_target_address(Address target, |
+void RelocInfo::set_target_address(Isolate* isolate, Address target, |
WriteBarrierMode write_barrier_mode, |
ICacheFlushMode icache_flush_mode) { |
DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); |
- Assembler::set_target_address_at(isolate_, pc_, host_, target, |
+ Assembler::set_target_address_at(isolate, pc_, host_, target, |
icache_flush_mode); |
if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL && |
IsCodeTarget(rmode_)) { |
- Object* target_code = Code::GetCodeFromTargetAddress(target); |
- host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( |
- host(), this, HeapObject::cast(target_code)); |
+ Code* target_code = Code::GetCodeFromTargetAddress(target); |
+ host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, |
+ target_code); |
} |
} |
@@ -638,9 +650,7 @@ void RelocIterator::next() { |
done_ = true; |
} |
- |
-RelocIterator::RelocIterator(Code* code, int mode_mask) |
- : rinfo_(code->map()->GetIsolate()) { |
+RelocIterator::RelocIterator(Code* code, int mode_mask) { |
rinfo_.host_ = code; |
rinfo_.pc_ = code->instruction_start(); |
rinfo_.data_ = 0; |
@@ -663,9 +673,7 @@ RelocIterator::RelocIterator(Code* code, int mode_mask) |
next(); |
} |
- |
-RelocIterator::RelocIterator(const CodeDesc& desc, int mode_mask) |
- : rinfo_(desc.origin->isolate()) { |
+RelocIterator::RelocIterator(const CodeDesc& desc, int mode_mask) { |
rinfo_.pc_ = desc.buffer; |
rinfo_.data_ = 0; |
// Relocation info is read backwards. |
@@ -688,7 +696,7 @@ bool RelocInfo::IsPatchedDebugBreakSlotSequence() { |
} |
#ifdef DEBUG |
-bool RelocInfo::RequiresRelocation(const CodeDesc& desc) { |
+bool RelocInfo::RequiresRelocation(Isolate* isolate, const CodeDesc& desc) { |
// Ensure there are no code targets or embedded objects present in the |
// deoptimization entries, they would require relocation after code |
// generation. |
@@ -1896,13 +1904,11 @@ int ConstantPoolBuilder::Emit(Assembler* assm) { |
void Assembler::RecordDeoptReason(DeoptimizeReason reason, |
SourcePosition position, int id) { |
- if (FLAG_trace_deopt || isolate()->is_profiling()) { |
- EnsureSpace ensure_space(this); |
- RecordRelocInfo(RelocInfo::DEOPT_SCRIPT_OFFSET, position.ScriptOffset()); |
- RecordRelocInfo(RelocInfo::DEOPT_INLINING_ID, position.InliningId()); |
- RecordRelocInfo(RelocInfo::DEOPT_REASON, static_cast<int>(reason)); |
- RecordRelocInfo(RelocInfo::DEOPT_ID, id); |
- } |
+ EnsureSpace ensure_space(this); |
+ RecordRelocInfo(RelocInfo::DEOPT_SCRIPT_OFFSET, position.ScriptOffset()); |
+ RecordRelocInfo(RelocInfo::DEOPT_INLINING_ID, position.InliningId()); |
+ RecordRelocInfo(RelocInfo::DEOPT_REASON, static_cast<int>(reason)); |
+ RecordRelocInfo(RelocInfo::DEOPT_ID, id); |
} |