From: Andreas Gampe Date: Thu, 31 Mar 2016 00:19:48 +0000 (-0700) Subject: ART: Add support for DexFile compiler filter function X-Git-Tag: android-x86-7.1-r1~248^2~5^2^2~76^2^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=86a785d23ba3956b78c33aa3b623df4b6ec8b901;p=android-x86%2Fart.git ART: Add support for DexFile compiler filter function Add support for getting a non-profile-guided version of a given compiler filter. Bug: 27921071 (cherry picked from commit fd97429f258acde6ee24a6f74c9050b2343e40cd) Change-Id: I54735b61732e6a5c9dc62425d04bc740dd365083 --- diff --git a/runtime/compiler_filter.cc b/runtime/compiler_filter.cc index 31a1bc10f..d617caf78 100644 --- a/runtime/compiler_filter.cc +++ b/runtime/compiler_filter.cc @@ -83,6 +83,34 @@ bool CompilerFilter::DependsOnProfile(Filter filter) { UNREACHABLE(); } +CompilerFilter::Filter CompilerFilter::GetNonProfileDependentFilterFrom(Filter filter) { + switch (filter) { + case CompilerFilter::kVerifyNone: + case CompilerFilter::kVerifyAtRuntime: + case CompilerFilter::kInterpretOnly: + case CompilerFilter::kSpace: + case CompilerFilter::kBalanced: + case CompilerFilter::kTime: + case CompilerFilter::kSpeed: + case CompilerFilter::kEverything: + return filter; + + case CompilerFilter::kVerifyProfile: + return CompilerFilter::kInterpretOnly; + + case CompilerFilter::kSpaceProfile: + return CompilerFilter::kSpace; + + case CompilerFilter::kSpeedProfile: + return CompilerFilter::kSpeed; + + case CompilerFilter::kEverythingProfile: + return CompilerFilter::kEverything; + } + UNREACHABLE(); +} + + bool CompilerFilter::IsAsGoodAs(Filter current, Filter target) { return current >= target; } diff --git a/runtime/compiler_filter.h b/runtime/compiler_filter.h index 1bea8b4f5..6289d8a22 100644 --- a/runtime/compiler_filter.h +++ b/runtime/compiler_filter.h @@ -59,6 +59,9 @@ class CompilerFilter FINAL { // profile. static bool DependsOnProfile(Filter filter); + // Returns a non-profile-guided version of the given filter. + static Filter GetNonProfileDependentFilterFrom(Filter filter); + // Returns true if the 'current' compiler filter is considered at least as // good as the 'target' compilation type. // For example: kSpeed is as good as kInterpretOnly, but kInterpretOnly is diff --git a/runtime/native/dalvik_system_DexFile.cc b/runtime/native/dalvik_system_DexFile.cc index 1e4b35f96..0abe39d87 100644 --- a/runtime/native/dalvik_system_DexFile.cc +++ b/runtime/native/dalvik_system_DexFile.cc @@ -456,6 +456,31 @@ static jboolean DexFile_isProfileGuidedCompilerFilter(JNIEnv* env, return CompilerFilter::DependsOnProfile(filter) ? JNI_TRUE : JNI_FALSE; } +static jstring DexFile_getNonProfileGuidedCompilerFilter(JNIEnv* env, + jclass javeDexFileClass ATTRIBUTE_UNUSED, + jstring javaCompilerFilter) { + ScopedUtfChars compiler_filter(env, javaCompilerFilter); + if (env->ExceptionCheck()) { + return nullptr; + } + + CompilerFilter::Filter filter; + if (!CompilerFilter::ParseCompilerFilter(compiler_filter.c_str(), &filter)) { + return javaCompilerFilter; + } + + CompilerFilter::Filter new_filter = CompilerFilter::GetNonProfileDependentFilterFrom(filter); + + // Filter stayed the same, return input. + if (filter == new_filter) { + return javaCompilerFilter; + } + + // Create a new string object and return. + std::string new_filter_str = CompilerFilter::NameOfFilter(new_filter); + return env->NewStringUTF(new_filter_str.c_str()); +} + static JNINativeMethod gMethods[] = { NATIVE_METHOD(DexFile, closeDexFile, "(Ljava/lang/Object;)Z"), NATIVE_METHOD(DexFile, @@ -478,6 +503,9 @@ static JNINativeMethod gMethods[] = { ")Ljava/lang/Object;"), NATIVE_METHOD(DexFile, isValidCompilerFilter, "(Ljava/lang/String;)Z"), NATIVE_METHOD(DexFile, isProfileGuidedCompilerFilter, "(Ljava/lang/String;)Z"), + NATIVE_METHOD(DexFile, + getNonProfileGuidedCompilerFilter, + "(Ljava/lang/String;)Ljava/lang/String;"), }; void register_dalvik_system_DexFile(JNIEnv* env) {