summaryrefslogtreecommitdiffstats
path: root/compiler/dex/quick
diff options
context:
space:
mode:
authorVladimir Marko <vmarko@google.com>2014-12-19 19:27:26 +0000
committerVladimir Marko <vmarko@google.com>2014-12-19 21:29:04 +0000
commitbfe400bb1a28cde991cdb3e39bc27bae6b04b8c2 (patch)
treebad7d998663fb37ef400cbf1fc5fe4cb89b32d9a /compiler/dex/quick
parentfa28ef0191e5f65bdf5932675f49d897bdc480b2 (diff)
downloadandroid_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.cc1
-rw-r--r--compiler/dex/quick/arm64/target_arm64.cc1
-rwxr-xr-xcompiler/dex/quick/gen_invoke.cc2
-rw-r--r--compiler/dex/quick/mips/target_mips.cc1
-rwxr-xr-xcompiler/dex/quick/x86/target_x86.cc1
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));