Index: src/assembler.h |
diff --git a/src/assembler.h b/src/assembler.h |
index df8c8a9cac32cc6243b9b0167ab7aab345e22399..357bac6e37333a5f7a8d2636365e001d7ec09b41 100644 |
--- a/src/assembler.h |
+++ b/src/assembler.h |
@@ -276,6 +276,15 @@ class Label BASE_EMBEDDED { |
enum SaveFPRegsMode { kDontSaveFPRegs, kSaveFPRegs }; |
+// Specifies whether to perform icache flush operations on RelocInfo updates. |
+// If FLUSH_ICACHE_IF_NEEDED, the icache will always be flushed if an |
+// instruction was modifed. If SKIP_ICACHE_FLUSH_IF_ATOMIC, the icache flush |
+// will be skipped if the update can be made atomically such that the CPU will |
+// execute either the complete old instruction sequence, or the complete new |
+// sequence. If SKIP_ICACHE_FLUSH the flush will always be skipped. |
+enum ICacheFlushMode { FLUSH_ICACHE_IF_NEEDED, |
+ SKIP_ICACHE_FLUSH_IF_ATOMIC, |
+ SKIP_ICACHE_FLUSH }; |
// ----------------------------------------------------------------------------- |
// Relocation information |
@@ -360,7 +369,6 @@ class RelocInfo { |
LAST_STANDARD_NONCOMPACT_ENUM = INTERNAL_REFERENCE |
}; |
- |
RelocInfo() {} |
RelocInfo(byte* pc, Mode rmode, intptr_t data, Code* host) |
@@ -468,19 +476,30 @@ class RelocInfo { |
// can only be called if IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) |
INLINE(Address target_address()); |
INLINE(void set_target_address(Address target, |
- WriteBarrierMode mode = UPDATE_WRITE_BARRIER)); |
+ WriteBarrierMode write_barrier_mode = |
+ UPDATE_WRITE_BARRIER, |
+ ICacheFlushMode icache_flush_mode = |
+ FLUSH_ICACHE_IF_NEEDED)); |
INLINE(Object* target_object()); |
INLINE(Handle<Object> target_object_handle(Assembler* origin)); |
INLINE(void set_target_object(Object* target, |
- WriteBarrierMode mode = UPDATE_WRITE_BARRIER)); |
+ WriteBarrierMode write_barrier_mode = |
+ UPDATE_WRITE_BARRIER, |
+ ICacheFlushMode icache_flush_mode = |
+ FLUSH_ICACHE_IF_NEEDED)); |
INLINE(Address target_runtime_entry(Assembler* origin)); |
INLINE(void set_target_runtime_entry(Address target, |
- WriteBarrierMode mode = |
- UPDATE_WRITE_BARRIER)); |
+ WriteBarrierMode write_barrier_mode = |
+ UPDATE_WRITE_BARRIER, |
+ ICacheFlushMode icache_flush_mode = |
+ FLUSH_ICACHE_IF_NEEDED)); |
INLINE(Cell* target_cell()); |
INLINE(Handle<Cell> target_cell_handle()); |
INLINE(void set_target_cell(Cell* cell, |
- WriteBarrierMode mode = UPDATE_WRITE_BARRIER)); |
+ WriteBarrierMode write_barrier_mode = |
+ UPDATE_WRITE_BARRIER, |
+ ICacheFlushMode icache_flush_mode = |
+ FLUSH_ICACHE_IF_NEEDED)); |
INLINE(Handle<Object> code_age_stub_handle(Assembler* origin)); |
INLINE(Code* code_age_stub()); |
INLINE(void set_code_age_stub(Code* stub)); |