Reviewers: Rico,
Description:
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.
Please review this at http://codereview.chromium.org/2365001/show
Affected files:
M src/x64/macro-assembler-x64.cc
Index: src/x64/macro-assembler-x64.cc
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
index
b851fec68429b7cf63c50f12a2f794ba42769bc0..d82b8ecf381f9f52fe0941467a036b64c2d20013
100644
--- a/src/x64/macro-assembler-x64.cc
+++ b/src/x64/macro-assembler-x64.cc
@@ -2641,20 +2641,27 @@ void MacroAssembler::LoadContext(Register dst, int
context_chain_length) {
}
}
+
int MacroAssembler::ArgumentStackSlotsForCFunctionCall(int num_arguments) {
// On Windows stack slots are reserved by the caller for all arguments
- // including the ones passed in registers. On Linux 6 arguments are
passed in
- // registers and the caller does not reserve stack slots for them.
+ // including the ones passed in registers, and space is alwaysallocated
for
+ // the four register arguments even if the function takes fewer than four
+ // arguments.
+ // On Linux the first six arguments are passed in registers and the
caller
+ // does not reserve stack slots for them.
ASSERT(num_arguments >= 0);
#ifdef _WIN64
- static const int kArgumentsWithoutStackSlot = 0;
+ static const int kMinimumStackSlots = 4;
+ if (num_arguments < kMinimumStackSlots) return kMinimumStackSlots;
+ return num_arguments;
#else
- static const int kArgumentsWithoutStackSlot = 6;
+ static const int kRegisterPassedArguments = 6;
+ if (num_arguments < kRegisterPassedArguments) return 0;
+ return num_arguments - kRegisterPassedArguments;
#endif
- return num_arguments > kArgumentsWithoutStackSlot ?
- num_arguments - kArgumentsWithoutStackSlot : 0;
}
+
void MacroAssembler::PrepareCallCFunction(int num_arguments) {
int frame_alignment = OS::ActivationFrameAlignment();
ASSERT(frame_alignment != 0);
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev