diff options
author | Calin Juravle <calin@google.com> | 2018-02-13 20:32:35 -0800 |
---|---|---|
committer | Calin Juravle <calin@google.com> | 2018-02-15 15:31:19 -0800 |
commit | ee9cb41260bc76cdb8572b10e99e6da866d9a8c8 (patch) | |
tree | c5192809ccfe6042800b5710fa22ec600060a81d /profman | |
parent | b40fa7c33075292beeb6840ac679ffd08fd1f719 (diff) | |
download | android_art-ee9cb41260bc76cdb8572b10e99e6da866d9a8c8.tar.gz android_art-ee9cb41260bc76cdb8572b10e99e6da866d9a8c8.tar.bz2 android_art-ee9cb41260bc76cdb8572b10e99e6da866d9a8c8.zip |
Ensure that we always set the method hotness in the profile
The method hotness were not recorded for methods extracted from the JIT
code cache.
Test: gtest & run-test
Bug: 71588770
Change-Id: Ifdf6340caa9faf5adb6f3b3b5b4046f31f34189c
Diffstat (limited to 'profman')
-rw-r--r-- | profman/profile_assistant_test.cc | 22 | ||||
-rw-r--r-- | profman/profman.cc | 27 |
2 files changed, 30 insertions, 19 deletions
diff --git a/profman/profile_assistant_test.cc b/profman/profile_assistant_test.cc index 79310ac166..188d0b0a24 100644 --- a/profman/profile_assistant_test.cc +++ b/profman/profile_assistant_test.cc @@ -31,6 +31,8 @@ namespace art { +using Hotness = ProfileCompilationInfo::MethodHotness; + static constexpr size_t kMaxMethodIds = 65535; class ProfileAssistantTest : public CommonRuntimeTest { @@ -80,12 +82,17 @@ class ProfileAssistantTest : public CommonRuntimeTest { ProfileCompilationInfo::OfflineProfileMethodInfo pmi = GetOfflineProfileMethodInfo(dex_location1, dex_location_checksum1, dex_location2, dex_location_checksum2); + Hotness::Flag flags = Hotness::kFlagPostStartup; if (reverse_dex_write_order) { - ASSERT_TRUE(info->AddMethod(dex_location2, dex_location_checksum2, i, kMaxMethodIds, pmi)); - ASSERT_TRUE(info->AddMethod(dex_location1, dex_location_checksum1, i, kMaxMethodIds, pmi)); + ASSERT_TRUE(info->AddMethod( + dex_location2, dex_location_checksum2, i, kMaxMethodIds, pmi, flags)); + ASSERT_TRUE(info->AddMethod( + dex_location1, dex_location_checksum1, i, kMaxMethodIds, pmi, flags)); } else { - ASSERT_TRUE(info->AddMethod(dex_location1, dex_location_checksum1, i, kMaxMethodIds, pmi)); - ASSERT_TRUE(info->AddMethod(dex_location2, dex_location_checksum2, i, kMaxMethodIds, pmi)); + ASSERT_TRUE(info->AddMethod( + dex_location1, dex_location_checksum1, i, kMaxMethodIds, pmi, flags)); + ASSERT_TRUE(info->AddMethod( + dex_location2, dex_location_checksum2, i, kMaxMethodIds, pmi, flags)); } } for (uint16_t i = 0; i < number_of_classes; i++) { @@ -109,7 +116,6 @@ class ProfileAssistantTest : public CommonRuntimeTest { const ScratchFile& profile, ProfileCompilationInfo* info) { std::string dex_location = "location1" + id; - using Hotness = ProfileCompilationInfo::MethodHotness; for (uint32_t idx : hot_methods) { info->AddMethodIndex(Hotness::kFlagHot, dex_location, checksum, idx, number_of_methods); } @@ -1086,10 +1092,10 @@ TEST_F(ProfileAssistantTest, TestProfileCreateWithInvalidData) { ASSERT_EQ(1u, classes.size()); ASSERT_TRUE(classes.find(invalid_class_index) != classes.end()); - // Verify that the invalid method is in the profile. - ASSERT_EQ(2u, hot_methods.size()); + // Verify that the invalid method did not get in the profile. + ASSERT_EQ(1u, hot_methods.size()); uint16_t invalid_method_index = std::numeric_limits<uint16_t>::max() - 1; - ASSERT_TRUE(hot_methods.find(invalid_method_index) != hot_methods.end()); + ASSERT_FALSE(hot_methods.find(invalid_method_index) != hot_methods.end()); } TEST_F(ProfileAssistantTest, DumpOnly) { diff --git a/profman/profman.cc b/profman/profman.cc index 387ce8dfae..efb7fcfec6 100644 --- a/profman/profman.cc +++ b/profman/profman.cc @@ -895,6 +895,17 @@ class ProfMan FINAL { method_str = line.substr(method_sep_index + kMethodSep.size()); } + uint32_t flags = 0; + if (is_hot) { + flags |= ProfileCompilationInfo::MethodHotness::kFlagHot; + } + if (is_startup) { + flags |= ProfileCompilationInfo::MethodHotness::kFlagStartup; + } + if (is_post_startup) { + flags |= ProfileCompilationInfo::MethodHotness::kFlagPostStartup; + } + TypeReference class_ref(/* dex_file */ nullptr, dex::TypeIndex()); if (!FindClass(dex_files, klass, &class_ref)) { LOG(WARNING) << "Could not find class: " << klass; @@ -930,7 +941,7 @@ class ProfMan FINAL { } } // TODO: Check return values? - profile->AddMethods(methods); + profile->AddMethods(methods, static_cast<ProfileCompilationInfo::MethodHotness::Flag>(flags)); profile->AddClasses(resolved_class_set); return true; } @@ -982,18 +993,12 @@ class ProfMan FINAL { } MethodReference ref(class_ref.dex_file, method_index); if (is_hot) { - profile->AddMethod(ProfileMethodInfo(ref, inline_caches)); - } - uint32_t flags = 0; - using Hotness = ProfileCompilationInfo::MethodHotness; - if (is_startup) { - flags |= Hotness::kFlagStartup; - } - if (is_post_startup) { - flags |= Hotness::kFlagPostStartup; + profile->AddMethod(ProfileMethodInfo(ref, inline_caches), + static_cast<ProfileCompilationInfo::MethodHotness::Flag>(flags)); } if (flags != 0) { - if (!profile->AddMethodIndex(static_cast<Hotness::Flag>(flags), ref)) { + if (!profile->AddMethodIndex( + static_cast<ProfileCompilationInfo::MethodHotness::Flag>(flags), ref)) { return false; } DCHECK(profile->GetMethodHotness(ref).IsInProfile()); |