1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "compiler_filter.h" 18 19 #include <ostream> 20 21 #include "base/utils.h" 22 23 namespace art { 24 25 bool CompilerFilter::IsAotCompilationEnabled(Filter filter) { 26 switch (filter) { 27 case CompilerFilter::kAssumeVerified: 28 case CompilerFilter::kExtract: 29 case CompilerFilter::kVerify: 30 case CompilerFilter::kQuicken: return false; 31 32 case CompilerFilter::kSpaceProfile: 33 case CompilerFilter::kSpace: 34 case CompilerFilter::kSpeedProfile: 35 case CompilerFilter::kSpeed: 36 case CompilerFilter::kEverythingProfile: 37 case CompilerFilter::kEverything: return true; 38 } 39 UNREACHABLE(); 40 } 41 42 bool CompilerFilter::IsJniCompilationEnabled(Filter filter) { 43 switch (filter) { 44 case CompilerFilter::kAssumeVerified: 45 case CompilerFilter::kExtract: 46 case CompilerFilter::kVerify: return false; 47 48 case CompilerFilter::kQuicken: 49 case CompilerFilter::kSpaceProfile: 50 case CompilerFilter::kSpace: 51 case CompilerFilter::kSpeedProfile: 52 case CompilerFilter::kSpeed: 53 case CompilerFilter::kEverythingProfile: 54 case CompilerFilter::kEverything: return true; 55 } 56 UNREACHABLE(); 57 } 58 59 bool CompilerFilter::IsQuickeningCompilationEnabled(Filter filter) { 60 switch (filter) { 61 case CompilerFilter::kAssumeVerified: 62 case CompilerFilter::kExtract: 63 case CompilerFilter::kVerify: return false; 64 65 case CompilerFilter::kQuicken: 66 case CompilerFilter::kSpaceProfile: 67 case CompilerFilter::kSpace: 68 case CompilerFilter::kSpeedProfile: 69 case CompilerFilter::kSpeed: 70 case CompilerFilter::kEverythingProfile: 71 case CompilerFilter::kEverything: return true; 72 } 73 UNREACHABLE(); 74 } 75 76 bool CompilerFilter::IsAnyCompilationEnabled(Filter filter) { 77 return IsJniCompilationEnabled(filter) || 78 IsQuickeningCompilationEnabled(filter) || 79 IsAotCompilationEnabled(filter); 80 } 81 82 bool CompilerFilter::IsVerificationEnabled(Filter filter) { 83 switch (filter) { 84 case CompilerFilter::kAssumeVerified: 85 case CompilerFilter::kExtract: return false; 86 87 case CompilerFilter::kVerify: 88 case CompilerFilter::kQuicken: 89 case CompilerFilter::kSpaceProfile: 90 case CompilerFilter::kSpace: 91 case CompilerFilter::kSpeedProfile: 92 case CompilerFilter::kSpeed: 93 case CompilerFilter::kEverythingProfile: 94 case CompilerFilter::kEverything: return true; 95 } 96 UNREACHABLE(); 97 } 98 99 bool CompilerFilter::DependsOnImageChecksum(Filter filter) { 100 // We run dex2dex with verification, so the oat file will depend on the 101 // image checksum if verification is enabled. 102 return IsVerificationEnabled(filter); 103 } 104 105 bool CompilerFilter::DependsOnProfile(Filter filter) { 106 switch (filter) { 107 case CompilerFilter::kAssumeVerified: 108 case CompilerFilter::kExtract: 109 case CompilerFilter::kVerify: 110 case CompilerFilter::kQuicken: 111 case CompilerFilter::kSpace: 112 case CompilerFilter::kSpeed: 113 case CompilerFilter::kEverything: return false; 114 115 case CompilerFilter::kSpaceProfile: 116 case CompilerFilter::kSpeedProfile: 117 case CompilerFilter::kEverythingProfile: return true; 118 } 119 UNREACHABLE(); 120 } 121 122 CompilerFilter::Filter CompilerFilter::GetNonProfileDependentFilterFrom(Filter filter) { 123 switch (filter) { 124 case CompilerFilter::kAssumeVerified: 125 case CompilerFilter::kExtract: 126 case CompilerFilter::kVerify: 127 case CompilerFilter::kQuicken: 128 case CompilerFilter::kSpace: 129 case CompilerFilter::kSpeed: 130 case CompilerFilter::kEverything: 131 return filter; 132 133 case CompilerFilter::kSpaceProfile: 134 return CompilerFilter::kSpace; 135 136 case CompilerFilter::kSpeedProfile: 137 return CompilerFilter::kSpeed; 138 139 case CompilerFilter::kEverythingProfile: 140 return CompilerFilter::kEverything; 141 } 142 UNREACHABLE(); 143 } 144 145 CompilerFilter::Filter CompilerFilter::GetSafeModeFilterFrom(Filter filter) { 146 // For safe mode, we should not return a filter that generates AOT compiled 147 // code. 148 switch (filter) { 149 case CompilerFilter::kAssumeVerified: 150 case CompilerFilter::kExtract: 151 case CompilerFilter::kVerify: 152 case CompilerFilter::kQuicken: 153 return filter; 154 155 case CompilerFilter::kSpace: 156 case CompilerFilter::kSpeed: 157 case CompilerFilter::kEverything: 158 case CompilerFilter::kSpaceProfile: 159 case CompilerFilter::kSpeedProfile: 160 case CompilerFilter::kEverythingProfile: 161 return CompilerFilter::kQuicken; 162 } 163 UNREACHABLE(); 164 } 165 166 bool CompilerFilter::IsAsGoodAs(Filter current, Filter target) { 167 return current >= target; 168 } 169 170 bool CompilerFilter::IsBetter(Filter current, Filter target) { 171 return current > target; 172 } 173 174 std::string CompilerFilter::NameOfFilter(Filter filter) { 175 switch (filter) { 176 case CompilerFilter::kAssumeVerified: return "assume-verified"; 177 case CompilerFilter::kExtract: return "extract"; 178 case CompilerFilter::kVerify: return "verify"; 179 case CompilerFilter::kQuicken: return "quicken"; 180 case CompilerFilter::kSpaceProfile: return "space-profile"; 181 case CompilerFilter::kSpace: return "space"; 182 case CompilerFilter::kSpeedProfile: return "speed-profile"; 183 case CompilerFilter::kSpeed: return "speed"; 184 case CompilerFilter::kEverythingProfile: return "everything-profile"; 185 case CompilerFilter::kEverything: return "everything"; 186 } 187 UNREACHABLE(); 188 } 189 190 bool CompilerFilter::ParseCompilerFilter(const char* option, Filter* filter) { 191 CHECK(filter != nullptr); 192 193 if (strcmp(option, "verify-none") == 0) { 194 LOG(WARNING) << "'verify-none' is an obsolete compiler filter name that will be " 195 << "removed in future releases, please use 'assume-verified' instead."; 196 *filter = kAssumeVerified; 197 } else if (strcmp(option, "interpret-only") == 0) { 198 LOG(WARNING) << "'interpret-only' is an obsolete compiler filter name that will be " 199 << "removed in future releases, please use 'quicken' instead."; 200 *filter = kQuicken; 201 } else if (strcmp(option, "verify-profile") == 0) { 202 LOG(WARNING) << "'verify-profile' is an obsolete compiler filter name that will be " 203 << "removed in future releases, please use 'verify' instead."; 204 *filter = kVerify; 205 } else if (strcmp(option, "verify-at-runtime") == 0) { 206 LOG(WARNING) << "'verify-at-runtime' is an obsolete compiler filter name that will be " 207 << "removed in future releases, please use 'extract' instead."; 208 *filter = kExtract; 209 } else if (strcmp(option, "balanced") == 0) { 210 LOG(WARNING) << "'balanced' is an obsolete compiler filter name that will be " 211 << "removed in future releases, please use 'speed' instead."; 212 *filter = kSpeed; 213 } else if (strcmp(option, "time") == 0) { 214 LOG(WARNING) << "'time' is an obsolete compiler filter name that will be " 215 << "removed in future releases, please use 'space' instead."; 216 *filter = kSpace; 217 } else if (strcmp(option, "assume-verified") == 0) { 218 *filter = kAssumeVerified; 219 } else if (strcmp(option, "extract") == 0) { 220 *filter = kExtract; 221 } else if (strcmp(option, "verify") == 0) { 222 *filter = kVerify; 223 } else if (strcmp(option, "quicken") == 0) { 224 *filter = kQuicken; 225 } else if (strcmp(option, "space") == 0) { 226 *filter = kSpace; 227 } else if (strcmp(option, "space-profile") == 0) { 228 *filter = kSpaceProfile; 229 } else if (strcmp(option, "speed") == 0) { 230 *filter = kSpeed; 231 } else if (strcmp(option, "speed-profile") == 0) { 232 *filter = kSpeedProfile; 233 } else if (strcmp(option, "everything") == 0) { 234 *filter = kEverything; 235 } else if (strcmp(option, "everything-profile") == 0) { 236 *filter = kEverythingProfile; 237 } else { 238 return false; 239 } 240 return true; 241 } 242 243 std::ostream& operator<<(std::ostream& os, const CompilerFilter::Filter& rhs) { 244 return os << CompilerFilter::NameOfFilter(rhs); 245 } 246 247 } // namespace art 248