blob: c0864901cfdac80eacb6f511492c98bf62d1947d [file] [log] [blame]
Andreas Gampe7bcfcb82016-03-23 15:31:51 +00001/*
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
Andreas Gampe8764dc32019-01-07 15:20:12 -080019#include <ostream>
20
David Sehrc431b9d2018-03-02 12:01:51 -080021#include "base/utils.h"
Andreas Gampe7bcfcb82016-03-23 15:31:51 +000022
23namespace art {
24
Nicolas Geoffray49cda062017-04-21 13:08:25 +010025bool CompilerFilter::IsAotCompilationEnabled(Filter filter) {
Andreas Gampe7bcfcb82016-03-23 15:31:51 +000026 switch (filter) {
Nicolas Geoffray49cda062017-04-21 13:08:25 +010027 case CompilerFilter::kAssumeVerified:
28 case CompilerFilter::kExtract:
29 case CompilerFilter::kVerify:
30 case CompilerFilter::kQuicken: return false;
Andreas Gampe7bcfcb82016-03-23 15:31:51 +000031
32 case CompilerFilter::kSpaceProfile:
33 case CompilerFilter::kSpace:
Andreas Gampe7bcfcb82016-03-23 15:31:51 +000034 case CompilerFilter::kSpeedProfile:
35 case CompilerFilter::kSpeed:
36 case CompilerFilter::kEverythingProfile:
37 case CompilerFilter::kEverything: return true;
38 }
39 UNREACHABLE();
40}
41
Vladimir Marko8c185bf2016-05-23 15:32:42 +010042bool CompilerFilter::IsJniCompilationEnabled(Filter filter) {
43 switch (filter) {
Nicolas Geoffray49cda062017-04-21 13:08:25 +010044 case CompilerFilter::kAssumeVerified:
45 case CompilerFilter::kExtract:
46 case CompilerFilter::kVerify: return false;
Vladimir Marko8c185bf2016-05-23 15:32:42 +010047
Nicolas Geoffray49cda062017-04-21 13:08:25 +010048 case CompilerFilter::kQuicken:
Vladimir Marko8c185bf2016-05-23 15:32:42 +010049 case CompilerFilter::kSpaceProfile:
50 case CompilerFilter::kSpace:
Vladimir Marko8c185bf2016-05-23 15:32:42 +010051 case CompilerFilter::kSpeedProfile:
52 case CompilerFilter::kSpeed:
53 case CompilerFilter::kEverythingProfile:
54 case CompilerFilter::kEverything: return true;
55 }
56 UNREACHABLE();
57}
58
Nicolas Geoffray49cda062017-04-21 13:08:25 +010059bool CompilerFilter::IsQuickeningCompilationEnabled(Filter filter) {
Nicolas Geoffray60ca9492016-12-20 21:15:00 +000060 switch (filter) {
Nicolas Geoffray49cda062017-04-21 13:08:25 +010061 case CompilerFilter::kAssumeVerified:
62 case CompilerFilter::kExtract:
63 case CompilerFilter::kVerify: return false;
Nicolas Geoffray60ca9492016-12-20 21:15:00 +000064
Nicolas Geoffray49cda062017-04-21 13:08:25 +010065 case CompilerFilter::kQuicken:
Nicolas Geoffray60ca9492016-12-20 21:15:00 +000066 case CompilerFilter::kSpaceProfile:
67 case CompilerFilter::kSpace:
Nicolas Geoffray60ca9492016-12-20 21:15:00 +000068 case CompilerFilter::kSpeedProfile:
69 case CompilerFilter::kSpeed:
Nicolas Geoffray60ca9492016-12-20 21:15:00 +000070 case CompilerFilter::kEverythingProfile:
71 case CompilerFilter::kEverything: return true;
72 }
73 UNREACHABLE();
74}
75
Nicolas Geoffray49cda062017-04-21 13:08:25 +010076bool CompilerFilter::IsAnyCompilationEnabled(Filter filter) {
77 return IsJniCompilationEnabled(filter) ||
78 IsQuickeningCompilationEnabled(filter) ||
79 IsAotCompilationEnabled(filter);
80}
81
Andreas Gampe7bcfcb82016-03-23 15:31:51 +000082bool CompilerFilter::IsVerificationEnabled(Filter filter) {
83 switch (filter) {
Nicolas Geoffray49cda062017-04-21 13:08:25 +010084 case CompilerFilter::kAssumeVerified:
85 case CompilerFilter::kExtract: return false;
Andreas Gampe7bcfcb82016-03-23 15:31:51 +000086
Nicolas Geoffray49cda062017-04-21 13:08:25 +010087 case CompilerFilter::kVerify:
88 case CompilerFilter::kQuicken:
Andreas Gampe7bcfcb82016-03-23 15:31:51 +000089 case CompilerFilter::kSpaceProfile:
90 case CompilerFilter::kSpace:
Andreas Gampe7bcfcb82016-03-23 15:31:51 +000091 case CompilerFilter::kSpeedProfile:
92 case CompilerFilter::kSpeed:
93 case CompilerFilter::kEverythingProfile:
94 case CompilerFilter::kEverything: return true;
95 }
96 UNREACHABLE();
97}
98
99bool 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
105bool CompilerFilter::DependsOnProfile(Filter filter) {
106 switch (filter) {
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100107 case CompilerFilter::kAssumeVerified:
108 case CompilerFilter::kExtract:
109 case CompilerFilter::kVerify:
110 case CompilerFilter::kQuicken:
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000111 case CompilerFilter::kSpace:
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000112 case CompilerFilter::kSpeed:
113 case CompilerFilter::kEverything: return false;
114
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000115 case CompilerFilter::kSpaceProfile:
116 case CompilerFilter::kSpeedProfile:
117 case CompilerFilter::kEverythingProfile: return true;
118 }
119 UNREACHABLE();
120}
121
Andreas Gampefd974292016-03-30 17:19:48 -0700122CompilerFilter::Filter CompilerFilter::GetNonProfileDependentFilterFrom(Filter filter) {
123 switch (filter) {
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100124 case CompilerFilter::kAssumeVerified:
125 case CompilerFilter::kExtract:
126 case CompilerFilter::kVerify:
127 case CompilerFilter::kQuicken:
Andreas Gampefd974292016-03-30 17:19:48 -0700128 case CompilerFilter::kSpace:
Andreas Gampefd974292016-03-30 17:19:48 -0700129 case CompilerFilter::kSpeed:
130 case CompilerFilter::kEverything:
131 return filter;
132
Andreas Gampefd974292016-03-30 17:19:48 -0700133 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
Nicolas Geoffray741d4262017-05-03 13:08:36 +0100145CompilerFilter::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}
Andreas Gampefd974292016-03-30 17:19:48 -0700165
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000166bool CompilerFilter::IsAsGoodAs(Filter current, Filter target) {
167 return current >= target;
168}
169
Shubham Ajmerae4e812a2017-05-25 20:09:58 -0700170bool CompilerFilter::IsBetter(Filter current, Filter target) {
171 return current > target;
172}
173
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000174std::string CompilerFilter::NameOfFilter(Filter filter) {
175 switch (filter) {
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100176 case CompilerFilter::kAssumeVerified: return "assume-verified";
177 case CompilerFilter::kExtract: return "extract";
178 case CompilerFilter::kVerify: return "verify";
179 case CompilerFilter::kQuicken: return "quicken";
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000180 case CompilerFilter::kSpaceProfile: return "space-profile";
181 case CompilerFilter::kSpace: return "space";
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000182 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
190bool CompilerFilter::ParseCompilerFilter(const char* option, Filter* filter) {
191 CHECK(filter != nullptr);
192
193 if (strcmp(option, "verify-none") == 0) {
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100194 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;
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000197 } else if (strcmp(option, "interpret-only") == 0) {
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100198 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;
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000201 } else if (strcmp(option, "verify-profile") == 0) {
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100202 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;
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000205 } else if (strcmp(option, "verify-at-runtime") == 0) {
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100206 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;
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000225 } else if (strcmp(option, "space") == 0) {
226 *filter = kSpace;
227 } else if (strcmp(option, "space-profile") == 0) {
228 *filter = kSpaceProfile;
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000229 } else if (strcmp(option, "speed") == 0) {
230 *filter = kSpeed;
231 } else if (strcmp(option, "speed-profile") == 0) {
232 *filter = kSpeedProfile;
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000233 } else if (strcmp(option, "everything") == 0) {
234 *filter = kEverything;
235 } else if (strcmp(option, "everything-profile") == 0) {
236 *filter = kEverythingProfile;
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000237 } else {
238 return false;
239 }
240 return true;
241}
242
243std::ostream& operator<<(std::ostream& os, const CompilerFilter::Filter& rhs) {
244 return os << CompilerFilter::NameOfFilter(rhs);
245}
246
247} // namespace art