xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceClFlags.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
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