summaryrefslogtreecommitdiff
path: root/compiler/optimizing/intrinsics_mips64.cc
diff options
context:
space:
mode:
author Roland Levillain <rpl@google.com> 2018-09-07 13:56:57 +0100
committer Roland Levillain <rpl@google.com> 2018-09-07 15:27:46 +0100
commit1d775d2ecfe847395e67310d588626962744c2d0 (patch)
treec0ad085c62a87400a003fb7eaeb8100a1705bf67 /compiler/optimizing/intrinsics_mips64.cc
parent1c29d5e65d01f9b37b0dbf24903977ea178bc2ea (diff)
Check that the String class is not movable in String.equals intrinsics.
Test: art/test.py Bug: 68181300 Bug: 67628039 Change-Id: I66afa3ea010f758125f8aec79509f0255cb5ea03
Diffstat (limited to 'compiler/optimizing/intrinsics_mips64.cc')
-rw-r--r--compiler/optimizing/intrinsics_mips64.cc8
1 files changed, 8 insertions, 0 deletions
diff --git a/compiler/optimizing/intrinsics_mips64.cc b/compiler/optimizing/intrinsics_mips64.cc
index 2eb252908c..cbe3b42cbf 100644
--- a/compiler/optimizing/intrinsics_mips64.cc
+++ b/compiler/optimizing/intrinsics_mips64.cc
@@ -1429,8 +1429,16 @@ void IntrinsicCodeGeneratorMIPS64::VisitStringEquals(HInvoke* invoke) {
// All string objects must have the same type since String cannot be subclassed.
// Receiver must be a string object, so its class field is equal to all strings' class fields.
// If the argument is a string object, its class field must be equal to receiver's class field.
+ //
+ // As the String class is expected to be non-movable, we can read the class
+ // field from String.equals' arguments without read barriers.
+ AssertNonMovableStringClass();
+ // /* HeapReference<Class> */ temp1 = str->klass_
__ Lw(temp1, str, class_offset);
+ // /* HeapReference<Class> */ temp2 = arg->klass_
__ Lw(temp2, arg, class_offset);
+ // Also, because we use the previously loaded class references only in the
+ // following comparison, we don't need to unpoison them.
__ Bnec(temp1, temp2, &return_false);
}