OSDN Git Service

Check for null profile in ShouldCompileBasedOnProfile
authorMathieu Chartier <mathieuc@google.com>
Wed, 22 Feb 2017 21:35:44 +0000 (13:35 -0800)
committerMathieu Chartier <mathieuc@google.com>
Wed, 22 Feb 2017 22:55:25 +0000 (14:55 -0800)
It may be null if speed-profile is passed to dex2oat without a
profile. In this case, compile nothing.

Test: mm test-art-host-gtest-dex2oat_test -j32

Bug: 35665292
Bug: 35420088

Change-Id: I2da3258492d1f6b86bba6b4bb5a86d378f0a9227

compiler/driver/compiler_driver.cc
dex2oat/dex2oat_test.cc

index 52ffa55..7e91453 100644 (file)
@@ -1054,11 +1054,16 @@ bool CompilerDriver::IsMethodToCompile(const MethodReference& method_ref) const
 }
 
 bool CompilerDriver::ShouldCompileBasedOnProfile(const MethodReference& method_ref) const {
+  // Profile compilation info may be null if no profile is passed.
   if (!CompilerFilter::DependsOnProfile(compiler_options_->GetCompilerFilter())) {
     // Use the compiler filter instead of the presence of profile_compilation_info_ since
     // we may want to have full speed compilation along with profile based layout optimizations.
     return true;
   }
+  // If we are using a profile filter but do not have a profile compilation info, compile nothing.
+  if (profile_compilation_info_ == nullptr) {
+    return false;
+  }
   bool result = profile_compilation_info_->ContainsMethod(method_ref);
 
   if (kDebugProfileGuidedCompilation) {
index 6881f75..2c0b125 100644 (file)
@@ -554,6 +554,12 @@ TEST_F(Dex2oatVeryLargeTest, UseVeryLarge) {
   RunTest(CompilerFilter::kSpeed, true, { "--very-large-app-threshold=100" });
 }
 
+// Regressin test for b/35665292.
+TEST_F(Dex2oatVeryLargeTest, SpeedProfileNoProfile) {
+  // Test that dex2oat doesn't crash with speed-profile but no input profile.
+  RunTest(CompilerFilter::kSpeedProfile, false);
+}
+
 class Dex2oatLayoutTest : public Dex2oatTest {
  protected:
   void CheckFilter(CompilerFilter::Filter input ATTRIBUTE_UNUSED,