Index: runtime/vm/object.h |
diff --git a/runtime/vm/object.h b/runtime/vm/object.h |
index 6be932d22d556de1438fe9effe6492c2a118db16..e7fea7361703e3f4d90e712d112d5059244f59b3 100644 |
--- a/runtime/vm/object.h |
+++ b/runtime/vm/object.h |
@@ -3960,13 +3960,48 @@ class Instructions : public Object { |
public: |
intptr_t size() const { return raw_ptr()->size_; } // Excludes HeaderSize(). |
- uword EntryPoint() const { |
- return EntryPoint(raw()); |
+ uword PayloadStart() const { |
+ return PayloadStart(raw()); |
} |
- static uword EntryPoint(RawInstructions* instr) { |
+ uword UncheckedEntryPoint() const { |
+ return UncheckedEntryPoint(raw()); |
+ } |
+ uword CheckedEntryPoint() const { |
+ return CheckedEntryPoint(raw()); |
+ } |
+ static uword PayloadStart(RawInstructions* instr) { |
return reinterpret_cast<uword>(instr->ptr()) + HeaderSize(); |
} |
+#if defined(TARGET_ARCH_IA32) |
+ static const intptr_t kCheckedEntryOffset = 0; |
+ static const intptr_t kUncheckedEntryOffset = 0; |
+#elif defined(TARGET_ARCH_X64) |
+ static const intptr_t kCheckedEntryOffset = 23; |
+ static const intptr_t kUncheckedEntryOffset = 44; |
+#elif defined(TARGET_ARCH_ARM) |
+ static const intptr_t kCheckedEntryOffset = 3 * Instr::kInstrSize; |
+ static const intptr_t kUncheckedEntryOffset = 9 * Instr::kInstrSize; |
+#elif defined(TARGET_ARCH_ARM64) |
+ static const intptr_t kCheckedEntryOffset = 6 * Instr::kInstrSize; |
+ static const intptr_t kUncheckedEntryOffset = 12 * Instr::kInstrSize; |
+#elif defined(TARGET_ARCH_MIPS) |
+ static const intptr_t kCheckedEntryOffset = 4 * Instr::kInstrSize; |
+ static const intptr_t kUncheckedEntryOffset = 14 * Instr::kInstrSize; |
+#elif defined(TARGET_ARCH_DBC) |
+ static const intptr_t kCheckedEntryOffset = 0; |
+ static const intptr_t kUncheckedEntryOffset = 0; |
+#else |
+#error Missing entry offsets for current architecture |
+#endif |
+ |
+ static uword UncheckedEntryPoint(RawInstructions* instr) { |
+ return PayloadStart(instr) + kUncheckedEntryOffset; |
+ } |
+ static uword CheckedEntryPoint(RawInstructions* instr) { |
+ return PayloadStart(instr) + kCheckedEntryOffset; |
+ } |
+ |
static const intptr_t kMaxElements = (kMaxInt32 - |
(sizeof(RawInstructions) + |
sizeof(RawObject) + |
@@ -3991,9 +4026,9 @@ class Instructions : public Object { |
return Utils::RoundUp(sizeof(RawInstructions), alignment); |
} |
- static RawInstructions* FromEntryPoint(uword entry_point) { |
+ static RawInstructions* FromUncheckedEntryPoint(uword entry_point) { |
return reinterpret_cast<RawInstructions*>( |
- entry_point - HeaderSize() + kHeapObjectTag); |
+ entry_point - HeaderSize() - kUncheckedEntryOffset + kHeapObjectTag); |
} |
bool Equals(const Instructions& other) const { |
@@ -4445,6 +4480,9 @@ class Code : public Object { |
static intptr_t entry_point_offset() { |
return OFFSET_OF(RawCode, entry_point_); |
} |
+ static intptr_t checked_entry_point_offset() { |
+ return OFFSET_OF(RawCode, checked_entry_point_); |
+ } |
RawObjectPool* object_pool() const { return raw_ptr()->object_pool_; } |
static intptr_t object_pool_offset() { |
@@ -4464,8 +4502,14 @@ class Code : public Object { |
} |
void set_is_alive(bool value) const; |
- uword EntryPoint() const { |
- return Instructions::Handle(instructions()).EntryPoint(); |
+ uword PayloadStart() const { |
+ return Instructions::PayloadStart(instructions()); |
+ } |
+ uword UncheckedEntryPoint() const { |
+ return Instructions::UncheckedEntryPoint(instructions()); |
+ } |
+ uword CheckedEntryPoint() const { |
+ return Instructions::CheckedEntryPoint(instructions()); |
} |
intptr_t Size() const { |
const Instructions& instr = Instructions::Handle(instructions()); |
@@ -4476,7 +4520,7 @@ class Code : public Object { |
} |
bool ContainsInstructionAt(uword addr) const { |
const Instructions& instr = Instructions::Handle(instructions()); |
- const uword offset = addr - instr.EntryPoint(); |
+ const uword offset = addr - instr.PayloadStart(); |
return offset < static_cast<uword>(instr.size()); |
} |