1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceClFlags.h - Cl Flags for translation ------*- C++ -*-===// 2*03ce13f7SAndroid Build Coastguard Worker // 3*03ce13f7SAndroid Build Coastguard Worker // The Subzero Code Generator 4*03ce13f7SAndroid Build Coastguard Worker // 5*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*03ce13f7SAndroid Build Coastguard Worker // 8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*03ce13f7SAndroid Build Coastguard Worker /// 10*03ce13f7SAndroid Build Coastguard Worker /// \file 11*03ce13f7SAndroid Build Coastguard Worker /// \brief Declares Ice::ClFlags which implements command line processing. 12*03ce13f7SAndroid Build Coastguard Worker /// 13*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 14*03ce13f7SAndroid Build Coastguard Worker 15*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICECLFLAGS_H 16*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICECLFLAGS_H 17*03ce13f7SAndroid Build Coastguard Worker 18*03ce13f7SAndroid Build Coastguard Worker #include "IceBuildDefs.h" 19*03ce13f7SAndroid Build Coastguard Worker #include "IceClFlags.def" 20*03ce13f7SAndroid Build Coastguard Worker #include "IceDefs.h" 21*03ce13f7SAndroid Build Coastguard Worker #include "IceRangeSpec.h" 22*03ce13f7SAndroid Build Coastguard Worker #include "IceTypes.h" 23*03ce13f7SAndroid Build Coastguard Worker 24*03ce13f7SAndroid Build Coastguard Worker #ifdef __clang__ 25*03ce13f7SAndroid Build Coastguard Worker #pragma clang diagnostic push 26*03ce13f7SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wunused-parameter" 27*03ce13f7SAndroid Build Coastguard Worker #endif // __clang__ 28*03ce13f7SAndroid Build Coastguard Worker 29*03ce13f7SAndroid Build Coastguard Worker #include "llvm/IRReader/IRReader.h" 30*03ce13f7SAndroid Build Coastguard Worker 31*03ce13f7SAndroid Build Coastguard Worker #ifdef __clang__ 32*03ce13f7SAndroid Build Coastguard Worker #pragma clang diagnostic pop 33*03ce13f7SAndroid Build Coastguard Worker #endif // __clang__ 34*03ce13f7SAndroid Build Coastguard Worker 35*03ce13f7SAndroid Build Coastguard Worker #include <string> 36*03ce13f7SAndroid Build Coastguard Worker #include <utility> 37*03ce13f7SAndroid Build Coastguard Worker #include <vector> 38*03ce13f7SAndroid Build Coastguard Worker 39*03ce13f7SAndroid Build Coastguard Worker #ifndef PNACL_LLVM 40*03ce13f7SAndroid Build Coastguard Worker namespace llvm { 41*03ce13f7SAndroid Build Coastguard Worker // \brief Define the expected format of the file. 42*03ce13f7SAndroid Build Coastguard Worker enum NaClFileFormat { 43*03ce13f7SAndroid Build Coastguard Worker // LLVM IR source or bitcode file (as appropriate). 44*03ce13f7SAndroid Build Coastguard Worker LLVMFormat, 45*03ce13f7SAndroid Build Coastguard Worker // PNaCl bitcode file. 46*03ce13f7SAndroid Build Coastguard Worker PNaClFormat, 47*03ce13f7SAndroid Build Coastguard Worker // Autodetect if PNaCl or LLVM format. 48*03ce13f7SAndroid Build Coastguard Worker AutodetectFileFormat 49*03ce13f7SAndroid Build Coastguard Worker }; 50*03ce13f7SAndroid Build Coastguard Worker } // end of namespace llvm 51*03ce13f7SAndroid Build Coastguard Worker #endif // !PNACL_LLVM 52*03ce13f7SAndroid Build Coastguard Worker 53*03ce13f7SAndroid Build Coastguard Worker namespace Ice { 54*03ce13f7SAndroid Build Coastguard Worker // detail defines the type cl_type_traits, which is used to define the 55*03ce13f7SAndroid Build Coastguard Worker // getters/setters for the ClFlags class. It converts the cl_detail::*_flag 56*03ce13f7SAndroid Build Coastguard Worker // types to appropriate types for the several getters and setters created. 57*03ce13f7SAndroid Build Coastguard Worker namespace detail { 58*03ce13f7SAndroid Build Coastguard Worker // Base cl_type_traits. 59*03ce13f7SAndroid Build Coastguard Worker template <typename B, typename CL> struct cl_type_traits {}; 60*03ce13f7SAndroid Build Coastguard Worker 61*03ce13f7SAndroid Build Coastguard Worker // cl_type_traits specialized cl::list<std::string>, non-MINIMAL build. 62*03ce13f7SAndroid Build Coastguard Worker template <> struct cl_type_traits<std::string, cl_detail::dev_list_flag> { 63*03ce13f7SAndroid Build Coastguard Worker using storage_type = std::vector<std::string>; 64*03ce13f7SAndroid Build Coastguard Worker }; 65*03ce13f7SAndroid Build Coastguard Worker 66*03ce13f7SAndroid Build Coastguard Worker // cl_type_traits specialized cl::list<Ice::VerboseItem>, non-MINIMAL build. 67*03ce13f7SAndroid Build Coastguard Worker template <> struct cl_type_traits<Ice::VerboseItem, cl_detail::dev_list_flag> { 68*03ce13f7SAndroid Build Coastguard Worker using storage_type = Ice::VerboseMask; 69*03ce13f7SAndroid Build Coastguard Worker }; 70*03ce13f7SAndroid Build Coastguard Worker 71*03ce13f7SAndroid Build Coastguard Worker // cl_type_traits specialized cl::opt<T>, non-MINIMAL build. 72*03ce13f7SAndroid Build Coastguard Worker template <typename T> struct cl_type_traits<T, cl_detail::dev_opt_flag> { 73*03ce13f7SAndroid Build Coastguard Worker using storage_type = T; 74*03ce13f7SAndroid Build Coastguard Worker }; 75*03ce13f7SAndroid Build Coastguard Worker 76*03ce13f7SAndroid Build Coastguard Worker // cl_type_traits specialized cl::opt<T>, MINIMAL build. 77*03ce13f7SAndroid Build Coastguard Worker template <typename T> struct cl_type_traits<T, cl_detail::release_opt_flag> { 78*03ce13f7SAndroid Build Coastguard Worker using storage_type = T; 79*03ce13f7SAndroid Build Coastguard Worker }; 80*03ce13f7SAndroid Build Coastguard Worker 81*03ce13f7SAndroid Build Coastguard Worker } // end of namespace detail 82*03ce13f7SAndroid Build Coastguard Worker 83*03ce13f7SAndroid Build Coastguard Worker /// Define variables which configure translation and related support functions. 84*03ce13f7SAndroid Build Coastguard Worker class ClFlags { 85*03ce13f7SAndroid Build Coastguard Worker ClFlags(const ClFlags &) = delete; 86*03ce13f7SAndroid Build Coastguard Worker ClFlags &operator=(const ClFlags &) = delete; 87*03ce13f7SAndroid Build Coastguard Worker 88*03ce13f7SAndroid Build Coastguard Worker public: 89*03ce13f7SAndroid Build Coastguard Worker /// User defined constructor. 90*03ce13f7SAndroid Build Coastguard Worker ClFlags() { resetClFlags(); } 91*03ce13f7SAndroid Build Coastguard Worker 92*03ce13f7SAndroid Build Coastguard Worker /// The command line flags. 93*03ce13f7SAndroid Build Coastguard Worker static ClFlags Flags; 94*03ce13f7SAndroid Build Coastguard Worker 95*03ce13f7SAndroid Build Coastguard Worker /// \brief Parse commmand line options for Subzero. 96*03ce13f7SAndroid Build Coastguard Worker /// 97*03ce13f7SAndroid Build Coastguard Worker /// This is done use cl::ParseCommandLineOptions() and the static variables of 98*03ce13f7SAndroid Build Coastguard Worker /// type cl::opt defined in IceClFlags.cpp 99*03ce13f7SAndroid Build Coastguard Worker static void parseFlags(int argc, const char *const *argv); 100*03ce13f7SAndroid Build Coastguard Worker 101*03ce13f7SAndroid Build Coastguard Worker /// Reset all configuration options to their nominal values. 102*03ce13f7SAndroid Build Coastguard Worker void resetClFlags(); 103*03ce13f7SAndroid Build Coastguard Worker 104*03ce13f7SAndroid Build Coastguard Worker /// \brief Retrieve the configuration option state 105*03ce13f7SAndroid Build Coastguard Worker /// 106*03ce13f7SAndroid Build Coastguard Worker /// This is defined by static variables 107*03ce13f7SAndroid Build Coastguard Worker /// anonymous_namespace{IceClFlags.cpp}::AllowErrorRecoveryObj, 108*03ce13f7SAndroid Build Coastguard Worker /// anonymous_namespace{IceClFlags.cpp}::AllowIacaMarksObj, 109*03ce13f7SAndroid Build Coastguard Worker /// ... 110*03ce13f7SAndroid Build Coastguard Worker static void getParsedClFlags(ClFlags &OutFlags); 111*03ce13f7SAndroid Build Coastguard Worker 112*03ce13f7SAndroid Build Coastguard Worker #define X(Name, Type, ClType, ...) \ 113*03ce13f7SAndroid Build Coastguard Worker private: \ 114*03ce13f7SAndroid Build Coastguard Worker using Name##StorageType = \ 115*03ce13f7SAndroid Build Coastguard Worker detail::cl_type_traits<Type, cl_detail::ClType>::storage_type; \ 116*03ce13f7SAndroid Build Coastguard Worker \ 117*03ce13f7SAndroid Build Coastguard Worker Name##StorageType Name; \ 118*03ce13f7SAndroid Build Coastguard Worker \ 119*03ce13f7SAndroid Build Coastguard Worker template <bool E> \ 120*03ce13f7SAndroid Build Coastguard Worker typename std::enable_if<E, void>::type set##Name##Impl( \ 121*03ce13f7SAndroid Build Coastguard Worker Name##StorageType Value) { \ 122*03ce13f7SAndroid Build Coastguard Worker Name = std::move(Value); \ 123*03ce13f7SAndroid Build Coastguard Worker } \ 124*03ce13f7SAndroid Build Coastguard Worker \ 125*03ce13f7SAndroid Build Coastguard Worker template <bool E> \ 126*03ce13f7SAndroid Build Coastguard Worker typename std::enable_if<!E, void>::type set##Name##Impl(Name##StorageType) { \ 127*03ce13f7SAndroid Build Coastguard Worker } \ 128*03ce13f7SAndroid Build Coastguard Worker \ 129*03ce13f7SAndroid Build Coastguard Worker public: \ 130*03ce13f7SAndroid Build Coastguard Worker Name##StorageType get##Name() const { return Name; } \ 131*03ce13f7SAndroid Build Coastguard Worker void set##Name(Name##StorageType Value) { \ 132*03ce13f7SAndroid Build Coastguard Worker /* TODO(jpp): figure out which optional flags are used in minimal, and \ 133*03ce13f7SAndroid Build Coastguard Worker what are the defaults for them. */ \ 134*03ce13f7SAndroid Build Coastguard Worker static constexpr bool Enable = \ 135*03ce13f7SAndroid Build Coastguard Worker std::is_same<cl_detail::ClType, cl_detail::release_opt_flag>::value || \ 136*03ce13f7SAndroid Build Coastguard Worker !BuildDefs::minimal() || true; \ 137*03ce13f7SAndroid Build Coastguard Worker set##Name##Impl<Enable>(std::move(Value)); \ 138*03ce13f7SAndroid Build Coastguard Worker } \ 139*03ce13f7SAndroid Build Coastguard Worker \ 140*03ce13f7SAndroid Build Coastguard Worker private: 141*03ce13f7SAndroid Build Coastguard Worker COMMAND_LINE_FLAGS 142*03ce13f7SAndroid Build Coastguard Worker #undef X 143*03ce13f7SAndroid Build Coastguard Worker 144*03ce13f7SAndroid Build Coastguard Worker public: 145*03ce13f7SAndroid Build Coastguard Worker bool isSequential() const { return NumTranslationThreads == 0; } 146*03ce13f7SAndroid Build Coastguard Worker bool isParseParallel() const { 147*03ce13f7SAndroid Build Coastguard Worker return getParseParallel() && !isSequential() && getBuildOnRead(); 148*03ce13f7SAndroid Build Coastguard Worker } 149*03ce13f7SAndroid Build Coastguard Worker std::string getAppName() const { return AppName; } 150*03ce13f7SAndroid Build Coastguard Worker void setAppName(const std::string &Value) { AppName = Value; } 151*03ce13f7SAndroid Build Coastguard Worker 152*03ce13f7SAndroid Build Coastguard Worker /// \brief Get the value of ClFlags::GenerateUnitTestMessages 153*03ce13f7SAndroid Build Coastguard Worker /// 154*03ce13f7SAndroid Build Coastguard Worker /// Note: If dump routines have been turned off, the error messages 155*03ce13f7SAndroid Build Coastguard Worker /// will not be readable. Hence, turn off. 156*03ce13f7SAndroid Build Coastguard Worker bool getGenerateUnitTestMessages() const { 157*03ce13f7SAndroid Build Coastguard Worker return !BuildDefs::dump() || GenerateUnitTestMessages; 158*03ce13f7SAndroid Build Coastguard Worker } 159*03ce13f7SAndroid Build Coastguard Worker /// Set ClFlags::GenerateUnitTestMessages to a new value 160*03ce13f7SAndroid Build Coastguard Worker void setGenerateUnitTestMessages(bool NewValue) { 161*03ce13f7SAndroid Build Coastguard Worker GenerateUnitTestMessages = NewValue; 162*03ce13f7SAndroid Build Coastguard Worker } 163*03ce13f7SAndroid Build Coastguard Worker bool matchForceO2(GlobalString Name, uint32_t Number) const { 164*03ce13f7SAndroid Build Coastguard Worker return ForceO2.match(Name, Number); 165*03ce13f7SAndroid Build Coastguard Worker } 166*03ce13f7SAndroid Build Coastguard Worker bool matchSplitInsts(const std::string &Name, uint32_t Number) const { 167*03ce13f7SAndroid Build Coastguard Worker return SplitInsts.match(Name, Number); 168*03ce13f7SAndroid Build Coastguard Worker } 169*03ce13f7SAndroid Build Coastguard Worker bool matchTestStatus(GlobalString Name, uint32_t Number) const { 170*03ce13f7SAndroid Build Coastguard Worker return TestStatus.match(Name, Number); 171*03ce13f7SAndroid Build Coastguard Worker } 172*03ce13f7SAndroid Build Coastguard Worker bool matchTimingFocus(GlobalString Name, uint32_t Number) const { 173*03ce13f7SAndroid Build Coastguard Worker return TimingFocus.match(Name, Number); 174*03ce13f7SAndroid Build Coastguard Worker } 175*03ce13f7SAndroid Build Coastguard Worker bool matchTranslateOnly(GlobalString Name, uint32_t Number) const { 176*03ce13f7SAndroid Build Coastguard Worker return TranslateOnly.match(Name, Number); 177*03ce13f7SAndroid Build Coastguard Worker } 178*03ce13f7SAndroid Build Coastguard Worker bool matchVerboseFocusOn(GlobalString Name, uint32_t Number) const { 179*03ce13f7SAndroid Build Coastguard Worker return VerboseFocus.match(Name, Number); 180*03ce13f7SAndroid Build Coastguard Worker } 181*03ce13f7SAndroid Build Coastguard Worker bool matchVerboseFocusOn(const std::string &Name, uint32_t Number) const { 182*03ce13f7SAndroid Build Coastguard Worker return VerboseFocus.match(Name, Number); 183*03ce13f7SAndroid Build Coastguard Worker } 184*03ce13f7SAndroid Build Coastguard Worker 185*03ce13f7SAndroid Build Coastguard Worker private: 186*03ce13f7SAndroid Build Coastguard Worker std::string AppName; 187*03ce13f7SAndroid Build Coastguard Worker 188*03ce13f7SAndroid Build Coastguard Worker /// Initialized to false; not set by the command line. 189*03ce13f7SAndroid Build Coastguard Worker bool GenerateUnitTestMessages; 190*03ce13f7SAndroid Build Coastguard Worker 191*03ce13f7SAndroid Build Coastguard Worker RangeSpec ForceO2; 192*03ce13f7SAndroid Build Coastguard Worker RangeSpec SplitInsts; 193*03ce13f7SAndroid Build Coastguard Worker RangeSpec TestStatus; 194*03ce13f7SAndroid Build Coastguard Worker RangeSpec TimingFocus; 195*03ce13f7SAndroid Build Coastguard Worker RangeSpec TranslateOnly; 196*03ce13f7SAndroid Build Coastguard Worker RangeSpec VerboseFocus; 197*03ce13f7SAndroid Build Coastguard Worker }; 198*03ce13f7SAndroid Build Coastguard Worker 199*03ce13f7SAndroid Build Coastguard Worker inline const ClFlags &getFlags() { return ClFlags::Flags; } 200*03ce13f7SAndroid Build Coastguard Worker 201*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice 202*03ce13f7SAndroid Build Coastguard Worker 203*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICECLFLAGS_H 204