OSDN Git Service

compiler_driver: loosen DCHECK for java/lang/invoke classes.
authorNarayan Kamath <narayan@google.com>
Thu, 27 Oct 2016 10:47:30 +0000 (11:47 +0100)
committerNarayan Kamath <narayan@google.com>
Fri, 28 Oct 2016 08:54:34 +0000 (08:54 +0000)
Verifier support for invoke-polymorphic hasn't been implemented
yet, so boot classpath classes that use it will not be verified
at compile time. This change will be reverted once verifier support
is implemented.

This change is a hack.

Test: make test-art-host
Bug: 32496585
Bug: 30550796

Change-Id: Id8fcb3fd0d5ddd09f1c80f751a5f96364b137855

compiler/driver/compiler_driver.cc

index 56b4ebd..1b87725 100644 (file)
@@ -24,6 +24,8 @@
 #include <malloc.h>  // For mallinfo
 #endif
 
+#include "android-base/strings.h"
+
 #include "art_field-inl.h"
 #include "art_method-inl.h"
 #include "base/array_ref.h"
@@ -2011,12 +2013,18 @@ class VerifyClassVisitor : public CompilationVisitor {
       CHECK(klass->IsCompileTimeVerified() || klass->IsErroneous())
           << klass->PrettyDescriptor() << ": state=" << klass->GetStatus();
 
-      // It is *very* problematic if there are verification errors in the boot classpath.
-      // For example, we rely on things working OK without verification when the
-      // decryption dialog is brought up. So abort in a debug build if we find this violated.
-      DCHECK(!manager_->GetCompiler()->GetCompilerOptions().IsBootImage() || klass->IsVerified())
-          << "Boot classpath class " << klass->PrettyClass()
-          << " failed to fully verify.";
+      // It is *very* problematic if there are verification errors in the boot classpath. For example,
+      // we rely on things working OK without verification when the decryption dialog is brought up.
+      // So abort in a debug build if we find this violated.
+      if (kIsDebugBuild) {
+        // TODO(narayan): Remove this special case for signature polymorphic
+        // invokes once verifier support is fully implemented.
+        if (manager_->GetCompiler()->GetCompilerOptions().IsBootImage() &&
+            !android::base::StartsWith(descriptor, "Ljava/lang/invoke/")) {
+          DCHECK(klass->IsVerified()) << "Boot classpath class " << klass->PrettyClass()
+              << " failed to fully verify: state= " << klass->GetStatus();
+        }
+      }
     } else {
       // Make the skip a soft failure, essentially being considered as verify at runtime.
       failure_kind = verifier::MethodVerifier::kSoftFailure;