Access checks may fail verification due to class loaders

At compile time we have incomplete class loader information. We need to
be tolerant and make this a runtime issue.

Change-Id: I9e63b804ae68434753f0aea7a855014030a1542d
diff --git a/src/compiler.h b/src/compiler.h
index a8c596a..b43d5f6 100644
--- a/src/compiler.h
+++ b/src/compiler.h
@@ -94,16 +94,17 @@
   bool CanAccessTypeWithoutChecks(uint32_t referrer_idx, const DexCache* dex_cache,
                                   const DexFile& dex_file, uint32_t type_idx) const {
     Class* resolved_class = dex_cache->GetResolvedType(type_idx);
-    // We should never ask whether a type needs access checks to raise a verification error,
-    // all other cases where this following test could fail should have been rewritten by the
-    // verifier to verification errors. Also need to handle a lack of knowledge at compile time.
-#ifndef NDEBUG
+    if (resolved_class == NULL) {
+      return false;  // Unknown class needs access checks.
+    }
     const DexFile::MethodId& method_id = dex_file.GetMethodId(referrer_idx);
     Class* referrer_class = dex_cache->GetResolvedType(method_id.class_idx_);
-    DCHECK(resolved_class == NULL || referrer_class == NULL ||
-           referrer_class->CanAccess(resolved_class));
-#endif
-    return resolved_class != NULL;
+    if (referrer_class == NULL) {
+      return false;  // Incomplete referrer knowledge needs access check.
+    }
+    // Perform access check, will return true if access is ok or false if we're going to have to
+    // check this at runtime (for example for class loaders).
+    return referrer_class->CanAccess(resolved_class);
   }
 
  private: