Index: runtime/vm/object.h |
diff --git a/runtime/vm/object.h b/runtime/vm/object.h |
index 6be932d22d556de1438fe9effe6492c2a118db16..77099904572ea038bd216bed6f55f6a2eac69619 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 = 15; |
+ static const intptr_t kUncheckedEntryOffset = 52; |
+#elif defined(TARGET_ARCH_ARM) |
+ static const intptr_t kCheckedEntryOffset = 3*4; |
Florian Schneider
2016/08/10 02:32:14
n*Instr::kInstrSize on ARM, ARM64, and MIPS.
rmacnak
2016/08/11 00:17:49
Done.
|
+ static const intptr_t kUncheckedEntryOffset = 9*4; |
+#elif defined(TARGET_ARCH_ARM64) |
+ static const intptr_t kCheckedEntryOffset = 6*4; |
+ static const intptr_t kUncheckedEntryOffset = 12*4; |
+#elif defined(TARGET_ARCH_MIPS) |
+ static const intptr_t kCheckedEntryOffset = 4*4; |
+ static const intptr_t kUncheckedEntryOffset = 14*4; |
+#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) + |
@@ -3993,7 +4028,7 @@ class Instructions : public Object { |
static RawInstructions* FromEntryPoint(uword entry_point) { |
Florian Schneider
2016/08/10 02:32:14
rename to FromUncheckedEntryPoint?
rmacnak
2016/08/11 00:17:49
Done.
|
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()); |
} |