diff options
author | Ian Rogers <irogers@google.com> | 2014-04-01 10:36:00 -0700 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2014-04-01 10:36:00 -0700 |
commit | 790a6b7312979513710c366b411ba6791ddf78c2 (patch) | |
tree | cb0f98dce2585727850ea7a60a34e933b5e8928a /compiler/jni | |
parent | 88e0463fa7e8ea7b427b65a07cd7b28111575174 (diff) | |
download | android_art-790a6b7312979513710c366b411ba6791ddf78c2.tar.gz android_art-790a6b7312979513710c366b411ba6791ddf78c2.tar.bz2 android_art-790a6b7312979513710c366b411ba6791ddf78c2.zip |
Calling convention support for cross 64/32 compilation.
Add REX support for x86-64 operands.
Change-Id: I093ae26fb8c111d54b8c72166f054984564c04c6
Diffstat (limited to 'compiler/jni')
-rw-r--r-- | compiler/jni/quick/arm/calling_convention_arm.cc | 16 | ||||
-rw-r--r-- | compiler/jni/quick/arm/calling_convention_arm.h | 4 | ||||
-rw-r--r-- | compiler/jni/quick/arm64/calling_convention_arm64.cc | 20 | ||||
-rw-r--r-- | compiler/jni/quick/arm64/calling_convention_arm64.h | 4 | ||||
-rw-r--r-- | compiler/jni/quick/calling_convention.cc | 11 | ||||
-rw-r--r-- | compiler/jni/quick/calling_convention.h | 47 | ||||
-rw-r--r-- | compiler/jni/quick/mips/calling_convention_mips.cc | 19 | ||||
-rw-r--r-- | compiler/jni/quick/mips/calling_convention_mips.h | 5 | ||||
-rw-r--r-- | compiler/jni/quick/x86/calling_convention_x86.cc | 14 | ||||
-rw-r--r-- | compiler/jni/quick/x86/calling_convention_x86.h | 4 | ||||
-rw-r--r-- | compiler/jni/quick/x86_64/calling_convention_x86_64.cc | 17 | ||||
-rw-r--r-- | compiler/jni/quick/x86_64/calling_convention_x86_64.h | 4 |
12 files changed, 91 insertions, 74 deletions
diff --git a/compiler/jni/quick/arm/calling_convention_arm.cc b/compiler/jni/quick/arm/calling_convention_arm.cc index 28b438e198..ab39d6baae 100644 --- a/compiler/jni/quick/arm/calling_convention_arm.cc +++ b/compiler/jni/quick/arm/calling_convention_arm.cc @@ -79,9 +79,9 @@ ManagedRegister ArmManagedRuntimeCallingConvention::CurrentParamRegister() { FrameOffset ArmManagedRuntimeCallingConvention::CurrentParamStackOffset() { CHECK(IsCurrentParamOnStack()); FrameOffset result = - FrameOffset(displacement_.Int32Value() + // displacement - kPointerSize + // Method* - (itr_slots_ * kPointerSize)); // offset into in args + FrameOffset(displacement_.Int32Value() + // displacement + kFramePointerSize + // Method* + (itr_slots_ * kFramePointerSize)); // offset into in args return result; } @@ -106,7 +106,7 @@ const ManagedRegisterEntrySpills& ArmManagedRuntimeCallingConvention::EntrySpill ArmJniCallingConvention::ArmJniCallingConvention(bool is_static, bool is_synchronized, const char* shorty) - : JniCallingConvention(is_static, is_synchronized, shorty) { + : JniCallingConvention(is_static, is_synchronized, shorty, kFramePointerSize) { // Compute padding to ensure longs and doubles are not split in AAPCS. Ignore the 'this' jobject // or jclass for static methods and the JNIEnv. We start at the aligned register r2. size_t padding = 0; @@ -143,15 +143,15 @@ ManagedRegister ArmJniCallingConvention::ReturnScratchRegister() const { size_t ArmJniCallingConvention::FrameSize() { // Method*, LR and callee save area size, local reference segment state - size_t frame_data_size = (3 + CalleeSaveRegisters().size()) * kPointerSize; + size_t frame_data_size = (3 + CalleeSaveRegisters().size()) * kFramePointerSize; // References plus 2 words for SIRT header - size_t sirt_size = (ReferenceCount() + 2) * kPointerSize; + size_t sirt_size = (ReferenceCount() + 2) * sirt_pointer_size_; // Plus return value spill area size return RoundUp(frame_data_size + sirt_size + SizeOfReturnValue(), kStackAlignment); } size_t ArmJniCallingConvention::OutArgSize() { - return RoundUp(NumberOfOutgoingStackArgs() * kPointerSize + padding_, + return RoundUp(NumberOfOutgoingStackArgs() * kFramePointerSize + padding_, kStackAlignment); } @@ -195,7 +195,7 @@ ManagedRegister ArmJniCallingConvention::CurrentParamRegister() { FrameOffset ArmJniCallingConvention::CurrentParamStackOffset() { CHECK_GE(itr_slots_, 4u); - size_t offset = displacement_.Int32Value() - OutArgSize() + ((itr_slots_ - 4) * kPointerSize); + size_t offset = displacement_.Int32Value() - OutArgSize() + ((itr_slots_ - 4) * kFramePointerSize); CHECK_LT(offset, OutArgSize()); return FrameOffset(offset); } diff --git a/compiler/jni/quick/arm/calling_convention_arm.h b/compiler/jni/quick/arm/calling_convention_arm.h index 96bbb7e94f..00a239b80d 100644 --- a/compiler/jni/quick/arm/calling_convention_arm.h +++ b/compiler/jni/quick/arm/calling_convention_arm.h @@ -22,10 +22,12 @@ namespace art { namespace arm { +constexpr size_t kFramePointerSize = 4; + class ArmManagedRuntimeCallingConvention FINAL : public ManagedRuntimeCallingConvention { public: ArmManagedRuntimeCallingConvention(bool is_static, bool is_synchronized, const char* shorty) - : ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty) {} + : ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty, kFramePointerSize) {} ~ArmManagedRuntimeCallingConvention() OVERRIDE {} // Calling convention ManagedRegister ReturnRegister() OVERRIDE; diff --git a/compiler/jni/quick/arm64/calling_convention_arm64.cc b/compiler/jni/quick/arm64/calling_convention_arm64.cc index ff899b75e9..c408fa97c3 100644 --- a/compiler/jni/quick/arm64/calling_convention_arm64.cc +++ b/compiler/jni/quick/arm64/calling_convention_arm64.cc @@ -79,9 +79,9 @@ ManagedRegister Arm64ManagedRuntimeCallingConvention::CurrentParamRegister() { FrameOffset Arm64ManagedRuntimeCallingConvention::CurrentParamStackOffset() { CHECK(IsCurrentParamOnStack()); FrameOffset result = - FrameOffset(displacement_.Int32Value() + // displacement - kPointerSize + // Method* - (itr_slots_ * kPointerSize)); // offset into in args + FrameOffset(displacement_.Int32Value() + // displacement + kFramePointerSize + // Method* + (itr_slots_ * kFramePointerSize)); // offset into in args return result; } @@ -119,8 +119,8 @@ const ManagedRegisterEntrySpills& Arm64ManagedRuntimeCallingConvention::EntrySpi // JNI calling convention Arm64JniCallingConvention::Arm64JniCallingConvention(bool is_static, bool is_synchronized, - const char* shorty) - : JniCallingConvention(is_static, is_synchronized, shorty) { + const char* shorty) + : JniCallingConvention(is_static, is_synchronized, shorty, kFramePointerSize) { // TODO This needs to be converted to 64bit. // Compute padding to ensure longs and doubles are not split in AAPCS. Ignore the 'this' jobject // or jclass for static methods and the JNIEnv. We start at the aligned register r2. @@ -135,7 +135,7 @@ Arm64JniCallingConvention::Arm64JniCallingConvention(bool is_static, bool is_syn // } // cur_reg++; // bump the iterator for every argument // } -// padding_ =0; + padding_ =0; callee_save_regs_.push_back(Arm64ManagedRegister::FromCoreRegister(X19)); callee_save_regs_.push_back(Arm64ManagedRegister::FromCoreRegister(X20)); @@ -173,15 +173,15 @@ ManagedRegister Arm64JniCallingConvention::ReturnScratchRegister() const { size_t Arm64JniCallingConvention::FrameSize() { // Method*, LR and callee save area size, local reference segment state - size_t frame_data_size = (3 + CalleeSaveRegisters().size()) * kPointerSize; + size_t frame_data_size = (3 + CalleeSaveRegisters().size()) * kFramePointerSize; // References plus 2 words for SIRT header - size_t sirt_size = (ReferenceCount() + 2) * kPointerSize; + size_t sirt_size = (ReferenceCount() + 2) * sirt_pointer_size_; // Plus return value spill area size return RoundUp(frame_data_size + sirt_size + SizeOfReturnValue(), kStackAlignment); } size_t Arm64JniCallingConvention::OutArgSize() { - return RoundUp(NumberOfOutgoingStackArgs() * kPointerSize + padding_, + return RoundUp(NumberOfOutgoingStackArgs() * kFramePointerSize + padding_, kStackAlignment); } @@ -228,7 +228,7 @@ ManagedRegister Arm64JniCallingConvention::CurrentParamRegister() { FrameOffset Arm64JniCallingConvention::CurrentParamStackOffset() { CHECK_GE(itr_slots_, 4u); - size_t offset = displacement_.Int32Value() - OutArgSize() + ((itr_slots_ - 4) * kPointerSize); + size_t offset = displacement_.Int32Value() - OutArgSize() + ((itr_slots_ - 4) * kFramePointerSize); CHECK_LT(offset, OutArgSize()); return FrameOffset(offset); } diff --git a/compiler/jni/quick/arm64/calling_convention_arm64.h b/compiler/jni/quick/arm64/calling_convention_arm64.h index 7e3383065d..c18cd2b0ce 100644 --- a/compiler/jni/quick/arm64/calling_convention_arm64.h +++ b/compiler/jni/quick/arm64/calling_convention_arm64.h @@ -22,10 +22,12 @@ namespace art { namespace arm64 { +constexpr size_t kFramePointerSize = 8; + class Arm64ManagedRuntimeCallingConvention FINAL : public ManagedRuntimeCallingConvention { public: Arm64ManagedRuntimeCallingConvention(bool is_static, bool is_synchronized, const char* shorty) - : ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty) {} + : ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty, kFramePointerSize) {} ~Arm64ManagedRuntimeCallingConvention() OVERRIDE {} // Calling convention ManagedRegister ReturnRegister() OVERRIDE; diff --git a/compiler/jni/quick/calling_convention.cc b/compiler/jni/quick/calling_convention.cc index 043bceae17..8efdcdaab2 100644 --- a/compiler/jni/quick/calling_convention.cc +++ b/compiler/jni/quick/calling_convention.cc @@ -26,11 +26,6 @@ namespace art { -// Offset of Method within the frame -FrameOffset CallingConvention::MethodStackOffset() { - return displacement_; -} - // Managed runtime calling convention ManagedRuntimeCallingConvention* ManagedRuntimeCallingConvention::Create( @@ -123,7 +118,7 @@ size_t JniCallingConvention::ReferenceCount() const { } FrameOffset JniCallingConvention::SavedLocalReferenceCookieOffset() const { - size_t references_size = kSirtPointerSize * ReferenceCount(); // size excluding header + size_t references_size = sirt_pointer_size_ * ReferenceCount(); // size excluding header return FrameOffset(SirtReferencesOffset().Int32Value() + references_size); } @@ -191,14 +186,14 @@ bool JniCallingConvention::IsCurrentParamAFloatOrDouble() { FrameOffset JniCallingConvention::CurrentParamSirtEntryOffset() { CHECK(IsCurrentParamAReference()); CHECK_LT(SirtLinkOffset(), SirtNumRefsOffset()); - int result = SirtReferencesOffset().Int32Value() + itr_refs_ * kSirtPointerSize; + int result = SirtReferencesOffset().Int32Value() + itr_refs_ * sirt_pointer_size_; CHECK_GT(result, SirtNumRefsOffset().Int32Value()); return FrameOffset(result); } size_t JniCallingConvention::CurrentParamSize() { if (itr_args_ <= kObjectOrClass) { - return kPointerSize; // JNIEnv or jobject/jclass + return frame_pointer_size_; // JNIEnv or jobject/jclass } else { int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); return ParamSize(arg_pos); diff --git a/compiler/jni/quick/calling_convention.h b/compiler/jni/quick/calling_convention.h index 4950905d4c..7e1cf630c6 100644 --- a/compiler/jni/quick/calling_convention.h +++ b/compiler/jni/quick/calling_convention.h @@ -24,7 +24,7 @@ namespace art { -// Top-level abstraction for different calling conventions +// Top-level abstraction for different calling conventions. class CallingConvention { public: bool IsReturnAReference() const { return shorty_[0] == 'L'; } @@ -46,8 +46,10 @@ class CallingConvention { // Register reserved for scratch usage during procedure calls. virtual ManagedRegister InterproceduralScratchRegister() = 0; - // Offset of Method within the frame - FrameOffset MethodStackOffset(); + // Offset of Method within the frame. + FrameOffset MethodStackOffset() { + return displacement_; + } // Iterator interface @@ -66,8 +68,13 @@ class CallingConvention { virtual ~CallingConvention() {} protected: - CallingConvention(bool is_static, bool is_synchronized, const char* shorty) - : displacement_(0), kSirtPointerSize(sizeof(StackReference<mirror::Object>)), is_static_(is_static), is_synchronized_(is_synchronized), + CallingConvention(bool is_static, bool is_synchronized, const char* shorty, + size_t frame_pointer_size) + : itr_slots_(0), itr_refs_(0), itr_args_(0), itr_longs_and_doubles_(0), + itr_float_and_doubles_(0), displacement_(0), + frame_pointer_size_(frame_pointer_size), + sirt_pointer_size_(sizeof(StackReference<mirror::Object>)), + is_static_(is_static), is_synchronized_(is_synchronized), shorty_(shorty) { num_args_ = (is_static ? 0 : 1) + strlen(shorty) - 1; num_ref_args_ = is_static ? 0 : 1; // The implicit this pointer. @@ -145,7 +152,7 @@ class CallingConvention { if (IsStatic()) { param++; // 0th argument must skip return value at start of the shorty } else if (param == 0) { - return kPointerSize; // this argument + return frame_pointer_size_; // this argument } size_t result = Primitive::ComponentSize(Primitive::GetType(shorty_[param])); if (result >= 1 && result < 4) { @@ -160,17 +167,20 @@ class CallingConvention { // Note that each slot is 32-bit. When the current argument is bigger // than 32 bits, return the first slot number for this argument. unsigned int itr_slots_; - // The number of references iterated past + // The number of references iterated past. unsigned int itr_refs_; - // The argument number along argument list for current argument + // The argument number along argument list for current argument. unsigned int itr_args_; - // Number of longs and doubles seen along argument list + // Number of longs and doubles seen along argument list. unsigned int itr_longs_and_doubles_; - // Number of float and doubles seen along argument list + // Number of float and doubles seen along argument list. unsigned int itr_float_and_doubles_; - // Space for frames below this on the stack + // Space for frames below this on the stack. FrameOffset displacement_; - size_t kSirtPointerSize; + // The size of a reference. + const size_t frame_pointer_size_; + // The size of a reference entry within the SIRT. + const size_t sirt_pointer_size_; private: const bool is_static_; @@ -218,8 +228,9 @@ class ManagedRuntimeCallingConvention : public CallingConvention { virtual const ManagedRegisterEntrySpills& EntrySpills() = 0; protected: - ManagedRuntimeCallingConvention(bool is_static, bool is_synchronized, const char* shorty) - : CallingConvention(is_static, is_synchronized, shorty) {} + ManagedRuntimeCallingConvention(bool is_static, bool is_synchronized, const char* shorty, + size_t frame_pointer_size) + : CallingConvention(is_static, is_synchronized, shorty, frame_pointer_size) {} }; // Abstraction for JNI calling conventions @@ -283,8 +294,7 @@ class JniCallingConvention : public CallingConvention { // Position of SIRT and interior fields FrameOffset SirtOffset() const { - return FrameOffset(displacement_.Int32Value() + - kPointerSize); // above Method* + return FrameOffset(this->displacement_.Int32Value() + frame_pointer_size_); // above Method* } FrameOffset SirtLinkOffset() const { @@ -311,8 +321,9 @@ class JniCallingConvention : public CallingConvention { kObjectOrClass = 1 }; - explicit JniCallingConvention(bool is_static, bool is_synchronized, const char* shorty) - : CallingConvention(is_static, is_synchronized, shorty) {} + explicit JniCallingConvention(bool is_static, bool is_synchronized, const char* shorty, + size_t frame_pointer_size) + : CallingConvention(is_static, is_synchronized, shorty, frame_pointer_size) {} // Number of stack slots for outgoing arguments, above which the SIRT is // located diff --git a/compiler/jni/quick/mips/calling_convention_mips.cc b/compiler/jni/quick/mips/calling_convention_mips.cc index ea39d6009c..51a3f54888 100644 --- a/compiler/jni/quick/mips/calling_convention_mips.cc +++ b/compiler/jni/quick/mips/calling_convention_mips.cc @@ -79,9 +79,9 @@ ManagedRegister MipsManagedRuntimeCallingConvention::CurrentParamRegister() { FrameOffset MipsManagedRuntimeCallingConvention::CurrentParamStackOffset() { CHECK(IsCurrentParamOnStack()); FrameOffset result = - FrameOffset(displacement_.Int32Value() + // displacement - kPointerSize + // Method* - (itr_slots_ * kPointerSize)); // offset into in args + FrameOffset(displacement_.Int32Value() + // displacement + kFramePointerSize + // Method* + (itr_slots_ * kFramePointerSize)); // offset into in args return result; } @@ -105,8 +105,8 @@ const ManagedRegisterEntrySpills& MipsManagedRuntimeCallingConvention::EntrySpil // JNI calling convention MipsJniCallingConvention::MipsJniCallingConvention(bool is_static, bool is_synchronized, - const char* shorty) - : JniCallingConvention(is_static, is_synchronized, shorty) { + const char* shorty) + : JniCallingConvention(is_static, is_synchronized, shorty, kFramePointerSize) { // Compute padding to ensure longs and doubles are not split in AAPCS. Ignore the 'this' jobject // or jclass for static methods and the JNIEnv. We start at the aligned register A2. size_t padding = 0; @@ -147,16 +147,15 @@ ManagedRegister MipsJniCallingConvention::ReturnScratchRegister() const { size_t MipsJniCallingConvention::FrameSize() { // Method*, LR and callee save area size, local reference segment state - size_t frame_data_size = (3 + CalleeSaveRegisters().size()) * kPointerSize; + size_t frame_data_size = (3 + CalleeSaveRegisters().size()) * kFramePointerSize; // References plus 2 words for SIRT header - size_t sirt_size = (ReferenceCount() + 2) * kPointerSize; + size_t sirt_size = (ReferenceCount() + 2) * sirt_pointer_size_; // Plus return value spill area size return RoundUp(frame_data_size + sirt_size + SizeOfReturnValue(), kStackAlignment); } size_t MipsJniCallingConvention::OutArgSize() { - return RoundUp(NumberOfOutgoingStackArgs() * kPointerSize + padding_, - kStackAlignment); + return RoundUp(NumberOfOutgoingStackArgs() * kFramePointerSize + padding_, kStackAlignment); } // JniCallingConvention ABI follows AAPCS where longs and doubles must occur @@ -199,7 +198,7 @@ ManagedRegister MipsJniCallingConvention::CurrentParamRegister() { FrameOffset MipsJniCallingConvention::CurrentParamStackOffset() { CHECK_GE(itr_slots_, 4u); - size_t offset = displacement_.Int32Value() - OutArgSize() + (itr_slots_ * kPointerSize); + size_t offset = displacement_.Int32Value() - OutArgSize() + (itr_slots_ * kFramePointerSize); CHECK_LT(offset, OutArgSize()); return FrameOffset(offset); } diff --git a/compiler/jni/quick/mips/calling_convention_mips.h b/compiler/jni/quick/mips/calling_convention_mips.h index 1a9053a9dd..e33fbade55 100644 --- a/compiler/jni/quick/mips/calling_convention_mips.h +++ b/compiler/jni/quick/mips/calling_convention_mips.h @@ -21,10 +21,13 @@ namespace art { namespace mips { + +constexpr size_t kFramePointerSize = 4; + class MipsManagedRuntimeCallingConvention FINAL : public ManagedRuntimeCallingConvention { public: MipsManagedRuntimeCallingConvention(bool is_static, bool is_synchronized, const char* shorty) - : ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty) {} + : ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty, kFramePointerSize) {} ~MipsManagedRuntimeCallingConvention() OVERRIDE {} // Calling convention ManagedRegister ReturnRegister() OVERRIDE; diff --git a/compiler/jni/quick/x86/calling_convention_x86.cc b/compiler/jni/quick/x86/calling_convention_x86.cc index 8d22fe6632..8b440eda48 100644 --- a/compiler/jni/quick/x86/calling_convention_x86.cc +++ b/compiler/jni/quick/x86/calling_convention_x86.cc @@ -86,8 +86,8 @@ ManagedRegister X86ManagedRuntimeCallingConvention::CurrentParamRegister() { FrameOffset X86ManagedRuntimeCallingConvention::CurrentParamStackOffset() { return FrameOffset(displacement_.Int32Value() + // displacement - kPointerSize + // Method* - (itr_slots_ * kPointerSize)); // offset into in args + kFramePointerSize + // Method* + (itr_slots_ * kFramePointerSize)); // offset into in args } const ManagedRegisterEntrySpills& X86ManagedRuntimeCallingConvention::EntrySpills() { @@ -112,7 +112,7 @@ const ManagedRegisterEntrySpills& X86ManagedRuntimeCallingConvention::EntrySpill X86JniCallingConvention::X86JniCallingConvention(bool is_static, bool is_synchronized, const char* shorty) - : JniCallingConvention(is_static, is_synchronized, shorty) { + : JniCallingConvention(is_static, is_synchronized, shorty, kFramePointerSize) { callee_save_regs_.push_back(X86ManagedRegister::FromCpuRegister(EBP)); callee_save_regs_.push_back(X86ManagedRegister::FromCpuRegister(ESI)); callee_save_regs_.push_back(X86ManagedRegister::FromCpuRegister(EDI)); @@ -124,15 +124,15 @@ uint32_t X86JniCallingConvention::CoreSpillMask() const { size_t X86JniCallingConvention::FrameSize() { // Method*, return address and callee save area size, local reference segment state - size_t frame_data_size = (3 + CalleeSaveRegisters().size()) * kPointerSize; + size_t frame_data_size = (3 + CalleeSaveRegisters().size()) * kFramePointerSize; // References plus 2 words for SIRT header - size_t sirt_size = (ReferenceCount() + 2) * kPointerSize; + size_t sirt_size = (ReferenceCount() + 2) * sirt_pointer_size_; // Plus return value spill area size return RoundUp(frame_data_size + sirt_size + SizeOfReturnValue(), kStackAlignment); } size_t X86JniCallingConvention::OutArgSize() { - return RoundUp(NumberOfOutgoingStackArgs() * kPointerSize, kStackAlignment); + return RoundUp(NumberOfOutgoingStackArgs() * kFramePointerSize, kStackAlignment); } bool X86JniCallingConvention::IsCurrentParamInRegister() { @@ -149,7 +149,7 @@ ManagedRegister X86JniCallingConvention::CurrentParamRegister() { } FrameOffset X86JniCallingConvention::CurrentParamStackOffset() { - return FrameOffset(displacement_.Int32Value() - OutArgSize() + (itr_slots_ * kPointerSize)); + return FrameOffset(displacement_.Int32Value() - OutArgSize() + (itr_slots_ * kFramePointerSize)); } size_t X86JniCallingConvention::NumberOfOutgoingStackArgs() { diff --git a/compiler/jni/quick/x86/calling_convention_x86.h b/compiler/jni/quick/x86/calling_convention_x86.h index 2dab059919..5b9069c26a 100644 --- a/compiler/jni/quick/x86/calling_convention_x86.h +++ b/compiler/jni/quick/x86/calling_convention_x86.h @@ -22,11 +22,13 @@ namespace art { namespace x86 { +constexpr size_t kFramePointerSize = 4; + class X86ManagedRuntimeCallingConvention FINAL : public ManagedRuntimeCallingConvention { public: explicit X86ManagedRuntimeCallingConvention(bool is_static, bool is_synchronized, const char* shorty) - : ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty) {} + : ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty, kFramePointerSize) {} ~X86ManagedRuntimeCallingConvention() OVERRIDE {} // Calling convention ManagedRegister ReturnRegister() OVERRIDE; diff --git a/compiler/jni/quick/x86_64/calling_convention_x86_64.cc b/compiler/jni/quick/x86_64/calling_convention_x86_64.cc index 24298d2e14..21e0bd7f61 100644 --- a/compiler/jni/quick/x86_64/calling_convention_x86_64.cc +++ b/compiler/jni/quick/x86_64/calling_convention_x86_64.cc @@ -96,7 +96,7 @@ ManagedRegister X86_64ManagedRuntimeCallingConvention::CurrentParamRegister() { FrameOffset X86_64ManagedRuntimeCallingConvention::CurrentParamStackOffset() { return FrameOffset(displacement_.Int32Value() + // displacement - kPointerSize + // Method* + kFramePointerSize + // Method* (itr_slots_ * sizeof(uint32_t))); // offset into in args } @@ -122,8 +122,8 @@ const ManagedRegisterEntrySpills& X86_64ManagedRuntimeCallingConvention::EntrySp // JNI calling convention X86_64JniCallingConvention::X86_64JniCallingConvention(bool is_static, bool is_synchronized, - const char* shorty) - : JniCallingConvention(is_static, is_synchronized, shorty) { + const char* shorty) + : JniCallingConvention(is_static, is_synchronized, shorty, kFramePointerSize) { callee_save_regs_.push_back(X86_64ManagedRegister::FromCpuRegister(RBX)); callee_save_regs_.push_back(X86_64ManagedRegister::FromCpuRegister(RBP)); callee_save_regs_.push_back(X86_64ManagedRegister::FromCpuRegister(R12)); @@ -133,20 +133,21 @@ X86_64JniCallingConvention::X86_64JniCallingConvention(bool is_static, bool is_s } uint32_t X86_64JniCallingConvention::CoreSpillMask() const { - return 1 << RBX | 1 << RBP | 1 << R12 | 1 << R13 | 1 << R14 | 1 << R15 | 1 << R13 | 1 << kNumberOfCpuRegisters; + return 1 << RBX | 1 << RBP | 1 << R12 | 1 << R13 | 1 << R14 | 1 << R15 | 1 << R13 | + 1 << kNumberOfCpuRegisters; } size_t X86_64JniCallingConvention::FrameSize() { // Method*, return address and callee save area size, local reference segment state - size_t frame_data_size = (3 + CalleeSaveRegisters().size()) * kPointerSize; + size_t frame_data_size = (3 + CalleeSaveRegisters().size()) * kFramePointerSize; // References plus link_ (pointer) and number_of_references_ (uint32_t) for SIRT header - size_t sirt_size = kPointerSize + sizeof(uint32_t) + ReferenceCount()*kSirtPointerSize; + size_t sirt_size = kFramePointerSize + sizeof(uint32_t) + (ReferenceCount() * sirt_pointer_size_); // Plus return value spill area size return RoundUp(frame_data_size + sirt_size + SizeOfReturnValue(), kStackAlignment); } size_t X86_64JniCallingConvention::OutArgSize() { - return RoundUp(NumberOfOutgoingStackArgs() * kPointerSize, kStackAlignment); + return RoundUp(NumberOfOutgoingStackArgs() * kFramePointerSize, kStackAlignment); } bool X86_64JniCallingConvention::IsCurrentParamInRegister() { @@ -180,7 +181,7 @@ FrameOffset X86_64JniCallingConvention::CurrentParamStackOffset() { size_t offset = itr_args_ - std::min(8U, itr_float_and_doubles_) // Float arguments passed through Xmm0..Xmm7 - std::min(6U, itr_args_ - itr_float_and_doubles_); // Integer arguments passed through GPR - return FrameOffset(displacement_.Int32Value() - OutArgSize() + (offset * kPointerSize)); + return FrameOffset(displacement_.Int32Value() - OutArgSize() + (offset * kFramePointerSize)); } size_t X86_64JniCallingConvention::NumberOfOutgoingStackArgs() { diff --git a/compiler/jni/quick/x86_64/calling_convention_x86_64.h b/compiler/jni/quick/x86_64/calling_convention_x86_64.h index d7f77626c3..d545774689 100644 --- a/compiler/jni/quick/x86_64/calling_convention_x86_64.h +++ b/compiler/jni/quick/x86_64/calling_convention_x86_64.h @@ -22,11 +22,13 @@ namespace art { namespace x86_64 { +constexpr size_t kFramePointerSize = 8; + class X86_64ManagedRuntimeCallingConvention FINAL : public ManagedRuntimeCallingConvention { public: explicit X86_64ManagedRuntimeCallingConvention(bool is_static, bool is_synchronized, const char* shorty) - : ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty) {} + : ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty, kFramePointerSize) {} ~X86_64ManagedRuntimeCallingConvention() OVERRIDE {} // Calling convention ManagedRegister ReturnRegister() OVERRIDE; |