| //===- subzero/src/IceClFlags.h - Cl Flags for translation ------*- C++ -*-===// |
| // |
| // The Subzero Code Generator |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// \brief Declares Ice::ClFlags which implements command line processing. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef SUBZERO_SRC_ICECLFLAGS_H |
| #define SUBZERO_SRC_ICECLFLAGS_H |
| |
| #include "IceBuildDefs.h" |
| #include "IceClFlags.def" |
| #include "IceDefs.h" |
| #include "IceRangeSpec.h" |
| #include "IceTypes.h" |
| |
| #ifdef __clang__ |
| #pragma clang diagnostic push |
| #pragma clang diagnostic ignored "-Wunused-parameter" |
| #endif // __clang__ |
| |
| #include "llvm/IRReader/IRReader.h" |
| |
| #ifdef __clang__ |
| #pragma clang diagnostic pop |
| #endif // __clang__ |
| |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| #ifndef PNACL_LLVM |
| namespace llvm { |
| // \brief Define the expected format of the file. |
| enum NaClFileFormat { |
| // LLVM IR source or bitcode file (as appropriate). |
| LLVMFormat, |
| // PNaCl bitcode file. |
| PNaClFormat, |
| // Autodetect if PNaCl or LLVM format. |
| AutodetectFileFormat |
| }; |
| } // end of namespace llvm |
| #endif // !PNACL_LLVM |
| |
| namespace Ice { |
| // detail defines the type cl_type_traits, which is used to define the |
| // getters/setters for the ClFlags class. It converts the cl_detail::*_flag |
| // types to appropriate types for the several getters and setters created. |
| namespace detail { |
| // Base cl_type_traits. |
| template <typename B, typename CL> struct cl_type_traits {}; |
| |
| // cl_type_traits specialized cl::list<std::string>, non-MINIMAL build. |
| template <> struct cl_type_traits<std::string, cl_detail::dev_list_flag> { |
| using storage_type = std::vector<std::string>; |
| }; |
| |
| // cl_type_traits specialized cl::list<Ice::VerboseItem>, non-MINIMAL build. |
| template <> struct cl_type_traits<Ice::VerboseItem, cl_detail::dev_list_flag> { |
| using storage_type = Ice::VerboseMask; |
| }; |
| |
| // cl_type_traits specialized cl::opt<T>, non-MINIMAL build. |
| template <typename T> struct cl_type_traits<T, cl_detail::dev_opt_flag> { |
| using storage_type = T; |
| }; |
| |
| // cl_type_traits specialized cl::opt<T>, MINIMAL build. |
| template <typename T> struct cl_type_traits<T, cl_detail::release_opt_flag> { |
| using storage_type = T; |
| }; |
| |
| } // end of namespace detail |
| |
| /// Define variables which configure translation and related support functions. |
| class ClFlags { |
| ClFlags(const ClFlags &) = delete; |
| ClFlags &operator=(const ClFlags &) = delete; |
| |
| public: |
| /// User defined constructor. |
| ClFlags() { resetClFlags(); } |
| |
| /// The command line flags. |
| static ClFlags Flags; |
| |
| /// \brief Parse commmand line options for Subzero. |
| /// |
| /// This is done use cl::ParseCommandLineOptions() and the static variables of |
| /// type cl::opt defined in IceClFlags.cpp |
| static void parseFlags(int argc, const char *const *argv); |
| |
| /// Reset all configuration options to their nominal values. |
| void resetClFlags(); |
| |
| /// \brief Retrieve the configuration option state |
| /// |
| /// This is defined by static variables |
| /// anonymous_namespace{IceClFlags.cpp}::AllowErrorRecoveryObj, |
| /// anonymous_namespace{IceClFlags.cpp}::AllowIacaMarksObj, |
| /// ... |
| static void getParsedClFlags(ClFlags &OutFlags); |
| |
| #define X(Name, Type, ClType, ...) \ |
| private: \ |
| using Name##StorageType = \ |
| detail::cl_type_traits<Type, cl_detail::ClType>::storage_type; \ |
| \ |
| Name##StorageType Name; \ |
| \ |
| template <bool E> \ |
| typename std::enable_if<E, void>::type set##Name##Impl( \ |
| Name##StorageType Value) { \ |
| Name = std::move(Value); \ |
| } \ |
| \ |
| template <bool E> \ |
| typename std::enable_if<!E, void>::type set##Name##Impl(Name##StorageType) { \ |
| } \ |
| \ |
| public: \ |
| Name##StorageType get##Name() const { return Name; } \ |
| void set##Name(Name##StorageType Value) { \ |
| /* TODO(jpp): figure out which optional flags are used in minimal, and \ |
| what are the defaults for them. */ \ |
| static constexpr bool Enable = \ |
| std::is_same<cl_detail::ClType, cl_detail::release_opt_flag>::value || \ |
| !BuildDefs::minimal() || true; \ |
| set##Name##Impl<Enable>(std::move(Value)); \ |
| } \ |
| \ |
| private: |
| COMMAND_LINE_FLAGS |
| #undef X |
| |
| public: |
| bool isSequential() const { return NumTranslationThreads == 0; } |
| bool isParseParallel() const { |
| return getParseParallel() && !isSequential() && getBuildOnRead(); |
| } |
| std::string getAppName() const { return AppName; } |
| void setAppName(const std::string &Value) { AppName = Value; } |
| |
| /// \brief Get the value of ClFlags::GenerateUnitTestMessages |
| /// |
| /// Note: If dump routines have been turned off, the error messages |
| /// will not be readable. Hence, turn off. |
| bool getGenerateUnitTestMessages() const { |
| return !BuildDefs::dump() || GenerateUnitTestMessages; |
| } |
| /// Set ClFlags::GenerateUnitTestMessages to a new value |
| void setGenerateUnitTestMessages(bool NewValue) { |
| GenerateUnitTestMessages = NewValue; |
| } |
| bool matchForceO2(GlobalString Name, uint32_t Number) const { |
| return ForceO2.match(Name, Number); |
| } |
| bool matchSplitInsts(const std::string &Name, uint32_t Number) const { |
| return SplitInsts.match(Name, Number); |
| } |
| bool matchTestStatus(GlobalString Name, uint32_t Number) const { |
| return TestStatus.match(Name, Number); |
| } |
| bool matchTimingFocus(GlobalString Name, uint32_t Number) const { |
| return TimingFocus.match(Name, Number); |
| } |
| bool matchTranslateOnly(GlobalString Name, uint32_t Number) const { |
| return TranslateOnly.match(Name, Number); |
| } |
| bool matchVerboseFocusOn(GlobalString Name, uint32_t Number) const { |
| return VerboseFocus.match(Name, Number); |
| } |
| bool matchVerboseFocusOn(const std::string &Name, uint32_t Number) const { |
| return VerboseFocus.match(Name, Number); |
| } |
| |
| private: |
| std::string AppName; |
| |
| /// Initialized to false; not set by the command line. |
| bool GenerateUnitTestMessages; |
| |
| RangeSpec ForceO2; |
| RangeSpec SplitInsts; |
| RangeSpec TestStatus; |
| RangeSpec TimingFocus; |
| RangeSpec TranslateOnly; |
| RangeSpec VerboseFocus; |
| }; |
| |
| inline const ClFlags &getFlags() { return ClFlags::Flags; } |
| |
| } // end of namespace Ice |
| |
| #endif // SUBZERO_SRC_ICECLFLAGS_H |