blob: dc55ab8931a4f56099d32a16e5dcfadd457f04ce [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
19#include "utils.h"
20
21namespace art {
22
Vladimir Marko8c185bf2016-05-23 15:32:42 +010023bool CompilerFilter::IsBytecodeCompilationEnabled(Filter filter) {
Andreas Gampe7bcfcb82016-03-23 15:31:51 +000024 switch (filter) {
25 case CompilerFilter::kVerifyNone:
26 case CompilerFilter::kVerifyAtRuntime:
27 case CompilerFilter::kVerifyProfile:
28 case CompilerFilter::kInterpretOnly: return false;
29
30 case CompilerFilter::kSpaceProfile:
31 case CompilerFilter::kSpace:
32 case CompilerFilter::kBalanced:
33 case CompilerFilter::kTime:
34 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) {
44 case CompilerFilter::kVerifyNone:
45 case CompilerFilter::kVerifyAtRuntime: return false;
46
47 case CompilerFilter::kVerifyProfile:
48 case CompilerFilter::kInterpretOnly:
49 case CompilerFilter::kSpaceProfile:
50 case CompilerFilter::kSpace:
51 case CompilerFilter::kBalanced:
52 case CompilerFilter::kTime:
53 case CompilerFilter::kSpeedProfile:
54 case CompilerFilter::kSpeed:
55 case CompilerFilter::kEverythingProfile:
56 case CompilerFilter::kEverything: return true;
57 }
58 UNREACHABLE();
59}
60
Nicolas Geoffray60ca9492016-12-20 21:15:00 +000061bool CompilerFilter::IsAnyMethodCompilationEnabled(Filter filter) {
62 switch (filter) {
63 case CompilerFilter::kVerifyNone:
64 case CompilerFilter::kVerifyAtRuntime:
65 case CompilerFilter::kVerifyProfile: return false;
66
67 case CompilerFilter::kInterpretOnly:
68 case CompilerFilter::kSpaceProfile:
69 case CompilerFilter::kSpace:
70 case CompilerFilter::kBalanced:
71 case CompilerFilter::kTime:
72 case CompilerFilter::kSpeedProfile:
73 case CompilerFilter::kSpeed:
Nicolas Geoffray60ca9492016-12-20 21:15:00 +000074 case CompilerFilter::kEverythingProfile:
75 case CompilerFilter::kEverything: return true;
76 }
77 UNREACHABLE();
78}
79
Andreas Gampe7bcfcb82016-03-23 15:31:51 +000080bool CompilerFilter::IsVerificationEnabled(Filter filter) {
81 switch (filter) {
82 case CompilerFilter::kVerifyNone:
83 case CompilerFilter::kVerifyAtRuntime: return false;
84
85 case CompilerFilter::kVerifyProfile:
86 case CompilerFilter::kInterpretOnly:
87 case CompilerFilter::kSpaceProfile:
88 case CompilerFilter::kSpace:
89 case CompilerFilter::kBalanced:
90 case CompilerFilter::kTime:
91 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) {
107 case CompilerFilter::kVerifyNone:
108 case CompilerFilter::kVerifyAtRuntime:
109 case CompilerFilter::kInterpretOnly:
110 case CompilerFilter::kSpace:
111 case CompilerFilter::kBalanced:
112 case CompilerFilter::kTime:
113 case CompilerFilter::kSpeed:
114 case CompilerFilter::kEverything: return false;
115
Nicolas Geoffray23a625c2017-02-06 10:28:33 +0000116 // verify-profile doesn't look at profiles anymore.
117 // TODO(ngeoffray): this will be cleaned up with b/34715556.
118 case CompilerFilter::kVerifyProfile: return false;
119
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000120 case CompilerFilter::kSpaceProfile:
121 case CompilerFilter::kSpeedProfile:
122 case CompilerFilter::kEverythingProfile: return true;
123 }
124 UNREACHABLE();
125}
126
Andreas Gampefd974292016-03-30 17:19:48 -0700127CompilerFilter::Filter CompilerFilter::GetNonProfileDependentFilterFrom(Filter filter) {
128 switch (filter) {
129 case CompilerFilter::kVerifyNone:
130 case CompilerFilter::kVerifyAtRuntime:
131 case CompilerFilter::kInterpretOnly:
132 case CompilerFilter::kSpace:
133 case CompilerFilter::kBalanced:
134 case CompilerFilter::kTime:
135 case CompilerFilter::kSpeed:
136 case CompilerFilter::kEverything:
137 return filter;
138
139 case CompilerFilter::kVerifyProfile:
Nicolas Geoffray23a625c2017-02-06 10:28:33 +0000140 // verify-profile doesn't look at profiles anymore.
141 // TODO(ngeoffray): this will be cleaned up with b/34715556.
142 return filter;
Andreas Gampefd974292016-03-30 17:19:48 -0700143
144 case CompilerFilter::kSpaceProfile:
145 return CompilerFilter::kSpace;
146
147 case CompilerFilter::kSpeedProfile:
148 return CompilerFilter::kSpeed;
149
150 case CompilerFilter::kEverythingProfile:
151 return CompilerFilter::kEverything;
152 }
153 UNREACHABLE();
154}
155
156
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000157bool CompilerFilter::IsAsGoodAs(Filter current, Filter target) {
158 return current >= target;
159}
160
161std::string CompilerFilter::NameOfFilter(Filter filter) {
162 switch (filter) {
163 case CompilerFilter::kVerifyNone: return "verify-none";
164 case CompilerFilter::kVerifyAtRuntime: return "verify-at-runtime";
165 case CompilerFilter::kVerifyProfile: return "verify-profile";
166 case CompilerFilter::kInterpretOnly: return "interpret-only";
167 case CompilerFilter::kSpaceProfile: return "space-profile";
168 case CompilerFilter::kSpace: return "space";
169 case CompilerFilter::kBalanced: return "balanced";
170 case CompilerFilter::kTime: return "time";
171 case CompilerFilter::kSpeedProfile: return "speed-profile";
172 case CompilerFilter::kSpeed: return "speed";
173 case CompilerFilter::kEverythingProfile: return "everything-profile";
174 case CompilerFilter::kEverything: return "everything";
175 }
176 UNREACHABLE();
177}
178
179bool CompilerFilter::ParseCompilerFilter(const char* option, Filter* filter) {
180 CHECK(filter != nullptr);
181
182 if (strcmp(option, "verify-none") == 0) {
183 *filter = kVerifyNone;
184 } else if (strcmp(option, "interpret-only") == 0) {
185 *filter = kInterpretOnly;
186 } else if (strcmp(option, "verify-profile") == 0) {
187 *filter = kVerifyProfile;
188 } else if (strcmp(option, "verify-at-runtime") == 0) {
189 *filter = kVerifyAtRuntime;
190 } else if (strcmp(option, "space") == 0) {
191 *filter = kSpace;
192 } else if (strcmp(option, "space-profile") == 0) {
193 *filter = kSpaceProfile;
194 } else if (strcmp(option, "balanced") == 0) {
195 *filter = kBalanced;
196 } else if (strcmp(option, "speed") == 0) {
197 *filter = kSpeed;
198 } else if (strcmp(option, "speed-profile") == 0) {
199 *filter = kSpeedProfile;
Andreas Gampe7bcfcb82016-03-23 15:31:51 +0000200 } else if (strcmp(option, "everything") == 0) {
201 *filter = kEverything;
202 } else if (strcmp(option, "everything-profile") == 0) {
203 *filter = kEverythingProfile;
204 } else if (strcmp(option, "time") == 0) {
205 *filter = kTime;
206 } else {
207 return false;
208 }
209 return true;
210}
211
212std::ostream& operator<<(std::ostream& os, const CompilerFilter::Filter& rhs) {
213 return os << CompilerFilter::NameOfFilter(rhs);
214}
215
216} // namespace art