1 /* 2 * Copyright (C) 2017 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_MAP_INL_H_ 18 #define ART_COMPILER_DRIVER_COMPILER_OPTIONS_MAP_INL_H_ 19 20 #include "compiler_options_map.h" 21 22 #include <memory> 23 24 #include "android-base/logging.h" 25 #include "android-base/macros.h" 26 #include "android-base/stringprintf.h" 27 28 #include "base/macros.h" 29 #include "cmdline_parser.h" 30 #include "compiler_options.h" 31 32 namespace art { 33 34 template <class Base> 35 inline bool ReadCompilerOptions(Base& map, CompilerOptions* options, std::string* error_msg) { 36 if (map.Exists(Base::CompilerFilter)) { 37 CompilerFilter::Filter compiler_filter; 38 if (!CompilerFilter::ParseCompilerFilter(map.Get(Base::CompilerFilter)->c_str(), 39 &compiler_filter)) { 40 *error_msg = android::base::StringPrintf("Unknown --compiler-filter value %s", 41 map.Get(Base::CompilerFilter)->c_str()); 42 return false; 43 } 44 options->SetCompilerFilter(compiler_filter); 45 } 46 map.AssignIfExists(Base::HugeMethodMaxThreshold, &options->huge_method_threshold_); 47 map.AssignIfExists(Base::LargeMethodMaxThreshold, &options->large_method_threshold_); 48 map.AssignIfExists(Base::SmallMethodMaxThreshold, &options->small_method_threshold_); 49 map.AssignIfExists(Base::TinyMethodMaxThreshold, &options->tiny_method_threshold_); 50 map.AssignIfExists(Base::NumDexMethodsThreshold, &options->num_dex_methods_threshold_); 51 map.AssignIfExists(Base::InlineMaxCodeUnitsThreshold, &options->inline_max_code_units_); 52 map.AssignIfExists(Base::GenerateDebugInfo, &options->generate_debug_info_); 53 map.AssignIfExists(Base::GenerateMiniDebugInfo, &options->generate_mini_debug_info_); 54 map.AssignIfExists(Base::GenerateBuildID, &options->generate_build_id_); 55 if (map.Exists(Base::Debuggable)) { 56 options->debuggable_ = true; 57 } 58 if (map.Exists(Base::Baseline)) { 59 options->baseline_ = true; 60 } 61 map.AssignIfExists(Base::TopKProfileThreshold, &options->top_k_profile_threshold_); 62 map.AssignIfExists(Base::AbortOnHardVerifierFailure, &options->abort_on_hard_verifier_failure_); 63 map.AssignIfExists(Base::AbortOnSoftVerifierFailure, &options->abort_on_soft_verifier_failure_); 64 if (map.Exists(Base::DumpInitFailures)) { 65 if (!options->ParseDumpInitFailures(*map.Get(Base::DumpInitFailures), error_msg)) { 66 return false; 67 } 68 } 69 map.AssignIfExists(Base::DumpCFG, &options->dump_cfg_file_name_); 70 if (map.Exists(Base::DumpCFGAppend)) { 71 options->dump_cfg_append_ = true; 72 } 73 if (map.Exists(Base::RegisterAllocationStrategy)) { 74 if (!options->ParseRegisterAllocationStrategy(*map.Get(Base::DumpInitFailures), error_msg)) { 75 return false; 76 } 77 } 78 map.AssignIfExists(Base::VerboseMethods, &options->verbose_methods_); 79 options->deduplicate_code_ = map.GetOrDefault(Base::DeduplicateCode); 80 if (map.Exists(Base::CountHotnessInCompiledCode)) { 81 options->count_hotness_in_compiled_code_ = true; 82 } 83 map.AssignIfExists(Base::ResolveStartupConstStrings, &options->resolve_startup_const_strings_); 84 if (map.Exists(Base::CheckProfiledMethods)) { 85 options->check_profiled_methods_ = *map.Get(Base::CheckProfiledMethods); 86 } 87 map.AssignIfExists(Base::MaxImageBlockSize, &options->max_image_block_size_); 88 89 if (map.Exists(Base::DumpTimings)) { 90 options->dump_timings_ = true; 91 } 92 93 if (map.Exists(Base::DumpPassTimings)) { 94 options->dump_pass_timings_ = true; 95 } 96 97 if (map.Exists(Base::DumpStats)) { 98 options->dump_stats_ = true; 99 } 100 101 return true; 102 } 103 104 #pragma GCC diagnostic push 105 #pragma GCC diagnostic ignored "-Wframe-larger-than=" 106 107 template <typename Map, typename Builder> 108 inline void AddCompilerOptionsArgumentParserOptions(Builder& b) { 109 b. 110 Define("--compiler-filter=_") 111 .template WithType<std::string>() 112 .IntoKey(Map::CompilerFilter) 113 114 .Define("--huge-method-max=_") 115 .template WithType<unsigned int>() 116 .IntoKey(Map::HugeMethodMaxThreshold) 117 .Define("--large-method-max=_") 118 .template WithType<unsigned int>() 119 .IntoKey(Map::LargeMethodMaxThreshold) 120 .Define("--small-method-max=_") 121 .template WithType<unsigned int>() 122 .IntoKey(Map::SmallMethodMaxThreshold) 123 .Define("--tiny-method-max=_") 124 .template WithType<unsigned int>() 125 .IntoKey(Map::TinyMethodMaxThreshold) 126 .Define("--num-dex-methods=_") 127 .template WithType<unsigned int>() 128 .IntoKey(Map::NumDexMethodsThreshold) 129 .Define("--inline-max-code-units=_") 130 .template WithType<unsigned int>() 131 .IntoKey(Map::InlineMaxCodeUnitsThreshold) 132 133 .Define({"--generate-debug-info", "-g", "--no-generate-debug-info"}) 134 .WithValues({true, true, false}) 135 .IntoKey(Map::GenerateDebugInfo) 136 .Define({"--generate-mini-debug-info", "--no-generate-mini-debug-info"}) 137 .WithValues({true, false}) 138 .IntoKey(Map::GenerateMiniDebugInfo) 139 140 .Define({"--generate-build-id", "--no-generate-build-id"}) 141 .WithValues({true, false}) 142 .IntoKey(Map::GenerateBuildID) 143 144 .Define({"--deduplicate-code=_"}) 145 .template WithType<bool>() 146 .WithValueMap({{"false", false}, {"true", true}}) 147 .IntoKey(Map::DeduplicateCode) 148 149 .Define({"--count-hotness-in-compiled-code"}) 150 .IntoKey(Map::CountHotnessInCompiledCode) 151 152 .Define({"--check-profiled-methods=_"}) 153 .template WithType<ProfileMethodsCheck>() 154 .WithValueMap({{"log", ProfileMethodsCheck::kLog}, 155 {"abort", ProfileMethodsCheck::kAbort}}) 156 .IntoKey(Map::CheckProfiledMethods) 157 158 .Define({"--dump-timings"}) 159 .IntoKey(Map::DumpTimings) 160 161 .Define({"--dump-pass-timings"}) 162 .IntoKey(Map::DumpPassTimings) 163 164 .Define({"--dump-stats"}) 165 .IntoKey(Map::DumpStats) 166 167 .Define("--debuggable") 168 .IntoKey(Map::Debuggable) 169 170 .Define("--baseline") 171 .IntoKey(Map::Baseline) 172 173 .Define("--top-k-profile-threshold=_") 174 .template WithType<double>().WithRange(0.0, 100.0) 175 .IntoKey(Map::TopKProfileThreshold) 176 177 .Define({"--abort-on-hard-verifier-error", "--no-abort-on-hard-verifier-error"}) 178 .WithValues({true, false}) 179 .IntoKey(Map::AbortOnHardVerifierFailure) 180 .Define({"--abort-on-soft-verifier-error", "--no-abort-on-soft-verifier-error"}) 181 .WithValues({true, false}) 182 .IntoKey(Map::AbortOnSoftVerifierFailure) 183 184 .Define("--dump-init-failures=_") 185 .template WithType<std::string>() 186 .IntoKey(Map::DumpInitFailures) 187 188 .Define("--dump-cfg=_") 189 .template WithType<std::string>() 190 .IntoKey(Map::DumpCFG) 191 .Define("--dump-cfg-append") 192 .IntoKey(Map::DumpCFGAppend) 193 194 .Define("--register-allocation-strategy=_") 195 .template WithType<std::string>() 196 .IntoKey(Map::RegisterAllocationStrategy) 197 198 .Define("--resolve-startup-const-strings=_") 199 .template WithType<bool>() 200 .WithValueMap({{"false", false}, {"true", true}}) 201 .IntoKey(Map::ResolveStartupConstStrings) 202 203 .Define("--verbose-methods=_") 204 .template WithType<ParseStringList<','>>() 205 .IntoKey(Map::VerboseMethods) 206 207 .Define("--max-image-block-size=_") 208 .template WithType<unsigned int>() 209 .IntoKey(Map::MaxImageBlockSize); 210 } 211 212 #pragma GCC diagnostic pop 213 214 } // namespace art 215 216 #endif // ART_COMPILER_DRIVER_COMPILER_OPTIONS_MAP_INL_H_ 217