Index: src/arm/assembler-arm.h |
diff --git a/src/arm/assembler-arm.h b/src/arm/assembler-arm.h |
index 25e7d7488d255390e7db9f741f8ff89223734716..a29fbff8af83b83c1cb0045f7633a44bcc823d16 100644 |
--- a/src/arm/assembler-arm.h |
+++ b/src/arm/assembler-arm.h |
@@ -695,7 +695,9 @@ class Assembler : public AssemblerBase { |
// for code generation and assumes its size to be buffer_size. If the buffer |
// is too small, a fatal error occurs. No deallocation of the buffer is done |
// upon destruction of the assembler. |
- Assembler(Isolate* isolate, void* buffer, int buffer_size); |
+ Assembler(Isolate* isolate, void* buffer, int buffer_size) |
+ : Assembler(IsolateData(isolate), buffer, buffer_size) {} |
+ Assembler(IsolateData isolate_data, void* buffer, int buffer_size); |
virtual ~Assembler(); |
// GetCode emits any pending (non-emitted) code and fills the descriptor |
@@ -735,6 +737,7 @@ class Assembler : public AssemblerBase { |
Address constant_pool)); |
// Read/Modify the code target address in the branch/call instruction at pc. |
+ // The isolate argument is unused (and may be nullptr) when skipping flushing. |
INLINE(static Address target_address_at(Address pc, Address constant_pool)); |
INLINE(static void set_target_address_at( |
Isolate* isolate, Address pc, Address constant_pool, Address target, |
@@ -1699,8 +1702,7 @@ class Assembler : public AssemblerBase { |
(reg.reg_code < LowDwVfpRegister::kMaxNumLowRegisters / 2); |
} |
- private: |
- int next_buffer_check_; // pc offset of next buffer check |
+ inline void emit(Instr x); |
// Code generation |
// The relocation writer's position is at least kGap bytes below the end of |
@@ -1709,6 +1711,25 @@ class Assembler : public AssemblerBase { |
// relocation info entries. |
static constexpr int kGap = 32; |
+ // Relocation info generation |
+ // Each relocation is encoded as a variable size value |
+ static constexpr int kMaxRelocSize = RelocInfoWriter::kMaxSize; |
+ RelocInfoWriter reloc_info_writer; |
+ |
+ // ConstantPoolEntry records are used during code generation as temporary |
+ // containers for constants and code target addresses until they are emitted |
+ // to the constant pool. These records are temporarily stored in a separate |
+ // buffer until a constant pool is emitted. |
+ // If every instruction in a long sequence is accessing the pool, we need one |
+ // pending relocation entry per instruction. |
+ |
+ // The buffers of pending constant pool entries. |
+ std::vector<ConstantPoolEntry> pending_32_bit_constants_; |
+ std::vector<ConstantPoolEntry> pending_64_bit_constants_; |
+ |
+ private: |
+ int next_buffer_check_; // pc offset of next buffer check |
+ |
// Constant pool generation |
// Pools are emitted in the instruction stream, preferably after unconditional |
// jumps or after returns from functions (in dead code locations). |
@@ -1736,31 +1757,13 @@ class Assembler : public AssemblerBase { |
int first_const_pool_32_use_; |
int first_const_pool_64_use_; |
- // Relocation info generation |
- // Each relocation is encoded as a variable size value |
- static constexpr int kMaxRelocSize = RelocInfoWriter::kMaxSize; |
- RelocInfoWriter reloc_info_writer; |
- |
- // ConstantPoolEntry records are used during code generation as temporary |
- // containers for constants and code target addresses until they are emitted |
- // to the constant pool. These records are temporarily stored in a separate |
- // buffer until a constant pool is emitted. |
- // If every instruction in a long sequence is accessing the pool, we need one |
- // pending relocation entry per instruction. |
- |
- // The buffers of pending constant pool entries. |
- std::vector<ConstantPoolEntry> pending_32_bit_constants_; |
- std::vector<ConstantPoolEntry> pending_64_bit_constants_; |
- |
ConstantPoolBuilder constant_pool_builder_; |
// The bound position, before this we cannot do instruction elimination. |
int last_bound_pos_; |
- // Code emission |
inline void CheckBuffer(); |
void GrowBuffer(); |
- inline void emit(Instr x); |
// 32-bit immediate values |
void move_32_bit_immediate(Register rd, |
@@ -1799,6 +1802,15 @@ class EnsureSpace BASE_EMBEDDED { |
INLINE(explicit EnsureSpace(Assembler* assembler)); |
}; |
+class PatchingAssembler : public Assembler { |
+ public: |
+ PatchingAssembler(IsolateData isolate_data, byte* address, int instructions); |
+ ~PatchingAssembler(); |
+ |
+ void Emit(Address addr); |
+ void FlushICache(Isolate* isolate); |
+}; |
+ |
} // namespace internal |
} // namespace v8 |