xref: /aosp_15_r20/art/compiler/driver/compiler_options.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_COMPILER_DRIVER_COMPILER_OPTIONS_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_COMPILER_DRIVER_COMPILER_OPTIONS_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include <memory>
21*795d594fSAndroid Build Coastguard Worker #include <ostream>
22*795d594fSAndroid Build Coastguard Worker #include <string>
23*795d594fSAndroid Build Coastguard Worker #include <vector>
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker #include "base/compiler_filter.h"
26*795d594fSAndroid Build Coastguard Worker #include "base/globals.h"
27*795d594fSAndroid Build Coastguard Worker #include "base/hash_set.h"
28*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
29*795d594fSAndroid Build Coastguard Worker #include "base/stl_util.h"
30*795d594fSAndroid Build Coastguard Worker #include "base/utils.h"
31*795d594fSAndroid Build Coastguard Worker #include "optimizing/register_allocator.h"
32*795d594fSAndroid Build Coastguard Worker 
33*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
34*795d594fSAndroid Build Coastguard Worker 
35*795d594fSAndroid Build Coastguard Worker namespace jit {
36*795d594fSAndroid Build Coastguard Worker class JitCompiler;
37*795d594fSAndroid Build Coastguard Worker }  // namespace jit
38*795d594fSAndroid Build Coastguard Worker 
39*795d594fSAndroid Build Coastguard Worker namespace verifier {
40*795d594fSAndroid Build Coastguard Worker class VerifierDepsTest;
41*795d594fSAndroid Build Coastguard Worker }  // namespace verifier
42*795d594fSAndroid Build Coastguard Worker 
43*795d594fSAndroid Build Coastguard Worker namespace linker {
44*795d594fSAndroid Build Coastguard Worker class Arm64RelativePatcherTest;
45*795d594fSAndroid Build Coastguard Worker class Thumb2RelativePatcherTest;
46*795d594fSAndroid Build Coastguard Worker }  // namespace linker
47*795d594fSAndroid Build Coastguard Worker 
48*795d594fSAndroid Build Coastguard Worker class ArtMethod;
49*795d594fSAndroid Build Coastguard Worker class DexFile;
50*795d594fSAndroid Build Coastguard Worker enum class InstructionSet;
51*795d594fSAndroid Build Coastguard Worker class InstructionSetFeatures;
52*795d594fSAndroid Build Coastguard Worker class ProfileCompilationInfo;
53*795d594fSAndroid Build Coastguard Worker 
54*795d594fSAndroid Build Coastguard Worker // Enum for CheckProfileMethodsCompiled. Outside CompilerOptions so it can be forward-declared.
55*795d594fSAndroid Build Coastguard Worker enum class ProfileMethodsCheck : uint8_t {
56*795d594fSAndroid Build Coastguard Worker   kNone,
57*795d594fSAndroid Build Coastguard Worker   kLog,
58*795d594fSAndroid Build Coastguard Worker   kAbort,
59*795d594fSAndroid Build Coastguard Worker };
60*795d594fSAndroid Build Coastguard Worker 
61*795d594fSAndroid Build Coastguard Worker class CompilerOptions final {
62*795d594fSAndroid Build Coastguard Worker  public:
63*795d594fSAndroid Build Coastguard Worker   // Default values for parameters set via flags.
64*795d594fSAndroid Build Coastguard Worker   static constexpr bool kDefaultGenerateDebugInfo = false;
65*795d594fSAndroid Build Coastguard Worker   static constexpr bool kDefaultGenerateMiniDebugInfo = true;
66*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kDefaultHugeMethodThreshold = 10000;
67*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kDefaultInlineMaxCodeUnits = 32;
68*795d594fSAndroid Build Coastguard Worker   // Token to represent no value set for `inline_max_code_units_`.
69*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kUnsetInlineMaxCodeUnits = -1;
70*795d594fSAndroid Build Coastguard Worker   // We set a lower inlining threshold for baseline to reduce code size and compilation time. This
71*795d594fSAndroid Build Coastguard Worker   // cannot be changed via flags.
72*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kBaselineInlineMaxCodeUnits = 14;
73*795d594fSAndroid Build Coastguard Worker 
74*795d594fSAndroid Build Coastguard Worker   enum class CompilerType : uint8_t {
75*795d594fSAndroid Build Coastguard Worker     kAotCompiler,             // AOT compiler.
76*795d594fSAndroid Build Coastguard Worker     kJitCompiler,             // Normal JIT compiler.
77*795d594fSAndroid Build Coastguard Worker     kSharedCodeJitCompiler,   // Zygote JIT producing code in the shared region area, putting
78*795d594fSAndroid Build Coastguard Worker                               // restrictions on, for example, how literals are being generated.
79*795d594fSAndroid Build Coastguard Worker   };
80*795d594fSAndroid Build Coastguard Worker 
81*795d594fSAndroid Build Coastguard Worker   enum class ImageType : uint8_t {
82*795d594fSAndroid Build Coastguard Worker     kNone,                    // JIT or AOT app compilation producing only an oat file but no image.
83*795d594fSAndroid Build Coastguard Worker     kBootImage,               // Creating boot image.
84*795d594fSAndroid Build Coastguard Worker     kBootImageExtension,      // Creating boot image extension.
85*795d594fSAndroid Build Coastguard Worker     kAppImage,                // Creating app image.
86*795d594fSAndroid Build Coastguard Worker   };
87*795d594fSAndroid Build Coastguard Worker 
88*795d594fSAndroid Build Coastguard Worker   EXPORT CompilerOptions();
89*795d594fSAndroid Build Coastguard Worker   EXPORT ~CompilerOptions();
90*795d594fSAndroid Build Coastguard Worker 
GetCompilerFilter()91*795d594fSAndroid Build Coastguard Worker   CompilerFilter::Filter GetCompilerFilter() const {
92*795d594fSAndroid Build Coastguard Worker     return compiler_filter_;
93*795d594fSAndroid Build Coastguard Worker   }
94*795d594fSAndroid Build Coastguard Worker 
SetCompilerFilter(CompilerFilter::Filter compiler_filter)95*795d594fSAndroid Build Coastguard Worker   void SetCompilerFilter(CompilerFilter::Filter compiler_filter) {
96*795d594fSAndroid Build Coastguard Worker     compiler_filter_ = compiler_filter;
97*795d594fSAndroid Build Coastguard Worker   }
98*795d594fSAndroid Build Coastguard Worker 
IsAotCompilationEnabled()99*795d594fSAndroid Build Coastguard Worker   bool IsAotCompilationEnabled() const {
100*795d594fSAndroid Build Coastguard Worker     return CompilerFilter::IsAotCompilationEnabled(compiler_filter_);
101*795d594fSAndroid Build Coastguard Worker   }
102*795d594fSAndroid Build Coastguard Worker 
IsJniCompilationEnabled()103*795d594fSAndroid Build Coastguard Worker   bool IsJniCompilationEnabled() const {
104*795d594fSAndroid Build Coastguard Worker     return CompilerFilter::IsJniCompilationEnabled(compiler_filter_);
105*795d594fSAndroid Build Coastguard Worker   }
106*795d594fSAndroid Build Coastguard Worker 
IsVerificationEnabled()107*795d594fSAndroid Build Coastguard Worker   bool IsVerificationEnabled() const {
108*795d594fSAndroid Build Coastguard Worker     return CompilerFilter::IsVerificationEnabled(compiler_filter_);
109*795d594fSAndroid Build Coastguard Worker   }
110*795d594fSAndroid Build Coastguard Worker 
AssumeDexFilesAreVerified()111*795d594fSAndroid Build Coastguard Worker   bool AssumeDexFilesAreVerified() const {
112*795d594fSAndroid Build Coastguard Worker     return compiler_filter_ == CompilerFilter::kAssumeVerified;
113*795d594fSAndroid Build Coastguard Worker   }
114*795d594fSAndroid Build Coastguard Worker 
AssumeClassesAreVerified()115*795d594fSAndroid Build Coastguard Worker   bool AssumeClassesAreVerified() const {
116*795d594fSAndroid Build Coastguard Worker     return compiler_filter_ == CompilerFilter::kAssumeVerified;
117*795d594fSAndroid Build Coastguard Worker   }
118*795d594fSAndroid Build Coastguard Worker 
IsAnyCompilationEnabled()119*795d594fSAndroid Build Coastguard Worker   bool IsAnyCompilationEnabled() const {
120*795d594fSAndroid Build Coastguard Worker     return CompilerFilter::IsAnyCompilationEnabled(compiler_filter_);
121*795d594fSAndroid Build Coastguard Worker   }
122*795d594fSAndroid Build Coastguard Worker 
GetHugeMethodThreshold()123*795d594fSAndroid Build Coastguard Worker   size_t GetHugeMethodThreshold() const {
124*795d594fSAndroid Build Coastguard Worker     return huge_method_threshold_;
125*795d594fSAndroid Build Coastguard Worker   }
126*795d594fSAndroid Build Coastguard Worker 
IsHugeMethod(size_t num_dalvik_instructions)127*795d594fSAndroid Build Coastguard Worker   bool IsHugeMethod(size_t num_dalvik_instructions) const {
128*795d594fSAndroid Build Coastguard Worker     return num_dalvik_instructions > huge_method_threshold_;
129*795d594fSAndroid Build Coastguard Worker   }
130*795d594fSAndroid Build Coastguard Worker 
GetInlineMaxCodeUnits()131*795d594fSAndroid Build Coastguard Worker   size_t GetInlineMaxCodeUnits() const {
132*795d594fSAndroid Build Coastguard Worker     return inline_max_code_units_;
133*795d594fSAndroid Build Coastguard Worker   }
SetInlineMaxCodeUnits(size_t units)134*795d594fSAndroid Build Coastguard Worker   void SetInlineMaxCodeUnits(size_t units) {
135*795d594fSAndroid Build Coastguard Worker     inline_max_code_units_ = units;
136*795d594fSAndroid Build Coastguard Worker   }
137*795d594fSAndroid Build Coastguard Worker 
EmitReadBarrier()138*795d594fSAndroid Build Coastguard Worker   bool EmitReadBarrier() const {
139*795d594fSAndroid Build Coastguard Worker     return emit_read_barrier_;
140*795d594fSAndroid Build Coastguard Worker   }
141*795d594fSAndroid Build Coastguard Worker 
GetDebuggable()142*795d594fSAndroid Build Coastguard Worker   bool GetDebuggable() const {
143*795d594fSAndroid Build Coastguard Worker     return debuggable_;
144*795d594fSAndroid Build Coastguard Worker   }
145*795d594fSAndroid Build Coastguard Worker 
SetDebuggable(bool value)146*795d594fSAndroid Build Coastguard Worker   void SetDebuggable(bool value) {
147*795d594fSAndroid Build Coastguard Worker     debuggable_ = value;
148*795d594fSAndroid Build Coastguard Worker   }
149*795d594fSAndroid Build Coastguard Worker 
GetNativeDebuggable()150*795d594fSAndroid Build Coastguard Worker   bool GetNativeDebuggable() const {
151*795d594fSAndroid Build Coastguard Worker     return GetDebuggable() && GetGenerateDebugInfo();
152*795d594fSAndroid Build Coastguard Worker   }
153*795d594fSAndroid Build Coastguard Worker 
154*795d594fSAndroid Build Coastguard Worker   // This flag controls whether the compiler collects debugging information.
155*795d594fSAndroid Build Coastguard Worker   // The other flags control how the information is written to disk.
GenerateAnyDebugInfo()156*795d594fSAndroid Build Coastguard Worker   bool GenerateAnyDebugInfo() const {
157*795d594fSAndroid Build Coastguard Worker     return GetGenerateDebugInfo() || GetGenerateMiniDebugInfo();
158*795d594fSAndroid Build Coastguard Worker   }
159*795d594fSAndroid Build Coastguard Worker 
GetGenerateDebugInfo()160*795d594fSAndroid Build Coastguard Worker   bool GetGenerateDebugInfo() const {
161*795d594fSAndroid Build Coastguard Worker     return generate_debug_info_;
162*795d594fSAndroid Build Coastguard Worker   }
163*795d594fSAndroid Build Coastguard Worker 
GetGenerateMiniDebugInfo()164*795d594fSAndroid Build Coastguard Worker   bool GetGenerateMiniDebugInfo() const {
165*795d594fSAndroid Build Coastguard Worker     return generate_mini_debug_info_;
166*795d594fSAndroid Build Coastguard Worker   }
167*795d594fSAndroid Build Coastguard Worker 
168*795d594fSAndroid Build Coastguard Worker   // Should run-time checks be emitted in debug mode?
169*795d594fSAndroid Build Coastguard Worker   bool EmitRunTimeChecksInDebugMode() const;
170*795d594fSAndroid Build Coastguard Worker 
GetGenerateBuildId()171*795d594fSAndroid Build Coastguard Worker   bool GetGenerateBuildId() const {
172*795d594fSAndroid Build Coastguard Worker     return generate_build_id_;
173*795d594fSAndroid Build Coastguard Worker   }
174*795d594fSAndroid Build Coastguard Worker 
GetImplicitNullChecks()175*795d594fSAndroid Build Coastguard Worker   bool GetImplicitNullChecks() const {
176*795d594fSAndroid Build Coastguard Worker     return implicit_null_checks_;
177*795d594fSAndroid Build Coastguard Worker   }
178*795d594fSAndroid Build Coastguard Worker 
GetImplicitStackOverflowChecks()179*795d594fSAndroid Build Coastguard Worker   bool GetImplicitStackOverflowChecks() const {
180*795d594fSAndroid Build Coastguard Worker     return implicit_so_checks_;
181*795d594fSAndroid Build Coastguard Worker   }
182*795d594fSAndroid Build Coastguard Worker 
IsAotCompiler()183*795d594fSAndroid Build Coastguard Worker   bool IsAotCompiler() const {
184*795d594fSAndroid Build Coastguard Worker     return compiler_type_ == CompilerType::kAotCompiler;
185*795d594fSAndroid Build Coastguard Worker   }
186*795d594fSAndroid Build Coastguard Worker 
IsJitCompiler()187*795d594fSAndroid Build Coastguard Worker   bool IsJitCompiler() const {
188*795d594fSAndroid Build Coastguard Worker     return compiler_type_ == CompilerType::kJitCompiler ||
189*795d594fSAndroid Build Coastguard Worker            compiler_type_ == CompilerType::kSharedCodeJitCompiler;
190*795d594fSAndroid Build Coastguard Worker   }
191*795d594fSAndroid Build Coastguard Worker 
IsJitCompilerForSharedCode()192*795d594fSAndroid Build Coastguard Worker   bool IsJitCompilerForSharedCode() const {
193*795d594fSAndroid Build Coastguard Worker     return compiler_type_ == CompilerType::kSharedCodeJitCompiler;
194*795d594fSAndroid Build Coastguard Worker   }
195*795d594fSAndroid Build Coastguard Worker 
GetImplicitSuspendChecks()196*795d594fSAndroid Build Coastguard Worker   bool GetImplicitSuspendChecks() const {
197*795d594fSAndroid Build Coastguard Worker     return implicit_suspend_checks_;
198*795d594fSAndroid Build Coastguard Worker   }
199*795d594fSAndroid Build Coastguard Worker 
IsGeneratingImage()200*795d594fSAndroid Build Coastguard Worker   bool IsGeneratingImage() const {
201*795d594fSAndroid Build Coastguard Worker     return IsBootImage() || IsBootImageExtension() || IsAppImage();
202*795d594fSAndroid Build Coastguard Worker   }
203*795d594fSAndroid Build Coastguard Worker 
204*795d594fSAndroid Build Coastguard Worker   // Are we compiling a boot image?
IsBootImage()205*795d594fSAndroid Build Coastguard Worker   bool IsBootImage() const {
206*795d594fSAndroid Build Coastguard Worker     return image_type_ == ImageType::kBootImage;
207*795d594fSAndroid Build Coastguard Worker   }
208*795d594fSAndroid Build Coastguard Worker 
209*795d594fSAndroid Build Coastguard Worker   // Are we compiling a boot image extension?
IsBootImageExtension()210*795d594fSAndroid Build Coastguard Worker   bool IsBootImageExtension() const {
211*795d594fSAndroid Build Coastguard Worker     return image_type_ == ImageType::kBootImageExtension;
212*795d594fSAndroid Build Coastguard Worker   }
213*795d594fSAndroid Build Coastguard Worker 
IsBaseline()214*795d594fSAndroid Build Coastguard Worker   bool IsBaseline() const {
215*795d594fSAndroid Build Coastguard Worker     return baseline_;
216*795d594fSAndroid Build Coastguard Worker   }
217*795d594fSAndroid Build Coastguard Worker 
ProfileBranches()218*795d594fSAndroid Build Coastguard Worker   bool ProfileBranches() const {
219*795d594fSAndroid Build Coastguard Worker     return profile_branches_;
220*795d594fSAndroid Build Coastguard Worker   }
221*795d594fSAndroid Build Coastguard Worker 
222*795d594fSAndroid Build Coastguard Worker   // Are we compiling an app image?
IsAppImage()223*795d594fSAndroid Build Coastguard Worker   bool IsAppImage() const {
224*795d594fSAndroid Build Coastguard Worker     return image_type_ == ImageType::kAppImage;
225*795d594fSAndroid Build Coastguard Worker   }
226*795d594fSAndroid Build Coastguard Worker 
IsMultiImage()227*795d594fSAndroid Build Coastguard Worker   bool IsMultiImage() const {
228*795d594fSAndroid Build Coastguard Worker     return multi_image_;
229*795d594fSAndroid Build Coastguard Worker   }
230*795d594fSAndroid Build Coastguard Worker 
231*795d594fSAndroid Build Coastguard Worker   // Returns whether we are running ART tests.
232*795d594fSAndroid Build Coastguard Worker   // The compiler will use that information for checking invariants.
CompileArtTest()233*795d594fSAndroid Build Coastguard Worker   bool CompileArtTest() const {
234*795d594fSAndroid Build Coastguard Worker     return compile_art_test_;
235*795d594fSAndroid Build Coastguard Worker   }
236*795d594fSAndroid Build Coastguard Worker 
237*795d594fSAndroid Build Coastguard Worker   // Should the code be compiled as position independent?
GetCompilePic()238*795d594fSAndroid Build Coastguard Worker   bool GetCompilePic() const {
239*795d594fSAndroid Build Coastguard Worker     return compile_pic_;
240*795d594fSAndroid Build Coastguard Worker   }
241*795d594fSAndroid Build Coastguard Worker 
GetProfileCompilationInfo()242*795d594fSAndroid Build Coastguard Worker   const ProfileCompilationInfo* GetProfileCompilationInfo() const {
243*795d594fSAndroid Build Coastguard Worker     return profile_compilation_info_;
244*795d594fSAndroid Build Coastguard Worker   }
245*795d594fSAndroid Build Coastguard Worker 
HasVerboseMethods()246*795d594fSAndroid Build Coastguard Worker   bool HasVerboseMethods() const {
247*795d594fSAndroid Build Coastguard Worker     return !verbose_methods_.empty();
248*795d594fSAndroid Build Coastguard Worker   }
249*795d594fSAndroid Build Coastguard Worker 
IsVerboseMethod(const std::string & pretty_method)250*795d594fSAndroid Build Coastguard Worker   bool IsVerboseMethod(const std::string& pretty_method) const {
251*795d594fSAndroid Build Coastguard Worker     for (const std::string& cur_method : verbose_methods_) {
252*795d594fSAndroid Build Coastguard Worker       if (pretty_method.find(cur_method) != std::string::npos) {
253*795d594fSAndroid Build Coastguard Worker         return true;
254*795d594fSAndroid Build Coastguard Worker       }
255*795d594fSAndroid Build Coastguard Worker     }
256*795d594fSAndroid Build Coastguard Worker     return false;
257*795d594fSAndroid Build Coastguard Worker   }
258*795d594fSAndroid Build Coastguard Worker 
GetInitFailureOutput()259*795d594fSAndroid Build Coastguard Worker   std::ostream* GetInitFailureOutput() const {
260*795d594fSAndroid Build Coastguard Worker     return init_failure_output_.get();
261*795d594fSAndroid Build Coastguard Worker   }
262*795d594fSAndroid Build Coastguard Worker 
AbortOnHardVerifierFailure()263*795d594fSAndroid Build Coastguard Worker   bool AbortOnHardVerifierFailure() const {
264*795d594fSAndroid Build Coastguard Worker     return abort_on_hard_verifier_failure_;
265*795d594fSAndroid Build Coastguard Worker   }
AbortOnSoftVerifierFailure()266*795d594fSAndroid Build Coastguard Worker   bool AbortOnSoftVerifierFailure() const {
267*795d594fSAndroid Build Coastguard Worker     return abort_on_soft_verifier_failure_;
268*795d594fSAndroid Build Coastguard Worker   }
269*795d594fSAndroid Build Coastguard Worker 
GetInstructionSet()270*795d594fSAndroid Build Coastguard Worker   InstructionSet GetInstructionSet() const {
271*795d594fSAndroid Build Coastguard Worker     return instruction_set_;
272*795d594fSAndroid Build Coastguard Worker   }
273*795d594fSAndroid Build Coastguard Worker 
GetInstructionSetFeatures()274*795d594fSAndroid Build Coastguard Worker   const InstructionSetFeatures* GetInstructionSetFeatures() const {
275*795d594fSAndroid Build Coastguard Worker     return instruction_set_features_.get();
276*795d594fSAndroid Build Coastguard Worker   }
277*795d594fSAndroid Build Coastguard Worker 
278*795d594fSAndroid Build Coastguard Worker 
GetNoInlineFromDexFile()279*795d594fSAndroid Build Coastguard Worker   const std::vector<const DexFile*>& GetNoInlineFromDexFile() const {
280*795d594fSAndroid Build Coastguard Worker     return no_inline_from_;
281*795d594fSAndroid Build Coastguard Worker   }
282*795d594fSAndroid Build Coastguard Worker 
GetDexFilesForOatFile()283*795d594fSAndroid Build Coastguard Worker   const std::vector<const DexFile*>& GetDexFilesForOatFile() const {
284*795d594fSAndroid Build Coastguard Worker     return dex_files_for_oat_file_;
285*795d594fSAndroid Build Coastguard Worker   }
286*795d594fSAndroid Build Coastguard Worker 
GetImageClasses()287*795d594fSAndroid Build Coastguard Worker   const HashSet<std::string>& GetImageClasses() const {
288*795d594fSAndroid Build Coastguard Worker     return image_classes_;
289*795d594fSAndroid Build Coastguard Worker   }
290*795d594fSAndroid Build Coastguard Worker 
291*795d594fSAndroid Build Coastguard Worker   EXPORT bool IsImageClass(const char* descriptor) const;
292*795d594fSAndroid Build Coastguard Worker 
293*795d594fSAndroid Build Coastguard Worker   // Returns whether the given `pretty_descriptor` is in the list of preloaded
294*795d594fSAndroid Build Coastguard Worker   // classes. `pretty_descriptor` should be the result of calling `PrettyDescriptor`.
295*795d594fSAndroid Build Coastguard Worker   EXPORT bool IsPreloadedClass(std::string_view pretty_descriptor) const;
296*795d594fSAndroid Build Coastguard Worker 
297*795d594fSAndroid Build Coastguard Worker   bool ParseCompilerOptions(const std::vector<std::string>& options,
298*795d594fSAndroid Build Coastguard Worker                             bool ignore_unrecognized,
299*795d594fSAndroid Build Coastguard Worker                             std::string* error_msg);
300*795d594fSAndroid Build Coastguard Worker 
SetNonPic()301*795d594fSAndroid Build Coastguard Worker   void SetNonPic() {
302*795d594fSAndroid Build Coastguard Worker     compile_pic_ = false;
303*795d594fSAndroid Build Coastguard Worker   }
304*795d594fSAndroid Build Coastguard Worker 
GetDumpCfgFileName()305*795d594fSAndroid Build Coastguard Worker   const std::string& GetDumpCfgFileName() const {
306*795d594fSAndroid Build Coastguard Worker     return dump_cfg_file_name_;
307*795d594fSAndroid Build Coastguard Worker   }
308*795d594fSAndroid Build Coastguard Worker 
GetDumpCfgAppend()309*795d594fSAndroid Build Coastguard Worker   bool GetDumpCfgAppend() const {
310*795d594fSAndroid Build Coastguard Worker     return dump_cfg_append_;
311*795d594fSAndroid Build Coastguard Worker   }
312*795d594fSAndroid Build Coastguard Worker 
IsForceDeterminism()313*795d594fSAndroid Build Coastguard Worker   bool IsForceDeterminism() const {
314*795d594fSAndroid Build Coastguard Worker     return force_determinism_;
315*795d594fSAndroid Build Coastguard Worker   }
316*795d594fSAndroid Build Coastguard Worker 
IsCheckLinkageConditions()317*795d594fSAndroid Build Coastguard Worker   bool IsCheckLinkageConditions() const {
318*795d594fSAndroid Build Coastguard Worker     return check_linkage_conditions_;
319*795d594fSAndroid Build Coastguard Worker   }
320*795d594fSAndroid Build Coastguard Worker 
IsCrashOnLinkageViolation()321*795d594fSAndroid Build Coastguard Worker   bool IsCrashOnLinkageViolation() const {
322*795d594fSAndroid Build Coastguard Worker     return crash_on_linkage_violation_;
323*795d594fSAndroid Build Coastguard Worker   }
324*795d594fSAndroid Build Coastguard Worker 
DeduplicateCode()325*795d594fSAndroid Build Coastguard Worker   bool DeduplicateCode() const {
326*795d594fSAndroid Build Coastguard Worker     return deduplicate_code_;
327*795d594fSAndroid Build Coastguard Worker   }
328*795d594fSAndroid Build Coastguard Worker 
GetPassesToRun()329*795d594fSAndroid Build Coastguard Worker   const std::vector<std::string>* GetPassesToRun() const {
330*795d594fSAndroid Build Coastguard Worker     return passes_to_run_;
331*795d594fSAndroid Build Coastguard Worker   }
332*795d594fSAndroid Build Coastguard Worker 
GetDumpTimings()333*795d594fSAndroid Build Coastguard Worker   bool GetDumpTimings() const {
334*795d594fSAndroid Build Coastguard Worker     return dump_timings_;
335*795d594fSAndroid Build Coastguard Worker   }
336*795d594fSAndroid Build Coastguard Worker 
GetDumpPassTimings()337*795d594fSAndroid Build Coastguard Worker   bool GetDumpPassTimings() const {
338*795d594fSAndroid Build Coastguard Worker     return dump_pass_timings_;
339*795d594fSAndroid Build Coastguard Worker   }
340*795d594fSAndroid Build Coastguard Worker 
GetDumpStats()341*795d594fSAndroid Build Coastguard Worker   bool GetDumpStats() const {
342*795d594fSAndroid Build Coastguard Worker     return dump_stats_;
343*795d594fSAndroid Build Coastguard Worker   }
344*795d594fSAndroid Build Coastguard Worker 
CountHotnessInCompiledCode()345*795d594fSAndroid Build Coastguard Worker   bool CountHotnessInCompiledCode() const {
346*795d594fSAndroid Build Coastguard Worker     return count_hotness_in_compiled_code_;
347*795d594fSAndroid Build Coastguard Worker   }
348*795d594fSAndroid Build Coastguard Worker 
ResolveStartupConstStrings()349*795d594fSAndroid Build Coastguard Worker   bool ResolveStartupConstStrings() const {
350*795d594fSAndroid Build Coastguard Worker     return resolve_startup_const_strings_;
351*795d594fSAndroid Build Coastguard Worker   }
352*795d594fSAndroid Build Coastguard Worker 
CheckProfiledMethodsCompiled()353*795d594fSAndroid Build Coastguard Worker   ProfileMethodsCheck CheckProfiledMethodsCompiled() const {
354*795d594fSAndroid Build Coastguard Worker     return check_profiled_methods_;
355*795d594fSAndroid Build Coastguard Worker   }
356*795d594fSAndroid Build Coastguard Worker 
MaxImageBlockSize()357*795d594fSAndroid Build Coastguard Worker   uint32_t MaxImageBlockSize() const {
358*795d594fSAndroid Build Coastguard Worker     return max_image_block_size_;
359*795d594fSAndroid Build Coastguard Worker   }
360*795d594fSAndroid Build Coastguard Worker 
SetMaxImageBlockSize(uint32_t size)361*795d594fSAndroid Build Coastguard Worker   void SetMaxImageBlockSize(uint32_t size) {
362*795d594fSAndroid Build Coastguard Worker     max_image_block_size_ = size;
363*795d594fSAndroid Build Coastguard Worker   }
364*795d594fSAndroid Build Coastguard Worker 
InitializeAppImageClasses()365*795d594fSAndroid Build Coastguard Worker   bool InitializeAppImageClasses() const {
366*795d594fSAndroid Build Coastguard Worker     return initialize_app_image_classes_;
367*795d594fSAndroid Build Coastguard Worker   }
368*795d594fSAndroid Build Coastguard Worker 
369*795d594fSAndroid Build Coastguard Worker   // Returns true if `dex_file` is within an oat file we're producing right now.
WithinOatFile(const DexFile * dex_file)370*795d594fSAndroid Build Coastguard Worker   bool WithinOatFile(const DexFile* dex_file) const {
371*795d594fSAndroid Build Coastguard Worker     return ContainsElement(GetDexFilesForOatFile(), dex_file);
372*795d594fSAndroid Build Coastguard Worker   }
373*795d594fSAndroid Build Coastguard Worker 
374*795d594fSAndroid Build Coastguard Worker   // If this is a static non-constructor method in the boot classpath, and its class isn't
375*795d594fSAndroid Build Coastguard Worker   // initialized at compile-time, or won't be initialized by the zygote, add
376*795d594fSAndroid Build Coastguard Worker   // initialization checks at entry. This will avoid the need of trampolines
377*795d594fSAndroid Build Coastguard Worker   // which at runtime we will need to dirty after initialization.
378*795d594fSAndroid Build Coastguard Worker   EXPORT bool ShouldCompileWithClinitCheck(ArtMethod* method) const;
379*795d594fSAndroid Build Coastguard Worker 
380*795d594fSAndroid Build Coastguard Worker  private:
381*795d594fSAndroid Build Coastguard Worker   EXPORT bool ParseDumpInitFailures(const std::string& option, std::string* error_msg);
382*795d594fSAndroid Build Coastguard Worker 
383*795d594fSAndroid Build Coastguard Worker   CompilerFilter::Filter compiler_filter_;
384*795d594fSAndroid Build Coastguard Worker   size_t huge_method_threshold_;
385*795d594fSAndroid Build Coastguard Worker   size_t inline_max_code_units_;
386*795d594fSAndroid Build Coastguard Worker 
387*795d594fSAndroid Build Coastguard Worker   InstructionSet instruction_set_;
388*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const InstructionSetFeatures> instruction_set_features_;
389*795d594fSAndroid Build Coastguard Worker 
390*795d594fSAndroid Build Coastguard Worker   // Dex files from which we should not inline code. Does not own the dex files.
391*795d594fSAndroid Build Coastguard Worker   // This is usually a very short list (i.e. a single dex file), so we
392*795d594fSAndroid Build Coastguard Worker   // prefer vector<> over a lookup-oriented container, such as set<>.
393*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> no_inline_from_;
394*795d594fSAndroid Build Coastguard Worker 
395*795d594fSAndroid Build Coastguard Worker   // List of dex files associated with the oat file, empty for JIT.
396*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> dex_files_for_oat_file_;
397*795d594fSAndroid Build Coastguard Worker 
398*795d594fSAndroid Build Coastguard Worker   // Image classes, specifies the classes that will be included in the image if creating an image.
399*795d594fSAndroid Build Coastguard Worker   // Must not be empty for real boot image, only for tests pretending to compile boot image.
400*795d594fSAndroid Build Coastguard Worker   HashSet<std::string> image_classes_;
401*795d594fSAndroid Build Coastguard Worker 
402*795d594fSAndroid Build Coastguard Worker   // Classes listed in the preloaded-classes file, used for boot image and
403*795d594fSAndroid Build Coastguard Worker   // boot image extension compilation.
404*795d594fSAndroid Build Coastguard Worker   HashSet<std::string> preloaded_classes_;
405*795d594fSAndroid Build Coastguard Worker 
406*795d594fSAndroid Build Coastguard Worker   CompilerType compiler_type_;
407*795d594fSAndroid Build Coastguard Worker   ImageType image_type_;
408*795d594fSAndroid Build Coastguard Worker   bool multi_image_;
409*795d594fSAndroid Build Coastguard Worker   bool compile_art_test_;
410*795d594fSAndroid Build Coastguard Worker   bool emit_read_barrier_;
411*795d594fSAndroid Build Coastguard Worker   bool baseline_;
412*795d594fSAndroid Build Coastguard Worker   bool debuggable_;
413*795d594fSAndroid Build Coastguard Worker   bool generate_debug_info_;
414*795d594fSAndroid Build Coastguard Worker   bool generate_mini_debug_info_;
415*795d594fSAndroid Build Coastguard Worker   bool generate_build_id_;
416*795d594fSAndroid Build Coastguard Worker   bool implicit_null_checks_;
417*795d594fSAndroid Build Coastguard Worker   bool implicit_so_checks_;
418*795d594fSAndroid Build Coastguard Worker   bool implicit_suspend_checks_;
419*795d594fSAndroid Build Coastguard Worker   bool compile_pic_;
420*795d594fSAndroid Build Coastguard Worker   bool dump_timings_;
421*795d594fSAndroid Build Coastguard Worker   bool dump_pass_timings_;
422*795d594fSAndroid Build Coastguard Worker   bool dump_stats_;
423*795d594fSAndroid Build Coastguard Worker   bool profile_branches_;
424*795d594fSAndroid Build Coastguard Worker 
425*795d594fSAndroid Build Coastguard Worker   // Info for profile guided compilation.
426*795d594fSAndroid Build Coastguard Worker   const ProfileCompilationInfo* profile_compilation_info_;
427*795d594fSAndroid Build Coastguard Worker 
428*795d594fSAndroid Build Coastguard Worker   // Vector of methods to have verbose output enabled for.
429*795d594fSAndroid Build Coastguard Worker   std::vector<std::string> verbose_methods_;
430*795d594fSAndroid Build Coastguard Worker 
431*795d594fSAndroid Build Coastguard Worker   // Abort compilation with an error if we find a class that fails verification with a hard
432*795d594fSAndroid Build Coastguard Worker   // failure.
433*795d594fSAndroid Build Coastguard Worker   bool abort_on_hard_verifier_failure_;
434*795d594fSAndroid Build Coastguard Worker   // Same for soft failures.
435*795d594fSAndroid Build Coastguard Worker   bool abort_on_soft_verifier_failure_;
436*795d594fSAndroid Build Coastguard Worker 
437*795d594fSAndroid Build Coastguard Worker   // Log initialization of initialization failures to this stream if not null.
438*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<std::ostream> init_failure_output_;
439*795d594fSAndroid Build Coastguard Worker 
440*795d594fSAndroid Build Coastguard Worker   std::string dump_cfg_file_name_;
441*795d594fSAndroid Build Coastguard Worker   bool dump_cfg_append_;
442*795d594fSAndroid Build Coastguard Worker 
443*795d594fSAndroid Build Coastguard Worker   // Whether the compiler should trade performance for determinism to guarantee exactly reproducible
444*795d594fSAndroid Build Coastguard Worker   // outcomes.
445*795d594fSAndroid Build Coastguard Worker   bool force_determinism_;
446*795d594fSAndroid Build Coastguard Worker 
447*795d594fSAndroid Build Coastguard Worker   // Whether the compiler should check for violation of the conditions required to perform AOT
448*795d594fSAndroid Build Coastguard Worker   // "linkage".
449*795d594fSAndroid Build Coastguard Worker   bool check_linkage_conditions_;
450*795d594fSAndroid Build Coastguard Worker   // Whether the compiler should crash when encountering a violation of one of
451*795d594fSAndroid Build Coastguard Worker   // the conditions required to perform AOT "linkage".
452*795d594fSAndroid Build Coastguard Worker   bool crash_on_linkage_violation_;
453*795d594fSAndroid Build Coastguard Worker 
454*795d594fSAndroid Build Coastguard Worker   // Whether code should be deduplicated.
455*795d594fSAndroid Build Coastguard Worker   bool deduplicate_code_;
456*795d594fSAndroid Build Coastguard Worker 
457*795d594fSAndroid Build Coastguard Worker   // Whether compiled code should increment the hotness count of ArtMethod. Note that the increments
458*795d594fSAndroid Build Coastguard Worker   // won't be atomic for performance reasons, so we accept races, just like in interpreter.
459*795d594fSAndroid Build Coastguard Worker   bool count_hotness_in_compiled_code_;
460*795d594fSAndroid Build Coastguard Worker 
461*795d594fSAndroid Build Coastguard Worker   // Whether we eagerly resolve all of the const strings that are loaded from startup methods in the
462*795d594fSAndroid Build Coastguard Worker   // profile.
463*795d594fSAndroid Build Coastguard Worker   bool resolve_startup_const_strings_;
464*795d594fSAndroid Build Coastguard Worker 
465*795d594fSAndroid Build Coastguard Worker   // Whether we attempt to run class initializers for app image classes.
466*795d594fSAndroid Build Coastguard Worker   bool initialize_app_image_classes_;
467*795d594fSAndroid Build Coastguard Worker 
468*795d594fSAndroid Build Coastguard Worker   // When running profile-guided compilation, check that methods intended to be compiled end
469*795d594fSAndroid Build Coastguard Worker   // up compiled and are not punted.
470*795d594fSAndroid Build Coastguard Worker   ProfileMethodsCheck check_profiled_methods_;
471*795d594fSAndroid Build Coastguard Worker 
472*795d594fSAndroid Build Coastguard Worker   // Maximum solid block size in the generated image.
473*795d594fSAndroid Build Coastguard Worker   uint32_t max_image_block_size_;
474*795d594fSAndroid Build Coastguard Worker 
475*795d594fSAndroid Build Coastguard Worker   // If not null, specifies optimization passes which will be run instead of defaults.
476*795d594fSAndroid Build Coastguard Worker   // Note that passes_to_run_ is not checked for correctness and providing an incorrect
477*795d594fSAndroid Build Coastguard Worker   // list of passes can lead to unexpected compiler behaviour. This is caused by dependencies
478*795d594fSAndroid Build Coastguard Worker   // between passes. Failing to satisfy them can for example lead to compiler crashes.
479*795d594fSAndroid Build Coastguard Worker   // Passing pass names which are not recognized by the compiler will result in
480*795d594fSAndroid Build Coastguard Worker   // compiler-dependant behavior.
481*795d594fSAndroid Build Coastguard Worker   const std::vector<std::string>* passes_to_run_;
482*795d594fSAndroid Build Coastguard Worker 
483*795d594fSAndroid Build Coastguard Worker   friend class Dex2Oat;
484*795d594fSAndroid Build Coastguard Worker   friend class CommonCompilerDriverTest;
485*795d594fSAndroid Build Coastguard Worker   friend class CommonCompilerTestImpl;
486*795d594fSAndroid Build Coastguard Worker   friend class jit::JitCompiler;
487*795d594fSAndroid Build Coastguard Worker   friend class verifier::VerifierDepsTest;
488*795d594fSAndroid Build Coastguard Worker   friend class linker::Arm64RelativePatcherTest;
489*795d594fSAndroid Build Coastguard Worker   friend class linker::Thumb2RelativePatcherTest;
490*795d594fSAndroid Build Coastguard Worker 
491*795d594fSAndroid Build Coastguard Worker   template <class Base>
492*795d594fSAndroid Build Coastguard Worker   friend bool ReadCompilerOptions(Base& map, CompilerOptions* options, std::string* error_msg);
493*795d594fSAndroid Build Coastguard Worker 
494*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(CompilerOptions);
495*795d594fSAndroid Build Coastguard Worker };
496*795d594fSAndroid Build Coastguard Worker 
497*795d594fSAndroid Build Coastguard Worker }  // namespace art
498*795d594fSAndroid Build Coastguard Worker 
499*795d594fSAndroid Build Coastguard Worker #endif  // ART_COMPILER_DRIVER_COMPILER_OPTIONS_H_
500