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     compile_pic_(false)
63 #ifdef ART_SEA_IR_MODE
64     , sea_ir_mode_(false)
65 #endif
66     {}
67 
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 compile_pic,bool sea_ir_mode)68   CompilerOptions(CompilerFilter compiler_filter,
69                   size_t huge_method_threshold,
70                   size_t large_method_threshold,
71                   size_t small_method_threshold,
72                   size_t tiny_method_threshold,
73                   size_t num_dex_methods_threshold,
74                   bool generate_gdb_information,
75                   bool include_patch_information,
76                   double top_k_profile_threshold,
77                   bool include_debug_symbols,
78                   bool implicit_null_checks,
79                   bool implicit_so_checks,
80                   bool implicit_suspend_checks,
81                   bool compile_pic
82 #ifdef ART_SEA_IR_MODE
83                   , bool sea_ir_mode
84 #endif
85                   ) :  // NOLINT(whitespace/parens)
86     compiler_filter_(compiler_filter),
87     huge_method_threshold_(huge_method_threshold),
88     large_method_threshold_(large_method_threshold),
89     small_method_threshold_(small_method_threshold),
90     tiny_method_threshold_(tiny_method_threshold),
91     num_dex_methods_threshold_(num_dex_methods_threshold),
92     generate_gdb_information_(generate_gdb_information),
93     include_patch_information_(include_patch_information),
94     top_k_profile_threshold_(top_k_profile_threshold),
95     include_debug_symbols_(include_debug_symbols),
96     implicit_null_checks_(implicit_null_checks),
97     implicit_so_checks_(implicit_so_checks),
98     implicit_suspend_checks_(implicit_suspend_checks),
99     compile_pic_(compile_pic)
100 #ifdef ART_SEA_IR_MODE
101     , sea_ir_mode_(sea_ir_mode)
102 #endif
103     {}
104 
GetCompilerFilter()105   CompilerFilter GetCompilerFilter() const {
106     return compiler_filter_;
107   }
108 
SetCompilerFilter(CompilerFilter compiler_filter)109   void SetCompilerFilter(CompilerFilter compiler_filter) {
110     compiler_filter_ = compiler_filter;
111   }
112 
IsCompilationEnabled()113   bool IsCompilationEnabled() const {
114     return ((compiler_filter_ != CompilerOptions::kVerifyNone) &&
115             (compiler_filter_ != CompilerOptions::kInterpretOnly));
116   }
117 
IsVerificationEnabled()118   bool IsVerificationEnabled() const {
119     return (compiler_filter_ != CompilerOptions::kVerifyNone);
120   }
121 
GetHugeMethodThreshold()122   size_t GetHugeMethodThreshold() const {
123     return huge_method_threshold_;
124   }
125 
GetLargeMethodThreshold()126   size_t GetLargeMethodThreshold() const {
127     return large_method_threshold_;
128   }
129 
GetSmallMethodThreshold()130   size_t GetSmallMethodThreshold() const {
131     return small_method_threshold_;
132   }
133 
GetTinyMethodThreshold()134   size_t GetTinyMethodThreshold() const {
135     return tiny_method_threshold_;
136   }
137 
IsHugeMethod(size_t num_dalvik_instructions)138   bool IsHugeMethod(size_t num_dalvik_instructions) const {
139     return num_dalvik_instructions > huge_method_threshold_;
140   }
141 
IsLargeMethod(size_t num_dalvik_instructions)142   bool IsLargeMethod(size_t num_dalvik_instructions) const {
143     return num_dalvik_instructions > large_method_threshold_;
144   }
145 
IsSmallMethod(size_t num_dalvik_instructions)146   bool IsSmallMethod(size_t num_dalvik_instructions) const {
147     return num_dalvik_instructions > small_method_threshold_;
148   }
149 
IsTinyMethod(size_t num_dalvik_instructions)150   bool IsTinyMethod(size_t num_dalvik_instructions) const {
151     return num_dalvik_instructions > tiny_method_threshold_;
152   }
153 
GetNumDexMethodsThreshold()154   size_t GetNumDexMethodsThreshold() const {
155     return num_dex_methods_threshold_;
156   }
157 
GetTopKProfileThreshold()158   double GetTopKProfileThreshold() const {
159     return top_k_profile_threshold_;
160   }
161 
GetIncludeDebugSymbols()162   bool GetIncludeDebugSymbols() const {
163     return include_debug_symbols_;
164   }
165 
GetImplicitNullChecks()166   bool GetImplicitNullChecks() const {
167     return implicit_null_checks_;
168   }
169 
SetImplicitNullChecks(bool new_val)170   void SetImplicitNullChecks(bool new_val) {
171     implicit_null_checks_ = new_val;
172   }
173 
GetImplicitStackOverflowChecks()174   bool GetImplicitStackOverflowChecks() const {
175     return implicit_so_checks_;
176   }
177 
SetImplicitStackOverflowChecks(bool new_val)178   void SetImplicitStackOverflowChecks(bool new_val) {
179     implicit_so_checks_ = new_val;
180   }
181 
GetImplicitSuspendChecks()182   bool GetImplicitSuspendChecks() const {
183     return implicit_suspend_checks_;
184   }
185 
SetImplicitSuspendChecks(bool new_val)186   void SetImplicitSuspendChecks(bool new_val) {
187     implicit_suspend_checks_ = new_val;
188   }
189 
190 #ifdef ART_SEA_IR_MODE
191   bool GetSeaIrMode();
192 #endif
193 
GetGenerateGDBInformation()194   bool GetGenerateGDBInformation() const {
195     return generate_gdb_information_;
196   }
197 
GetIncludePatchInformation()198   bool GetIncludePatchInformation() const {
199     return include_patch_information_;
200   }
201 
202   // Should the code be compiled as position independent?
GetCompilePic()203   bool GetCompilePic() const {
204     return compile_pic_;
205   }
206 
207  private:
208   CompilerFilter compiler_filter_;
209   size_t huge_method_threshold_;
210   size_t large_method_threshold_;
211   size_t small_method_threshold_;
212   size_t tiny_method_threshold_;
213   size_t num_dex_methods_threshold_;
214   bool generate_gdb_information_;
215   bool include_patch_information_;
216   // When using a profile file only the top K% of the profiled samples will be compiled.
217   double top_k_profile_threshold_;
218   bool include_debug_symbols_;
219   bool implicit_null_checks_;
220   bool implicit_so_checks_;
221   bool implicit_suspend_checks_;
222   bool compile_pic_;
223 #ifdef ART_SEA_IR_MODE
224   bool sea_ir_mode_;
225 #endif
226 };
227 
228 }  // namespace art
229 
230 #endif  // ART_COMPILER_DRIVER_COMPILER_OPTIONS_H_
231