diff options
author | Alexey Frunze <Alexey.Frunze@imgtec.com> | 2017-05-28 19:10:28 -0700 |
---|---|---|
committer | Alexey Frunze <Alexey.Frunze@imgtec.com> | 2017-05-28 20:17:39 -0700 |
commit | 6079dca3058e58bb9e12a60a10324a5218a99274 (patch) | |
tree | 19e3a8ccf7a8ac831c27658e0470c4f83debef74 /compiler/optimizing/code_generator_mips.cc | |
parent | 0a5ace58e973da278049f837bf2cdbaf7b44849c (diff) |
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
Diffstat (limited to 'compiler/optimizing/code_generator_mips.cc')
-rw-r--r-- | compiler/optimizing/code_generator_mips.cc | 5 |
1 files changed, 3 insertions, 2 deletions
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<Register>(); - 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; } |