diff options
author | Vladimir Marko <vmarko@google.com> | 2014-12-19 19:27:26 +0000 |
---|---|---|
committer | Vladimir Marko <vmarko@google.com> | 2014-12-19 21:29:04 +0000 |
commit | bfe400bb1a28cde991cdb3e39bc27bae6b04b8c2 (patch) | |
tree | bad7d998663fb37ef400cbf1fc5fe4cb89b32d9a /compiler/dex/quick | |
parent | fa28ef0191e5f65bdf5932675f49d897bdc480b2 (diff) | |
download | android_art-bfe400bb1a28cde991cdb3e39bc27bae6b04b8c2.tar.gz android_art-bfe400bb1a28cde991cdb3e39bc27bae6b04b8c2.tar.bz2 android_art-bfe400bb1a28cde991cdb3e39bc27bae6b04b8c2.zip |
Fix running out of temps when storing invoke-interface result.
On ARM, after emitting invoke-interface we didn't have any
free temps to use for storing the result, so we would crash
if the result was an unpromoted dalvik register with stack
location too far from SP.
Bug: 18769895
(cherry picked from commit d6bd06c713e8ec69de96510ef57bdf7adb4781ed)
Change-Id: Id88f6f3788eaf6ecbc7bd68880b445423f6e4f94
Diffstat (limited to 'compiler/dex/quick')
-rw-r--r-- | compiler/dex/quick/arm/target_arm.cc | 1 | ||||
-rw-r--r-- | compiler/dex/quick/arm64/target_arm64.cc | 1 | ||||
-rwxr-xr-x | compiler/dex/quick/gen_invoke.cc | 2 | ||||
-rw-r--r-- | compiler/dex/quick/mips/target_mips.cc | 1 | ||||
-rwxr-xr-x | compiler/dex/quick/x86/target_x86.cc | 1 |
5 files changed, 5 insertions, 1 deletions
diff --git a/compiler/dex/quick/arm/target_arm.cc b/compiler/dex/quick/arm/target_arm.cc index d3743531fb..b05939156f 100644 --- a/compiler/dex/quick/arm/target_arm.cc +++ b/compiler/dex/quick/arm/target_arm.cc @@ -749,6 +749,7 @@ void ArmMir2Lir::FreeCallTemps() { FreeTemp(rs_r1); FreeTemp(rs_r2); FreeTemp(rs_r3); + FreeTemp(TargetReg(kHiddenArg)); if (!kArm32QuickCodeUseSoftFloat) { FreeTemp(rs_fr0); FreeTemp(rs_fr1); diff --git a/compiler/dex/quick/arm64/target_arm64.cc b/compiler/dex/quick/arm64/target_arm64.cc index 030c5ed2f4..ee7e818f85 100644 --- a/compiler/dex/quick/arm64/target_arm64.cc +++ b/compiler/dex/quick/arm64/target_arm64.cc @@ -759,6 +759,7 @@ void Arm64Mir2Lir::FreeCallTemps() { FreeTemp(rs_f5); FreeTemp(rs_f6); FreeTemp(rs_f7); + FreeTemp(TargetReg(kHiddenArg)); } RegStorage Arm64Mir2Lir::LoadHelper(QuickEntrypointEnum trampoline) { diff --git a/compiler/dex/quick/gen_invoke.cc b/compiler/dex/quick/gen_invoke.cc index 9462d3d08f..eb206a68c6 100755 --- a/compiler/dex/quick/gen_invoke.cc +++ b/compiler/dex/quick/gen_invoke.cc @@ -1557,7 +1557,7 @@ void Mir2Lir::GenInvokeNoInline(CallInfo* info) { LIR* call_insn = GenCallInsn(method_info); MarkSafepointPC(call_insn); - ClobberCallerSave(); + FreeCallTemps(); if (info->result.location != kLocInvalid) { // We have a following MOVE_RESULT - do it now. if (info->result.wide) { diff --git a/compiler/dex/quick/mips/target_mips.cc b/compiler/dex/quick/mips/target_mips.cc index efa130c65d..c22ba04e08 100644 --- a/compiler/dex/quick/mips/target_mips.cc +++ b/compiler/dex/quick/mips/target_mips.cc @@ -445,6 +445,7 @@ void MipsMir2Lir::FreeCallTemps() { FreeTemp(rs_rMIPS_ARG1); FreeTemp(rs_rMIPS_ARG2); FreeTemp(rs_rMIPS_ARG3); + FreeTemp(TargetReg(kHiddenArg)); } bool MipsMir2Lir::GenMemBarrier(MemBarrierKind barrier_kind ATTRIBUTE_UNUSED) { diff --git a/compiler/dex/quick/x86/target_x86.cc b/compiler/dex/quick/x86/target_x86.cc index 230f611de0..97732e2c12 100755 --- a/compiler/dex/quick/x86/target_x86.cc +++ b/compiler/dex/quick/x86/target_x86.cc @@ -562,6 +562,7 @@ void X86Mir2Lir::FreeCallTemps() { FreeTemp(TargetReg32(kArg1)); FreeTemp(TargetReg32(kArg2)); FreeTemp(TargetReg32(kArg3)); + FreeTemp(TargetReg32(kHiddenArg)); if (cu_->target64) { FreeTemp(TargetReg32(kArg4)); FreeTemp(TargetReg32(kArg5)); |