1 // Copyright Contributors to the OpenVDB Project 2 // SPDX-License-Identifier: MPL-2.0 3 4 /// @file compiler/CompilerOptions.h 5 /// 6 /// @authors Nick Avramoussis 7 /// 8 /// @brief OpenVDB AX Compiler Options 9 /// 10 11 #ifndef OPENVDB_AX_COMPILER_COMPILER_OPTIONS_HAS_BEEN_INCLUDED 12 #define OPENVDB_AX_COMPILER_COMPILER_OPTIONS_HAS_BEEN_INCLUDED 13 14 #include <openvdb/openvdb.h> 15 #include <openvdb/version.h> 16 17 namespace openvdb { 18 OPENVDB_USE_VERSION_NAMESPACE 19 namespace OPENVDB_VERSION_NAME { 20 21 namespace ax { 22 23 /// @brief Options that control how functions behave 24 struct FunctionOptions 25 { 26 /// @brief Enable the constant folding of C bindings. Functions may use this setting 27 /// to determine whether they are allowed to be called during code generation 28 /// to evaluate call sites with purely constant arguments and replace the call 29 /// with the result. 30 /// @note This does not impact IR functions which we leave to LLVM's CF during 31 /// IR optimization. 32 /// @note We used to bind IR methods to corresponding C bindings, however it can be 33 /// very easy to implement incorrectly, leading to discrepancies in the CF 34 /// results. Fundamentally, LLVM's support for CF IR is far superior and our 35 /// framework only supports some types of folding (see codegen/ConstantFolding.h) 36 bool mConstantFoldCBindings = true; 37 /// @brief When enabled, functions which have IR builder instruction definitions will 38 /// prioritise those over any registered external calls 39 bool mPrioritiseIR = true; 40 /// @brief When enabled, the function registry is only populated on a function visit. 41 /// At the end of code generation, only functions which have been instantiated 42 /// will exist in the function map. 43 bool mLazyFunctions = true; 44 }; 45 46 /// @brief Settings which control how a Compiler class object behaves 47 struct CompilerOptions 48 { 49 /// @brief Controls the llvm compiler optimization level 50 enum class OptLevel 51 { 52 NONE, // Do not run any optimization passes 53 O0, // Optimization level 0. Similar to clang -O0 54 O1, // Optimization level 1. Similar to clang -O1 55 O2, // Optimization level 2. Similar to clang -O2 56 Os, // Like -O2 with extra optimizations for size. Similar to clang -Os 57 Oz, // Like -Os but reduces code size further. Similar to clang -Oz 58 O3 // Optimization level 3. Similar to clang -O3 59 }; 60 61 OptLevel mOptLevel = OptLevel::O3; 62 63 /// @brief If this flag is true, the generated llvm module will be verified when compilation 64 /// occurs, resulting in an exception being thrown if it is not valid 65 bool mVerify = true; 66 /// @brief Options for the function registry 67 FunctionOptions mFunctionOptions = FunctionOptions(); 68 }; 69 70 } // namespace ax 71 } // namespace OPENVDB_VERSION_NAME 72 } // namespace openvdb 73 74 #endif // OPENVDB_AX_COMPILER_FUNCTION_REGISTRY_OPTIONS_HAS_BEEN_INCLUDED 75 76