diff options
author | Mathieu Chartier <mathieuc@google.com> | 2015-03-13 16:32:44 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2015-03-13 18:49:27 -0700 |
commit | 921d6eb3c4e12a2000fe490c4e58d0e6e0628b90 (patch) | |
tree | e93a9a3cf8274d69463b5fb3703040ae05285c30 /compiler/dex | |
parent | 97930feb1288f1b8ef08f11af5db9e0fe1e6bbe7 (diff) | |
download | android_art-921d6eb3c4e12a2000fe490c4e58d0e6e0628b90.tar.gz android_art-921d6eb3c4e12a2000fe490c4e58d0e6e0628b90.tar.bz2 android_art-921d6eb3c4e12a2000fe490c4e58d0e6e0628b90.zip |
Fix 32 bit loads of 64 bit direct code pointers
Fixes 64 bit problems for JIT since the JIT code cache isn't always
in the low 2GB.
(cherry picked from commit 0d2ac187be10838c008e6aaa03e5e55014e9087e)
Change-Id: Ifd37d6a86166a91be1b258da7329c888fd82e4b9
Diffstat (limited to 'compiler/dex')
-rw-r--r-- | compiler/dex/quick/arm64/call_arm64.cc | 6 | ||||
-rw-r--r-- | compiler/dex/quick/mips64/call_mips64.cc | 6 | ||||
-rw-r--r-- | compiler/dex/quick/x86/call_x86.cc | 7 |
3 files changed, 12 insertions, 7 deletions
diff --git a/compiler/dex/quick/arm64/call_arm64.cc b/compiler/dex/quick/arm64/call_arm64.cc index 15edcc5142..82751626e3 100644 --- a/compiler/dex/quick/arm64/call_arm64.cc +++ b/compiler/dex/quick/arm64/call_arm64.cc @@ -449,14 +449,14 @@ static int Arm64NextSDCallInsn(CompilationUnit* cu, CallInfo* info, switch (state) { case 0: // Get the current Method* [sets kArg0] if (direct_code != static_cast<uintptr_t>(-1)) { - cg->LoadConstant(cg->TargetPtrReg(kInvokeTgt), direct_code); + cg->LoadConstantWide(cg->TargetPtrReg(kInvokeTgt), direct_code); } else if (Arm64UseRelativeCall(cu, target_method)) { // Defer to linker patch. } else { cg->LoadCodeAddress(target_method, type, kInvokeTgt); } if (direct_method != static_cast<uintptr_t>(-1)) { - cg->LoadConstant(cg->TargetReg(kArg0, kRef), direct_method); + cg->LoadConstantWide(cg->TargetReg(kArg0, kRef), direct_method); } else { cg->LoadMethodAddress(target_method, type, kArg0); } @@ -479,7 +479,7 @@ static int Arm64NextSDCallInsn(CompilationUnit* cu, CallInfo* info, // Set up direct code if known. if (direct_code != 0) { if (direct_code != static_cast<uintptr_t>(-1)) { - cg->LoadConstant(cg->TargetPtrReg(kInvokeTgt), direct_code); + cg->LoadConstantWide(cg->TargetPtrReg(kInvokeTgt), direct_code); } else if (Arm64UseRelativeCall(cu, target_method)) { // Defer to linker patch. } else { diff --git a/compiler/dex/quick/mips64/call_mips64.cc b/compiler/dex/quick/mips64/call_mips64.cc index 63cef7e348..31be1c21a6 100644 --- a/compiler/dex/quick/mips64/call_mips64.cc +++ b/compiler/dex/quick/mips64/call_mips64.cc @@ -356,12 +356,12 @@ static int Mips64NextSDCallInsn(CompilationUnit* cu, CallInfo* info ATTRIBUTE_UN switch (state) { case 0: // Get the current Method* [sets kArg0] if (direct_code != static_cast<uintptr_t>(-1)) { - cg->LoadConstant(cg->TargetPtrReg(kInvokeTgt), direct_code); + cg->LoadConstantWide(cg->TargetPtrReg(kInvokeTgt), direct_code); } else { cg->LoadCodeAddress(target_method, type, kInvokeTgt); } if (direct_method != static_cast<uintptr_t>(-1)) { - cg->LoadConstant(cg->TargetReg(kArg0, kRef), direct_method); + cg->LoadConstantWide(cg->TargetReg(kArg0, kRef), direct_method); } else { cg->LoadMethodAddress(target_method, type, kArg0); } @@ -382,7 +382,7 @@ static int Mips64NextSDCallInsn(CompilationUnit* cu, CallInfo* info ATTRIBUTE_UN // Set up direct code if known. if (direct_code != 0) { if (direct_code != static_cast<uintptr_t>(-1)) { - cg->LoadConstant(cg->TargetPtrReg(kInvokeTgt), direct_code); + cg->LoadConstantWide(cg->TargetPtrReg(kInvokeTgt), direct_code); } else { CHECK_LT(target_method.dex_method_index, target_method.dex_file->NumMethodIds()); cg->LoadCodeAddress(target_method, type, kInvokeTgt); diff --git a/compiler/dex/quick/x86/call_x86.cc b/compiler/dex/quick/x86/call_x86.cc index c3db3a64e5..11c146549e 100644 --- a/compiler/dex/quick/x86/call_x86.cc +++ b/compiler/dex/quick/x86/call_x86.cc @@ -332,7 +332,12 @@ static int X86NextSDCallInsn(CompilationUnit* cu, CallInfo* info, switch (state) { case 0: // Get the current Method* [sets kArg0] if (direct_method != static_cast<uintptr_t>(-1)) { - cg->LoadConstant(cg->TargetReg(kArg0, kRef), direct_method); + auto target_reg = cg->TargetReg(kArg0, kRef); + if (target_reg.Is64Bit()) { + cg->LoadConstantWide(target_reg, direct_method); + } else { + cg->LoadConstant(target_reg, direct_method); + } } else { cg->LoadMethodAddress(target_method, type, kArg0); } |