diff options
Diffstat (limited to 'compiler/jni')
-rw-r--r-- | compiler/jni/jni_cfi_test_expected.inc | 131 | ||||
-rw-r--r-- | compiler/jni/jni_compiler_test.cc | 11 | ||||
-rw-r--r-- | compiler/jni/quick/arm/calling_convention_arm.cc | 3 | ||||
-rw-r--r-- | compiler/jni/quick/arm64/calling_convention_arm64.cc | 6 | ||||
-rw-r--r-- | compiler/jni/quick/calling_convention.cc | 4 | ||||
-rw-r--r-- | compiler/jni/quick/calling_convention.h | 11 | ||||
-rw-r--r-- | compiler/jni/quick/jni_compiler.cc | 37 | ||||
-rw-r--r-- | compiler/jni/quick/mips/calling_convention_mips.cc | 2 | ||||
-rw-r--r-- | compiler/jni/quick/mips64/calling_convention_mips64.cc | 8 | ||||
-rw-r--r-- | compiler/jni/quick/x86/calling_convention_x86.cc | 2 | ||||
-rw-r--r-- | compiler/jni/quick/x86_64/calling_convention_x86_64.cc | 8 |
11 files changed, 109 insertions, 114 deletions
diff --git a/compiler/jni/jni_cfi_test_expected.inc b/compiler/jni/jni_cfi_test_expected.inc index eaf7872..09b6034 100644 --- a/compiler/jni/jni_cfi_test_expected.inc +++ b/compiler/jni/jni_cfi_test_expected.inc @@ -85,8 +85,8 @@ static constexpr uint8_t expected_asm_kArm64[] = { 0xF7, 0x63, 0x08, 0xA9, 0xF9, 0x6B, 0x09, 0xA9, 0xFB, 0x73, 0x0A, 0xA9, 0xFD, 0x7B, 0x0B, 0xA9, 0xE8, 0x27, 0x02, 0x6D, 0xEA, 0x2F, 0x03, 0x6D, 0xEC, 0x37, 0x04, 0x6D, 0xEE, 0x3F, 0x05, 0x6D, 0xF5, 0x03, 0x12, 0xAA, - 0xE0, 0x03, 0x00, 0xB9, 0xE1, 0xC7, 0x00, 0xB9, 0xE0, 0xCB, 0x00, 0xBD, - 0xE2, 0xCF, 0x00, 0xB9, 0xE3, 0xD3, 0x00, 0xB9, 0xFF, 0x83, 0x00, 0xD1, + 0xE0, 0x03, 0x00, 0xF9, 0xE1, 0xCB, 0x00, 0xB9, 0xE0, 0xCF, 0x00, 0xBD, + 0xE2, 0xD3, 0x00, 0xB9, 0xE3, 0xD7, 0x00, 0xB9, 0xFF, 0x83, 0x00, 0xD1, 0xFF, 0x83, 0x00, 0x91, 0xF2, 0x03, 0x15, 0xAA, 0xF3, 0x53, 0x46, 0xA9, 0xF5, 0x5B, 0x47, 0xA9, 0xF7, 0x63, 0x48, 0xA9, 0xF9, 0x6B, 0x49, 0xA9, 0xFB, 0x73, 0x4A, 0xA9, 0xFD, 0x7B, 0x4B, 0xA9, 0xE8, 0x27, 0x42, 0x6D, @@ -138,11 +138,11 @@ static constexpr uint8_t expected_cfi_kArm64[] = { // 0x0000002c: .cfi_offset_extended: r78 at cfa-112 // 0x0000002c: .cfi_offset_extended: r79 at cfa-104 // 0x0000002c: mov x21, tr -// 0x00000030: str w0, [sp] -// 0x00000034: str w1, [sp, #196] -// 0x00000038: str s0, [sp, #200] -// 0x0000003c: str w2, [sp, #204] -// 0x00000040: str w3, [sp, #208] +// 0x00000030: str x0, [sp] +// 0x00000034: str w1, [sp, #200] +// 0x00000038: str s0, [sp, #204] +// 0x0000003c: str w2, [sp, #208] +// 0x00000040: str w3, [sp, #212] // 0x00000044: sub sp, sp, #0x20 (32) // 0x00000048: .cfi_def_cfa_offset: 224 // 0x00000048: add sp, sp, #0x20 (32) @@ -238,20 +238,20 @@ static constexpr uint8_t expected_asm_kX86_64[] = { 0x41, 0x57, 0x41, 0x56, 0x41, 0x55, 0x41, 0x54, 0x55, 0x53, 0x48, 0x83, 0xEC, 0x48, 0xF2, 0x44, 0x0F, 0x11, 0x7C, 0x24, 0x40, 0xF2, 0x44, 0x0F, 0x11, 0x74, 0x24, 0x38, 0xF2, 0x44, 0x0F, 0x11, 0x6C, 0x24, 0x30, 0xF2, - 0x44, 0x0F, 0x11, 0x64, 0x24, 0x28, 0x89, 0x3C, 0x24, 0x89, 0xB4, 0x24, - 0x84, 0x00, 0x00, 0x00, 0xF3, 0x0F, 0x11, 0x84, 0x24, 0x88, 0x00, 0x00, - 0x00, 0x89, 0x94, 0x24, 0x8C, 0x00, 0x00, 0x00, 0x89, 0x8C, 0x24, 0x90, - 0x00, 0x00, 0x00, 0x48, 0x83, 0xC4, 0xE0, 0x48, 0x83, 0xC4, 0x20, 0xF2, - 0x44, 0x0F, 0x10, 0x64, 0x24, 0x28, 0xF2, 0x44, 0x0F, 0x10, 0x6C, 0x24, - 0x30, 0xF2, 0x44, 0x0F, 0x10, 0x74, 0x24, 0x38, 0xF2, 0x44, 0x0F, 0x10, - 0x7C, 0x24, 0x40, 0x48, 0x83, 0xC4, 0x48, 0x5B, 0x5D, 0x41, 0x5C, 0x41, - 0x5D, 0x41, 0x5E, 0x41, 0x5F, 0xC3, + 0x44, 0x0F, 0x11, 0x64, 0x24, 0x28, 0x48, 0x89, 0x3C, 0x24, 0x89, 0xB4, + 0x24, 0x88, 0x00, 0x00, 0x00, 0xF3, 0x0F, 0x11, 0x84, 0x24, 0x8C, 0x00, + 0x00, 0x00, 0x89, 0x94, 0x24, 0x90, 0x00, 0x00, 0x00, 0x89, 0x8C, 0x24, + 0x94, 0x00, 0x00, 0x00, 0x48, 0x83, 0xC4, 0xE0, 0x48, 0x83, 0xC4, 0x20, + 0xF2, 0x44, 0x0F, 0x10, 0x64, 0x24, 0x28, 0xF2, 0x44, 0x0F, 0x10, 0x6C, + 0x24, 0x30, 0xF2, 0x44, 0x0F, 0x10, 0x74, 0x24, 0x38, 0xF2, 0x44, 0x0F, + 0x10, 0x7C, 0x24, 0x40, 0x48, 0x83, 0xC4, 0x48, 0x5B, 0x5D, 0x41, 0x5C, + 0x41, 0x5D, 0x41, 0x5E, 0x41, 0x5F, 0xC3, }; static constexpr uint8_t expected_cfi_kX86_64[] = { 0x42, 0x0E, 0x10, 0x8F, 0x04, 0x42, 0x0E, 0x18, 0x8E, 0x06, 0x42, 0x0E, 0x20, 0x8D, 0x08, 0x42, 0x0E, 0x28, 0x8C, 0x0A, 0x41, 0x0E, 0x30, 0x86, 0x0C, 0x41, 0x0E, 0x38, 0x83, 0x0E, 0x44, 0x0E, 0x80, 0x01, 0x47, 0xA0, - 0x10, 0x47, 0x9F, 0x12, 0x47, 0x9E, 0x14, 0x47, 0x9D, 0x16, 0x65, 0x0E, + 0x10, 0x47, 0x9F, 0x12, 0x47, 0x9E, 0x14, 0x47, 0x9D, 0x16, 0x66, 0x0E, 0xA0, 0x01, 0x44, 0x0E, 0x80, 0x01, 0x0A, 0x47, 0xDD, 0x47, 0xDE, 0x47, 0xDF, 0x47, 0xE0, 0x44, 0x0E, 0x38, 0x41, 0x0E, 0x30, 0xC3, 0x41, 0x0E, 0x28, 0xC6, 0x42, 0x0E, 0x20, 0xCC, 0x42, 0x0E, 0x18, 0xCD, 0x42, 0x0E, @@ -285,47 +285,47 @@ static constexpr uint8_t expected_cfi_kX86_64[] = { // 0x00000023: .cfi_offset: r30 at cfa-80 // 0x00000023: movsd [rsp + 40], xmm12 // 0x0000002a: .cfi_offset: r29 at cfa-88 -// 0x0000002a: mov [rsp], edi -// 0x0000002d: mov [rsp + 132], esi -// 0x00000034: movss [rsp + 136], xmm0 -// 0x0000003d: mov [rsp + 140], edx -// 0x00000044: mov [rsp + 144], ecx -// 0x0000004b: addq rsp, -32 -// 0x0000004f: .cfi_def_cfa_offset: 160 -// 0x0000004f: addq rsp, 32 -// 0x00000053: .cfi_def_cfa_offset: 128 -// 0x00000053: .cfi_remember_state -// 0x00000053: movsd xmm12, [rsp + 40] -// 0x0000005a: .cfi_restore: r29 -// 0x0000005a: movsd xmm13, [rsp + 48] -// 0x00000061: .cfi_restore: r30 -// 0x00000061: movsd xmm14, [rsp + 56] -// 0x00000068: .cfi_restore: r31 -// 0x00000068: movsd xmm15, [rsp + 64] -// 0x0000006f: .cfi_restore: r32 -// 0x0000006f: addq rsp, 72 -// 0x00000073: .cfi_def_cfa_offset: 56 -// 0x00000073: pop rbx -// 0x00000074: .cfi_def_cfa_offset: 48 -// 0x00000074: .cfi_restore: r3 -// 0x00000074: pop rbp -// 0x00000075: .cfi_def_cfa_offset: 40 -// 0x00000075: .cfi_restore: r6 -// 0x00000075: pop r12 -// 0x00000077: .cfi_def_cfa_offset: 32 -// 0x00000077: .cfi_restore: r12 -// 0x00000077: pop r13 -// 0x00000079: .cfi_def_cfa_offset: 24 -// 0x00000079: .cfi_restore: r13 -// 0x00000079: pop r14 -// 0x0000007b: .cfi_def_cfa_offset: 16 -// 0x0000007b: .cfi_restore: r14 -// 0x0000007b: pop r15 -// 0x0000007d: .cfi_def_cfa_offset: 8 -// 0x0000007d: .cfi_restore: r15 -// 0x0000007d: ret -// 0x0000007e: .cfi_restore_state -// 0x0000007e: .cfi_def_cfa_offset: 128 +// 0x0000002a: movq [rsp], rdi +// 0x0000002e: mov [rsp + 136], esi +// 0x00000035: movss [rsp + 140], xmm0 +// 0x0000003e: mov [rsp + 144], edx +// 0x00000045: mov [rsp + 148], ecx +// 0x0000004c: addq rsp, -32 +// 0x00000050: .cfi_def_cfa_offset: 160 +// 0x00000050: addq rsp, 32 +// 0x00000054: .cfi_def_cfa_offset: 128 +// 0x00000054: .cfi_remember_state +// 0x00000054: movsd xmm12, [rsp + 40] +// 0x0000005b: .cfi_restore: r29 +// 0x0000005b: movsd xmm13, [rsp + 48] +// 0x00000062: .cfi_restore: r30 +// 0x00000062: movsd xmm14, [rsp + 56] +// 0x00000069: .cfi_restore: r31 +// 0x00000069: movsd xmm15, [rsp + 64] +// 0x00000070: .cfi_restore: r32 +// 0x00000070: addq rsp, 72 +// 0x00000074: .cfi_def_cfa_offset: 56 +// 0x00000074: pop rbx +// 0x00000075: .cfi_def_cfa_offset: 48 +// 0x00000075: .cfi_restore: r3 +// 0x00000075: pop rbp +// 0x00000076: .cfi_def_cfa_offset: 40 +// 0x00000076: .cfi_restore: r6 +// 0x00000076: pop r12 +// 0x00000078: .cfi_def_cfa_offset: 32 +// 0x00000078: .cfi_restore: r12 +// 0x00000078: pop r13 +// 0x0000007a: .cfi_def_cfa_offset: 24 +// 0x0000007a: .cfi_restore: r13 +// 0x0000007a: pop r14 +// 0x0000007c: .cfi_def_cfa_offset: 16 +// 0x0000007c: .cfi_restore: r14 +// 0x0000007c: pop r15 +// 0x0000007e: .cfi_def_cfa_offset: 8 +// 0x0000007e: .cfi_restore: r15 +// 0x0000007e: ret +// 0x0000007f: .cfi_restore_state +// 0x0000007f: .cfi_def_cfa_offset: 128 static constexpr uint8_t expected_asm_kMips[] = { 0xC0, 0xFF, 0xBD, 0x27, 0x3C, 0x00, 0xBF, 0xAF, 0x38, 0x00, 0xB8, 0xAF, @@ -400,7 +400,7 @@ static constexpr uint8_t expected_cfi_kMips[] = { // 0x0000006c: .cfi_restore: r31 // 0x0000006c: addiu r29, r29, 64 // 0x00000070: .cfi_def_cfa_offset: 0 -// 0x00000070: jalr r0, r31 +// 0x00000070: jr r31 // 0x00000074: nop // 0x00000078: .cfi_restore_state // 0x00000078: .cfi_def_cfa_offset: 64 @@ -409,8 +409,8 @@ static constexpr uint8_t expected_asm_kMips64[] = { 0xA0, 0xFF, 0xBD, 0x67, 0x58, 0x00, 0xBF, 0xFF, 0x50, 0x00, 0xBE, 0xFF, 0x48, 0x00, 0xBC, 0xFF, 0x40, 0x00, 0xB7, 0xFF, 0x38, 0x00, 0xB6, 0xFF, 0x30, 0x00, 0xB5, 0xFF, 0x28, 0x00, 0xB4, 0xFF, 0x20, 0x00, 0xB3, 0xFF, - 0x18, 0x00, 0xB2, 0xFF, 0x00, 0x00, 0xA4, 0xAF, 0x64, 0x00, 0xA5, 0xAF, - 0x68, 0x00, 0xAE, 0xE7, 0x6C, 0x00, 0xA7, 0xAF, 0x70, 0x00, 0xA8, 0xAF, + 0x18, 0x00, 0xB2, 0xFF, 0x00, 0x00, 0xA4, 0xFF, 0x68, 0x00, 0xA5, 0xAF, + 0x6C, 0x00, 0xAE, 0xE7, 0x70, 0x00, 0xA7, 0xAF, 0x74, 0x00, 0xA8, 0xAF, 0xE0, 0xFF, 0xBD, 0x67, 0x20, 0x00, 0xBD, 0x67, 0x18, 0x00, 0xB2, 0xDF, 0x20, 0x00, 0xB3, 0xDF, 0x28, 0x00, 0xB4, 0xDF, 0x30, 0x00, 0xB5, 0xDF, 0x38, 0x00, 0xB6, 0xDF, 0x40, 0x00, 0xB7, 0xDF, 0x48, 0x00, 0xBC, 0xDF, @@ -445,11 +445,11 @@ static constexpr uint8_t expected_cfi_kMips64[] = { // 0x00000024: .cfi_offset: r19 at cfa-64 // 0x00000024: sd r18, +24(r29) // 0x00000028: .cfi_offset: r18 at cfa-72 -// 0x00000028: sw r4, +0(r29) -// 0x0000002c: sw r5, +100(r29) -// 0x00000030: swc1 f14, +104(r29) -// 0x00000034: sw r7, +108(r29) -// 0x00000038: sw r8, +112(r29) +// 0x00000028: sd r4, +0(r29) +// 0x0000002c: sw r5, +104(r29) +// 0x00000030: swc1 f14, +108(r29) +// 0x00000034: sw r7, +112(r29) +// 0x00000038: sw r8, +116(r29) // 0x0000003c: daddiu r29, r29, -32 // 0x00000040: .cfi_def_cfa_offset: 128 // 0x00000040: daddiu r29, r29, 32 @@ -479,4 +479,3 @@ static constexpr uint8_t expected_cfi_kMips64[] = { // 0x00000070: nop // 0x00000074: .cfi_restore_state // 0x00000074: .cfi_def_cfa_offset: 96 - diff --git a/compiler/jni/jni_compiler_test.cc b/compiler/jni/jni_compiler_test.cc index 4186891..e98e572 100644 --- a/compiler/jni/jni_compiler_test.cc +++ b/compiler/jni/jni_compiler_test.cc @@ -18,6 +18,7 @@ #include <math.h> +#include "art_method-inl.h" #include "class_linker.h" #include "common_compiler_test.h" #include "dex_file.h" @@ -25,7 +26,6 @@ #include "indirect_reference_table.h" #include "jni_internal.h" #include "mem_map.h" -#include "mirror/art_method-inl.h" #include "mirror/class-inl.h" #include "mirror/class_loader.h" #include "mirror/object_array-inl.h" @@ -65,12 +65,9 @@ class JniCompilerTest : public CommonCompilerTest { hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader))); // Compile the native method before starting the runtime mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader); - mirror::ArtMethod* method; - if (direct) { - method = c->FindDirectMethod(method_name, method_sig); - } else { - method = c->FindVirtualMethod(method_name, method_sig); - } + const auto pointer_size = class_linker_->GetImagePointerSize(); + ArtMethod* method = direct ? c->FindDirectMethod(method_name, method_sig, pointer_size) : + c->FindVirtualMethod(method_name, method_sig, pointer_size); ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig; if (check_generic_jni_) { method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub()); diff --git a/compiler/jni/quick/arm/calling_convention_arm.cc b/compiler/jni/quick/arm/calling_convention_arm.cc index d3690b2..9d2732a 100644 --- a/compiler/jni/quick/arm/calling_convention_arm.cc +++ b/compiler/jni/quick/arm/calling_convention_arm.cc @@ -257,8 +257,7 @@ ManagedRegister ArmJniCallingConvention::ReturnScratchRegister() const { size_t ArmJniCallingConvention::FrameSize() { // Method*, LR and callee save area size, local reference segment state - size_t frame_data_size = sizeof(StackReference<mirror::ArtMethod>) + - (2 + CalleeSaveRegisters().size()) * kFramePointerSize; + size_t frame_data_size = kArmPointerSize + (2 + CalleeSaveRegisters().size()) * kFramePointerSize; // References plus 2 words for HandleScope header size_t handle_scope_size = HandleScope::SizeOf(kFramePointerSize, ReferenceCount()); // Plus return value spill area size diff --git a/compiler/jni/quick/arm64/calling_convention_arm64.cc b/compiler/jni/quick/arm64/calling_convention_arm64.cc index 4344c90..b094747 100644 --- a/compiler/jni/quick/arm64/calling_convention_arm64.cc +++ b/compiler/jni/quick/arm64/calling_convention_arm64.cc @@ -99,8 +99,8 @@ ManagedRegister Arm64ManagedRuntimeCallingConvention::CurrentParamRegister() { FrameOffset Arm64ManagedRuntimeCallingConvention::CurrentParamStackOffset() { CHECK(IsCurrentParamOnStack()); FrameOffset result = - FrameOffset(displacement_.Int32Value() + // displacement - sizeof(StackReference<mirror::ArtMethod>) + // Method ref + FrameOffset(displacement_.Int32Value() + // displacement + kFramePointerSize + // Method ref (itr_slots_ * sizeof(uint32_t))); // offset into in args return result; } @@ -206,7 +206,7 @@ ManagedRegister Arm64JniCallingConvention::ReturnScratchRegister() const { size_t Arm64JniCallingConvention::FrameSize() { // Method*, callee save area size, local reference segment state - size_t frame_data_size = sizeof(StackReference<mirror::ArtMethod>) + + size_t frame_data_size = kFramePointerSize + CalleeSaveRegisters().size() * kFramePointerSize + sizeof(uint32_t); // References plus 2 words for HandleScope header size_t handle_scope_size = HandleScope::SizeOf(kFramePointerSize, ReferenceCount()); diff --git a/compiler/jni/quick/calling_convention.cc b/compiler/jni/quick/calling_convention.cc index 2e146c4..bb8136b 100644 --- a/compiler/jni/quick/calling_convention.cc +++ b/compiler/jni/quick/calling_convention.cc @@ -131,7 +131,7 @@ size_t JniCallingConvention::ReferenceCount() const { FrameOffset JniCallingConvention::SavedLocalReferenceCookieOffset() const { size_t references_size = handle_scope_pointer_size_ * ReferenceCount(); // size excluding header - return FrameOffset(HandleerencesOffset().Int32Value() + references_size); + return FrameOffset(HandleReferencesOffset().Int32Value() + references_size); } FrameOffset JniCallingConvention::ReturnValueSaveLocation() const { @@ -228,7 +228,7 @@ bool JniCallingConvention::IsCurrentParamALong() { FrameOffset JniCallingConvention::CurrentParamHandleScopeEntryOffset() { CHECK(IsCurrentParamAReference()); CHECK_LT(HandleScopeLinkOffset(), HandleScopeNumRefsOffset()); - int result = HandleerencesOffset().Int32Value() + itr_refs_ * handle_scope_pointer_size_; + int result = HandleReferencesOffset().Int32Value() + itr_refs_ * handle_scope_pointer_size_; CHECK_GT(result, HandleScopeNumRefsOffset().Int32Value()); return FrameOffset(result); } diff --git a/compiler/jni/quick/calling_convention.h b/compiler/jni/quick/calling_convention.h index 0c64a36..c9b595a 100644 --- a/compiler/jni/quick/calling_convention.h +++ b/compiler/jni/quick/calling_convention.h @@ -171,7 +171,7 @@ class CallingConvention { if (IsStatic()) { param++; // 0th argument must skip return value at start of the shorty } else if (param == 0) { - return frame_pointer_size_; // this argument + return sizeof(mirror::HeapReference<mirror::Object>); // this argument } size_t result = Primitive::ComponentSize(Primitive::GetType(shorty_[param])); if (result >= 1 && result < 4) { @@ -196,7 +196,7 @@ class CallingConvention { unsigned int itr_float_and_doubles_; // Space for frames below this on the stack. FrameOffset displacement_; - // The size of a reference. + // The size of a pointer. const size_t frame_pointer_size_; // The size of a reference entry within the handle scope. const size_t handle_scope_pointer_size_; @@ -320,12 +320,13 @@ class JniCallingConvention : public CallingConvention { // Position of handle scope and interior fields FrameOffset HandleScopeOffset() const { - return FrameOffset(this->displacement_.Int32Value() + sizeof(StackReference<mirror::ArtMethod>)); + return FrameOffset(this->displacement_.Int32Value() + frame_pointer_size_); // above Method reference } FrameOffset HandleScopeLinkOffset() const { - return FrameOffset(HandleScopeOffset().Int32Value() + HandleScope::LinkOffset(frame_pointer_size_)); + return FrameOffset(HandleScopeOffset().Int32Value() + + HandleScope::LinkOffset(frame_pointer_size_)); } FrameOffset HandleScopeNumRefsOffset() const { @@ -333,7 +334,7 @@ class JniCallingConvention : public CallingConvention { HandleScope::NumberOfReferencesOffset(frame_pointer_size_)); } - FrameOffset HandleerencesOffset() const { + FrameOffset HandleReferencesOffset() const { return FrameOffset(HandleScopeOffset().Int32Value() + HandleScope::ReferencesOffset(frame_pointer_size_)); } diff --git a/compiler/jni/quick/jni_compiler.cc b/compiler/jni/quick/jni_compiler.cc index a06303d..0347c5e 100644 --- a/compiler/jni/quick/jni_compiler.cc +++ b/compiler/jni/quick/jni_compiler.cc @@ -21,6 +21,7 @@ #include <vector> #include <fstream> +#include "art_method.h" #include "base/logging.h" #include "base/macros.h" #include "calling_convention.h" @@ -31,7 +32,6 @@ #include "driver/compiler_options.h" #include "entrypoints/quick/quick_entrypoints.h" #include "jni_env_ext.h" -#include "mirror/art_method.h" #include "utils/assembler.h" #include "utils/managed_register.h" #include "utils/arm/managed_register_arm.h" @@ -117,18 +117,18 @@ CompiledMethod* ArtJniCompileMethodInternal(CompilerDriver* driver, if (is_64_bit_target) { __ CopyRawPtrFromThread64(main_jni_conv->HandleScopeLinkOffset(), - Thread::TopHandleScopeOffset<8>(), - mr_conv->InterproceduralScratchRegister()); + Thread::TopHandleScopeOffset<8>(), + mr_conv->InterproceduralScratchRegister()); __ StoreStackOffsetToThread64(Thread::TopHandleScopeOffset<8>(), - main_jni_conv->HandleScopeOffset(), - mr_conv->InterproceduralScratchRegister()); + main_jni_conv->HandleScopeOffset(), + mr_conv->InterproceduralScratchRegister()); } else { __ CopyRawPtrFromThread32(main_jni_conv->HandleScopeLinkOffset(), - Thread::TopHandleScopeOffset<4>(), - mr_conv->InterproceduralScratchRegister()); + Thread::TopHandleScopeOffset<4>(), + mr_conv->InterproceduralScratchRegister()); __ StoreStackOffsetToThread32(Thread::TopHandleScopeOffset<4>(), - main_jni_conv->HandleScopeOffset(), - mr_conv->InterproceduralScratchRegister()); + main_jni_conv->HandleScopeOffset(), + mr_conv->InterproceduralScratchRegister()); } // 3. Place incoming reference arguments into handle scope @@ -138,10 +138,10 @@ CompiledMethod* ArtJniCompileMethodInternal(CompilerDriver* driver, FrameOffset handle_scope_offset = main_jni_conv->CurrentParamHandleScopeEntryOffset(); // Check handle scope offset is within frame CHECK_LT(handle_scope_offset.Uint32Value(), frame_size); - // Note this LoadRef() already includes the heap poisoning negation. + // Note this LoadRef() doesn't need heap poisoning since its from the ArtMethod. // Note this LoadRef() does not include read barrier. It will be handled below. __ LoadRef(main_jni_conv->InterproceduralScratchRegister(), - mr_conv->MethodRegister(), mirror::ArtMethod::DeclaringClassOffset()); + mr_conv->MethodRegister(), ArtMethod::DeclaringClassOffset(), false); __ VerifyObject(main_jni_conv->InterproceduralScratchRegister(), false); __ StoreRef(handle_scope_offset, main_jni_conv->InterproceduralScratchRegister()); main_jni_conv->Next(); // in handle scope so move to next argument @@ -251,12 +251,11 @@ CompiledMethod* ArtJniCompileMethodInternal(CompilerDriver* driver, if (main_jni_conv->IsCurrentParamOnStack()) { FrameOffset out_off = main_jni_conv->CurrentParamStackOffset(); __ CreateHandleScopeEntry(out_off, locked_object_handle_scope_offset, - mr_conv->InterproceduralScratchRegister(), - false); + mr_conv->InterproceduralScratchRegister(), false); } else { ManagedRegister out_reg = main_jni_conv->CurrentParamRegister(); __ CreateHandleScopeEntry(out_reg, locked_object_handle_scope_offset, - ManagedRegister::NoRegister(), false); + ManagedRegister::NoRegister(), false); } main_jni_conv->Next(); } @@ -264,10 +263,10 @@ CompiledMethod* ArtJniCompileMethodInternal(CompilerDriver* driver, __ GetCurrentThread(main_jni_conv->CurrentParamRegister()); if (is_64_bit_target) { __ Call(main_jni_conv->CurrentParamRegister(), Offset(jni_start64), - main_jni_conv->InterproceduralScratchRegister()); + main_jni_conv->InterproceduralScratchRegister()); } else { __ Call(main_jni_conv->CurrentParamRegister(), Offset(jni_start32), - main_jni_conv->InterproceduralScratchRegister()); + main_jni_conv->InterproceduralScratchRegister()); } } else { __ GetCurrentThread(main_jni_conv->CurrentParamStackOffset(), @@ -347,15 +346,15 @@ CompiledMethod* ArtJniCompileMethodInternal(CompilerDriver* driver, FrameOffset jni_env = main_jni_conv->CurrentParamStackOffset(); if (is_64_bit_target) { __ CopyRawPtrFromThread64(jni_env, Thread::JniEnvOffset<8>(), - main_jni_conv->InterproceduralScratchRegister()); + main_jni_conv->InterproceduralScratchRegister()); } else { __ CopyRawPtrFromThread32(jni_env, Thread::JniEnvOffset<4>(), - main_jni_conv->InterproceduralScratchRegister()); + main_jni_conv->InterproceduralScratchRegister()); } } // 9. Plant call to native code associated with method. - MemberOffset jni_entrypoint_offset = mirror::ArtMethod::EntryPointFromJniOffset( + MemberOffset jni_entrypoint_offset = ArtMethod::EntryPointFromJniOffset( InstructionSetPointerSize(instruction_set)); __ Call(main_jni_conv->MethodStackOffset(), jni_entrypoint_offset, mr_conv->InterproceduralScratchRegister()); diff --git a/compiler/jni/quick/mips/calling_convention_mips.cc b/compiler/jni/quick/mips/calling_convention_mips.cc index aefbf06..4e716b5 100644 --- a/compiler/jni/quick/mips/calling_convention_mips.cc +++ b/compiler/jni/quick/mips/calling_convention_mips.cc @@ -148,7 +148,7 @@ ManagedRegister MipsJniCallingConvention::ReturnScratchRegister() const { size_t MipsJniCallingConvention::FrameSize() { // Method*, LR and callee save area size, local reference segment state - size_t frame_data_size = sizeof(StackReference<mirror::ArtMethod>) + + size_t frame_data_size = kMipsPointerSize + (2 + CalleeSaveRegisters().size()) * kFramePointerSize; // References plus 2 words for HandleScope header size_t handle_scope_size = HandleScope::SizeOf(kFramePointerSize, ReferenceCount()); diff --git a/compiler/jni/quick/mips64/calling_convention_mips64.cc b/compiler/jni/quick/mips64/calling_convention_mips64.cc index d446867..3a11bcf 100644 --- a/compiler/jni/quick/mips64/calling_convention_mips64.cc +++ b/compiler/jni/quick/mips64/calling_convention_mips64.cc @@ -84,9 +84,9 @@ ManagedRegister Mips64ManagedRuntimeCallingConvention::CurrentParamRegister() { FrameOffset Mips64ManagedRuntimeCallingConvention::CurrentParamStackOffset() { CHECK(IsCurrentParamOnStack()); FrameOffset result = - FrameOffset(displacement_.Int32Value() + // displacement - sizeof(StackReference<mirror::ArtMethod>) + // Method ref - (itr_slots_ * sizeof(uint32_t))); // offset into in args + FrameOffset(displacement_.Int32Value() + // displacement + kFramePointerSize + // Method ref + (itr_slots_ * sizeof(uint32_t))); // offset into in args return result; } @@ -149,7 +149,7 @@ ManagedRegister Mips64JniCallingConvention::ReturnScratchRegister() const { size_t Mips64JniCallingConvention::FrameSize() { // Mehtod* and callee save area size, local reference segment state - size_t frame_data_size = sizeof(StackReference<mirror::ArtMethod>) + + size_t frame_data_size = kFramePointerSize + CalleeSaveRegisters().size() * kFramePointerSize + sizeof(uint32_t); // References plus 2 words for HandleScope header size_t handle_scope_size = HandleScope::SizeOf(kFramePointerSize, ReferenceCount()); diff --git a/compiler/jni/quick/x86/calling_convention_x86.cc b/compiler/jni/quick/x86/calling_convention_x86.cc index 499dd7c..322caca 100644 --- a/compiler/jni/quick/x86/calling_convention_x86.cc +++ b/compiler/jni/quick/x86/calling_convention_x86.cc @@ -180,7 +180,7 @@ 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 = sizeof(StackReference<mirror::ArtMethod>) + + size_t frame_data_size = kX86PointerSize + (2 + CalleeSaveRegisters().size()) * kFramePointerSize; // References plus 2 words for HandleScope header size_t handle_scope_size = HandleScope::SizeOf(kFramePointerSize, ReferenceCount()); 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 7e92d12..9c7eab1 100644 --- a/compiler/jni/quick/x86_64/calling_convention_x86_64.cc +++ b/compiler/jni/quick/x86_64/calling_convention_x86_64.cc @@ -97,9 +97,9 @@ ManagedRegister X86_64ManagedRuntimeCallingConvention::CurrentParamRegister() { } FrameOffset X86_64ManagedRuntimeCallingConvention::CurrentParamStackOffset() { - return FrameOffset(displacement_.Int32Value() + // displacement - sizeof(StackReference<mirror::ArtMethod>) + // Method ref - (itr_slots_ * sizeof(uint32_t))); // offset into in args + return FrameOffset(displacement_.Int32Value() + // displacement + kX86_64PointerSize + // Method ref + itr_slots_ * sizeof(uint32_t)); // offset into in args } const ManagedRegisterEntrySpills& X86_64ManagedRuntimeCallingConvention::EntrySpills() { @@ -149,7 +149,7 @@ uint32_t X86_64JniCallingConvention::FpSpillMask() const { size_t X86_64JniCallingConvention::FrameSize() { // Method*, return address and callee save area size, local reference segment state - size_t frame_data_size = sizeof(StackReference<mirror::ArtMethod>) + + size_t frame_data_size = kX86_64PointerSize + (2 + CalleeSaveRegisters().size()) * kFramePointerSize; // References plus link_ (pointer) and number_of_references_ (uint32_t) for HandleScope header size_t handle_scope_size = HandleScope::SizeOf(kFramePointerSize, ReferenceCount()); |