Use HeapReference for SafeGetClass

Make sure to use heap refernece here so the value read isn't bogus
for heap poisoning. Fixes heap poisoning tests that were broken for
implicit null checks.

Bug: 31023171
Test: test/testrunner/testrunner.py --interpreter --optimizing -j20 --host --verbose

Change-Id: Ia67cdb304be205773d781251235f8b0b4bf7c0bd
diff --git a/runtime/fault_handler.cc b/runtime/fault_handler.cc
index f863299..7d01af0 100644
--- a/runtime/fault_handler.cc
+++ b/runtime/fault_handler.cc
@@ -79,8 +79,7 @@
 static mirror::Class* SafeGetClass(mirror::Object* obj) REQUIRES_SHARED(Locks::mutator_lock_) {
   char* obj_cls = reinterpret_cast<char*>(obj) + mirror::Object::ClassOffset().SizeValue();
 
-  mirror::CompressedReference<mirror::Class> cls =
-      mirror::CompressedReference<mirror::Class>::FromMirrorPtr(nullptr);
+  mirror::HeapReference<mirror::Class> cls;
   ssize_t rc = SafeCopy(&cls, obj_cls, sizeof(cls));
   CHECK_NE(-1, rc);
 
diff --git a/runtime/mirror/object_reference.h b/runtime/mirror/object_reference.h
index 108e8ae..c62ee6c 100644
--- a/runtime/mirror/object_reference.h
+++ b/runtime/mirror/object_reference.h
@@ -104,6 +104,8 @@
   using Compression = PtrCompression<kPoisonHeapReferences, MirrorType>;
 
  public:
+  HeapReference() REQUIRES_SHARED(Locks::mutator_lock_) : HeapReference(nullptr) {}
+
   template <bool kIsVolatile = false>
   MirrorType* AsMirrorPtr() const REQUIRES_SHARED(Locks::mutator_lock_) {
     return Compression::Decompress(
@@ -141,7 +143,7 @@
 
  private:
   explicit HeapReference(MirrorType* mirror_ptr) REQUIRES_SHARED(Locks::mutator_lock_)
-      : reference_(this->Compress(mirror_ptr)) {}
+      : reference_(Compression::Compress(mirror_ptr)) {}
 
   // The encoded reference to a mirror::Object. Atomically updateable.
   Atomic<uint32_t> reference_;