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 Workerconstexpr 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 Workerconstexpr 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 Workerconstexpr 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 Workerconstexpr 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 Workerconstexpr 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 Workerconstexpr 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 Workerconstexpr 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 Workerconstexpr 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 Workerconstexpr 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 Workerconstexpr 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