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