Commit 1be589d8 authored by lrn@chromium.org's avatar lrn@chromium.org

X64: Fix issue 678. Bug in some Win64 C calls from generated code.

Win 64 C call ABI implementation requires space allocated on stack for four
argument registers, even when passing fewer arguments in registers.

Review URL: http://codereview.chromium.org/2365001

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4748 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 527c7972
...@@ -2641,20 +2641,27 @@ void MacroAssembler::LoadContext(Register dst, int context_chain_length) { ...@@ -2641,20 +2641,27 @@ void MacroAssembler::LoadContext(Register dst, int context_chain_length) {
} }
} }
int MacroAssembler::ArgumentStackSlotsForCFunctionCall(int num_arguments) { int MacroAssembler::ArgumentStackSlotsForCFunctionCall(int num_arguments) {
// On Windows stack slots are reserved by the caller for all arguments // On Windows 64 stack slots are reserved by the caller for all arguments
// including the ones passed in registers. On Linux 6 arguments are passed in // including the ones passed in registers, and space is always allocated for
// registers and the caller does not reserve stack slots for them. // the four register arguments even if the function takes fewer than four
// arguments.
// On AMD64 ABI (Linux/Mac) the first six arguments are passed in registers
// and the caller does not reserve stack slots for them.
ASSERT(num_arguments >= 0); ASSERT(num_arguments >= 0);
#ifdef _WIN64 #ifdef _WIN64
static const int kArgumentsWithoutStackSlot = 0; static const int kMinimumStackSlots = 4;
if (num_arguments < kMinimumStackSlots) return kMinimumStackSlots;
return num_arguments;
#else #else
static const int kArgumentsWithoutStackSlot = 6; static const int kRegisterPassedArguments = 6;
if (num_arguments < kRegisterPassedArguments) return 0;
return num_arguments - kRegisterPassedArguments;
#endif #endif
return num_arguments > kArgumentsWithoutStackSlot ?
num_arguments - kArgumentsWithoutStackSlot : 0;
} }
void MacroAssembler::PrepareCallCFunction(int num_arguments) { void MacroAssembler::PrepareCallCFunction(int num_arguments) {
int frame_alignment = OS::ActivationFrameAlignment(); int frame_alignment = OS::ActivationFrameAlignment();
ASSERT(frame_alignment != 0); ASSERT(frame_alignment != 0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment