Index: runtime/vm/code_patcher_x64.cc |
=================================================================== |
--- runtime/vm/code_patcher_x64.cc (revision 24207) |
+++ runtime/vm/code_patcher_x64.cc (working copy) |
@@ -15,72 +15,47 @@ |
namespace dart { |
-// The pattern of a Dart instance call is: |
-// 00: 48 bb imm64 mov RBX, immediate 1 |
-// 10: 49 ba imm64 mov R10, immediate 2 |
-// 20: 49 bb imm64 mov R11, target_address |
-// 30: 41 ff d3 call R11 |
-// 33: <- return_address |
-class DartCallPattern : public ValueObject { |
+// A Dart instance call passes the ic-data in RBX. |
+// The expected pattern of a dart instance call: |
+// 00: 48 bb imm64 mov RBX, ic-data |
+// 10: 49 bb imm64 mov R11, target_address |
+// 20: 41 ff d3 call R11 |
+// 23 <- return address |
+class InstanceCall : public ValueObject { |
public: |
- explicit DartCallPattern(uword return_address) |
+ explicit InstanceCall(uword return_address) |
: start_(return_address - kCallPatternSize) { |
ASSERT(IsValid(return_address)); |
- ASSERT((kCallPatternSize - 20) == Assembler::kCallExternalLabelSize); |
+ ASSERT((kCallPatternSize - 10) == Assembler::kCallExternalLabelSize); |
} |
- static const int kCallPatternSize = 33; |
+ static const int kCallPatternSize = 23; |
static bool IsValid(uword return_address) { |
uint8_t* code_bytes = |
reinterpret_cast<uint8_t*>(return_address - kCallPatternSize); |
return (code_bytes[00] == 0x48) && (code_bytes[01] == 0xBB) && |
- (code_bytes[10] == 0x49) && (code_bytes[11] == 0xBA) && |
- (code_bytes[20] == 0x49) && (code_bytes[21] == 0xBB) && |
- (code_bytes[30] == 0x41) && (code_bytes[31] == 0xFF) && |
- (code_bytes[32] == 0xD3); |
+ (code_bytes[10] == 0x49) && (code_bytes[11] == 0xBB) && |
+ (code_bytes[20] == 0x41) && (code_bytes[21] == 0xFF) && |
+ (code_bytes[22] == 0xD3); |
} |
+ RawObject* ic_data() const { |
+ return *reinterpret_cast<RawObject**>(start_ + 0 + 2); |
+ } |
+ |
uword target() const { |
- return *reinterpret_cast<uword*>(start_ + 20 + 2); |
+ return *reinterpret_cast<uword*>(start_ + 10 + 2); |
} |
void set_target(uword target) const { |
- uword* target_addr = reinterpret_cast<uword*>(start_ + 20 + 2); |
+ uword* target_addr = reinterpret_cast<uword*>(start_ + 10 + 2); |
*target_addr = target; |
- CPU::FlushICache(start_ + 20, 2 + 8); |
+ CPU::FlushICache(start_ + 10, 2 + 8); |
} |
- RawObject* immediate_one() const { |
- return *reinterpret_cast<RawObject**>(start_ + 0 + 2); |
- } |
- |
- RawObject* immediate_two() const { |
- return *reinterpret_cast<RawObject**>(start_ + 10 + 2); |
- } |
- |
private: |
uword start_; |
- DISALLOW_IMPLICIT_CONSTRUCTORS(DartCallPattern); |
-}; |
- |
- |
-// A Dart instance call passes the ic-data in RBX. |
-// The expected pattern of a dart instance call: |
-// mov RBX, ic-data |
-// mov R10, arguments_descriptor_array |
-// mov R11, target_address |
-// call R11 |
-// <- return address |
-class InstanceCall : public DartCallPattern { |
- public: |
- explicit InstanceCall(uword return_address) |
- : DartCallPattern(return_address) {} |
- |
- RawObject* ic_data() const { return immediate_one(); } |
- RawObject* arguments_descriptor() const { return immediate_two(); } |
- |
- private: |
DISALLOW_IMPLICIT_CONSTRUCTORS(InstanceCall); |
}; |
@@ -193,22 +168,18 @@ |
uword CodePatcher::GetInstanceCallAt(uword return_address, |
const Code& code, |
- ICData* ic_data, |
- Array* arguments_descriptor) { |
+ ICData* ic_data) { |
ASSERT(code.ContainsInstructionAt(return_address)); |
InstanceCall call(return_address); |
if (ic_data != NULL) { |
*ic_data ^= call.ic_data(); |
} |
- if (arguments_descriptor != NULL) { |
- *arguments_descriptor ^= call.arguments_descriptor(); |
- } |
return call.target(); |
} |
intptr_t CodePatcher::InstanceCallSizeInBytes() { |
- return DartCallPattern::kCallPatternSize; |
+ return InstanceCall::kCallPatternSize; |
} |