Index: src/x64/macro-assembler-x64.h |
diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h |
index 7a7f1a278ad53a5d6544b527e3568fafcac358ac..5908cefb1be8a64f69311f8e1f5388cf1ac0f49f 100644 |
--- a/src/x64/macro-assembler-x64.h |
+++ b/src/x64/macro-assembler-x64.h |
@@ -61,7 +61,7 @@ typedef Operand MemOperand; |
// Forward declaration. |
class JumpTarget; |
-class PostCallGenerator; |
+class CallWrapper; |
struct SmiIndex { |
SmiIndex(Register index_register, ScaleFactor scale) |
@@ -199,32 +199,32 @@ class MacroAssembler: public Assembler { |
const ParameterCount& expected, |
const ParameterCount& actual, |
InvokeFlag flag, |
- PostCallGenerator* post_call_generator = NULL); |
+ CallWrapper* call_wrapper = NULL); |
void InvokeCode(Handle<Code> code, |
const ParameterCount& expected, |
const ParameterCount& actual, |
RelocInfo::Mode rmode, |
InvokeFlag flag, |
- PostCallGenerator* post_call_generator = NULL); |
+ CallWrapper* call_wrapper = NULL); |
// Invoke the JavaScript function in the given register. Changes the |
// current context to the context in the function before invoking. |
void InvokeFunction(Register function, |
const ParameterCount& actual, |
InvokeFlag flag, |
- PostCallGenerator* post_call_generator = NULL); |
+ CallWrapper* call_wrapper = NULL); |
void InvokeFunction(JSFunction* function, |
const ParameterCount& actual, |
InvokeFlag flag, |
- PostCallGenerator* post_call_generator = NULL); |
+ CallWrapper* call_wrapper = NULL); |
// Invoke specified builtin JavaScript function. Adds an entry to |
// the unresolved list if the name does not resolve. |
void InvokeBuiltin(Builtins::JavaScript id, |
InvokeFlag flag, |
- PostCallGenerator* post_call_generator = NULL); |
+ CallWrapper* call_wrapper = NULL); |
// Store the function for the given builtin in the target register. |
void GetBuiltinFunction(Register target, Builtins::JavaScript id); |
@@ -626,6 +626,26 @@ class MacroAssembler: public Assembler { |
void Call(ExternalReference ext); |
void Call(Handle<Code> code_object, RelocInfo::Mode rmode); |
+ // The size of the code generated for different call instructions. |
+ int CallSize(Address destination, RelocInfo::Mode rmode) { |
+ return kCallInstructionLength; |
+ } |
+ int CallSize(ExternalReference ext) { |
+ return kCallInstructionLength; |
+ } |
+ int CallSize(Handle<Code> code_object) { |
+ // Code calls use 32-bit relative addressing. |
+ return kShortCallInstructionLength; |
+ } |
+ int CallSize(Register target) { |
+ // Opcode: REX_opt FF /2 m64 |
+ return (target.high_bit() != 0) ? 3 : 2; |
+ } |
+ int CallSize(const Operand& target) { |
+ // Opcode: REX_opt FF /2 m64 |
+ return (target.requires_rex() ? 2 : 1) + target.operand_size(); |
+ } |
+ |
// Emit call to the code we are currently generating. |
void CallSelf() { |
Handle<Code> self(reinterpret_cast<Code**>(CodeObject().location())); |
@@ -1018,7 +1038,7 @@ class MacroAssembler: public Assembler { |
Register code_register, |
LabelType* done, |
InvokeFlag flag, |
- PostCallGenerator* post_call_generator); |
+ CallWrapper* call_wrapper); |
// Activation support. |
void EnterFrame(StackFrame::Type type); |
@@ -1084,13 +1104,17 @@ class CodePatcher { |
// Helper class for generating code or data associated with the code |
-// right after a call instruction. As an example this can be used to |
+// right before or after a call instruction. As an example this can be used to |
// generate safepoint data after calls for crankshaft. |
-class PostCallGenerator { |
+class CallWrapper { |
public: |
- PostCallGenerator() { } |
- virtual ~PostCallGenerator() { } |
- virtual void Generate() = 0; |
+ CallWrapper() { } |
+ virtual ~CallWrapper() { } |
+ // Called just before emitting a call. Argument is the size of the generated |
+ // call code. |
+ virtual void BeforeCall(int call_size) = 0; |
+ // Called just after emitting a call, i.e., at the return site for the call. |
+ virtual void AfterCall() = 0; |
}; |
@@ -1801,7 +1825,7 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected, |
Register code_register, |
LabelType* done, |
InvokeFlag flag, |
- PostCallGenerator* post_call_generator) { |
+ CallWrapper* call_wrapper) { |
bool definitely_matches = false; |
NearLabel invoke; |
if (expected.is_immediate()) { |
@@ -1851,8 +1875,9 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected, |
} |
if (flag == CALL_FUNCTION) { |
+ if (call_wrapper != NULL) call_wrapper->BeforeCall(CallSize(adaptor)); |
Call(adaptor, RelocInfo::CODE_TARGET); |
- if (post_call_generator != NULL) post_call_generator->Generate(); |
+ if (call_wrapper != NULL) call_wrapper->AfterCall(); |
jmp(done); |
} else { |
Jump(adaptor, RelocInfo::CODE_TARGET); |