Index: src/arm/assembler-arm.cc |
diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc |
index 11684ef5aa5a73c9c8bf6045d9f6a2b4d0b8b537..186d7abd54a1d161fd3fc9e94d58735809eff92d 100644 |
--- a/src/arm/assembler-arm.cc |
+++ b/src/arm/assembler-arm.cc |
@@ -359,13 +359,13 @@ uint32_t RelocInfo::wasm_function_table_size_reference() { |
} |
void RelocInfo::unchecked_update_wasm_memory_reference( |
- Address address, ICacheFlushMode flush_mode) { |
- Assembler::set_target_address_at(isolate_, pc_, host_, address, flush_mode); |
+ Isolate* isolate, Address address, ICacheFlushMode flush_mode) { |
+ Assembler::set_target_address_at(isolate, pc_, host_, address, flush_mode); |
} |
-void RelocInfo::unchecked_update_wasm_size(uint32_t size, |
+void RelocInfo::unchecked_update_wasm_size(Isolate* isolate, uint32_t size, |
ICacheFlushMode flush_mode) { |
- Assembler::set_target_address_at(isolate_, pc_, host_, |
+ Assembler::set_target_address_at(isolate, pc_, host_, |
reinterpret_cast<Address>(size), flush_mode); |
} |
@@ -551,8 +551,8 @@ const Instr kStrRegFpNegOffsetPattern = |
al | B26 | NegOffset | Register::kCode_fp * B16; |
const Instr kLdrStrInstrTypeMask = 0xffff0000; |
-Assembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) |
- : AssemblerBase(isolate, buffer, buffer_size), |
+Assembler::Assembler(IsolateData isolate_data, void* buffer, int buffer_size) |
+ : AssemblerBase(isolate_data, buffer, buffer_size), |
recorded_ast_id_(TypeFeedbackId::None()), |
pending_32_bit_constants_(), |
pending_64_bit_constants_(), |
@@ -941,25 +941,25 @@ void Assembler::target_at_put(int pos, int target_pos) { |
if (is_uint8(target24)) { |
// If the target fits in a byte then only patch with a mov |
// instruction. |
- CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), 1, |
- CodePatcher::DONT_FLUSH); |
- patcher.masm()->mov(dst, Operand(target24)); |
+ PatchingAssembler patcher(isolate_data(), |
+ reinterpret_cast<byte*>(buffer_ + pos), 1); |
+ patcher.mov(dst, Operand(target24)); |
} else { |
uint16_t target16_0 = target24 & kImm16Mask; |
uint16_t target16_1 = target24 >> 16; |
if (CpuFeatures::IsSupported(ARMv7)) { |
// Patch with movw/movt. |
if (target16_1 == 0) { |
- CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), |
- 1, CodePatcher::DONT_FLUSH); |
- CpuFeatureScope scope(patcher.masm(), ARMv7); |
- patcher.masm()->movw(dst, target16_0); |
+ PatchingAssembler patcher(isolate_data(), |
+ reinterpret_cast<byte*>(buffer_ + pos), 1); |
+ CpuFeatureScope scope(&patcher, ARMv7); |
+ patcher.movw(dst, target16_0); |
} else { |
- CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), |
- 2, CodePatcher::DONT_FLUSH); |
- CpuFeatureScope scope(patcher.masm(), ARMv7); |
- patcher.masm()->movw(dst, target16_0); |
- patcher.masm()->movt(dst, target16_1); |
+ PatchingAssembler patcher(isolate_data(), |
+ reinterpret_cast<byte*>(buffer_ + pos), 2); |
+ CpuFeatureScope scope(&patcher, ARMv7); |
+ patcher.movw(dst, target16_0); |
+ patcher.movt(dst, target16_1); |
} |
} else { |
// Patch with a sequence of mov/orr/orr instructions. |
@@ -967,16 +967,16 @@ void Assembler::target_at_put(int pos, int target_pos) { |
uint8_t target8_1 = target16_0 >> 8; |
uint8_t target8_2 = target16_1 & kImm8Mask; |
if (target8_2 == 0) { |
- CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), |
- 2, CodePatcher::DONT_FLUSH); |
- patcher.masm()->mov(dst, Operand(target8_0)); |
- patcher.masm()->orr(dst, dst, Operand(target8_1 << 8)); |
+ PatchingAssembler patcher(isolate_data(), |
+ reinterpret_cast<byte*>(buffer_ + pos), 2); |
+ patcher.mov(dst, Operand(target8_0)); |
+ patcher.orr(dst, dst, Operand(target8_1 << 8)); |
} else { |
- CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), |
- 3, CodePatcher::DONT_FLUSH); |
- patcher.masm()->mov(dst, Operand(target8_0)); |
- patcher.masm()->orr(dst, dst, Operand(target8_1 << 8)); |
- patcher.masm()->orr(dst, dst, Operand(target8_2 << 16)); |
+ PatchingAssembler patcher(isolate_data(), |
+ reinterpret_cast<byte*>(buffer_ + pos), 3); |
+ patcher.mov(dst, Operand(target8_0)); |
+ patcher.orr(dst, dst, Operand(target8_1 << 8)); |
+ patcher.orr(dst, dst, Operand(target8_2 << 16)); |
} |
} |
} |
@@ -4998,7 +4998,7 @@ void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { |
data = RecordedAstId().ToInt(); |
ClearRecordedAstId(); |
} |
- RelocInfo rinfo(isolate(), pc_, rmode, data, NULL); |
+ RelocInfo rinfo(pc_, rmode, data, NULL); |
reloc_info_writer.Write(&rinfo); |
} |
@@ -5352,6 +5352,29 @@ void Assembler::PatchConstantPoolAccessInstruction( |
} |
} |
+PatchingAssembler::PatchingAssembler(IsolateData isolate_data, byte* address, |
+ int instructions) |
+ : Assembler(isolate_data, address, instructions * kInstrSize + kGap) { |
+ DCHECK_EQ(reloc_info_writer.pos(), buffer_ + buffer_size_); |
+} |
+ |
+PatchingAssembler::~PatchingAssembler() { |
+ // Check that we don't have any pending constant pools. |
+ DCHECK(pending_32_bit_constants_.empty()); |
+ DCHECK(pending_64_bit_constants_.empty()); |
+ |
+ // Check that the code was patched as expected. |
+ DCHECK_EQ(pc_, buffer_ + buffer_size_ - kGap); |
+ DCHECK_EQ(reloc_info_writer.pos(), buffer_ + buffer_size_); |
+} |
+ |
+void PatchingAssembler::Emit(Address addr) { |
+ emit(reinterpret_cast<Instr>(addr)); |
+} |
+ |
+void PatchingAssembler::FlushICache(Isolate* isolate) { |
+ Assembler::FlushICache(isolate, buffer_, buffer_size_ - kGap); |
+} |
} // namespace internal |
} // namespace v8 |