• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 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 #ifndef ART_COMPILER_DRIVER_COMPILER_OPTIONS_H_
18 #define ART_COMPILER_DRIVER_COMPILER_OPTIONS_H_
19 
20 namespace art {
21 
22 class CompilerOptions {
23  public:
24   enum CompilerFilter {
25     kVerifyNone,          // Skip verification and compile nothing except JNI stubs.
26     kInterpretOnly,       // Compile nothing except JNI stubs.
27     kSpace,               // Maximize space savings.
28     kBalanced,            // Try to get the best performance return on compilation investment.
29     kSpeed,               // Maximize runtime performance.
30     kEverything           // Force compilation (Note: excludes compilaton of class initializers).
31   };
32 
33   // Guide heuristics to determine whether to compile method if profile data not available.
34 #if ART_SMALL_MODE
35   static const CompilerFilter kDefaultCompilerFilter = kInterpretOnly;
36 #else
37   static const CompilerFilter kDefaultCompilerFilter = kSpeed;
38 #endif
39   static const size_t kDefaultHugeMethodThreshold = 10000;
40   static const size_t kDefaultLargeMethodThreshold = 600;
41   static const size_t kDefaultSmallMethodThreshold = 60;
42   static const size_t kDefaultTinyMethodThreshold = 20;
43   static const size_t kDefaultNumDexMethodsThreshold = 900;
44   static constexpr double kDefaultTopKProfileThreshold = 90.0;
45   static const bool kDefaultIncludeDebugSymbols = kIsDebugBuild;
46   static const bool kDefaultIncludePatchInformation = false;
47 
CompilerOptions()48   CompilerOptions() :
49     compiler_filter_(kDefaultCompilerFilter),
50     huge_method_threshold_(kDefaultHugeMethodThreshold),
51     large_method_threshold_(kDefaultLargeMethodThreshold),
52     small_method_threshold_(kDefaultSmallMethodThreshold),
53     tiny_method_threshold_(kDefaultTinyMethodThreshold),
54     num_dex_methods_threshold_(kDefaultNumDexMethodsThreshold),
55     generate_gdb_information_(false),
56     include_patch_information_(kDefaultIncludePatchInformation),
57     top_k_profile_threshold_(kDefaultTopKProfileThreshold),
58     include_debug_symbols_(kDefaultIncludeDebugSymbols),
59     implicit_null_checks_(false),
60     implicit_so_checks_(false),
61     implicit_suspend_checks_(false)
62 #ifdef ART_SEA_IR_MODE
63     , sea_ir_mode_(false)
64 #endif
65     {}
66 
CompilerOptions(CompilerFilter compiler_filter,size_t huge_method_threshold,size_t large_method_threshold,size_t small_method_threshold,size_t tiny_method_threshold,size_t num_dex_methods_threshold,bool generate_gdb_information,bool include_patch_information,double top_k_profile_threshold,bool include_debug_symbols,bool implicit_null_checks,bool implicit_so_checks,bool implicit_suspend_checks,bool sea_ir_mode)67   CompilerOptions(CompilerFilter compiler_filter,
68                   size_t huge_method_threshold,
69                   size_t large_method_threshold,
70                   size_t small_method_threshold,
71                   size_t tiny_method_threshold,
72                   size_t num_dex_methods_threshold,
73                   bool generate_gdb_information,
74                   bool include_patch_information,
75                   double top_k_profile_threshold,
76                   bool include_debug_symbols,
77                   bool implicit_null_checks,
78                   bool implicit_so_checks,
79                   bool implicit_suspend_checks
80 #ifdef ART_SEA_IR_MODE
81                   , bool sea_ir_mode
82 #endif
83                   ) :  // NOLINT(whitespace/parens)
84     compiler_filter_(compiler_filter),
85     huge_method_threshold_(huge_method_threshold),
86     large_method_threshold_(large_method_threshold),
87     small_method_threshold_(small_method_threshold),
88     tiny_method_threshold_(tiny_method_threshold),
89     num_dex_methods_threshold_(num_dex_methods_threshold),
90     generate_gdb_information_(generate_gdb_information),
91     include_patch_information_(include_patch_information),
92     top_k_profile_threshold_(top_k_profile_threshold),
93     include_debug_symbols_(include_debug_symbols),
94     implicit_null_checks_(implicit_null_checks),
95     implicit_so_checks_(implicit_so_checks),
96     implicit_suspend_checks_(implicit_suspend_checks)
97 #ifdef ART_SEA_IR_MODE
98     , sea_ir_mode_(sea_ir_mode)
99 #endif
100     {}
101 
GetCompilerFilter()102   CompilerFilter GetCompilerFilter() const {
103     return compiler_filter_;
104   }
105 
SetCompilerFilter(CompilerFilter compiler_filter)106   void SetCompilerFilter(CompilerFilter compiler_filter) {
107     compiler_filter_ = compiler_filter;
108   }
109 
IsCompilationEnabled()110   bool IsCompilationEnabled() const {
111     return ((compiler_filter_ != CompilerOptions::kVerifyNone) &&
112             (compiler_filter_ != CompilerOptions::kInterpretOnly));
113   }
114 
IsVerificationEnabled()115   bool IsVerificationEnabled() const {
116     return (compiler_filter_ != CompilerOptions::kVerifyNone);
117   }
118 
GetHugeMethodThreshold()119   size_t GetHugeMethodThreshold() const {
120     return huge_method_threshold_;
121   }
122 
GetLargeMethodThreshold()123   size_t GetLargeMethodThreshold() const {
124     return large_method_threshold_;
125   }
126 
GetSmallMethodThreshold()127   size_t GetSmallMethodThreshold() const {
128     return small_method_threshold_;
129   }
130 
GetTinyMethodThreshold()131   size_t GetTinyMethodThreshold() const {
132     return tiny_method_threshold_;
133   }
134 
IsHugeMethod(size_t num_dalvik_instructions)135   bool IsHugeMethod(size_t num_dalvik_instructions) const {
136     return num_dalvik_instructions > huge_method_threshold_;
137   }
138 
IsLargeMethod(size_t num_dalvik_instructions)139   bool IsLargeMethod(size_t num_dalvik_instructions) const {
140     return num_dalvik_instructions > large_method_threshold_;
141   }
142 
IsSmallMethod(size_t num_dalvik_instructions)143   bool IsSmallMethod(size_t num_dalvik_instructions) const {
144     return num_dalvik_instructions > small_method_threshold_;
145   }
146 
IsTinyMethod(size_t num_dalvik_instructions)147   bool IsTinyMethod(size_t num_dalvik_instructions) const {
148     return num_dalvik_instructions > tiny_method_threshold_;
149   }
150 
GetNumDexMethodsThreshold()151   size_t GetNumDexMethodsThreshold() const {
152     return num_dex_methods_threshold_;
153   }
154 
GetTopKProfileThreshold()155   double GetTopKProfileThreshold() const {
156     return top_k_profile_threshold_;
157   }
158 
GetIncludeDebugSymbols()159   bool GetIncludeDebugSymbols() const {
160     return include_debug_symbols_;
161   }
162 
GetImplicitNullChecks()163   bool GetImplicitNullChecks() const {
164     return implicit_null_checks_;
165   }
166 
SetImplicitNullChecks(bool new_val)167   void SetImplicitNullChecks(bool new_val) {
168     implicit_null_checks_ = new_val;
169   }
170 
GetImplicitStackOverflowChecks()171   bool GetImplicitStackOverflowChecks() const {
172     return implicit_so_checks_;
173   }
174 
SetImplicitStackOverflowChecks(bool new_val)175   void SetImplicitStackOverflowChecks(bool new_val) {
176     implicit_so_checks_ = new_val;
177   }
178 
GetImplicitSuspendChecks()179   bool GetImplicitSuspendChecks() const {
180     return implicit_suspend_checks_;
181   }
182 
SetImplicitSuspendChecks(bool new_val)183   void SetImplicitSuspendChecks(bool new_val) {
184     implicit_suspend_checks_ = new_val;
185   }
186 
187 #ifdef ART_SEA_IR_MODE
188   bool GetSeaIrMode();
189 #endif
190 
GetGenerateGDBInformation()191   bool GetGenerateGDBInformation() const {
192     return generate_gdb_information_;
193   }
194 
GetIncludePatchInformation()195   bool GetIncludePatchInformation() const {
196     return include_patch_information_;
197   }
198 
199  private:
200   CompilerFilter compiler_filter_;
201   size_t huge_method_threshold_;
202   size_t large_method_threshold_;
203   size_t small_method_threshold_;
204   size_t tiny_method_threshold_;
205   size_t num_dex_methods_threshold_;
206   bool generate_gdb_information_;
207   bool include_patch_information_;
208   // When using a profile file only the top K% of the profiled samples will be compiled.
209   double top_k_profile_threshold_;
210   bool include_debug_symbols_;
211   bool implicit_null_checks_;
212   bool implicit_so_checks_;
213   bool implicit_suspend_checks_;
214 #ifdef ART_SEA_IR_MODE
215   bool sea_ir_mode_;
216 #endif
217 };
218 
219 }  // namespace art
220 
221 #endif  // ART_COMPILER_DRIVER_COMPILER_OPTIONS_H_
222