From 6079dca3058e58bb9e12a60a10324a5218a99274 Mon Sep 17 00:00:00 2001 From: Alexey Frunze Date: Sun, 28 May 2017 19:10:28 -0700 Subject: MIPS32R2: Fix MethodLoadKind::kBootImageLinkTimePcRelative This makes MIPS32 boot again. The issue was introduced in commit 6597946d29be9108e2cc51223553d3db9290a3d9: Static invokes in slow paths would sometimes get HMipsComputeBaseMethodAddress from the stack into the same register where the art method pointer would later be loaded (A0) with the former being overwritten in the process of loading the latter. Test: booted MIPS32R2 in QEMU Change-Id: Ib584cf66795574175650f42b191c797fb3b3965f --- compiler/optimizing/code_generator_mips.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'compiler/optimizing') diff --git a/compiler/optimizing/code_generator_mips.cc b/compiler/optimizing/code_generator_mips.cc index d8ac99a9a6..1978534112 100644 --- a/compiler/optimizing/code_generator_mips.cc +++ b/compiler/optimizing/code_generator_mips.cc @@ -1674,6 +1674,7 @@ Literal* CodeGeneratorMIPS::DeduplicateBootImageAddressLiteral(uint32_t address) void CodeGeneratorMIPS::EmitPcRelativeAddressPlaceholderHigh(PcRelativePatchInfo* info, Register out, Register base) { + DCHECK_NE(out, base); if (GetInstructionSetFeatures().IsR6()) { DCHECK_EQ(base, ZERO); __ Bind(&info->high_label); @@ -7139,8 +7140,8 @@ void CodeGeneratorMIPS::GenerateStaticOrDirectCall(HInvokeStaticOrDirect* invoke PcRelativePatchInfo* info = NewPcRelativeMethodPatch(invoke->GetTargetMethod()); bool reordering = __ SetReorder(false); Register temp_reg = temp.AsRegister(); - EmitPcRelativeAddressPlaceholderHigh(info, temp_reg, base_reg); - __ Addiu(temp_reg, temp_reg, /* placeholder */ 0x5678); + EmitPcRelativeAddressPlaceholderHigh(info, TMP, base_reg); + __ Addiu(temp_reg, TMP, /* placeholder */ 0x5678); __ SetReorder(reordering); break; } -- cgit v1.2.3-59-g8ed1b