diff options
Diffstat (limited to 'compiler/dex/pass_me.h')
-rw-r--r-- | compiler/dex/pass_me.h | 81 |
1 files changed, 69 insertions, 12 deletions
diff --git a/compiler/dex/pass_me.h b/compiler/dex/pass_me.h index 79d8f51..d3cf393 100644 --- a/compiler/dex/pass_me.h +++ b/compiler/dex/pass_me.h @@ -21,6 +21,7 @@ #include "base/logging.h" #include "pass.h" +#include "compiler_ir.h" #include "safe_map.h" namespace art { @@ -104,7 +105,7 @@ class PassME : public Pass { */ void PrintPassDefaultOptions() const { for (const auto& option : default_options_) { - LOG(INFO) << "\t" << option.first << ":" << std::dec << option.second; + LOG(INFO) << "\t" << option.first << ":" << option.second; } } @@ -112,15 +113,49 @@ class PassME : public Pass { * @brief Prints the pass options along with either default or overridden setting. * @param overridden_options The overridden settings for this pass. */ - void PrintPassOptions(SafeMap<const std::string, int>& overridden_options) const { + void PrintPassOptions(SafeMap<const std::string, const OptionContent>& overridden_options) const { // We walk through the default options only to get the pass names. We use GetPassOption to // also consider the overridden ones. for (const auto& option : default_options_) { - LOG(INFO) << "\t" << option.first << ":" << std::dec + LOG(INFO) << "\t" << option.first << ":" << GetPassOption(option.first, overridden_options); } } + /** + * @brief Used to obtain the option structure for a pass. + * @details Will return the overridden option if it exists or default one otherwise. + * @param option_name The name of option whose setting to look for. + * @param c_unit The compilation unit currently being handled. + * @return Returns the option structure containing the option value. + */ + const OptionContent& GetPassOption(const char* option_name, CompilationUnit* c_unit) const { + return GetPassOption(option_name, c_unit->overridden_pass_options); + } + + /** + * @brief Used to obtain the option for a pass as a string. + * @details Will return the overridden option if it exists or default one otherwise. + * It will return nullptr if the required option value is not a string. + * @param option_name The name of option whose setting to look for. + * @param c_unit The compilation unit currently being handled. + * @return Returns the overridden option if it exists or the default one otherwise. + */ + const char* GetStringPassOption(const char* option_name, CompilationUnit* c_unit) const { + return GetStringPassOption(option_name, c_unit->overridden_pass_options); + } + + /** + * @brief Used to obtain the pass option value as an integer. + * @details Will return the overridden option if it exists or default one otherwise. + * It will return 0 if the required option value is not an integer. + * @param c_unit The compilation unit currently being handled. + * @return Returns the overriden option if it exists or the default one otherwise. + */ + int64_t GetIntegerPassOption(const char* option_name, CompilationUnit* c_unit) const { + return GetIntegerPassOption(option_name, c_unit->overridden_pass_options); + } + const char* GetDumpCFGFolder() const { return dump_cfg_folder_; } @@ -130,29 +165,51 @@ class PassME : public Pass { } protected: - int GetPassOption(const char* option_name, const SafeMap<const std::string, int>& overridden_options) const { + const OptionContent& GetPassOption(const char* option_name, + const SafeMap<const std::string, const OptionContent>& overridden_options) const { + DCHECK(option_name != nullptr); + // First check if there are any overridden settings. auto overridden_it = overridden_options.find(std::string(option_name)); if (overridden_it != overridden_options.end()) { return overridden_it->second; + } else { + // Otherwise, there must be a default value for this option name. + auto default_it = default_options_.find(option_name); + // An invalid option is being requested. + if (default_it == default_options_.end()) { + LOG(FATAL) << "Fatal: Cannot find an option named \"" << option_name << "\""; + } + + return default_it->second; } + } - // Next check the default options. - auto default_it = default_options_.find(option_name); + const char* GetStringPassOption(const char* option_name, + const SafeMap<const std::string, const OptionContent>& overridden_options) const { + const OptionContent& option_content = GetPassOption(option_name, overridden_options); + if (option_content.type != OptionContent::kString) { + return nullptr; + } - if (default_it == default_options_.end()) { - // An invalid option is being requested. - DCHECK(false); + return option_content.GetString(); + } + + int64_t GetIntegerPassOption(const char* option_name, + const SafeMap<const std::string, const OptionContent>& overridden_options) const { + const OptionContent& option_content = GetPassOption(option_name, overridden_options); + if (option_content.type != OptionContent::kInteger) { return 0; } - return default_it->second; + return option_content.GetInteger(); } /** @brief Type of traversal: determines the order to execute the pass on the BasicBlocks. */ const DataFlowAnalysisMode traversal_type_; - /** @brief Flags for additional directives: used to determine if a particular post-optimization pass is necessary. */ + /** @brief Flags for additional directives: used to determine if a particular + * post-optimization pass is necessary. */ const unsigned int flags_; /** @brief CFG Dump Folder: what sub-folder to use for dumping the CFGs post pass. */ @@ -163,7 +220,7 @@ class PassME : public Pass { * @details The constructor of the specific pass instance should fill this * with default options. * */ - SafeMap<const char*, int> default_options_; + SafeMap<const char*, const OptionContent> default_options_; }; } // namespace art #endif // ART_COMPILER_DEX_PASS_ME_H_ |