OSDN Git Service

Get heap poisoning working in 64-bit.
authorHiroshi Yamauchi <yamauchi@google.com>
Fri, 26 Sep 2014 21:55:38 +0000 (14:55 -0700)
committerHiroshi Yamauchi <yamauchi@google.com>
Mon, 29 Sep 2014 23:21:28 +0000 (16:21 -0700)
This adds the reference negate code in arm64 and x86_64 that's used by
the jni compiler.

Bug: 12687968
Bug: 8367515
Change-Id: I28a44bcead1ee613866645620b4eaf54fad6a3aa

compiler/utils/arm64/assembler_arm64.cc
compiler/utils/x86_64/assembler_x86_64.cc

index 3edf59b..c82b4f0 100644 (file)
@@ -299,6 +299,10 @@ void Arm64Assembler::LoadRef(ManagedRegister m_dst, ManagedRegister m_base,
   CHECK(dst.IsCoreRegister() && base.IsCoreRegister());
   LoadWFromOffset(kLoadWord, dst.AsOverlappingCoreRegisterLow(), base.AsCoreRegister(),
                   offs.Int32Value());
+  if (kPoisonHeapReferences) {
+    WRegister ref_reg = dst.AsOverlappingCoreRegisterLow();
+    ___ Neg(reg_w(ref_reg), vixl::Operand(reg_w(ref_reg)));
+  }
 }
 
 void Arm64Assembler::LoadRawPtr(ManagedRegister m_dst, ManagedRegister m_base, Offset offs) {
index a47e968..1dcd4b3 100644 (file)
@@ -1992,6 +1992,9 @@ void X86_64Assembler::LoadRef(ManagedRegister mdest, ManagedRegister base,
   X86_64ManagedRegister dest = mdest.AsX86_64();
   CHECK(dest.IsCpuRegister() && dest.IsCpuRegister());
   movq(dest.AsCpuRegister(), Address(base.AsX86_64().AsCpuRegister(), offs));
+  if (kPoisonHeapReferences) {
+    negl(dest.AsCpuRegister());
+  }
 }
 
 void X86_64Assembler::LoadRawPtr(ManagedRegister mdest, ManagedRegister base,
@@ -2276,4 +2279,3 @@ void X86_64ExceptionSlowPath::Emit(Assembler *sasm) {
 
 }  // namespace x86_64
 }  // namespace art
-