xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceBuildDefs.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceBuildDefs.h - Translator build defines ----*- 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 Define the Ice::BuildDefs namespace
12*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*03ce13f7SAndroid Build Coastguard Worker 
14*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICEBUILDDEFS_H
15*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICEBUILDDEFS_H
16*03ce13f7SAndroid Build Coastguard Worker 
17*03ce13f7SAndroid Build Coastguard Worker namespace Ice {
18*03ce13f7SAndroid Build Coastguard Worker /// \brief Defines constexpr functions that express various Subzero build
19*03ce13f7SAndroid Build Coastguard Worker /// system defined values.
20*03ce13f7SAndroid Build Coastguard Worker ///
21*03ce13f7SAndroid Build Coastguard Worker /// These resulting constexpr functions allow code to in effect be
22*03ce13f7SAndroid Build Coastguard Worker /// conditionally compiled without having to do this using the older C++
23*03ce13f7SAndroid Build Coastguard Worker /// preprocessor solution.
24*03ce13f7SAndroid Build Coastguard Worker 
25*03ce13f7SAndroid Build Coastguard Worker /** \verbatim
26*03ce13f7SAndroid Build Coastguard Worker 
27*03ce13f7SAndroid Build Coastguard Worker  For example whenever the value of FEATURE_SUPPORTED is needed, instead
28*03ce13f7SAndroid Build Coastguard Worker  of (except in these constexpr functions):
29*03ce13f7SAndroid Build Coastguard Worker 
30*03ce13f7SAndroid Build Coastguard Worker  #if FEATURE_SUPPORTED ...
31*03ce13f7SAndroid Build Coastguard Worker  ...
32*03ce13f7SAndroid Build Coastguard Worker  #endif
33*03ce13f7SAndroid Build Coastguard Worker 
34*03ce13f7SAndroid Build Coastguard Worker  We can have:
35*03ce13f7SAndroid Build Coastguard Worker 
36*03ce13f7SAndroid Build Coastguard Worker  namespace Ice {
37*03ce13f7SAndroid Build Coastguard Worker  namespace BuildDefs {
38*03ce13f7SAndroid Build Coastguard Worker 
39*03ce13f7SAndroid Build Coastguard Worker  // Use this form when FEATURE_SUPPORTED is guaranteed to be defined on the
40*03ce13f7SAndroid Build Coastguard Worker  // C++ compiler command line as 0 or 1.
41*03ce13f7SAndroid Build Coastguard Worker  constexpr bool hasFeature() { return FEATURE_SUPPORTED; }
42*03ce13f7SAndroid Build Coastguard Worker 
43*03ce13f7SAndroid Build Coastguard Worker  or
44*03ce13f7SAndroid Build Coastguard Worker 
45*03ce13f7SAndroid Build Coastguard Worker  // Use this form when FEATURE_SUPPORTED may not necessarily be defined on
46*03ce13f7SAndroid Build Coastguard Worker  // the C++ compiler command line.
47*03ce13f7SAndroid Build Coastguard Worker  constexpr bool hasFeature() {
48*03ce13f7SAndroid Build Coastguard Worker  #if FEATURE_SUPPORTED
49*03ce13f7SAndroid Build Coastguard Worker    return true;
50*03ce13f7SAndroid Build Coastguard Worker  #else // !FEATURE_SUPPORTED
51*03ce13f7SAndroid Build Coastguard Worker    return false;
52*03ce13f7SAndroid Build Coastguard Worker  #endif // !FEATURE_SUPPORTED
53*03ce13f7SAndroid Build Coastguard Worker  }
54*03ce13f7SAndroid Build Coastguard Worker 
55*03ce13f7SAndroid Build Coastguard Worker  ...} // end of namespace BuildDefs
56*03ce13f7SAndroid Build Coastguard Worker  } // end of namespace Ice
57*03ce13f7SAndroid Build Coastguard Worker 
58*03ce13f7SAndroid Build Coastguard Worker 
59*03ce13f7SAndroid Build Coastguard Worker  And later in the code:
60*03ce13f7SAndroid Build Coastguard Worker 
61*03ce13f7SAndroid Build Coastguard Worker  if (Ice::BuildDefs::hasFeature() {
62*03ce13f7SAndroid Build Coastguard Worker     ...
63*03ce13f7SAndroid Build Coastguard Worker  }
64*03ce13f7SAndroid Build Coastguard Worker 
65*03ce13f7SAndroid Build Coastguard Worker  \endverbatim
66*03ce13f7SAndroid Build Coastguard Worker 
67*03ce13f7SAndroid Build Coastguard Worker  Since hasFeature() returns a constexpr, an optimizing compiler will know to
68*03ce13f7SAndroid Build Coastguard Worker  keep or discard the above fragment. In addition, the code will always be
69*03ce13f7SAndroid Build Coastguard Worker  looked at by the compiler which eliminates the problem with defines in that
70*03ce13f7SAndroid Build Coastguard Worker  if you don't build that variant, you don't even know if the code would
71*03ce13f7SAndroid Build Coastguard Worker  compile unless you build with that variant.
72*03ce13f7SAndroid Build Coastguard Worker 
73*03ce13f7SAndroid Build Coastguard Worker   **/
74*03ce13f7SAndroid Build Coastguard Worker 
75*03ce13f7SAndroid Build Coastguard Worker namespace BuildDefs {
76*03ce13f7SAndroid Build Coastguard Worker 
77*03ce13f7SAndroid Build Coastguard Worker // The ALLOW_* etc. symbols must be #defined to zero or non-zero.
78*03ce13f7SAndroid Build Coastguard Worker /// Return true if ALLOW_DUMP is defined as a non-zero value
dump()79*03ce13f7SAndroid Build Coastguard Worker constexpr bool dump() { return ALLOW_DUMP; }
80*03ce13f7SAndroid Build Coastguard Worker /// Return true if ALLOW_TIMERS is defined as a non-zero value
timers()81*03ce13f7SAndroid Build Coastguard Worker constexpr bool timers() { return ALLOW_TIMERS; }
82*03ce13f7SAndroid Build Coastguard Worker /// Return true if ALLOW_LLVM_CL is defined as a non-zero value
83*03ce13f7SAndroid Build Coastguard Worker // TODO(stichnot): this ALLOW_LLVM_CL is a TBD option which will
84*03ce13f7SAndroid Build Coastguard Worker // allow for replacement of llvm:cl command line processor with a
85*03ce13f7SAndroid Build Coastguard Worker // smaller footprint version for Subzero.
llvmCl()86*03ce13f7SAndroid Build Coastguard Worker constexpr bool llvmCl() { return ALLOW_LLVM_CL; }
87*03ce13f7SAndroid Build Coastguard Worker /// Return true if ALLOW_LLVM_IR is defined as a non-zero value
llvmIr()88*03ce13f7SAndroid Build Coastguard Worker constexpr bool llvmIr() { return ALLOW_LLVM_IR; }
89*03ce13f7SAndroid Build Coastguard Worker /// Return true if ALLOW_LLVM_IR_AS_INPUT is defined as a non-zero value
llvmIrAsInput()90*03ce13f7SAndroid Build Coastguard Worker constexpr bool llvmIrAsInput() { return ALLOW_LLVM_IR_AS_INPUT; }
91*03ce13f7SAndroid Build Coastguard Worker /// Return true if ALLOW_MINIMAL_BUILD is defined as a non-zero value
minimal()92*03ce13f7SAndroid Build Coastguard Worker constexpr bool minimal() { return ALLOW_MINIMAL_BUILD; }
93*03ce13f7SAndroid Build Coastguard Worker /// Return true if ALLOW_WASM is defined as a non-zero value
wasm()94*03ce13f7SAndroid Build Coastguard Worker constexpr bool wasm() { return ALLOW_WASM; }
95*03ce13f7SAndroid Build Coastguard Worker 
96*03ce13f7SAndroid Build Coastguard Worker /// Return true if NDEBUG is defined
asserts()97*03ce13f7SAndroid Build Coastguard Worker constexpr bool asserts() {
98*03ce13f7SAndroid Build Coastguard Worker #ifdef NDEBUG
99*03ce13f7SAndroid Build Coastguard Worker   return false;
100*03ce13f7SAndroid Build Coastguard Worker #else  // !NDEBUG
101*03ce13f7SAndroid Build Coastguard Worker   return true;
102*03ce13f7SAndroid Build Coastguard Worker #endif // !NDEBUG
103*03ce13f7SAndroid Build Coastguard Worker }
104*03ce13f7SAndroid Build Coastguard Worker 
105*03ce13f7SAndroid Build Coastguard Worker /// Return true if PNACL_BROWSER_TRANSLATOR is defined
browser()106*03ce13f7SAndroid Build Coastguard Worker constexpr bool browser() {
107*03ce13f7SAndroid Build Coastguard Worker #if PNACL_BROWSER_TRANSLATOR
108*03ce13f7SAndroid Build Coastguard Worker   return true;
109*03ce13f7SAndroid Build Coastguard Worker #else  // !PNACL_BROWSER_TRANSLATOR
110*03ce13f7SAndroid Build Coastguard Worker   return false;
111*03ce13f7SAndroid Build Coastguard Worker #endif // !PNACL_BROWSER_TRANSLATOR
112*03ce13f7SAndroid Build Coastguard Worker }
113*03ce13f7SAndroid Build Coastguard Worker 
114*03ce13f7SAndroid Build Coastguard Worker /// Return true if ALLOW_EXTRA_VALIDATION is defined
extraValidation()115*03ce13f7SAndroid Build Coastguard Worker constexpr bool extraValidation() {
116*03ce13f7SAndroid Build Coastguard Worker #if ALLOW_EXTRA_VALIDATION
117*03ce13f7SAndroid Build Coastguard Worker   return true;
118*03ce13f7SAndroid Build Coastguard Worker #else  // !ALLOW_EXTRA_VALIDATION
119*03ce13f7SAndroid Build Coastguard Worker   return false;
120*03ce13f7SAndroid Build Coastguard Worker #endif // !ALLOW_EXTRA_VALIDATION
121*03ce13f7SAndroid Build Coastguard Worker }
122*03ce13f7SAndroid Build Coastguard Worker 
123*03ce13f7SAndroid Build Coastguard Worker } // end of namespace BuildDefs
124*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice
125*03ce13f7SAndroid Build Coastguard Worker 
126*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICEBUILDDEFS_H
127