Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright Contributors to the OpenVDB Project | ||
2 | // SPDX-License-Identifier: MPL-2.0 | ||
3 | |||
4 | /// @file codegen/FunctionTypes.h | ||
5 | /// | ||
6 | /// @authors Nick Avramoussis | ||
7 | /// | ||
8 | /// @brief Contains frameworks for creating custom AX functions which can | ||
9 | /// be registered within the FunctionRegistry and used during code | ||
10 | /// generation. The intended and safest way to build a function is to | ||
11 | /// use the FunctionBuilder struct with its addSignature methods. Note | ||
12 | /// that the derived Function classes provided can also be subclassed | ||
13 | /// for more granular control, however may be subject to more substantial | ||
14 | /// API changes. | ||
15 | /// | ||
16 | /// @details There are a variety of different ways to build a function | ||
17 | /// which are tailored towards different function types. The two currently | ||
18 | /// supported function implementations are C Bindings and IR generation. | ||
19 | /// Additionally, depending on the return type of the function, you may | ||
20 | /// need to declare your function an SRET (structural return) function. | ||
21 | /// | ||
22 | /// C Bindings: | ||
23 | /// As the name suggests, the CFunction class infrastructure provides | ||
24 | /// the quickest and easiest way to bind to methods in your host | ||
25 | /// application. The most important thing to consider when choosing | ||
26 | /// this approach is performance. LLVM will have no knowledge of the | ||
27 | /// function body during optimization passes. Depending on the | ||
28 | /// implementation of your method and the user's usage from AX, C | ||
29 | /// bindings may be subject to limited optimizations in comparison to | ||
30 | /// IR functions. For example, a static function which is called from | ||
31 | /// within a loop cannot be unrolled. See the CFunction templated | ||
32 | /// class. | ||
33 | /// | ||
34 | /// IR Functions: | ||
35 | /// IR Functions expect implementations to generate the body of the | ||
36 | /// function directly into IR during code generation. This ensures | ||
37 | /// optimal performance during optimization passes however can be | ||
38 | /// trickier to design. Note that, in the future, AX functions will | ||
39 | /// be internally supported to provide a better solution for | ||
40 | /// IR generated functions. See the IRFunction templated class. | ||
41 | /// | ||
42 | /// SRET Functions: | ||
43 | /// Both C Bindings and IR Functions can be marked as SRET methods. | ||
44 | /// SRET methods, in AX, are any function which returns a value which | ||
45 | /// is not a scalar (e.g. vectors, matrices). This follows the same | ||
46 | /// optimization logic as clang which will rebuild function signatures | ||
47 | /// with their return type as the first argument if the return type is | ||
48 | /// greater than a given size. You should never attempt to return | ||
49 | /// alloca's directly from functions (unless malloced). | ||
50 | /// | ||
51 | /// Some other things to consider: | ||
52 | /// - Ensure C Binding dependencies have been correctly mapped. | ||
53 | /// - Avoid calling B.CreateAlloca inside of IR functions - instead | ||
54 | /// rely on the utility method insertStaticAlloca() where possible. | ||
55 | /// - Ensure both floating point and integer argument signatures are | ||
56 | /// provided if you wish to avoid floats truncating. | ||
57 | /// - Array arguments (vectors/matrices) are always passed by pointer. | ||
58 | /// Scalar arguments are always passed by copy. | ||
59 | /// - Ensure array arguments which will not be modified are marked as | ||
60 | /// readonly. Currently, only array arguments can be passed by | ||
61 | /// "reference". | ||
62 | /// - Ensure function bodies, return types and parameters and marked | ||
63 | /// with desirable llvm attributes. | ||
64 | /// | ||
65 | |||
66 | #ifndef OPENVDB_AX_CODEGEN_FUNCTION_TYPES_HAS_BEEN_INCLUDED | ||
67 | #define OPENVDB_AX_CODEGEN_FUNCTION_TYPES_HAS_BEEN_INCLUDED | ||
68 | |||
69 | #include "Types.h" | ||
70 | #include "Utils.h" // isValidCast | ||
71 | #include "ConstantFolding.h" | ||
72 | |||
73 | #include <openvdb/version.h> | ||
74 | |||
75 | #include <llvm/IR/Constants.h> | ||
76 | #include <llvm/IR/IRBuilder.h> | ||
77 | #include <llvm/IR/Module.h> | ||
78 | |||
79 | #include <algorithm> | ||
80 | #include <functional> | ||
81 | #include <memory> | ||
82 | #include <stack> | ||
83 | #include <type_traits> | ||
84 | #include <unordered_map> | ||
85 | #include <vector> | ||
86 | |||
87 | namespace openvdb { | ||
88 | OPENVDB_USE_VERSION_NAMESPACE | ||
89 | namespace OPENVDB_VERSION_NAME { | ||
90 | |||
91 | namespace ax { | ||
92 | namespace codegen { | ||
93 | |||
94 | //////////////////////////////////////////////////////////////////////////////// | ||
95 | //////////////////////////////////////////////////////////////////////////////// | ||
96 | |||
97 | /// @brief Object to array conversion methods to allow functions to return | ||
98 | /// vector types. These containers provided an interface for automatic | ||
99 | /// conversion of C++ objects to LLVM types as array types. | ||
100 | |||
101 | template <typename T, size_t _SIZE = 1> | ||
102 | struct ArgType { | ||
103 | using Type = T; | ||
104 | static const size_t SIZE = _SIZE; | ||
105 | using ArrayType = Type[SIZE]; | ||
106 | ArrayType mData; | ||
107 | }; | ||
108 | |||
109 | template <typename T, size_t S> | ||
110 | struct LLVMType<ArgType<T,S>> : public AliasTypeMap<ArgType<T,S>, T[S]> {}; | ||
111 | |||
112 | using V2D = ArgType<double, 2>; | ||
113 | using V2F = ArgType<float, 2>; | ||
114 | using V2I = ArgType<int32_t, 2>; | ||
115 | using V3D = ArgType<double, 3>; | ||
116 | using V3F = ArgType<float, 3>; | ||
117 | using V3I = ArgType<int32_t, 3>; | ||
118 | using V4D = ArgType<double, 4>; | ||
119 | using V4F = ArgType<float, 4>; | ||
120 | using V4I = ArgType<int32_t, 4>; | ||
121 | using M3D = ArgType<double, 9>; | ||
122 | using M3F = ArgType<float, 9>; | ||
123 | using M4D = ArgType<double, 16>; | ||
124 | using M4F = ArgType<float, 16>; | ||
125 | |||
126 | //////////////////////////////////////////////////////////////////////////////// | ||
127 | |||
128 | /// @brief Type to symbol conversions - these characters are used to build each | ||
129 | /// functions unique signature. They differ from standard AX or LLVM | ||
130 | /// syntax to be as short as possible i.e. vec4d, [4 x double] = d4 | ||
131 | |||
132 |
14/28✓ Branch 1 taken 89 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 104 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 80 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 78 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 78 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 78 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 78 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 78 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 78 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 13 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 13 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 91 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 65 times.
✗ Branch 41 not taken.
|
1001 | template <typename T> struct TypeToSymbol { static inline std::string s() { return "?"; } }; |
133 |
83/166✓ Branch 1 taken 1074 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1120 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2047 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2275 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2357 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1475 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1475 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1475 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1474 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1474 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1474 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1474 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1474 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1474 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1474 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1474 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1500 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1500 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1522 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1522 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1518 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 1518 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1472 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 1472 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1471 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 1471 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 1471 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 1471 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 1471 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 1471 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 1479 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 1479 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 1471 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 1471 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 1471 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 1445 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 1487 times.
✗ Branch 110 not taken.
✓ Branch 112 taken 1487 times.
✗ Branch 113 not taken.
✓ Branch 115 taken 1492 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 1492 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 801 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 809 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 771 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 764 times.
✗ Branch 131 not taken.
✓ Branch 133 taken 764 times.
✗ Branch 134 not taken.
✓ Branch 136 taken 747 times.
✗ Branch 137 not taken.
✓ Branch 139 taken 734 times.
✗ Branch 140 not taken.
✓ Branch 142 taken 734 times.
✗ Branch 143 not taken.
✓ Branch 145 taken 724 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 724 times.
✗ Branch 149 not taken.
✓ Branch 151 taken 724 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 724 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 724 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 724 times.
✗ Branch 161 not taken.
✓ Branch 163 taken 724 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 724 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 724 times.
✗ Branch 170 not taken.
✓ Branch 172 taken 724 times.
✗ Branch 173 not taken.
✓ Branch 175 taken 724 times.
✗ Branch 176 not taken.
✓ Branch 178 taken 721 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 724 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 724 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 722 times.
✗ Branch 188 not taken.
✓ Branch 190 taken 722 times.
✗ Branch 191 not taken.
✓ Branch 193 taken 732 times.
✗ Branch 194 not taken.
✓ Branch 196 taken 732 times.
✗ Branch 197 not taken.
✓ Branch 199 taken 771 times.
✗ Branch 200 not taken.
✓ Branch 202 taken 772 times.
✗ Branch 203 not taken.
✓ Branch 205 taken 719 times.
✗ Branch 206 not taken.
✓ Branch 208 taken 719 times.
✗ Branch 209 not taken.
✓ Branch 211 taken 719 times.
✗ Branch 212 not taken.
✓ Branch 214 taken 719 times.
✗ Branch 215 not taken.
✓ Branch 217 taken 719 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 719 times.
✗ Branch 221 not taken.
✓ Branch 223 taken 719 times.
✗ Branch 224 not taken.
✓ Branch 226 taken 719 times.
✗ Branch 227 not taken.
✓ Branch 229 taken 719 times.
✗ Branch 230 not taken.
✓ Branch 232 taken 719 times.
✗ Branch 233 not taken.
✓ Branch 235 taken 719 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 719 times.
✗ Branch 239 not taken.
✓ Branch 241 taken 719 times.
✗ Branch 242 not taken.
✓ Branch 244 taken 719 times.
✗ Branch 245 not taken.
✓ Branch 247 taken 7 times.
✗ Branch 248 not taken.
|
91495 | template <> struct TypeToSymbol<void> { static inline std::string s() { return "v"; } }; |
134 | 598 | template <> struct TypeToSymbol<char> { static inline std::string s() { return "c"; } }; | |
135 |
1/2✓ Branch 1 taken 230 times.
✗ Branch 2 not taken.
|
230 | template <> struct TypeToSymbol<uint8_t> { static inline std::string s() { return "u8"; } }; |
136 |
1/2✓ Branch 1 taken 230 times.
✗ Branch 2 not taken.
|
230 | template <> struct TypeToSymbol<uint16_t> { static inline std::string s() { return "us"; } }; |
137 | ✗ | template <> struct TypeToSymbol<uint32_t> { static inline std::string s() { return "ui"; } }; | |
138 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
58248 | template <> struct TypeToSymbol<uint64_t> { static inline std::string s() { return "ul"; } }; |
139 | template <> struct TypeToSymbol<int8_t> { static inline std::string s() { return "8"; } }; | ||
140 |
3/6✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
|
8670 | template <> struct TypeToSymbol<int16_t> { static inline std::string s() { return "s"; } }; |
141 |
14/28✓ Branch 1 taken 4797 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 62668 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4685 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 185 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 230 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 226 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 226 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 26 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 13 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 765 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 39 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 13 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 13 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 13 times.
✗ Branch 41 not taken.
|
73899 | template <> struct TypeToSymbol<int32_t> { static inline std::string s() { return "i"; } }; |
142 |
4/8✓ Branch 1 taken 170 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 765 times.
✗ Branch 11 not taken.
|
11402 | template <> struct TypeToSymbol<int64_t> { static inline std::string s() { return "l"; } }; |
143 |
16/32✓ Branch 1 taken 8570 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9596 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5487 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1452 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 728 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 52 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 52 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 196 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 348 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 348 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 348 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 26 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 14 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 804 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 13 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1975 times.
✗ Branch 47 not taken.
|
30009 | template <> struct TypeToSymbol<float> { static inline std::string s() { return "f"; } }; |
144 |
26/52✓ Branch 1 taken 4947 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5118 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5058 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5460 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4761 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 52 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 52 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 122 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 122 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 122 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 348 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 348 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 348 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 26 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 26 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 13 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 13 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 209 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 817 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 13 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 14 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 27 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 13 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 13 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 13 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 2015 times.
✗ Branch 77 not taken.
|
30070 | template <> struct TypeToSymbol<double> { static inline std::string s() { return "d"; } }; |
145 | 12968 | template <> struct TypeToSymbol<codegen::String> { static inline std::string s() { return "a"; } }; | |
146 | |||
147 | template <typename T> | ||
148 | struct TypeToSymbol<T*> { | ||
149 |
1/2✓ Branch 2 taken 280625 times.
✗ Branch 3 not taken.
|
1122500 | static inline std::string s() { return TypeToSymbol<T>::s() + "*"; } |
150 | }; | ||
151 | |||
152 | template <typename T, size_t S> | ||
153 | struct TypeToSymbol<T[S]> { | ||
154 |
1/2✓ Branch 2 taken 123799 times.
✗ Branch 3 not taken.
|
742794 | static inline std::string s() { return TypeToSymbol<T>::s() + std::to_string(S); } |
155 | }; | ||
156 | |||
157 | template <typename T, size_t S> struct TypeToSymbol<ArgType<T,S>> : public TypeToSymbol<T[S]> {}; | ||
158 | template <typename T> struct TypeToSymbol<math::Vec2<T>> : public TypeToSymbol<T[2]> {}; | ||
159 | template <typename T> struct TypeToSymbol<math::Vec3<T>> : public TypeToSymbol<T[3]> {}; | ||
160 | template <typename T> struct TypeToSymbol<math::Vec4<T>> : public TypeToSymbol<T[4]> {}; | ||
161 | template <typename T> struct TypeToSymbol<math::Mat3<T>> : public TypeToSymbol<T[9]> {}; | ||
162 | template <typename T> struct TypeToSymbol<math::Mat4<T>> : public TypeToSymbol<T[16]> {}; | ||
163 | template <typename T> struct TypeToSymbol<const T> : public TypeToSymbol<T> {}; | ||
164 | template <typename T> struct TypeToSymbol<const T*> : public TypeToSymbol<T*> {}; | ||
165 | |||
166 | //////////////////////////////////////////////////////////////////////////////// | ||
167 | //////////////////////////////////////////////////////////////////////////////// | ||
168 | |||
169 | /// @brief Templated argument iterator which implements various small functions | ||
170 | /// per argument type, resolved at compile time. | ||
171 | /// | ||
172 | template <typename SignatureT, size_t I = FunctionTraits<SignatureT>::N_ARGS> | ||
173 | struct ArgumentIterator | ||
174 | { | ||
175 | using ArgT = typename FunctionTraits<SignatureT>::template Arg<I-1>; | ||
176 | using ArgumentValueType = typename ArgT::Type; | ||
177 | |||
178 | template <typename OpT> | ||
179 | 3740476 | static void apply(const OpT& op, const bool forwards) { | |
180 |
1/2✓ Branch 0 taken 1870238 times.
✗ Branch 1 not taken.
|
3740476 | if (forwards) { |
181 | 2837436 | ArgumentIterator<SignatureT, I-1>::apply(op, forwards); | |
182 | 3766537 | op(ArgumentValueType()); | |
183 | } | ||
184 | else { | ||
185 | ✗ | op(ArgumentValueType()); | |
186 | ✗ | ArgumentIterator<SignatureT, I-1>::apply(op, forwards); | |
187 | } | ||
188 | 3740476 | } | |
189 | }; | ||
190 | |||
191 | template <typename SignatureT> | ||
192 | struct ArgumentIterator<SignatureT, 0> | ||
193 | { | ||
194 | template <typename OpT> | ||
195 | ✗ | static void apply(const OpT&, const bool) {} | |
196 | }; | ||
197 | |||
198 | //////////////////////////////////////////////////////////////////////////////// | ||
199 | //////////////////////////////////////////////////////////////////////////////// | ||
200 | |||
201 | /// @brief Populate a vector of llvm types from a function signature declaration. | ||
202 | /// | ||
203 | /// @param C The llvm context | ||
204 | /// @param types A vector of types to populate | ||
205 | /// | ||
206 | template <typename SignatureT> | ||
207 | inline llvm::Type* | ||
208 | 746809 | llvmTypesFromSignature(llvm::LLVMContext& C, | |
209 | std::vector<llvm::Type*>* types = nullptr) | ||
210 | { | ||
211 | using Traits = FunctionTraits<SignatureT>; | ||
212 | using ArgumentIteratorT = | ||
213 | ArgumentIterator<SignatureT, Traits::N_ARGS>; | ||
214 | |||
215 |
1/2✓ Branch 0 taken 373545 times.
✗ Branch 1 not taken.
|
746809 | if (types) { |
216 |
3/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
746845 | types->reserve(Traits::N_ARGS); |
217 | 3787463 | auto callback = [&types, &C](auto type) { | |
218 | using Type = decltype(type); | ||
219 | 1942013 | types->emplace_back(LLVMType<Type>::get(C)); | |
220 | }; | ||
221 | 713150 | ArgumentIteratorT::apply(callback, /*forwards*/true); | |
222 | } | ||
223 | 746812 | return LLVMType<typename Traits::ReturnType>::get(C); | |
224 | } | ||
225 | |||
226 | /// @brief Generate an LLVM FunctionType from a function signature | ||
227 | /// | ||
228 | /// @param C The llvm context | ||
229 | /// | ||
230 | template <typename SignatureT> | ||
231 | inline llvm::FunctionType* | ||
232 |
1/2✓ Branch 1 taken 1818 times.
✗ Branch 2 not taken.
|
1820 | llvmFunctionTypeFromSignature(llvm::LLVMContext& C) |
233 | { | ||
234 | std::vector<llvm::Type*> types; | ||
235 | llvm::Type* returnType = | ||
236 |
1/2✓ Branch 1 taken 1817 times.
✗ Branch 2 not taken.
|
1818 | llvmTypesFromSignature<SignatureT>(C, &types); |
237 |
3/6✓ Branch 1 taken 1818 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1817 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
|
1820 | return llvm::FunctionType::get(/*Result=*/returnType, |
238 | /*Params=*/llvm::ArrayRef<llvm::Type*>(types), | ||
239 | 1820 | /*isVarArg=*/false); | |
240 | } | ||
241 | |||
242 | /// @brief Print a function signature to the provided ostream. | ||
243 | /// | ||
244 | /// @param os The stream to print to | ||
245 | /// @param types The function argument types | ||
246 | /// @param returnType The return type of the function. Must not be a nullptr | ||
247 | /// @param name The name of the function. If not provided, the return type | ||
248 | /// neighbours the first parenthesis | ||
249 | /// @param names Names of the function parameters. If a name is nullptr, it | ||
250 | /// skipped | ||
251 | /// @param axTypes Whether to try and convert the llvm::Types provided to | ||
252 | /// AX types. If false, the llvm types are used. | ||
253 | OPENVDB_AX_API void | ||
254 | printSignature(std::ostream& os, | ||
255 | const std::vector<llvm::Type*>& types, | ||
256 | const llvm::Type* returnType, | ||
257 | const char* name = nullptr, | ||
258 | const std::vector<const char*>& names = {}, | ||
259 | const bool axTypes = false); | ||
260 | |||
261 | //////////////////////////////////////////////////////////////////////////////// | ||
262 | //////////////////////////////////////////////////////////////////////////////// | ||
263 | |||
264 | /// @brief The base/abstract representation of an AX function. Derived classes | ||
265 | /// must implement the Function::types call to describe their signature. | ||
266 | struct OPENVDB_AX_API Function | ||
267 | { | ||
268 | using Ptr = std::shared_ptr<Function>; | ||
269 | |||
270 | 108308 | Function(const size_t size, const std::string& symbol) | |
271 | 108308 | : mSize(size) | |
272 | , mSymbol(symbol) | ||
273 | , mAttributes(nullptr) | ||
274 | , mNames() | ||
275 | 108308 | , mDeps() { | |
276 | // symbol must be a valid string | ||
277 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 108308 times.
|
108308 | assert(!symbol.empty()); |
278 | 108308 | } | |
279 | |||
280 |
2/2✓ Branch 0 taken 3300 times.
✓ Branch 1 taken 105008 times.
|
433232 | virtual ~Function() = default; |
281 | |||
282 | /// @brief Populate a vector of llvm::Types which describe this function | ||
283 | /// signature. This method is used by Function::create, | ||
284 | /// Function::print and Function::match. | ||
285 | virtual llvm::Type* types(std::vector<llvm::Type*>&, llvm::LLVMContext&) const = 0; | ||
286 | |||
287 | /// @brief Converts and creates this AX function into a llvm Function. | ||
288 | /// @details This method uses the result from Function::types() to construct | ||
289 | /// a llvm::FunctionType and a subsequent a llvm::Function. Any | ||
290 | /// parameter, return or function attributes are also added to the | ||
291 | /// function. If a module is provided, the module if first checked | ||
292 | /// to see if the function already exists. If it does, it is | ||
293 | /// immediately returned. If the function doesn't exist in the | ||
294 | /// module, its prototype is created and also inserted into the end | ||
295 | /// of the modules function list. If no module is provided, the | ||
296 | /// function is left detached and must be added to a valid Module | ||
297 | /// to be callable. | ||
298 | /// @warning If a module is not provided, the caller takes ownership of the | ||
299 | /// returned function and is responsible for deallocating it. | ||
300 | /// @note The body of the function is left to derived classes to | ||
301 | /// implement. As you need a Module to generate the prototype/body, | ||
302 | /// this function serves two purposes. The first is to return the | ||
303 | /// detached function signature if only a context is provided. | ||
304 | /// The second is to ensure the function prototype and body (if | ||
305 | /// required) is inserted into the module prior to returning. | ||
306 | /// @note It is possible to end up with function symbol collisions if you | ||
307 | /// do not have unique function symbols in your module | ||
308 | /// | ||
309 | /// @param C The LLVM Context | ||
310 | /// @param M The Module to write the function to | ||
311 | virtual llvm::Function* | ||
312 | create(llvm::LLVMContext& C, llvm::Module* M = nullptr) const; | ||
313 | |||
314 | /// @brief Convenience method which always uses the provided module to find | ||
315 | /// the function or insert it if necessary. | ||
316 | /// @param M The llvm::Module to use | ||
317 | llvm::Function* create(llvm::Module& M) const { | ||
318 |
29/56✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 5 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 6 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 5 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 9 times.
✓ Branch 26 taken 1 times.
✓ Branch 28 taken 10 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 1 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 1 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 1 times.
✗ Branch 83 not taken.
|
80 | return this->create(M.getContext(), &M); |
319 | } | ||
320 | |||
321 | /// @brief Convenience method for calling M.getFunction(symbol). Returns a | ||
322 | /// nullptr if the function has not yet been created or if it is | ||
323 | /// embedded IR. | ||
324 | /// @param M The llvm::Module to use | ||
325 | llvm::Function* get(const llvm::Module& M) const; | ||
326 | |||
327 | /// @brief Uses the IRBuilder to create a call to this function with the | ||
328 | /// given arguments, creating the function and inserting it into the | ||
329 | /// IRBuilder's Module if necessary (through Function::create). | ||
330 | /// Returns the result of the function call which can be a nullptr | ||
331 | /// if the function is a non-sret void call. | ||
332 | /// @note The IRBuilder must have a valid llvm Module/Function/Block | ||
333 | /// attached | ||
334 | /// @note If the number of provided arguments do not match the size of the | ||
335 | /// current function, invalid IR will be generated. | ||
336 | /// @note If the provided argument types do not match the current function | ||
337 | /// and cast is false, invalid IR will be generated. Additionally, | ||
338 | /// invalid IR will be generated if cast is true but no valid cast | ||
339 | /// exists for a given argument. | ||
340 | /// @note When casting arguments, the readonly flags of the function are | ||
341 | /// not checked (unlike Function::match). Casting an argument will | ||
342 | /// cause a new copy of the argument to be created and passed to the | ||
343 | /// function. These new values do not propagate back any changes to | ||
344 | /// the original argument. Separate functions for all writable | ||
345 | /// argument types must be created. | ||
346 | /// | ||
347 | /// @param args The llvm Value arguments to call this function with | ||
348 | /// @param B The llvm IRBuilder | ||
349 | /// @param cast Whether to allow implicit casting of arguments | ||
350 | virtual llvm::Value* | ||
351 | call(const std::vector<llvm::Value*>& args, | ||
352 | llvm::IRBuilder<>& B, | ||
353 | const bool cast = false) const; | ||
354 | |||
355 | /// @brief The result type from calls to Function::match | ||
356 | enum SignatureMatch { None = 0, Size, Implicit, Explicit }; | ||
357 | |||
358 | /// @brief The base implementation for determining how a vector of llvm | ||
359 | /// arguments translates to this functions signature. Returns an | ||
360 | /// enum which represents the available mapping. | ||
361 | /// @details This method calls types() to figure out the function signature, | ||
362 | /// then compares each argument type to the type in the input | ||
363 | /// vector. If the types match exactly, an Explicit match is found. | ||
364 | /// If the sizes of the inputs and signature differ, no match is | ||
365 | /// found and None is returned. If however, the sizes match and | ||
366 | /// there exists a valid implicit cast from the input type to the | ||
367 | /// signature type for every input, an Implicit match is returned. | ||
368 | /// Finally, if the sizes match but there is no implicit cast | ||
369 | /// mapping, Size is returned. | ||
370 | /// i8 -> i32 : Implicit | ||
371 | /// i32 -> i32 : Explicit | ||
372 | /// str -> i32 : Size | ||
373 | /// (i32,i32) -> i32 : None | ||
374 | /// @note Due to the way CFunctionSRet is implemented, the LLVM Context | ||
375 | /// must be provided in case we have a zero arg function signature | ||
376 | /// with a SRET. | ||
377 | /// @param inputs The input types | ||
378 | /// @param C The LLVM Context | ||
379 | virtual SignatureMatch match(const std::vector<llvm::Type*>& inputs, llvm::LLVMContext& C) const; | ||
380 | |||
381 | /// @brief The number of arguments that this function has | ||
382 |
19/27✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8464 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 243012 times.
✓ Branch 4 taken 15084 times.
✓ Branch 5 taken 27538 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 48171 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✓ Branch 10 taken 1 times.
✓ Branch 11 taken 22 times.
✓ Branch 12 taken 4 times.
✓ Branch 13 taken 293566 times.
✓ Branch 14 taken 105366 times.
✓ Branch 16 taken 18743 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
|
759997 | inline size_t size() const { return mSize; } |
383 | |||
384 | /// @brief The function symbol name. | ||
385 | /// @details This will be used as its identifier in IR and must be unique. | ||
386 | inline const char* symbol() const { return mSymbol.c_str(); } | ||
387 | |||
388 | /// @brief Returns the descriptive name of the given argument index | ||
389 | /// @details If the index is greater than the number of arguments, an empty | ||
390 | /// string is returned. | ||
391 | /// | ||
392 | /// @param idx The index of the argument | ||
393 | inline const char* argName(const size_t idx) const { | ||
394 |
10/168✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
✓ Branch 2 taken 20123 times.
✓ Branch 3 taken 687 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
|
20839 | return idx < mNames.size() ? mNames[idx] : ""; |
395 | } | ||
396 | |||
397 | /// @brief Print this function's signature to the provided ostream. | ||
398 | /// @details This is intended to return a descriptive front end user string | ||
399 | /// rather than the function's IR representation. This function is | ||
400 | /// virtual so that derived classes can customize how they present | ||
401 | /// frontend information. | ||
402 | /// @sa printSignature | ||
403 | /// | ||
404 | /// @param C The llvm context | ||
405 | /// @param os The ostream to print to | ||
406 | /// @param name The name to insert into the description. | ||
407 | /// @param axTypes Whether to print llvm IR or AX Types. | ||
408 | virtual void print(llvm::LLVMContext& C, | ||
409 | std::ostream& os, | ||
410 | const char* name = nullptr, | ||
411 | const bool axTypes = true) const; | ||
412 | |||
413 | /// Builder methods | ||
414 | |||
415 |
2/2✓ Branch 0 taken 188402 times.
✓ Branch 1 taken 13416 times.
|
201818 | inline bool hasParamAttribute(const size_t i, |
416 | const llvm::Attribute::AttrKind& kind) const | ||
417 | { | ||
418 |
2/2✓ Branch 0 taken 188402 times.
✓ Branch 1 taken 13416 times.
|
201818 | if (!mAttributes) return false; |
419 |
2/2✓ Branch 0 taken 62223 times.
✓ Branch 1 taken 126179 times.
|
188402 | const auto iter = mAttributes->mParamAttrs.find(i); |
420 |
2/2✓ Branch 0 taken 62223 times.
✓ Branch 1 taken 126179 times.
|
188402 | if (iter == mAttributes->mParamAttrs.end()) return false; |
421 | const auto& vec = iter->second; | ||
422 | 62223 | return std::find(vec.begin(), vec.end(), kind) != vec.end(); | |
423 | } | ||
424 | |||
425 |
2/4✓ Branch 1 taken 7412 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8173 times.
✗ Branch 5 not taken.
|
15585 | inline void setArgumentNames(std::vector<const char*> names) { mNames = names; } |
426 | |||
427 | const std::vector<const char*>& dependencies() const { return mDeps; } | ||
428 |
2/4✓ Branch 1 taken 95391 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12815 times.
✗ Branch 5 not taken.
|
108206 | inline void setDependencies(std::vector<const char*> deps) { mDeps = deps; } |
429 | |||
430 | inline void setFnAttributes(const std::vector<llvm::Attribute::AttrKind>& in) | ||
431 | { | ||
432 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
104105 | this->attrs().mFnAttrs = in; |
433 | 104105 | } | |
434 | inline void setRetAttributes(const std::vector<llvm::Attribute::AttrKind>& in) | ||
435 | { | ||
436 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | this->attrs().mRetAttrs = in; |
437 | 1 | } | |
438 | 270570 | inline void setParamAttributes(const size_t i, | |
439 | const std::vector<llvm::Attribute::AttrKind>& in) | ||
440 | { | ||
441 | 270570 | this->attrs().mParamAttrs[i] = in; | |
442 | 270570 | } | |
443 | |||
444 | protected: | ||
445 | |||
446 | /// @brief Cast the provided arguments to the given type as supported by | ||
447 | /// implicit casting of function types. If the types already match | ||
448 | /// OR if a cast cannot be performed, nothing is done to the argument. | ||
449 | /// @todo This should really be generalized out for Function::call and | ||
450 | /// Function::match to both use. However, due to SRET functions, | ||
451 | /// this logic must be performed somewhere in the Function class | ||
452 | /// hierarchy and not in FunctionGroup | ||
453 | static void cast(std::vector<llvm::Value*>& args, | ||
454 | const std::vector<llvm::Type*>& types, | ||
455 | llvm::IRBuilder<>& B); | ||
456 | |||
457 | private: | ||
458 | |||
459 | struct Attributes { | ||
460 | std::vector<llvm::Attribute::AttrKind> mFnAttrs, mRetAttrs; | ||
461 | std::map<size_t, std::vector<llvm::Attribute::AttrKind>> mParamAttrs; | ||
462 | }; | ||
463 | |||
464 |
2/2✓ Branch 0 taken 105073 times.
✓ Branch 1 taken 269603 times.
|
374676 | inline Attributes& attrs() { |
465 |
2/2✓ Branch 0 taken 105073 times.
✓ Branch 1 taken 269603 times.
|
374676 | if (!mAttributes) mAttributes.reset(new Attributes()); |
466 | 374676 | return *mAttributes; | |
467 | } | ||
468 | |||
469 | llvm::AttributeList flattenAttrs(llvm::LLVMContext& C) const; | ||
470 | |||
471 | const size_t mSize; | ||
472 | const std::string mSymbol; | ||
473 | std::unique_ptr<Attributes> mAttributes; | ||
474 | std::vector<const char*> mNames; | ||
475 | std::vector<const char*> mDeps; | ||
476 | }; | ||
477 | |||
478 | /// @brief Templated interface class for SRET functions. This struct provides | ||
479 | /// the interface for functions that wish to return arrays (vectors or | ||
480 | /// matrices) by internally remapping the first argument for the user. | ||
481 | /// As far as LLVM and any bindings are concerned, the function | ||
482 | /// signature remains unchanged - however the first argument becomes | ||
483 | /// "invisible" to the user and is instead allocated by LLVM before the | ||
484 | /// function is executed. Importantly, the argument has no impact on | ||
485 | /// the user facing AX signature and doesn't affect declaration selection. | ||
486 | /// @note This class is not intended to be instantiated directly, but instead | ||
487 | /// used by derived implementation which hold a valid implementations | ||
488 | /// of member functions required to create a llvm::Function (such as | ||
489 | /// Function::types and Function::call). This exists as an interface to | ||
490 | /// avoid virtual inheritance. | ||
491 | /// | ||
492 | template <typename SignatureT, typename DerivedFunction> | ||
493 | struct SRetFunction : public DerivedFunction | ||
494 | { | ||
495 | using Ptr = std::shared_ptr<SRetFunction<SignatureT, DerivedFunction>>; | ||
496 | using Traits = FunctionTraits<SignatureT>; | ||
497 | |||
498 | // check there actually are arguments | ||
499 | static_assert(Traits::N_ARGS > 0, | ||
500 | "SRET Function object has been setup with the first argument as the return " | ||
501 | "value, however the provided signature is empty."); | ||
502 | |||
503 | // check no return value exists | ||
504 | static_assert(std::is_same<typename Traits::ReturnType, void>::value, | ||
505 | "SRET Function object has been setup with the first argument as the return " | ||
506 | "value and a non void return type."); | ||
507 | |||
508 | private: | ||
509 | |||
510 | using FirstArgument = typename Traits::template Arg<0>::Type; | ||
511 | static_assert(std::is_pointer<FirstArgument>::value, | ||
512 | "SRET Function object has been setup with the first argument as the return " | ||
513 | "value, but this argument it is not a pointer type."); | ||
514 | using SRetType = typename std::remove_pointer<FirstArgument>::type; | ||
515 | |||
516 | public: | ||
517 | |||
518 | /// @brief Override of match which inserts the SRET type such that the base | ||
519 | /// class methods ignore it. | ||
520 | 8946 | Function::SignatureMatch match(const std::vector<llvm::Type*>& args, | |
521 | llvm::LLVMContext& C) const override | ||
522 | { | ||
523 | // append return type and right rotate | ||
524 | 8946 | std::vector<llvm::Type*> inputs(args); | |
525 |
2/6✓ Branch 1 taken 4473 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2682 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
8946 | inputs.emplace_back(LLVMType<SRetType*>::get(C)); |
526 | 8946 | std::rotate(inputs.rbegin(), inputs.rbegin() + 1, inputs.rend()); | |
527 |
1/2✓ Branch 1 taken 4473 times.
✗ Branch 2 not taken.
|
17892 | return DerivedFunction::match(inputs, C); |
528 | } | ||
529 | |||
530 | /// @brief Override of call which allocates the required SRET llvm::Value | ||
531 | /// for this function. | ||
532 | /// @note Unlike other function where the returned llvm::Value* is a | ||
533 | /// llvm::CallInst (which also represents the return value), | ||
534 | /// SRET functions return the allocated 1st argument i.e. not a | ||
535 | /// llvm::CallInst | ||
536 | llvm::Value* | ||
537 | 3920 | call(const std::vector<llvm::Value*>& args, | |
538 | llvm::IRBuilder<>& B, | ||
539 | const bool cast) const override | ||
540 | { | ||
541 | // append return value and right rotate | ||
542 | 3920 | std::vector<llvm::Value*> inputs(args); | |
543 |
1/2✓ Branch 1 taken 848 times.
✗ Branch 2 not taken.
|
1696 | llvm::Type* sret = LLVMType<SRetType>::get(B.getContext()); |
544 |
2/6✓ Branch 1 taken 1960 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1960 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
3920 | inputs.emplace_back(insertStaticAlloca(B, sret)); |
545 | 3920 | std::rotate(inputs.rbegin(), inputs.rbegin() + 1, inputs.rend()); | |
546 |
1/2✓ Branch 1 taken 1960 times.
✗ Branch 2 not taken.
|
3920 | DerivedFunction::call(inputs, B, cast); |
547 |
1/2✓ Branch 0 taken 1960 times.
✗ Branch 1 not taken.
|
7840 | return inputs.front(); |
548 | } | ||
549 | |||
550 | /// @brief Override of print to avoid printing out the SRET type | ||
551 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
6 | void print(llvm::LLVMContext& C, |
552 | std::ostream& os, | ||
553 | const char* name = nullptr, | ||
554 | const bool axTypes = true) const override | ||
555 | { | ||
556 | std::vector<llvm::Type*> current; | ||
557 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
6 | llvm::Type* ret = this->types(current, C); |
558 | // left rotate | ||
559 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
6 | std::rotate(current.begin(), current.begin() + 1, current.end()); |
560 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
6 | ret = current.back(); |
561 | current.pop_back(); | ||
562 | |||
563 | std::vector<const char*> names; | ||
564 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
6 | names.reserve(this->size()); |
565 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
|
8 | for (size_t i = 0; i < this->size()-1; ++i) { |
566 |
1/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
2 | names.emplace_back(this->argName(i)); |
567 | } | ||
568 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
6 | printSignature(os, current, ret, name, names, axTypes); |
569 | 6 | } | |
570 | |||
571 | protected: | ||
572 | /// @brief Forward all arguments to the derived class | ||
573 | template <typename ...Args> | ||
574 | SRetFunction(Args&&... ts) : DerivedFunction(ts...) {} | ||
575 | }; | ||
576 | |||
577 | /// @brief The base class for all C bindings. | ||
578 | struct CFunctionBase : public Function | ||
579 | { | ||
580 | using Ptr = std::shared_ptr<CFunctionBase>; | ||
581 | |||
582 | 94364 | ~CFunctionBase() override = default; | |
583 | |||
584 | /// @brief Returns the global address of this function. | ||
585 | /// @note This is only required for C bindings. | ||
586 | virtual uint64_t address() const = 0; | ||
587 | |||
588 |
3/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
|
95394 | inline void setConstantFold(bool on) { mConstantFold = on; } |
589 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
28547 | inline bool hasConstantFold() const { return mConstantFold; } |
590 | |||
591 | ✗ | inline virtual llvm::Value* fold(const std::vector<llvm::Value*>&, | |
592 | llvm::LLVMContext&) const { | ||
593 | ✗ | return nullptr; | |
594 | } | ||
595 | |||
596 | protected: | ||
597 | CFunctionBase(const size_t size, | ||
598 | const std::string& symbol) | ||
599 | 95402 | : Function(size, symbol) | |
600 | 190804 | , mConstantFold(false) {} | |
601 | |||
602 | private: | ||
603 | bool mConstantFold; | ||
604 | }; | ||
605 | |||
606 | /// @brief Represents a concrete C function binding. | ||
607 | /// | ||
608 | /// @note This struct is templated on the signature to allow for evaluation of | ||
609 | /// the arguments to llvm types from any llvm context. | ||
610 | /// | ||
611 | template <typename SignatureT> | ||
612 | struct CFunction : public CFunctionBase | ||
613 | { | ||
614 | using CFunctionT = CFunction<SignatureT>; | ||
615 | using Ptr = std::shared_ptr<CFunctionT>; | ||
616 | using Traits = FunctionTraits<SignatureT>; | ||
617 | |||
618 | // Assert that the return argument is not a pointer (relaxed for void* for mallocs). | ||
619 | // Note that this is relaxed for IR functions where it's allowed if the function is | ||
620 | // forcefully inlined. | ||
621 | static_assert(std::is_same<typename Traits::ReturnType, void*>::value || | ||
622 | !std::is_pointer<typename Traits::ReturnType>::value, | ||
623 | "CFunction object has been setup with a pointer return argument. C bindings " | ||
624 | "cannot return memory locations to LLVM - Consider using a CFunctionSRet."); | ||
625 | |||
626 |
123/246✓ Branch 1 taken 876 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 782 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 858 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1634 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1575 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1902 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1734 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1461 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1461 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1461 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1461 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1461 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1460 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1460 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1460 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1460 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1473 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1473 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1484 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1484 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1480 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 1480 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1456 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 1458 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1458 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 1458 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 1458 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 1458 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 1458 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 1458 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 1471 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 1471 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 1471 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 1471 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 1484 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 1484 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 1484 times.
✗ Branch 110 not taken.
✓ Branch 112 taken 1484 times.
✗ Branch 113 not taken.
✓ Branch 115 taken 1484 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 1484 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 790 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 790 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 784 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 760 times.
✗ Branch 131 not taken.
✓ Branch 133 taken 806 times.
✗ Branch 134 not taken.
✓ Branch 136 taken 806 times.
✗ Branch 137 not taken.
✓ Branch 139 taken 1097 times.
✗ Branch 140 not taken.
✓ Branch 142 taken 1097 times.
✗ Branch 143 not taken.
✓ Branch 145 taken 819 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 738 times.
✗ Branch 149 not taken.
✓ Branch 151 taken 738 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 782 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 782 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 782 times.
✗ Branch 161 not taken.
✓ Branch 163 taken 834 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 895 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 895 times.
✗ Branch 170 not taken.
✓ Branch 172 taken 834 times.
✗ Branch 173 not taken.
✓ Branch 175 taken 895 times.
✗ Branch 176 not taken.
✓ Branch 178 taken 895 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 834 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 895 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 895 times.
✗ Branch 188 not taken.
✓ Branch 190 taken 732 times.
✗ Branch 191 not taken.
✓ Branch 193 taken 732 times.
✗ Branch 194 not taken.
✓ Branch 196 taken 732 times.
✗ Branch 197 not taken.
✓ Branch 199 taken 732 times.
✗ Branch 200 not taken.
✓ Branch 202 taken 732 times.
✗ Branch 203 not taken.
✓ Branch 205 taken 732 times.
✗ Branch 206 not taken.
✓ Branch 208 taken 732 times.
✗ Branch 209 not taken.
✓ Branch 211 taken 732 times.
✗ Branch 212 not taken.
✓ Branch 214 taken 732 times.
✗ Branch 215 not taken.
✓ Branch 217 taken 720 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 720 times.
✗ Branch 221 not taken.
✓ Branch 223 taken 761 times.
✗ Branch 224 not taken.
✓ Branch 226 taken 761 times.
✗ Branch 227 not taken.
✓ Branch 229 taken 749 times.
✗ Branch 230 not taken.
✓ Branch 232 taken 749 times.
✗ Branch 233 not taken.
✓ Branch 235 taken 749 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 749 times.
✗ Branch 239 not taken.
✓ Branch 241 taken 745 times.
✗ Branch 242 not taken.
✓ Branch 244 taken 732 times.
✗ Branch 245 not taken.
✓ Branch 247 taken 732 times.
✗ Branch 248 not taken.
✓ Branch 250 taken 33 times.
✗ Branch 251 not taken.
✓ Branch 253 taken 13 times.
✗ Branch 254 not taken.
✓ Branch 256 taken 13 times.
✗ Branch 257 not taken.
✓ Branch 259 taken 3 times.
✗ Branch 260 not taken.
✓ Branch 262 taken 3 times.
✗ Branch 263 not taken.
✓ Branch 265 taken 3 times.
✗ Branch 266 not taken.
✓ Branch 268 taken 3 times.
✗ Branch 269 not taken.
✓ Branch 271 taken 3 times.
✗ Branch 272 not taken.
✓ Branch 274 taken 3 times.
✗ Branch 275 not taken.
✓ Branch 277 taken 3 times.
✗ Branch 278 not taken.
✓ Branch 280 taken 3 times.
✗ Branch 281 not taken.
✓ Branch 283 taken 3 times.
✗ Branch 284 not taken.
✓ Branch 286 taken 3 times.
✗ Branch 287 not taken.
✓ Branch 289 taken 3 times.
✗ Branch 290 not taken.
✓ Branch 292 taken 3 times.
✗ Branch 293 not taken.
✓ Branch 295 taken 3 times.
✗ Branch 296 not taken.
✓ Branch 298 taken 3 times.
✗ Branch 299 not taken.
✓ Branch 301 taken 3 times.
✗ Branch 302 not taken.
✓ Branch 304 taken 3 times.
✗ Branch 305 not taken.
✓ Branch 307 taken 3 times.
✗ Branch 308 not taken.
✓ Branch 310 taken 3 times.
✗ Branch 311 not taken.
✓ Branch 313 taken 13 times.
✗ Branch 314 not taken.
✓ Branch 316 taken 13 times.
✗ Branch 317 not taken.
✓ Branch 319 taken 13 times.
✗ Branch 320 not taken.
✓ Branch 322 taken 402 times.
✗ Branch 323 not taken.
✓ Branch 325 taken 13 times.
✗ Branch 326 not taken.
✓ Branch 328 taken 13 times.
✗ Branch 329 not taken.
✓ Branch 331 taken 13 times.
✗ Branch 332 not taken.
✓ Branch 334 taken 111 times.
✗ Branch 335 not taken.
✓ Branch 337 taken 415 times.
✗ Branch 338 not taken.
✓ Branch 340 taken 13 times.
✗ Branch 341 not taken.
✓ Branch 343 taken 13 times.
✗ Branch 344 not taken.
✓ Branch 346 taken 52 times.
✗ Branch 347 not taken.
✓ Branch 349 taken 26 times.
✗ Branch 350 not taken.
✓ Branch 352 taken 13 times.
✗ Branch 353 not taken.
✓ Branch 355 taken 14 times.
✗ Branch 356 not taken.
✓ Branch 358 taken 27 times.
✗ Branch 359 not taken.
✓ Branch 361 taken 1028 times.
✗ Branch 362 not taken.
✓ Branch 364 taken 1068 times.
✗ Branch 365 not taken.
✓ Branch 367 taken 1 times.
✗ Branch 368 not taken.
|
95402 | CFunction(const std::string& symbol, SignatureT* function) |
627 | : CFunctionBase(Traits::N_ARGS, symbol) | ||
628 |
81/162✓ Branch 1 taken 870 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1528 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1914 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1746 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1473 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1473 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1486 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1486 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1486 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1486 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1486 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1486 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1486 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1486 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1486 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1486 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1532 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1532 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1823 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1823 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1541 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 1506 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1506 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 1506 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1558 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 1619 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 1619 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 1558 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 1619 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 1619 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 1558 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 1619 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 1619 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 1458 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 1458 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 1458 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 1458 times.
✗ Branch 110 not taken.
✓ Branch 112 taken 1458 times.
✗ Branch 113 not taken.
✓ Branch 115 taken 1458 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 1446 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 752 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 793 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 787 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 724 times.
✗ Branch 131 not taken.
✓ Branch 133 taken 724 times.
✗ Branch 134 not taken.
✓ Branch 136 taken 724 times.
✗ Branch 137 not taken.
✓ Branch 139 taken 724 times.
✗ Branch 140 not taken.
✓ Branch 142 taken 724 times.
✗ Branch 143 not taken.
✓ Branch 145 taken 724 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 724 times.
✗ Branch 149 not taken.
✓ Branch 151 taken 724 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 724 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 724 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 724 times.
✗ Branch 161 not taken.
✓ Branch 163 taken 724 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 724 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 724 times.
✗ Branch 170 not taken.
✓ Branch 172 taken 724 times.
✗ Branch 173 not taken.
✓ Branch 175 taken 724 times.
✗ Branch 176 not taken.
✓ Branch 178 taken 724 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 724 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 732 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 732 times.
✗ Branch 188 not taken.
✓ Branch 190 taken 732 times.
✗ Branch 191 not taken.
✓ Branch 193 taken 1121 times.
✗ Branch 194 not taken.
✓ Branch 196 taken 732 times.
✗ Branch 197 not taken.
✓ Branch 199 taken 830 times.
✗ Branch 200 not taken.
✓ Branch 202 taken 1134 times.
✗ Branch 203 not taken.
✓ Branch 205 taken 732 times.
✗ Branch 206 not taken.
✓ Branch 208 taken 732 times.
✗ Branch 209 not taken.
✓ Branch 211 taken 771 times.
✗ Branch 212 not taken.
✓ Branch 214 taken 745 times.
✗ Branch 215 not taken.
✓ Branch 217 taken 732 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 733 times.
✗ Branch 221 not taken.
✓ Branch 223 taken 746 times.
✗ Branch 224 not taken.
✓ Branch 226 taken 1747 times.
✗ Branch 227 not taken.
✓ Branch 229 taken 1787 times.
✗ Branch 230 not taken.
✓ Branch 232 taken 720 times.
✗ Branch 233 not taken.
✓ Branch 235 taken 719 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 719 times.
✗ Branch 239 not taken.
✓ Branch 241 taken 719 times.
✗ Branch 242 not taken.
|
94204 | , mFunction(function) {} |
629 | |||
630 |
2/4✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
|
188390 | ~CFunction() override = default; |
631 | |||
632 | 585024 | inline llvm::Type* types(std::vector<llvm::Type*>& types, llvm::LLVMContext& C) const override | |
633 | { | ||
634 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
585029 | return llvmTypesFromSignature<SignatureT>(C, &types); |
635 | } | ||
636 | |||
637 | 20432 | inline uint64_t address() const override final { | |
638 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
20438 | return reinterpret_cast<uint64_t>(mFunction); |
639 | } | ||
640 | |||
641 | llvm::Value* | ||
642 | 57608 | call(const std::vector<llvm::Value*>& args, | |
643 | llvm::IRBuilder<>& B, | ||
644 | const bool cast) const override | ||
645 | { | ||
646 | 57608 | llvm::Value* result = this->fold(args, B.getContext()); | |
647 |
2/2✓ Branch 0 taken 28364 times.
✓ Branch 1 taken 440 times.
|
57608 | if (result) return result; |
648 | 56728 | return Function::call(args, B, cast); | |
649 | } | ||
650 | |||
651 | 57618 | llvm::Value* fold(const std::vector<llvm::Value*>& args, llvm::LLVMContext& C) const override final | |
652 | { | ||
653 | auto allconst = | ||
654 | 1495 | [](const std::vector<llvm::Value*>& vals) -> bool { | |
655 |
86/246✓ Branch 0 taken 143 times.
✓ Branch 1 taken 74 times.
✓ Branch 2 taken 116 times.
✓ Branch 3 taken 88 times.
✓ Branch 4 taken 128 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 128 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 20 times.
✓ Branch 13 taken 12 times.
✓ Branch 14 taken 48 times.
✓ Branch 15 taken 8 times.
✓ Branch 16 taken 5 times.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 253 times.
✓ Branch 21 taken 149 times.
✓ Branch 22 taken 153 times.
✓ Branch 23 taken 49 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 4 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 4 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 120 times.
✓ Branch 31 taken 60 times.
✓ Branch 32 taken 52 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 52 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 16 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✓ Branch 74 taken 4 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 4 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 8 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 4 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 4 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 8 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 8 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 8 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 8 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 8 times.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✓ Branch 104 taken 4 times.
✓ Branch 105 taken 4 times.
✓ Branch 106 taken 12 times.
✓ Branch 107 taken 12 times.
✓ Branch 108 taken 4 times.
✗ Branch 109 not taken.
✓ Branch 110 taken 8 times.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✓ Branch 114 taken 4 times.
✗ Branch 115 not taken.
✓ Branch 116 taken 8 times.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✓ Branch 120 taken 8 times.
✗ Branch 121 not taken.
✓ Branch 122 taken 8 times.
✗ Branch 123 not taken.
✓ Branch 124 taken 4 times.
✗ Branch 125 not taken.
✓ Branch 126 taken 8 times.
✗ Branch 127 not taken.
✓ Branch 128 taken 8 times.
✗ Branch 129 not taken.
✓ Branch 130 taken 4 times.
✗ Branch 131 not taken.
✓ Branch 132 taken 8 times.
✗ Branch 133 not taken.
✓ Branch 134 taken 8 times.
✗ Branch 135 not taken.
✓ Branch 136 taken 4 times.
✗ Branch 137 not taken.
✓ Branch 138 taken 4 times.
✗ Branch 139 not taken.
✓ Branch 140 taken 4 times.
✗ Branch 141 not taken.
✓ Branch 142 taken 4 times.
✗ Branch 143 not taken.
✓ Branch 144 taken 4 times.
✗ Branch 145 not taken.
✓ Branch 146 taken 4 times.
✗ Branch 147 not taken.
✓ Branch 148 taken 16 times.
✓ Branch 149 taken 4 times.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✓ Branch 152 taken 112 times.
✓ Branch 153 taken 56 times.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✓ Branch 156 taken 4 times.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
✗ Branch 168 not taken.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
✗ Branch 174 not taken.
✗ Branch 175 not taken.
✗ Branch 176 not taken.
✗ Branch 177 not taken.
✓ Branch 178 taken 8 times.
✗ Branch 179 not taken.
✓ Branch 180 taken 8 times.
✗ Branch 181 not taken.
✓ Branch 182 taken 4 times.
✗ Branch 183 not taken.
✓ Branch 184 taken 4 times.
✗ Branch 185 not taken.
✓ Branch 186 taken 4 times.
✗ Branch 187 not taken.
✓ Branch 188 taken 4 times.
✗ Branch 189 not taken.
✓ Branch 190 taken 4 times.
✗ Branch 191 not taken.
✓ Branch 192 taken 4 times.
✗ Branch 193 not taken.
✓ Branch 194 taken 4 times.
✗ Branch 195 not taken.
✓ Branch 196 taken 4 times.
✗ Branch 197 not taken.
✓ Branch 198 taken 4 times.
✗ Branch 199 not taken.
✓ Branch 200 taken 4 times.
✗ Branch 201 not taken.
✗ Branch 202 not taken.
✗ Branch 203 not taken.
✗ Branch 204 not taken.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✓ Branch 210 taken 24 times.
✗ Branch 211 not taken.
✓ Branch 212 taken 24 times.
✗ Branch 213 not taken.
✓ Branch 214 taken 8 times.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 217 not taken.
✓ Branch 218 taken 16 times.
✗ Branch 219 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✓ Branch 222 taken 8 times.
✗ Branch 223 not taken.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✓ Branch 226 taken 8 times.
✗ Branch 227 not taken.
✗ Branch 228 not taken.
✗ Branch 229 not taken.
✓ Branch 230 taken 16 times.
✗ Branch 231 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✓ Branch 234 taken 8 times.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✓ Branch 238 taken 20 times.
✗ Branch 239 not taken.
✓ Branch 240 taken 20 times.
✗ Branch 241 not taken.
✓ Branch 242 taken 4 times.
✗ Branch 243 not taken.
✓ Branch 244 taken 4 times.
✗ Branch 245 not taken.
|
2293 | for (auto& value : vals) { |
656 |
81/246✓ Branch 0 taken 69 times.
✓ Branch 1 taken 74 times.
✓ Branch 2 taken 28 times.
✓ Branch 3 taken 88 times.
✓ Branch 4 taken 128 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 128 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 8 times.
✓ Branch 13 taken 12 times.
✓ Branch 14 taken 40 times.
✓ Branch 15 taken 8 times.
✓ Branch 16 taken 4 times.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 44 times.
✓ Branch 21 taken 209 times.
✓ Branch 22 taken 8 times.
✓ Branch 23 taken 145 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 4 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 4 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 120 times.
✓ Branch 32 taken 52 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 52 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 16 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✓ Branch 74 taken 4 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 4 times.
✗ Branch 77 not taken.
✓ Branch 78 taken 8 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 4 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 4 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 8 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 8 times.
✗ Branch 87 not taken.
✓ Branch 88 taken 8 times.
✗ Branch 89 not taken.
✓ Branch 90 taken 8 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 8 times.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✓ Branch 105 taken 4 times.
✗ Branch 106 not taken.
✓ Branch 107 taken 12 times.
✓ Branch 108 taken 4 times.
✗ Branch 109 not taken.
✓ Branch 110 taken 8 times.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✓ Branch 114 taken 4 times.
✗ Branch 115 not taken.
✓ Branch 116 taken 8 times.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✓ Branch 120 taken 8 times.
✗ Branch 121 not taken.
✓ Branch 122 taken 8 times.
✗ Branch 123 not taken.
✓ Branch 124 taken 4 times.
✗ Branch 125 not taken.
✓ Branch 126 taken 8 times.
✗ Branch 127 not taken.
✓ Branch 128 taken 8 times.
✗ Branch 129 not taken.
✓ Branch 130 taken 4 times.
✗ Branch 131 not taken.
✓ Branch 132 taken 8 times.
✗ Branch 133 not taken.
✓ Branch 134 taken 8 times.
✗ Branch 135 not taken.
✓ Branch 136 taken 4 times.
✗ Branch 137 not taken.
✓ Branch 138 taken 4 times.
✗ Branch 139 not taken.
✓ Branch 140 taken 4 times.
✗ Branch 141 not taken.
✓ Branch 142 taken 4 times.
✗ Branch 143 not taken.
✓ Branch 144 taken 4 times.
✗ Branch 145 not taken.
✓ Branch 146 taken 4 times.
✗ Branch 147 not taken.
✓ Branch 148 taken 4 times.
✓ Branch 149 taken 12 times.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 152 not taken.
✓ Branch 153 taken 112 times.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✓ Branch 156 taken 4 times.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
✗ Branch 168 not taken.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
✗ Branch 174 not taken.
✗ Branch 175 not taken.
✗ Branch 176 not taken.
✗ Branch 177 not taken.
✓ Branch 178 taken 8 times.
✗ Branch 179 not taken.
✓ Branch 180 taken 8 times.
✗ Branch 181 not taken.
✓ Branch 182 taken 4 times.
✗ Branch 183 not taken.
✓ Branch 184 taken 4 times.
✗ Branch 185 not taken.
✓ Branch 186 taken 4 times.
✗ Branch 187 not taken.
✓ Branch 188 taken 4 times.
✗ Branch 189 not taken.
✓ Branch 190 taken 4 times.
✗ Branch 191 not taken.
✓ Branch 192 taken 4 times.
✗ Branch 193 not taken.
✓ Branch 194 taken 4 times.
✗ Branch 195 not taken.
✓ Branch 196 taken 4 times.
✗ Branch 197 not taken.
✓ Branch 198 taken 4 times.
✗ Branch 199 not taken.
✓ Branch 200 taken 4 times.
✗ Branch 201 not taken.
✗ Branch 202 not taken.
✗ Branch 203 not taken.
✗ Branch 204 not taken.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✓ Branch 210 taken 24 times.
✗ Branch 211 not taken.
✓ Branch 212 taken 24 times.
✗ Branch 213 not taken.
✓ Branch 214 taken 8 times.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 217 not taken.
✓ Branch 218 taken 16 times.
✗ Branch 219 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✓ Branch 222 taken 8 times.
✗ Branch 223 not taken.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✓ Branch 226 taken 8 times.
✗ Branch 227 not taken.
✗ Branch 228 not taken.
✗ Branch 229 not taken.
✓ Branch 230 taken 16 times.
✗ Branch 231 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✓ Branch 234 taken 8 times.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✓ Branch 238 taken 20 times.
✗ Branch 239 not taken.
✓ Branch 240 taken 20 times.
✗ Branch 241 not taken.
✓ Branch 242 taken 4 times.
✗ Branch 243 not taken.
✓ Branch 244 taken 4 times.
✗ Branch 245 not taken.
|
1775 | if (!llvm::isa<llvm::Constant>(value)) return false; |
657 | } | ||
658 | 518 | return true; | |
659 | }; | ||
660 | |||
661 |
2/2✓ Branch 0 taken 1495 times.
✓ Branch 1 taken 27314 times.
|
57618 | if (!this->hasConstantFold()) return nullptr; |
662 |
2/2✓ Branch 1 taken 518 times.
✓ Branch 2 taken 977 times.
|
2990 | if (!allconst(args)) return nullptr; |
663 | std::vector<llvm::Constant*> constants; | ||
664 |
1/2✓ Branch 1 taken 518 times.
✗ Branch 2 not taken.
|
1036 | constants.reserve(args.size()); |
665 |
2/2✓ Branch 0 taken 798 times.
✓ Branch 1 taken 518 times.
|
2632 | for (auto& value : args) { |
666 |
1/4✓ Branch 2 taken 798 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
1596 | constants.emplace_back(llvm::cast<llvm::Constant>(value)); |
667 | } | ||
668 | |||
669 | // no guarantee that fold() will be able to cast all arguments | ||
670 |
1/2✓ Branch 1 taken 518 times.
✗ Branch 2 not taken.
|
1036 | return ConstantFolder<SignatureT>::fold(constants, *mFunction, C); |
671 | } | ||
672 | |||
673 | private: | ||
674 | SignatureT* mFunction; | ||
675 | }; | ||
676 | |||
677 | /// @brief The base/abstract definition for an IR function. | ||
678 | struct OPENVDB_AX_API IRFunctionBase : public Function | ||
679 | { | ||
680 | using Ptr = std::shared_ptr<IRFunctionBase>; | ||
681 | |||
682 | /// @brief The IR callback function which will write the LLVM IR for this | ||
683 | /// function's body. | ||
684 | /// @details The first argument is the vector of functional arguments. i.e. | ||
685 | /// a representation of the value that the callback has been invoked | ||
686 | /// with. | ||
687 | /// The last argument is the IR builder which should be used to | ||
688 | /// generate the function body IR. | ||
689 | /// @note You can return a nullptr from this method which will represent | ||
690 | /// a ret void, a ret void instruction, or an actual value | ||
691 | using GeneratorCb = std::function<llvm::Value* | ||
692 | (const std::vector<llvm::Value*>&, llvm::IRBuilder<>&)>; | ||
693 | |||
694 | /// @brief Enable or disable the embedding of IR. Embedded IR is currently | ||
695 | /// required for function which use parent function parameters. | ||
696 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
12815 | inline void setEmbedIR(bool on) { mEmbedIR = on; } |
697 |
4/4✓ Branch 0 taken 15363 times.
✓ Branch 1 taken 110 times.
✓ Branch 2 taken 19182 times.
✓ Branch 3 taken 2 times.
|
34657 | inline bool hasEmbedIR() const { return mEmbedIR; } |
698 | |||
699 | /// @brief Override for the creation of an IR function. This ensures that | ||
700 | /// the body and prototype of the function are generated if a Module | ||
701 | /// is provided. | ||
702 | /// @note A nullptr is returned if mEmbedIR is true and no action is | ||
703 | /// performed. | ||
704 | /// @note Throws if this function has been initialized with a nullptr | ||
705 | /// generator callback. In this case, the function prototype will | ||
706 | /// be created, but not the function body. | ||
707 | /// @note Throws if the return type of the generator callback does not | ||
708 | /// match the function prototype. In this case, both the prototype | ||
709 | /// and the function body will be created and inserted, but the IR | ||
710 | /// will be invalid. | ||
711 | llvm::Function* | ||
712 | create(llvm::LLVMContext& C, llvm::Module* M) const override; | ||
713 | |||
714 | /// @brief Override for call, which is only necessary if mEmbedIR is true, | ||
715 | /// as the IR generation for embedded functions is delayed until | ||
716 | /// the function is called. If mEmbedIR is false, this simply calls | ||
717 | /// Function::call | ||
718 | llvm::Value* | ||
719 | call(const std::vector<llvm::Value*>& args, | ||
720 | llvm::IRBuilder<>& B, | ||
721 | const bool cast) const override; | ||
722 | |||
723 | protected: | ||
724 | |||
725 | // @todo This should ideally live in FunctionGroup::execute, but the return | ||
726 | // type is allowed to differ for sret C bindings. | ||
727 | inline void | ||
728 | 8544 | verifyResultType(const llvm::Type* result, const llvm::Type* expected) const | |
729 | { | ||
730 |
2/2✓ Branch 0 taken 8543 times.
✓ Branch 1 taken 1 times.
|
8544 | if (result == expected) return; |
731 | std::string source, target; | ||
732 |
2/4✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | if (result) llvmTypeToString(result, source); |
733 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | llvmTypeToString(expected, target); |
734 |
7/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
|
7 | OPENVDB_THROW(AXCodeGenError, "Function \"" + std::string(this->symbol()) + |
735 | "\" has been invoked with a mismatching return type. Expected: \"" + | ||
736 | target + "\", got \"" + source + "\"."); | ||
737 | } | ||
738 | |||
739 | 12820 | IRFunctionBase(const std::string& symbol, | |
740 | const GeneratorCb& gen, | ||
741 | const size_t size) | ||
742 | 12820 | : Function(size, symbol) | |
743 | , mGen(gen) | ||
744 |
1/2✓ Branch 2 taken 12820 times.
✗ Branch 3 not taken.
|
12820 | , mEmbedIR(false) {} |
745 |
1/2✓ Branch 0 taken 12820 times.
✗ Branch 1 not taken.
|
51280 | ~IRFunctionBase() override = default; |
746 | |||
747 | const GeneratorCb mGen; | ||
748 | bool mEmbedIR; | ||
749 | }; | ||
750 | |||
751 | /// @brief Represents a concrete IR function. | ||
752 | template <typename SignatureT> | ||
753 | 1159 | struct IRFunction : public IRFunctionBase | |
754 | { | ||
755 | using Traits = FunctionTraits<SignatureT>; | ||
756 | using Ptr = std::shared_ptr<IRFunction>; | ||
757 | |||
758 | 12816 | IRFunction(const std::string& symbol, const GeneratorCb& gen) | |
759 |
153/306✓ Branch 1 taken 2641 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2641 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1868 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1891 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 319 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 378 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 364 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 691 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 461 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 20 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 37 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 37 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 15 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 15 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 15 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 15 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 27 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 27 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 27 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 27 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 38 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 38 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 38 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 38 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 14 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 14 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 14 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 14 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 14 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 14 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 14 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 14 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 27 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 27 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 27 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 27 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 27 times.
✗ Branch 110 not taken.
✓ Branch 112 taken 27 times.
✗ Branch 113 not taken.
✓ Branch 115 taken 27 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 27 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 40 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 40 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 40 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 40 times.
✗ Branch 131 not taken.
✓ Branch 133 taken 40 times.
✗ Branch 134 not taken.
✓ Branch 136 taken 40 times.
✗ Branch 137 not taken.
✓ Branch 139 taken 40 times.
✗ Branch 140 not taken.
✓ Branch 142 taken 40 times.
✗ Branch 143 not taken.
✓ Branch 145 taken 39 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 39 times.
✗ Branch 149 not taken.
✓ Branch 151 taken 39 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 39 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 39 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 39 times.
✗ Branch 161 not taken.
✓ Branch 163 taken 39 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 39 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 39 times.
✗ Branch 170 not taken.
✓ Branch 172 taken 39 times.
✗ Branch 173 not taken.
✓ Branch 175 taken 39 times.
✗ Branch 176 not taken.
✓ Branch 178 taken 39 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 39 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 39 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 85 times.
✗ Branch 188 not taken.
✓ Branch 190 taken 85 times.
✗ Branch 191 not taken.
✓ Branch 193 taken 85 times.
✗ Branch 194 not taken.
✓ Branch 196 taken 85 times.
✗ Branch 197 not taken.
✓ Branch 199 taken 98 times.
✗ Branch 200 not taken.
✓ Branch 202 taken 98 times.
✗ Branch 203 not taken.
✓ Branch 205 taken 98 times.
✗ Branch 206 not taken.
✓ Branch 208 taken 98 times.
✗ Branch 209 not taken.
✓ Branch 211 taken 17 times.
✗ Branch 212 not taken.
✓ Branch 214 taken 17 times.
✗ Branch 215 not taken.
✓ Branch 217 taken 17 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 17 times.
✗ Branch 221 not taken.
✓ Branch 223 taken 61 times.
✗ Branch 224 not taken.
✓ Branch 226 taken 61 times.
✗ Branch 227 not taken.
✓ Branch 229 taken 61 times.
✗ Branch 230 not taken.
✓ Branch 232 taken 61 times.
✗ Branch 233 not taken.
✓ Branch 235 taken 61 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 61 times.
✗ Branch 239 not taken.
✓ Branch 241 taken 113 times.
✗ Branch 242 not taken.
✓ Branch 244 taken 113 times.
✗ Branch 245 not taken.
✓ Branch 247 taken 174 times.
✗ Branch 248 not taken.
✓ Branch 250 taken 174 times.
✗ Branch 251 not taken.
✓ Branch 253 taken 174 times.
✗ Branch 254 not taken.
✓ Branch 256 taken 174 times.
✗ Branch 257 not taken.
✓ Branch 259 taken 113 times.
✗ Branch 260 not taken.
✓ Branch 262 taken 113 times.
✗ Branch 263 not taken.
✓ Branch 265 taken 174 times.
✗ Branch 266 not taken.
✓ Branch 268 taken 174 times.
✗ Branch 269 not taken.
✓ Branch 271 taken 174 times.
✗ Branch 272 not taken.
✓ Branch 274 taken 174 times.
✗ Branch 275 not taken.
✓ Branch 277 taken 113 times.
✗ Branch 278 not taken.
✓ Branch 280 taken 113 times.
✗ Branch 281 not taken.
✓ Branch 283 taken 174 times.
✗ Branch 284 not taken.
✓ Branch 286 taken 174 times.
✗ Branch 287 not taken.
✓ Branch 289 taken 174 times.
✗ Branch 290 not taken.
✓ Branch 292 taken 174 times.
✗ Branch 293 not taken.
✓ Branch 295 taken 13 times.
✗ Branch 296 not taken.
✓ Branch 298 taken 13 times.
✗ Branch 299 not taken.
✓ Branch 301 taken 13 times.
✗ Branch 302 not taken.
✓ Branch 304 taken 13 times.
✗ Branch 305 not taken.
✓ Branch 307 taken 13 times.
✗ Branch 308 not taken.
✓ Branch 310 taken 13 times.
✗ Branch 311 not taken.
✓ Branch 313 taken 13 times.
✗ Branch 314 not taken.
✓ Branch 316 taken 13 times.
✗ Branch 317 not taken.
✓ Branch 319 taken 13 times.
✗ Branch 320 not taken.
✓ Branch 322 taken 13 times.
✗ Branch 323 not taken.
✓ Branch 325 taken 13 times.
✗ Branch 326 not taken.
✓ Branch 328 taken 13 times.
✗ Branch 329 not taken.
✓ Branch 331 taken 13 times.
✗ Branch 332 not taken.
✓ Branch 334 taken 1 times.
✗ Branch 335 not taken.
✓ Branch 337 taken 1 times.
✗ Branch 338 not taken.
✓ Branch 340 taken 1 times.
✗ Branch 341 not taken.
✓ Branch 343 taken 1 times.
✗ Branch 344 not taken.
✓ Branch 346 taken 14 times.
✗ Branch 347 not taken.
✓ Branch 349 taken 14 times.
✗ Branch 350 not taken.
✓ Branch 352 taken 14 times.
✗ Branch 353 not taken.
✓ Branch 355 taken 14 times.
✗ Branch 356 not taken.
✓ Branch 358 taken 43 times.
✗ Branch 359 not taken.
✓ Branch 361 taken 43 times.
✗ Branch 362 not taken.
✓ Branch 364 taken 947 times.
✗ Branch 365 not taken.
✓ Branch 367 taken 947 times.
✗ Branch 368 not taken.
✓ Branch 370 taken 947 times.
✗ Branch 371 not taken.
✓ Branch 373 taken 947 times.
✗ Branch 374 not taken.
✓ Branch 376 taken 49 times.
✗ Branch 377 not taken.
✓ Branch 379 taken 50 times.
✗ Branch 380 not taken.
✓ Branch 382 taken 39 times.
✗ Branch 383 not taken.
✓ Branch 385 taken 39 times.
✗ Branch 386 not taken.
✓ Branch 388 taken 389 times.
✗ Branch 389 not taken.
✓ Branch 391 taken 389 times.
✗ Branch 392 not taken.
✓ Branch 394 taken 389 times.
✗ Branch 395 not taken.
✓ Branch 397 taken 389 times.
✗ Branch 398 not taken.
✓ Branch 400 taken 402 times.
✗ Branch 401 not taken.
✓ Branch 403 taken 402 times.
✗ Branch 404 not taken.
✓ Branch 406 taken 402 times.
✗ Branch 407 not taken.
✓ Branch 409 taken 402 times.
✗ Branch 410 not taken.
✓ Branch 412 taken 26 times.
✗ Branch 413 not taken.
✓ Branch 415 taken 26 times.
✗ Branch 416 not taken.
✓ Branch 418 taken 13 times.
✗ Branch 419 not taken.
✓ Branch 421 taken 13 times.
✗ Branch 422 not taken.
✓ Branch 424 taken 13 times.
✗ Branch 425 not taken.
✓ Branch 427 taken 13 times.
✗ Branch 428 not taken.
✓ Branch 430 taken 13 times.
✗ Branch 431 not taken.
✓ Branch 433 taken 13 times.
✗ Branch 434 not taken.
✓ Branch 436 taken 13 times.
✗ Branch 437 not taken.
✓ Branch 439 taken 13 times.
✗ Branch 440 not taken.
✓ Branch 442 taken 13 times.
✗ Branch 443 not taken.
✓ Branch 445 taken 13 times.
✗ Branch 446 not taken.
✓ Branch 448 taken 13 times.
✗ Branch 449 not taken.
✓ Branch 451 taken 13 times.
✗ Branch 452 not taken.
✓ Branch 454 taken 13 times.
✗ Branch 455 not taken.
✓ Branch 457 taken 13 times.
✗ Branch 458 not taken.
|
12816 | : IRFunctionBase(symbol, gen, Traits::N_ARGS) {} |
760 | |||
761 | inline llvm::Type* | ||
762 | 158484 | types(std::vector<llvm::Type*>& types, llvm::LLVMContext& C) const override | |
763 | { | ||
764 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
158485 | return llvmTypesFromSignature<SignatureT>(C, &types); |
765 | } | ||
766 | }; | ||
767 | |||
768 | /// @brief Represents a concrete C function binding with the first argument as | ||
769 | /// its return type. | ||
770 | template <typename SignatureT> | ||
771 | struct CFunctionSRet : public SRetFunction<SignatureT, CFunction<SignatureT>> | ||
772 | { | ||
773 | using BaseT = SRetFunction<SignatureT, CFunction<SignatureT>>; | ||
774 | CFunctionSRet(const std::string& symbol, const SignatureT function) | ||
775 |
45/90✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 142 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 193 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 72 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 13 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 13 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 13 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 13 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 13 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 13 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 13 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 13 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 13 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 13 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 13 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 13 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 37 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 37 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 37 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 37 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 13 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 13 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 13 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 13 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 13 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 13 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 13 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 13 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 17 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 17 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 13 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 13 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 13 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 30 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 30 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 30 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 30 times.
✗ Branch 110 not taken.
✓ Branch 112 taken 26 times.
✗ Branch 113 not taken.
✓ Branch 115 taken 13 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 13 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 26 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 13 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 13 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 13 times.
✗ Branch 131 not taken.
✓ Branch 133 taken 13 times.
✗ Branch 134 not taken.
|
1198 | : BaseT(symbol, function) {} |
776 | 2396 | ~CFunctionSRet() override = default; | |
777 | }; | ||
778 | |||
779 | /// @brief Represents a concrete IR function with the first argument as | ||
780 | /// its return type. | ||
781 | template <typename SignatureT> | ||
782 | struct IRFunctionSRet : public SRetFunction<SignatureT, IRFunction<SignatureT>> | ||
783 | { | ||
784 | using BaseT = SRetFunction<SignatureT, IRFunction<SignatureT>>; | ||
785 | IRFunctionSRet(const std::string& symbol, | ||
786 | const IRFunctionBase::GeneratorCb& gen) | ||
787 |
39/78✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 141 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 186 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 72 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 13 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 13 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 13 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 13 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 13 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 13 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 13 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 13 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 13 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 13 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 13 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 13 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 37 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 37 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 37 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 37 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 13 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 13 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 13 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 13 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 13 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 13 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 13 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 13 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 17 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 17 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 17 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 17 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 13 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 13 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 13 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 43 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 43 times.
✗ Branch 110 not taken.
✓ Branch 112 taken 49 times.
✗ Branch 113 not taken.
✓ Branch 115 taken 50 times.
✗ Branch 116 not taken.
|
1159 | : BaseT(symbol, gen) {} |
788 | 2318 | ~IRFunctionSRet() override = default; | |
789 | }; | ||
790 | |||
791 | /// @brief todo | ||
792 | struct OPENVDB_AX_API FunctionGroup | ||
793 | { | ||
794 | using Ptr = std::shared_ptr<FunctionGroup>; | ||
795 | using UniquePtr = std::unique_ptr<FunctionGroup>; | ||
796 | using FunctionList = std::vector<Function::Ptr>; | ||
797 | |||
798 | FunctionGroup(const char* name, | ||
799 | const char* doc, | ||
800 | const FunctionList& list) | ||
801 | 11443 | : mName(name) | |
802 | , mDoc(doc) | ||
803 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
|
11443 | , mFunctionList(list) {} |
804 | 11443 | ~FunctionGroup() = default; | |
805 | |||
806 | /// @brief Given a vector of llvm types, automatically returns the best | ||
807 | /// possible function declaration from the stored function list. The | ||
808 | /// 'best' declaration is determined by the provided types | ||
809 | /// compatibility to each functions signature. | ||
810 | /// @note If multiple implicit matches are found, the first match is | ||
811 | /// returned. | ||
812 | /// @note Returns a nullptr if no compatible match was found or if the | ||
813 | /// function list is empty. A compatible match is defined as an | ||
814 | /// Explicit or Implicit match. | ||
815 | /// | ||
816 | /// @param types A vector of types representing the function argument types | ||
817 | /// @param C The llvm context | ||
818 | /// @param type If provided, type is set to the type of match that occurred | ||
819 | const Function* | ||
820 | match(const std::vector<llvm::Type*>& types, | ||
821 | llvm::LLVMContext& C, | ||
822 | Function::SignatureMatch* type = nullptr) const; | ||
823 | |||
824 | /// @brief Given a vector of llvm values, find the best possible function | ||
825 | /// signature, generate and execute the function body. Returns the | ||
826 | /// return value of the function (nullptr if void). The behaviour | ||
827 | /// is undefined if a valid match does not exist. For such cases, | ||
828 | /// call the second version of FunctionGroup::execute. | ||
829 | /// @note This function will throw if no valid return is provided by the | ||
830 | /// matched declaration implementation. | ||
831 | /// | ||
832 | /// @param args A vector of values representing the function arguments | ||
833 | /// @param B The current llvm IRBuilder | ||
834 | llvm::Value* | ||
835 | execute(const std::vector<llvm::Value*>& args, | ||
836 | llvm::IRBuilder<>& B) const; | ||
837 | |||
838 | /// @brief Given a vector of llvm values, find the best possible function | ||
839 | /// signature, generate and execute the function body. Returns the | ||
840 | /// Function that was selected and executed or a nullptr if no | ||
841 | /// valid match was found. Sets the result variable to the return | ||
842 | /// value of the function (nullptr if void). If no match is found, | ||
843 | /// the result variable if left unset. | ||
844 | /// @note This function will throw if no valid return is provided by the | ||
845 | /// matched declaration implementation. | ||
846 | /// | ||
847 | /// @param args A vector of values representing the function arguments | ||
848 | /// @param B The current llvm IRBuilder | ||
849 | /// @param result The result to set. nullptr on void return. | ||
850 | /// @return The matched function. nullptr if no match was found | ||
851 | const Function* | ||
852 | execute(const std::vector<llvm::Value*>& args, | ||
853 | llvm::IRBuilder<>& B, | ||
854 | llvm::Value*& result) const; | ||
855 | |||
856 | /// @brief Accessor to the underlying function signature list | ||
857 | inline const FunctionList& list() const { return mFunctionList; } | ||
858 |
2/6✓ Branch 1 taken 107 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 106 times.
|
213 | const char* name() const { return mName; } |
859 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const char* doc() const { return mDoc; } |
860 | |||
861 | private: | ||
862 | const char* mName; | ||
863 | const char* mDoc; | ||
864 | const FunctionList mFunctionList; | ||
865 | }; | ||
866 | |||
867 | /// @brief The FunctionBuilder class provides a builder pattern framework to | ||
868 | /// allow easy and valid construction of AX functions. There are a | ||
869 | /// number of complex tasks which may need to be performed during | ||
870 | /// construction of C or IR function which are delegated to this | ||
871 | /// builder, whilst ensuring that the constructed functions are | ||
872 | /// guaranteed to be valid. | ||
873 | /// @details Use the FunctionBuilder::addSignature methods to append function | ||
874 | /// signatures. Finalize the group of functions with | ||
875 | /// FunctionBuilder::get. | ||
876 | struct FunctionBuilder | ||
877 | { | ||
878 | enum DeclPreferrence { | ||
879 | C, IR, Any | ||
880 | }; | ||
881 | |||
882 |
13/440✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 61 taken 724 times.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✓ Branch 73 taken 11436 times.
✗ Branch 74 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✓ Branch 100 taken 724 times.
✗ Branch 101 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 133 not taken.
✗ Branch 134 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✓ Branch 139 taken 721 times.
✗ Branch 140 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 151 not taken.
✗ Branch 152 not taken.
✓ Branch 154 taken 13 times.
✗ Branch 155 not taken.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
✗ Branch 175 not taken.
✗ Branch 176 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 181 not taken.
✗ Branch 182 not taken.
✗ Branch 184 not taken.
✗ Branch 185 not taken.
✗ Branch 187 not taken.
✗ Branch 188 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✗ Branch 193 not taken.
✗ Branch 194 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 202 not taken.
✗ Branch 203 not taken.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 211 not taken.
✗ Branch 212 not taken.
✗ Branch 214 not taken.
✗ Branch 215 not taken.
✗ Branch 217 not taken.
✗ Branch 218 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✗ Branch 223 not taken.
✗ Branch 224 not taken.
✗ Branch 226 not taken.
✗ Branch 227 not taken.
✗ Branch 229 not taken.
✗ Branch 230 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 238 not taken.
✗ Branch 239 not taken.
✓ Branch 241 taken 719 times.
✗ Branch 242 not taken.
✗ Branch 244 not taken.
✗ Branch 245 not taken.
✗ Branch 247 not taken.
✗ Branch 248 not taken.
✗ Branch 250 not taken.
✗ Branch 251 not taken.
✗ Branch 253 not taken.
✗ Branch 254 not taken.
✗ Branch 256 not taken.
✗ Branch 257 not taken.
✗ Branch 259 not taken.
✗ Branch 260 not taken.
✗ Branch 262 not taken.
✗ Branch 263 not taken.
✗ Branch 265 not taken.
✗ Branch 266 not taken.
✗ Branch 268 not taken.
✗ Branch 269 not taken.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✗ Branch 274 not taken.
✗ Branch 275 not taken.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 280 not taken.
✗ Branch 281 not taken.
✗ Branch 283 not taken.
✗ Branch 284 not taken.
✗ Branch 286 not taken.
✗ Branch 287 not taken.
✗ Branch 289 not taken.
✗ Branch 290 not taken.
✗ Branch 292 not taken.
✗ Branch 293 not taken.
✗ Branch 295 not taken.
✗ Branch 296 not taken.
✗ Branch 298 not taken.
✗ Branch 299 not taken.
✗ Branch 301 not taken.
✗ Branch 302 not taken.
✗ Branch 304 not taken.
✗ Branch 305 not taken.
✗ Branch 307 not taken.
✗ Branch 308 not taken.
✗ Branch 310 not taken.
✗ Branch 311 not taken.
✗ Branch 313 not taken.
✗ Branch 314 not taken.
✗ Branch 316 not taken.
✗ Branch 317 not taken.
✗ Branch 319 not taken.
✗ Branch 320 not taken.
✗ Branch 322 not taken.
✗ Branch 323 not taken.
✗ Branch 325 not taken.
✗ Branch 326 not taken.
✗ Branch 328 not taken.
✗ Branch 329 not taken.
✗ Branch 331 not taken.
✗ Branch 332 not taken.
✗ Branch 334 not taken.
✗ Branch 335 not taken.
✗ Branch 337 not taken.
✗ Branch 338 not taken.
✗ Branch 340 not taken.
✗ Branch 341 not taken.
✗ Branch 343 not taken.
✗ Branch 344 not taken.
✗ Branch 346 not taken.
✗ Branch 347 not taken.
✗ Branch 349 not taken.
✗ Branch 350 not taken.
✗ Branch 352 not taken.
✗ Branch 353 not taken.
✗ Branch 355 not taken.
✗ Branch 356 not taken.
✗ Branch 358 not taken.
✗ Branch 359 not taken.
✗ Branch 361 not taken.
✗ Branch 362 not taken.
✗ Branch 364 not taken.
✗ Branch 365 not taken.
✗ Branch 367 not taken.
✗ Branch 368 not taken.
✗ Branch 370 not taken.
✗ Branch 371 not taken.
✗ Branch 373 not taken.
✗ Branch 374 not taken.
✗ Branch 376 not taken.
✗ Branch 377 not taken.
✗ Branch 379 not taken.
✗ Branch 380 not taken.
✗ Branch 382 not taken.
✗ Branch 383 not taken.
✗ Branch 385 not taken.
✗ Branch 386 not taken.
✗ Branch 388 not taken.
✗ Branch 389 not taken.
✗ Branch 391 not taken.
✗ Branch 392 not taken.
✗ Branch 394 not taken.
✗ Branch 395 not taken.
✗ Branch 397 not taken.
✗ Branch 398 not taken.
✗ Branch 400 not taken.
✗ Branch 401 not taken.
✗ Branch 403 not taken.
✗ Branch 404 not taken.
✗ Branch 406 not taken.
✗ Branch 407 not taken.
✗ Branch 409 not taken.
✗ Branch 410 not taken.
✗ Branch 412 not taken.
✗ Branch 413 not taken.
✗ Branch 415 not taken.
✗ Branch 416 not taken.
✗ Branch 418 not taken.
✗ Branch 419 not taken.
✗ Branch 421 not taken.
✗ Branch 422 not taken.
✗ Branch 424 not taken.
✗ Branch 425 not taken.
✗ Branch 427 not taken.
✗ Branch 428 not taken.
✗ Branch 430 not taken.
✗ Branch 431 not taken.
✗ Branch 433 not taken.
✗ Branch 434 not taken.
✗ Branch 436 not taken.
✗ Branch 437 not taken.
✗ Branch 439 not taken.
✗ Branch 440 not taken.
✗ Branch 442 not taken.
✗ Branch 443 not taken.
✗ Branch 445 not taken.
✗ Branch 446 not taken.
✗ Branch 448 not taken.
✗ Branch 449 not taken.
✗ Branch 451 not taken.
✗ Branch 452 not taken.
✗ Branch 454 not taken.
✗ Branch 455 not taken.
✗ Branch 457 not taken.
✗ Branch 458 not taken.
✗ Branch 460 not taken.
✗ Branch 461 not taken.
✗ Branch 463 not taken.
✗ Branch 464 not taken.
✗ Branch 466 not taken.
✗ Branch 467 not taken.
✗ Branch 469 not taken.
✗ Branch 470 not taken.
✗ Branch 472 not taken.
✗ Branch 473 not taken.
✗ Branch 475 not taken.
✗ Branch 476 not taken.
✗ Branch 478 not taken.
✗ Branch 479 not taken.
✗ Branch 481 not taken.
✗ Branch 482 not taken.
✗ Branch 484 not taken.
✗ Branch 485 not taken.
✗ Branch 487 not taken.
✗ Branch 488 not taken.
✗ Branch 490 not taken.
✗ Branch 491 not taken.
✗ Branch 493 not taken.
✗ Branch 494 not taken.
✗ Branch 496 not taken.
✗ Branch 497 not taken.
✗ Branch 499 not taken.
✗ Branch 500 not taken.
✗ Branch 502 not taken.
✗ Branch 503 not taken.
✗ Branch 505 not taken.
✗ Branch 506 not taken.
✗ Branch 508 not taken.
✗ Branch 509 not taken.
✗ Branch 511 not taken.
✗ Branch 512 not taken.
✗ Branch 514 not taken.
✗ Branch 515 not taken.
✗ Branch 517 not taken.
✗ Branch 518 not taken.
✗ Branch 520 not taken.
✗ Branch 521 not taken.
✗ Branch 523 not taken.
✗ Branch 524 not taken.
✗ Branch 526 not taken.
✗ Branch 527 not taken.
✗ Branch 529 not taken.
✗ Branch 530 not taken.
✗ Branch 532 not taken.
✗ Branch 533 not taken.
✓ Branch 535 taken 3 times.
✗ Branch 536 not taken.
✗ Branch 538 not taken.
✗ Branch 539 not taken.
✗ Branch 541 not taken.
✗ Branch 542 not taken.
✗ Branch 544 not taken.
✗ Branch 545 not taken.
✗ Branch 547 not taken.
✗ Branch 548 not taken.
✗ Branch 550 not taken.
✗ Branch 551 not taken.
✗ Branch 553 not taken.
✗ Branch 554 not taken.
✗ Branch 556 not taken.
✗ Branch 557 not taken.
✗ Branch 559 not taken.
✗ Branch 560 not taken.
✗ Branch 562 not taken.
✗ Branch 563 not taken.
✗ Branch 565 not taken.
✗ Branch 566 not taken.
✓ Branch 568 taken 13 times.
✗ Branch 569 not taken.
✗ Branch 571 not taken.
✗ Branch 572 not taken.
✓ Branch 574 taken 13 times.
✗ Branch 575 not taken.
✓ Branch 577 taken 13 times.
✗ Branch 578 not taken.
✓ Branch 580 taken 13 times.
✗ Branch 581 not taken.
✗ Branch 583 not taken.
✗ Branch 584 not taken.
✗ Branch 586 not taken.
✗ Branch 587 not taken.
✗ Branch 589 not taken.
✗ Branch 590 not taken.
✗ Branch 592 not taken.
✗ Branch 593 not taken.
✓ Branch 595 taken 39 times.
✗ Branch 596 not taken.
✗ Branch 598 not taken.
✗ Branch 599 not taken.
✗ Branch 601 not taken.
✗ Branch 602 not taken.
✗ Branch 604 not taken.
✗ Branch 605 not taken.
✗ Branch 607 not taken.
✗ Branch 608 not taken.
✗ Branch 610 not taken.
✗ Branch 611 not taken.
✗ Branch 613 not taken.
✗ Branch 614 not taken.
✗ Branch 616 not taken.
✗ Branch 617 not taken.
✗ Branch 619 not taken.
✗ Branch 620 not taken.
✗ Branch 622 not taken.
✗ Branch 623 not taken.
✗ Branch 625 not taken.
✗ Branch 626 not taken.
✗ Branch 628 not taken.
✗ Branch 629 not taken.
✗ Branch 631 not taken.
✗ Branch 632 not taken.
✗ Branch 634 not taken.
✗ Branch 635 not taken.
✗ Branch 637 not taken.
✗ Branch 638 not taken.
✗ Branch 640 not taken.
✗ Branch 641 not taken.
✗ Branch 643 not taken.
✗ Branch 644 not taken.
✗ Branch 646 not taken.
✗ Branch 647 not taken.
✗ Branch 649 not taken.
✗ Branch 650 not taken.
✗ Branch 652 not taken.
✗ Branch 653 not taken.
✗ Branch 655 not taken.
✗ Branch 656 not taken.
✗ Branch 658 not taken.
✗ Branch 659 not taken.
|
15159 | struct Settings |
883 | { | ||
884 | using Ptr = std::shared_ptr<Settings>; | ||
885 | |||
886 |
2/2✓ Branch 0 taken 108136 times.
✓ Branch 1 taken 68 times.
|
108204 | inline bool isDefault() const { |
887 |
2/2✓ Branch 0 taken 108136 times.
✓ Branch 1 taken 68 times.
|
108204 | if (mNames) return false; |
888 |
1/2✓ Branch 0 taken 108136 times.
✗ Branch 1 not taken.
|
108136 | if (!mDeps.empty()) return false; |
889 |
2/4✓ Branch 0 taken 108136 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 108136 times.
✗ Branch 3 not taken.
|
108136 | if (mConstantFold || mEmbedIR) return false; |
890 |
2/2✓ Branch 0 taken 104520 times.
✓ Branch 1 taken 3616 times.
|
108136 | if (!mFnAttrs.empty()) return false; |
891 |
1/2✓ Branch 0 taken 104520 times.
✗ Branch 1 not taken.
|
104520 | if (!mRetAttrs.empty()) return false; |
892 |
2/2✓ Branch 0 taken 39 times.
✓ Branch 1 taken 104481 times.
|
104520 | if (!mParamAttrs.empty()) return false; |
893 | return true; | ||
894 | } | ||
895 | |||
896 | std::shared_ptr<std::vector<const char*>> mNames = nullptr; | ||
897 | std::vector<const char*> mDeps = {}; | ||
898 | bool mConstantFold = false; | ||
899 | bool mEmbedIR = false; | ||
900 | std::vector<llvm::Attribute::AttrKind> mFnAttrs = {}; | ||
901 | std::vector<llvm::Attribute::AttrKind> mRetAttrs = {}; | ||
902 | std::map<size_t, std::vector<llvm::Attribute::AttrKind>> mParamAttrs = {}; | ||
903 | }; | ||
904 | |||
905 | 11436 | FunctionBuilder(const char* name) | |
906 | 11436 | : mName(name) | |
907 |
1/2✓ Branch 1 taken 11436 times.
✗ Branch 2 not taken.
|
22872 | , mCurrentSettings(new Settings()) {} |
908 | |||
909 | |||
910 | template <typename Signature, bool SRet = false> | ||
911 | inline FunctionBuilder& | ||
912 | 25628 | addSignature(const IRFunctionBase::GeneratorCb& cb, | |
913 | const char* symbol = nullptr) | ||
914 | { | ||
915 | using IRFType = typename std::conditional | ||
916 | <!SRet, IRFunction<Signature>, IRFunctionSRet<Signature>>::type; | ||
917 | using IRPtr = typename IRFType::Ptr; | ||
918 | |||
919 | Settings::Ptr settings = mCurrentSettings; | ||
920 |
2/2✓ Branch 0 taken 52 times.
✓ Branch 1 taken 12762 times.
|
25628 | if (!mCurrentSettings->isDefault()) { |
921 |
2/4✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 52 times.
✗ Branch 5 not taken.
|
104 | settings.reset(new Settings()); |
922 | } | ||
923 | |||
924 | std::string s; | ||
925 |
3/4✓ Branch 0 taken 3772 times.
✓ Branch 1 taken 9042 times.
✓ Branch 3 taken 3772 times.
✗ Branch 4 not taken.
|
33172 | if (symbol) s = std::string(symbol); |
926 |
1/2✓ Branch 1 taken 9042 times.
✗ Branch 2 not taken.
|
36168 | else s = this->genSymbol<Signature>(); |
927 | |||
928 |
1/2✓ Branch 1 taken 12814 times.
✗ Branch 2 not taken.
|
25628 | auto ir = IRPtr(new IRFType(s, cb)); |
929 |
1/2✓ Branch 1 taken 12814 times.
✗ Branch 2 not taken.
|
25628 | mIRFunctions.emplace_back(ir); |
930 |
1/4✓ Branch 1 taken 12814 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
51256 | mSettings[ir.get()] = settings; |
931 | mCurrentSettings = settings; | ||
932 | 25628 | return *this; | |
933 | } | ||
934 | |||
935 | template <typename Signature, bool SRet = false> | ||
936 | inline FunctionBuilder& | ||
937 | 190780 | addSignature(const Signature* ptr, | |
938 | const char* symbol = nullptr) | ||
939 | { | ||
940 | using CFType = typename std::conditional | ||
941 | <!SRet, CFunction<Signature>, CFunctionSRet<Signature>>::type; | ||
942 | using CPtr = typename CFType::Ptr; | ||
943 | |||
944 | Settings::Ptr settings = mCurrentSettings; | ||
945 |
2/2✓ Branch 0 taken 3671 times.
✓ Branch 1 taken 91719 times.
|
190780 | if (!mCurrentSettings->isDefault()) { |
946 |
2/4✓ Branch 1 taken 3671 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3671 times.
✗ Branch 5 not taken.
|
7342 | settings.reset(new Settings()); |
947 | } | ||
948 | |||
949 | std::string s; | ||
950 |
3/4✓ Branch 0 taken 276 times.
✓ Branch 1 taken 95114 times.
✓ Branch 3 taken 276 times.
✗ Branch 4 not taken.
|
191332 | if (symbol) s = std::string(symbol); |
951 |
1/2✓ Branch 1 taken 95114 times.
✗ Branch 2 not taken.
|
380456 | else s = this->genSymbol<Signature>(); |
952 | |||
953 |
1/2✓ Branch 1 taken 95390 times.
✗ Branch 2 not taken.
|
190780 | auto c = CPtr(new CFType(s, ptr)); |
954 |
1/2✓ Branch 1 taken 95390 times.
✗ Branch 2 not taken.
|
190780 | mCFunctions.emplace_back(c); |
955 |
1/4✓ Branch 1 taken 95390 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
381560 | mSettings[c.get()] = settings; |
956 | mCurrentSettings = settings; | ||
957 | 190780 | return *this; | |
958 | } | ||
959 | |||
960 | template <typename Signature, bool SRet = false> | ||
961 | inline FunctionBuilder& | ||
962 | addSignature(const IRFunctionBase::GeneratorCb& cb, const Signature* ptr, const char* symbol = nullptr) | ||
963 | { | ||
964 |
165/330✓ Branch 1 taken 147 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 53 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 70 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 127 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 147 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 474 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 13 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 13 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 13 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 13 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 13 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 13 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 13 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 13 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 13 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 13 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 13 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 13 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 13 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 13 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 13 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 13 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 13 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 13 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 13 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 13 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 13 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 13 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 13 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 13 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 37 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 37 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 37 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 37 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 13 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 13 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 13 times.
✗ Branch 110 not taken.
✓ Branch 112 taken 13 times.
✗ Branch 113 not taken.
✓ Branch 115 taken 13 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 13 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 13 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 13 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 13 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 13 times.
✗ Branch 131 not taken.
✓ Branch 133 taken 13 times.
✗ Branch 134 not taken.
✓ Branch 136 taken 13 times.
✗ Branch 137 not taken.
✓ Branch 139 taken 13 times.
✗ Branch 140 not taken.
✓ Branch 142 taken 13 times.
✗ Branch 143 not taken.
✓ Branch 145 taken 13 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 13 times.
✗ Branch 149 not taken.
✓ Branch 151 taken 13 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 13 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 13 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 13 times.
✗ Branch 161 not taken.
✓ Branch 163 taken 13 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 13 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 13 times.
✗ Branch 170 not taken.
✓ Branch 172 taken 13 times.
✗ Branch 173 not taken.
✓ Branch 175 taken 13 times.
✗ Branch 176 not taken.
✓ Branch 178 taken 13 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 13 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 13 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 13 times.
✗ Branch 188 not taken.
✓ Branch 190 taken 13 times.
✗ Branch 191 not taken.
✓ Branch 193 taken 13 times.
✗ Branch 194 not taken.
✓ Branch 196 taken 13 times.
✗ Branch 197 not taken.
✓ Branch 199 taken 13 times.
✗ Branch 200 not taken.
✓ Branch 202 taken 13 times.
✗ Branch 203 not taken.
✓ Branch 205 taken 13 times.
✗ Branch 206 not taken.
✓ Branch 208 taken 13 times.
✗ Branch 209 not taken.
✓ Branch 211 taken 13 times.
✗ Branch 212 not taken.
✓ Branch 214 taken 13 times.
✗ Branch 215 not taken.
✓ Branch 217 taken 13 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 13 times.
✗ Branch 221 not taken.
✓ Branch 223 taken 13 times.
✗ Branch 224 not taken.
✓ Branch 226 taken 13 times.
✗ Branch 227 not taken.
✓ Branch 229 taken 13 times.
✗ Branch 230 not taken.
✓ Branch 232 taken 13 times.
✗ Branch 233 not taken.
✓ Branch 235 taken 13 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 13 times.
✗ Branch 239 not taken.
✓ Branch 241 taken 13 times.
✗ Branch 242 not taken.
✓ Branch 244 taken 13 times.
✗ Branch 245 not taken.
✓ Branch 247 taken 13 times.
✗ Branch 248 not taken.
✓ Branch 250 taken 13 times.
✗ Branch 251 not taken.
✓ Branch 253 taken 153 times.
✗ Branch 254 not taken.
✓ Branch 256 taken 153 times.
✗ Branch 257 not taken.
✓ Branch 259 taken 153 times.
✗ Branch 260 not taken.
✓ Branch 262 taken 153 times.
✗ Branch 263 not taken.
✓ Branch 265 taken 85 times.
✗ Branch 266 not taken.
✓ Branch 268 taken 85 times.
✗ Branch 269 not taken.
✓ Branch 271 taken 85 times.
✗ Branch 272 not taken.
✓ Branch 274 taken 85 times.
✗ Branch 275 not taken.
✓ Branch 277 taken 105 times.
✗ Branch 278 not taken.
✓ Branch 280 taken 105 times.
✗ Branch 281 not taken.
✓ Branch 283 taken 105 times.
✗ Branch 284 not taken.
✓ Branch 286 taken 105 times.
✗ Branch 287 not taken.
✓ Branch 289 taken 105 times.
✗ Branch 290 not taken.
✓ Branch 292 taken 105 times.
✗ Branch 293 not taken.
✓ Branch 295 taken 105 times.
✗ Branch 296 not taken.
✓ Branch 298 taken 105 times.
✗ Branch 299 not taken.
✓ Branch 301 taken 13 times.
✗ Branch 302 not taken.
✓ Branch 304 taken 13 times.
✗ Branch 305 not taken.
✓ Branch 307 taken 17 times.
✗ Branch 308 not taken.
✓ Branch 310 taken 17 times.
✗ Branch 311 not taken.
✓ Branch 313 taken 17 times.
✗ Branch 314 not taken.
✓ Branch 316 taken 17 times.
✗ Branch 317 not taken.
✓ Branch 319 taken 17 times.
✗ Branch 320 not taken.
✓ Branch 322 taken 17 times.
✗ Branch 323 not taken.
✓ Branch 325 taken 61 times.
✗ Branch 326 not taken.
✓ Branch 328 taken 61 times.
✗ Branch 329 not taken.
✓ Branch 331 taken 61 times.
✗ Branch 332 not taken.
✓ Branch 334 taken 61 times.
✗ Branch 335 not taken.
✓ Branch 337 taken 61 times.
✗ Branch 338 not taken.
✓ Branch 340 taken 61 times.
✗ Branch 341 not taken.
✓ Branch 343 taken 61 times.
✗ Branch 344 not taken.
✓ Branch 346 taken 61 times.
✗ Branch 347 not taken.
✓ Branch 349 taken 61 times.
✗ Branch 350 not taken.
✓ Branch 352 taken 113 times.
✗ Branch 353 not taken.
✓ Branch 355 taken 113 times.
✗ Branch 356 not taken.
✓ Branch 358 taken 113 times.
✗ Branch 359 not taken.
✓ Branch 361 taken 113 times.
✗ Branch 362 not taken.
✓ Branch 364 taken 113 times.
✗ Branch 365 not taken.
✓ Branch 367 taken 113 times.
✗ Branch 368 not taken.
✓ Branch 370 taken 113 times.
✗ Branch 371 not taken.
✓ Branch 373 taken 113 times.
✗ Branch 374 not taken.
✓ Branch 376 taken 113 times.
✗ Branch 377 not taken.
✓ Branch 379 taken 13 times.
✗ Branch 380 not taken.
✓ Branch 382 taken 13 times.
✗ Branch 383 not taken.
✓ Branch 385 taken 13 times.
✗ Branch 386 not taken.
✓ Branch 388 taken 13 times.
✗ Branch 389 not taken.
✓ Branch 391 taken 13 times.
✗ Branch 392 not taken.
✓ Branch 394 taken 13 times.
✗ Branch 395 not taken.
✓ Branch 397 taken 13 times.
✗ Branch 398 not taken.
✓ Branch 400 taken 13 times.
✗ Branch 401 not taken.
✓ Branch 403 taken 13 times.
✗ Branch 404 not taken.
✓ Branch 406 taken 13 times.
✗ Branch 407 not taken.
✓ Branch 409 taken 13 times.
✗ Branch 410 not taken.
✓ Branch 412 taken 13 times.
✗ Branch 413 not taken.
✓ Branch 415 taken 13 times.
✗ Branch 416 not taken.
✓ Branch 418 taken 13 times.
✗ Branch 419 not taken.
✓ Branch 421 taken 13 times.
✗ Branch 422 not taken.
✓ Branch 424 taken 13 times.
✗ Branch 425 not taken.
✓ Branch 427 taken 13 times.
✗ Branch 428 not taken.
✓ Branch 430 taken 13 times.
✗ Branch 431 not taken.
✓ Branch 433 taken 13 times.
✗ Branch 434 not taken.
✓ Branch 436 taken 13 times.
✗ Branch 437 not taken.
✓ Branch 439 taken 13 times.
✗ Branch 440 not taken.
✓ Branch 442 taken 49 times.
✗ Branch 443 not taken.
✓ Branch 445 taken 49 times.
✗ Branch 446 not taken.
✓ Branch 448 taken 617 times.
✗ Branch 449 not taken.
✓ Branch 451 taken 617 times.
✗ Branch 452 not taken.
✓ Branch 454 taken 13 times.
✗ Branch 455 not taken.
✓ Branch 457 taken 13 times.
✗ Branch 458 not taken.
✓ Branch 460 taken 13 times.
✗ Branch 461 not taken.
✓ Branch 463 taken 13 times.
✗ Branch 464 not taken.
✓ Branch 466 taken 13 times.
✗ Branch 467 not taken.
✓ Branch 469 taken 13 times.
✗ Branch 470 not taken.
✓ Branch 472 taken 13 times.
✗ Branch 473 not taken.
✓ Branch 475 taken 13 times.
✗ Branch 476 not taken.
✓ Branch 478 taken 13 times.
✗ Branch 479 not taken.
✓ Branch 481 taken 13 times.
✗ Branch 482 not taken.
✓ Branch 484 taken 125 times.
✗ Branch 485 not taken.
✓ Branch 487 taken 125 times.
✗ Branch 488 not taken.
✓ Branch 490 taken 1 times.
✗ Branch 491 not taken.
✓ Branch 493 taken 1 times.
✗ Branch 494 not taken.
|
7601 | this->addSignature<Signature, SRet>(cb, symbol); |
965 |
165/330✓ Branch 1 taken 147 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 53 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 70 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 127 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 147 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 474 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 13 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 13 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 13 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 13 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 13 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 13 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 13 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 13 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 13 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 13 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 13 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 13 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 13 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 13 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 13 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 13 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 13 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 13 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 13 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 13 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 13 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 13 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 13 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 13 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 37 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 37 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 37 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 37 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 13 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 13 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 13 times.
✗ Branch 110 not taken.
✓ Branch 112 taken 13 times.
✗ Branch 113 not taken.
✓ Branch 115 taken 13 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 13 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 13 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 13 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 13 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 13 times.
✗ Branch 131 not taken.
✓ Branch 133 taken 13 times.
✗ Branch 134 not taken.
✓ Branch 136 taken 13 times.
✗ Branch 137 not taken.
✓ Branch 139 taken 13 times.
✗ Branch 140 not taken.
✓ Branch 142 taken 13 times.
✗ Branch 143 not taken.
✓ Branch 145 taken 13 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 13 times.
✗ Branch 149 not taken.
✓ Branch 151 taken 13 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 13 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 13 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 13 times.
✗ Branch 161 not taken.
✓ Branch 163 taken 13 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 13 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 13 times.
✗ Branch 170 not taken.
✓ Branch 172 taken 13 times.
✗ Branch 173 not taken.
✓ Branch 175 taken 13 times.
✗ Branch 176 not taken.
✓ Branch 178 taken 13 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 13 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 13 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 13 times.
✗ Branch 188 not taken.
✓ Branch 190 taken 13 times.
✗ Branch 191 not taken.
✓ Branch 193 taken 13 times.
✗ Branch 194 not taken.
✓ Branch 196 taken 13 times.
✗ Branch 197 not taken.
✓ Branch 199 taken 13 times.
✗ Branch 200 not taken.
✓ Branch 202 taken 13 times.
✗ Branch 203 not taken.
✓ Branch 205 taken 13 times.
✗ Branch 206 not taken.
✓ Branch 208 taken 13 times.
✗ Branch 209 not taken.
✓ Branch 211 taken 13 times.
✗ Branch 212 not taken.
✓ Branch 214 taken 13 times.
✗ Branch 215 not taken.
✓ Branch 217 taken 13 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 13 times.
✗ Branch 221 not taken.
✓ Branch 223 taken 13 times.
✗ Branch 224 not taken.
✓ Branch 226 taken 13 times.
✗ Branch 227 not taken.
✓ Branch 229 taken 13 times.
✗ Branch 230 not taken.
✓ Branch 232 taken 13 times.
✗ Branch 233 not taken.
✓ Branch 235 taken 13 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 13 times.
✗ Branch 239 not taken.
✓ Branch 241 taken 13 times.
✗ Branch 242 not taken.
✓ Branch 244 taken 13 times.
✗ Branch 245 not taken.
✓ Branch 247 taken 13 times.
✗ Branch 248 not taken.
✓ Branch 250 taken 13 times.
✗ Branch 251 not taken.
✓ Branch 253 taken 153 times.
✗ Branch 254 not taken.
✓ Branch 256 taken 153 times.
✗ Branch 257 not taken.
✓ Branch 259 taken 153 times.
✗ Branch 260 not taken.
✓ Branch 262 taken 153 times.
✗ Branch 263 not taken.
✓ Branch 265 taken 85 times.
✗ Branch 266 not taken.
✓ Branch 268 taken 85 times.
✗ Branch 269 not taken.
✓ Branch 271 taken 85 times.
✗ Branch 272 not taken.
✓ Branch 274 taken 85 times.
✗ Branch 275 not taken.
✓ Branch 277 taken 105 times.
✗ Branch 278 not taken.
✓ Branch 280 taken 105 times.
✗ Branch 281 not taken.
✓ Branch 283 taken 105 times.
✗ Branch 284 not taken.
✓ Branch 286 taken 105 times.
✗ Branch 287 not taken.
✓ Branch 289 taken 105 times.
✗ Branch 290 not taken.
✓ Branch 292 taken 105 times.
✗ Branch 293 not taken.
✓ Branch 295 taken 105 times.
✗ Branch 296 not taken.
✓ Branch 298 taken 105 times.
✗ Branch 299 not taken.
✓ Branch 301 taken 13 times.
✗ Branch 302 not taken.
✓ Branch 304 taken 13 times.
✗ Branch 305 not taken.
✓ Branch 307 taken 17 times.
✗ Branch 308 not taken.
✓ Branch 310 taken 17 times.
✗ Branch 311 not taken.
✓ Branch 313 taken 17 times.
✗ Branch 314 not taken.
✓ Branch 316 taken 17 times.
✗ Branch 317 not taken.
✓ Branch 319 taken 17 times.
✗ Branch 320 not taken.
✓ Branch 322 taken 17 times.
✗ Branch 323 not taken.
✓ Branch 325 taken 61 times.
✗ Branch 326 not taken.
✓ Branch 328 taken 61 times.
✗ Branch 329 not taken.
✓ Branch 331 taken 61 times.
✗ Branch 332 not taken.
✓ Branch 334 taken 61 times.
✗ Branch 335 not taken.
✓ Branch 337 taken 61 times.
✗ Branch 338 not taken.
✓ Branch 340 taken 61 times.
✗ Branch 341 not taken.
✓ Branch 343 taken 61 times.
✗ Branch 344 not taken.
✓ Branch 346 taken 61 times.
✗ Branch 347 not taken.
✓ Branch 349 taken 61 times.
✗ Branch 350 not taken.
✓ Branch 352 taken 113 times.
✗ Branch 353 not taken.
✓ Branch 355 taken 113 times.
✗ Branch 356 not taken.
✓ Branch 358 taken 113 times.
✗ Branch 359 not taken.
✓ Branch 361 taken 113 times.
✗ Branch 362 not taken.
✓ Branch 364 taken 113 times.
✗ Branch 365 not taken.
✓ Branch 367 taken 113 times.
✗ Branch 368 not taken.
✓ Branch 370 taken 113 times.
✗ Branch 371 not taken.
✓ Branch 373 taken 113 times.
✗ Branch 374 not taken.
✓ Branch 376 taken 113 times.
✗ Branch 377 not taken.
✓ Branch 379 taken 13 times.
✗ Branch 380 not taken.
✓ Branch 382 taken 13 times.
✗ Branch 383 not taken.
✓ Branch 385 taken 13 times.
✗ Branch 386 not taken.
✓ Branch 388 taken 13 times.
✗ Branch 389 not taken.
✓ Branch 391 taken 13 times.
✗ Branch 392 not taken.
✓ Branch 394 taken 13 times.
✗ Branch 395 not taken.
✓ Branch 397 taken 13 times.
✗ Branch 398 not taken.
✓ Branch 400 taken 13 times.
✗ Branch 401 not taken.
✓ Branch 403 taken 13 times.
✗ Branch 404 not taken.
✓ Branch 406 taken 13 times.
✗ Branch 407 not taken.
✓ Branch 409 taken 13 times.
✗ Branch 410 not taken.
✓ Branch 412 taken 13 times.
✗ Branch 413 not taken.
✓ Branch 415 taken 13 times.
✗ Branch 416 not taken.
✓ Branch 418 taken 13 times.
✗ Branch 419 not taken.
✓ Branch 421 taken 13 times.
✗ Branch 422 not taken.
✓ Branch 424 taken 13 times.
✗ Branch 425 not taken.
✓ Branch 427 taken 13 times.
✗ Branch 428 not taken.
✓ Branch 430 taken 13 times.
✗ Branch 431 not taken.
✓ Branch 433 taken 13 times.
✗ Branch 434 not taken.
✓ Branch 436 taken 13 times.
✗ Branch 437 not taken.
✓ Branch 439 taken 13 times.
✗ Branch 440 not taken.
✓ Branch 442 taken 49 times.
✗ Branch 443 not taken.
✓ Branch 445 taken 49 times.
✗ Branch 446 not taken.
✓ Branch 448 taken 617 times.
✗ Branch 449 not taken.
✓ Branch 451 taken 617 times.
✗ Branch 452 not taken.
✓ Branch 454 taken 13 times.
✗ Branch 455 not taken.
✓ Branch 457 taken 13 times.
✗ Branch 458 not taken.
✓ Branch 460 taken 13 times.
✗ Branch 461 not taken.
✓ Branch 463 taken 13 times.
✗ Branch 464 not taken.
✓ Branch 466 taken 13 times.
✗ Branch 467 not taken.
✓ Branch 469 taken 13 times.
✗ Branch 470 not taken.
✓ Branch 472 taken 13 times.
✗ Branch 473 not taken.
✓ Branch 475 taken 13 times.
✗ Branch 476 not taken.
✓ Branch 478 taken 13 times.
✗ Branch 479 not taken.
✓ Branch 481 taken 13 times.
✗ Branch 482 not taken.
✓ Branch 484 taken 125 times.
✗ Branch 485 not taken.
✓ Branch 487 taken 125 times.
✗ Branch 488 not taken.
✓ Branch 490 taken 1 times.
✗ Branch 491 not taken.
✓ Branch 493 taken 1 times.
✗ Branch 494 not taken.
|
7601 | this->addSignature<Signature, SRet>(ptr, symbol); |
966 | return *this; | ||
967 | } | ||
968 | |||
969 | inline FunctionBuilder& addDependency(const char* name) { | ||
970 |
17/34✓ Branch 1 taken 140 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 51 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 59 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 80 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 127 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 127 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 13 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 13 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 13 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 13 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 13 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 85 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 85 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 17 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 61 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 61 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 13 times.
✗ Branch 50 not taken.
|
646 | mCurrentSettings->mDeps.emplace_back(name); return *this; |
971 | } | ||
972 | |||
973 | 3879 | inline FunctionBuilder& setEmbedIR(bool on) { mCurrentSettings->mEmbedIR = on; return *this; } | |
974 |
147/157✓ Branch 0 taken 40 times.
✓ Branch 1 taken 1577 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 269 times.
✓ Branch 4 taken 1276 times.
✓ Branch 5 taken 78 times.
✓ Branch 6 taken 996 times.
✓ Branch 7 taken 574 times.
✓ Branch 8 taken 40 times.
✓ Branch 9 taken 1859 times.
✓ Branch 10 taken 8 times.
✓ Branch 11 taken 469 times.
✓ Branch 12 taken 989 times.
✓ Branch 13 taken 5 times.
✓ Branch 14 taken 726 times.
✓ Branch 15 taken 3 times.
✓ Branch 16 taken 238 times.
✓ Branch 17 taken 487 times.
✓ Branch 18 taken 18 times.
✓ Branch 19 taken 10 times.
✓ Branch 20 taken 35 times.
✓ Branch 21 taken 13 times.
✓ Branch 22 taken 12 times.
✓ Branch 23 taken 8 times.
✓ Branch 24 taken 51 times.
✓ Branch 25 taken 8 times.
✓ Branch 26 taken 5 times.
✓ Branch 27 taken 15 times.
✓ Branch 28 taken 5 times.
✓ Branch 29 taken 28 times.
✓ Branch 30 taken 5 times.
✓ Branch 31 taken 22 times.
✓ Branch 32 taken 5 times.
✓ Branch 33 taken 10 times.
✓ Branch 34 taken 5 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1 times.
✓ Branch 37 taken 8 times.
✓ Branch 38 taken 5 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✓ Branch 41 taken 8 times.
✓ Branch 42 taken 5 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 1 times.
✓ Branch 45 taken 8 times.
✓ Branch 46 taken 5 times.
✓ Branch 48 taken 13 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 8 times.
✓ Branch 51 taken 5 times.
✓ Branch 53 taken 13 times.
✗ Branch 54 not taken.
✓ Branch 56 taken 13 times.
✗ Branch 57 not taken.
✓ Branch 59 taken 13 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 8 times.
✓ Branch 62 taken 5 times.
✓ Branch 63 taken 8 times.
✓ Branch 64 taken 5 times.
✓ Branch 65 taken 8 times.
✓ Branch 66 taken 5 times.
✓ Branch 67 taken 16 times.
✓ Branch 68 taken 17 times.
✓ Branch 69 taken 8 times.
✓ Branch 70 taken 5 times.
✓ Branch 71 taken 8 times.
✓ Branch 72 taken 5 times.
✓ Branch 73 taken 8 times.
✓ Branch 74 taken 5 times.
✓ Branch 75 taken 8 times.
✓ Branch 76 taken 5 times.
✓ Branch 77 taken 8 times.
✓ Branch 78 taken 5 times.
✓ Branch 79 taken 8 times.
✓ Branch 80 taken 5 times.
✓ Branch 81 taken 8 times.
✓ Branch 82 taken 5 times.
✗ Branch 83 not taken.
✓ Branch 84 taken 37 times.
✓ Branch 86 taken 8 times.
✓ Branch 87 taken 5 times.
✓ Branch 88 taken 8 times.
✓ Branch 89 taken 5 times.
✓ Branch 90 taken 8 times.
✓ Branch 91 taken 5 times.
✓ Branch 92 taken 8 times.
✓ Branch 93 taken 5 times.
✓ Branch 94 taken 8 times.
✓ Branch 95 taken 5 times.
✓ Branch 96 taken 8 times.
✓ Branch 97 taken 5 times.
✓ Branch 98 taken 24 times.
✓ Branch 99 taken 129 times.
✓ Branch 100 taken 8 times.
✓ Branch 101 taken 5 times.
✓ Branch 102 taken 8 times.
✓ Branch 103 taken 5 times.
✓ Branch 104 taken 8 times.
✓ Branch 105 taken 5 times.
✓ Branch 106 taken 8 times.
✓ Branch 107 taken 5 times.
✓ Branch 108 taken 8 times.
✓ Branch 109 taken 6 times.
✓ Branch 110 taken 56 times.
✓ Branch 111 taken 29 times.
✓ Branch 112 taken 56 times.
✓ Branch 113 taken 49 times.
✓ Branch 114 taken 56 times.
✓ Branch 115 taken 49 times.
✓ Branch 116 taken 8 times.
✓ Branch 117 taken 5 times.
✓ Branch 118 taken 8 times.
✓ Branch 119 taken 9 times.
✓ Branch 120 taken 16 times.
✓ Branch 121 taken 45 times.
✓ Branch 122 taken 24 times.
✓ Branch 123 taken 89 times.
✓ Branch 124 taken 8 times.
✓ Branch 125 taken 5 times.
✓ Branch 126 taken 8 times.
✓ Branch 127 taken 5 times.
✓ Branch 128 taken 8 times.
✓ Branch 129 taken 5 times.
✓ Branch 130 taken 8 times.
✓ Branch 131 taken 5 times.
✓ Branch 132 taken 8 times.
✓ Branch 133 taken 5 times.
✓ Branch 134 taken 8 times.
✓ Branch 135 taken 5 times.
✓ Branch 136 taken 8 times.
✓ Branch 137 taken 5 times.
✓ Branch 138 taken 8 times.
✓ Branch 139 taken 5 times.
✓ Branch 140 taken 8 times.
✓ Branch 141 taken 5 times.
✓ Branch 142 taken 24 times.
✓ Branch 143 taken 25 times.
✓ Branch 144 taken 32 times.
✓ Branch 145 taken 585 times.
✓ Branch 146 taken 8 times.
✓ Branch 147 taken 5 times.
✓ Branch 148 taken 8 times.
✓ Branch 149 taken 5 times.
✓ Branch 150 taken 8 times.
✓ Branch 151 taken 5 times.
✓ Branch 152 taken 8 times.
✓ Branch 153 taken 5 times.
✓ Branch 154 taken 8 times.
✓ Branch 155 taken 5 times.
✓ Branch 156 taken 32 times.
✓ Branch 157 taken 93 times.
✗ Branch 158 not taken.
✓ Branch 159 taken 1 times.
✗ Branch 160 not taken.
✓ Branch 161 taken 1 times.
|
13490 | inline FunctionBuilder& setConstantFold(bool on) { mCurrentSettings->mConstantFold = on; return *this; } |
975 | 4191 | inline FunctionBuilder& setArgumentNames(const std::vector<const char*>& names) { | |
976 |
1/2✓ Branch 2 taken 4191 times.
✗ Branch 3 not taken.
|
4191 | mCurrentSettings->mNames.reset(new std::vector<const char*>(names)); |
977 | 4191 | return *this; | |
978 | } | ||
979 | |||
980 | /// @details Parameter and Function Attributes. When designing a C binding, | ||
981 | /// llvm will be unable to assign parameter markings to the return | ||
982 | /// type, function body or parameter attributes due to there not | ||
983 | /// being any visibility on the function itself during codegen. | ||
984 | /// The best way to ensure performant C bindings is to ensure | ||
985 | /// that the function is marked with the required llvm parameters. | ||
986 | /// Some of the heavy hitters (which can have the most impact) | ||
987 | /// are below: | ||
988 | /// | ||
989 | /// Functions: | ||
990 | /// - norecurse | ||
991 | /// This function attribute indicates that the function does | ||
992 | /// not call itself either directly or indirectly down any | ||
993 | /// possible call path. | ||
994 | /// | ||
995 | /// - willreturn | ||
996 | /// This function attribute indicates that a call of this | ||
997 | /// function will either exhibit undefined behavior or comes | ||
998 | /// back and continues execution at a point in the existing | ||
999 | /// call stack that includes the current invocation. | ||
1000 | /// | ||
1001 | /// - nounwind | ||
1002 | /// This function attribute indicates that the function never | ||
1003 | /// raises an exception. | ||
1004 | /// | ||
1005 | /// - readnone | ||
1006 | /// On a function, this attribute indicates that the function | ||
1007 | /// computes its result (or decides to unwind an exception) based | ||
1008 | /// strictly on its arguments, without dereferencing any pointer | ||
1009 | /// arguments or otherwise accessing any mutable state (e.g. memory, | ||
1010 | /// control registers, etc) visible to caller functions. | ||
1011 | /// | ||
1012 | /// - readonly | ||
1013 | /// On a function, this attribute indicates that the function | ||
1014 | /// does not write through any pointer arguments (including byval | ||
1015 | /// arguments) or otherwise modify any state (e.g. memory, control | ||
1016 | /// registers, etc) visible to caller functions. | ||
1017 | /// control registers, etc) visible to caller functions. | ||
1018 | /// | ||
1019 | /// - writeonly | ||
1020 | /// On a function, this attribute indicates that the function may | ||
1021 | /// write to but does not read from memory. | ||
1022 | /// | ||
1023 | /// Parameters: | ||
1024 | /// - noalias | ||
1025 | /// This indicates that objects accessed via pointer values based | ||
1026 | /// on the argument or return value are not also accessed, during | ||
1027 | /// the execution of the function, via pointer values not based on | ||
1028 | /// the argument or return value. | ||
1029 | /// | ||
1030 | /// - nonnull | ||
1031 | /// This indicates that the parameter or return pointer is not null. | ||
1032 | /// | ||
1033 | /// - readonly | ||
1034 | /// Indicates that the function does not write through this pointer | ||
1035 | /// argument, even though it may write to the memory that the pointer | ||
1036 | /// points to. | ||
1037 | /// | ||
1038 | /// - writeonly | ||
1039 | /// Indicates that the function may write to but does not read through | ||
1040 | /// this pointer argument (even though it may read from the memory | ||
1041 | /// that the pointer points to). | ||
1042 | /// | ||
1043 | inline FunctionBuilder& | ||
1044 | addParameterAttribute(const size_t idx, const llvm::Attribute::AttrKind attr) { | ||
1045 |
138/276✓ Branch 1 taken 2968 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2968 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2968 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2968 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2996 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2996 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2992 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 2992 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2992 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 2992 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2992 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 2992 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 2963 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 2963 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 2965 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 2965 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 2965 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 2965 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 2271 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 2271 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 2271 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 2271 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 2271 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 2271 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 2271 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 2271 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 2265 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 2265 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 2255 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 2255 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 2265 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 2265 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 2265 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 2265 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 2265 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 2265 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 2263 times.
✗ Branch 110 not taken.
✓ Branch 112 taken 2263 times.
✗ Branch 113 not taken.
✓ Branch 115 taken 2263 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 2263 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 2239 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 2239 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 2239 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 2239 times.
✗ Branch 131 not taken.
✓ Branch 133 taken 2239 times.
✗ Branch 134 not taken.
✓ Branch 136 taken 2239 times.
✗ Branch 137 not taken.
✓ Branch 139 taken 2239 times.
✗ Branch 140 not taken.
✓ Branch 142 taken 2239 times.
✗ Branch 143 not taken.
✓ Branch 145 taken 2239 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 2239 times.
✗ Branch 149 not taken.
✓ Branch 151 taken 2239 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 2239 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 1488 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 1488 times.
✗ Branch 161 not taken.
✓ Branch 163 taken 1488 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 1488 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 1508 times.
✗ Branch 170 not taken.
✓ Branch 172 taken 1508 times.
✗ Branch 173 not taken.
✓ Branch 175 taken 1508 times.
✗ Branch 176 not taken.
✓ Branch 178 taken 1508 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 1488 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 1488 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 776 times.
✗ Branch 188 not taken.
✓ Branch 190 taken 776 times.
✗ Branch 191 not taken.
✓ Branch 193 taken 776 times.
✗ Branch 194 not taken.
✓ Branch 196 taken 776 times.
✗ Branch 197 not taken.
✓ Branch 199 taken 776 times.
✗ Branch 200 not taken.
✓ Branch 202 taken 776 times.
✗ Branch 203 not taken.
✓ Branch 205 taken 776 times.
✗ Branch 206 not taken.
✓ Branch 208 taken 776 times.
✗ Branch 209 not taken.
✓ Branch 211 taken 789 times.
✗ Branch 212 not taken.
✓ Branch 214 taken 789 times.
✗ Branch 215 not taken.
✓ Branch 217 taken 789 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 789 times.
✗ Branch 221 not taken.
✓ Branch 223 taken 789 times.
✗ Branch 224 not taken.
✓ Branch 226 taken 789 times.
✗ Branch 227 not taken.
✓ Branch 229 taken 789 times.
✗ Branch 230 not taken.
✓ Branch 232 taken 789 times.
✗ Branch 233 not taken.
✓ Branch 235 taken 783 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 783 times.
✗ Branch 239 not taken.
✓ Branch 241 taken 783 times.
✗ Branch 242 not taken.
✓ Branch 244 taken 783 times.
✗ Branch 245 not taken.
✓ Branch 247 taken 783 times.
✗ Branch 248 not taken.
✓ Branch 250 taken 783 times.
✗ Branch 251 not taken.
✓ Branch 253 taken 769 times.
✗ Branch 254 not taken.
✓ Branch 256 taken 769 times.
✗ Branch 257 not taken.
✓ Branch 259 taken 769 times.
✗ Branch 260 not taken.
✓ Branch 262 taken 769 times.
✗ Branch 263 not taken.
✓ Branch 265 taken 769 times.
✗ Branch 266 not taken.
✓ Branch 268 taken 769 times.
✗ Branch 269 not taken.
✓ Branch 271 taken 793 times.
✗ Branch 272 not taken.
✓ Branch 274 taken 793 times.
✗ Branch 275 not taken.
✓ Branch 277 taken 37 times.
✗ Branch 278 not taken.
✓ Branch 280 taken 37 times.
✗ Branch 281 not taken.
✓ Branch 283 taken 37 times.
✗ Branch 284 not taken.
✓ Branch 286 taken 37 times.
✗ Branch 287 not taken.
✓ Branch 289 taken 37 times.
✗ Branch 290 not taken.
✓ Branch 292 taken 37 times.
✗ Branch 293 not taken.
✓ Branch 295 taken 13 times.
✗ Branch 296 not taken.
✓ Branch 298 taken 13 times.
✗ Branch 299 not taken.
✓ Branch 301 taken 13 times.
✗ Branch 302 not taken.
✓ Branch 304 taken 13 times.
✗ Branch 305 not taken.
✓ Branch 307 taken 13 times.
✗ Branch 308 not taken.
✓ Branch 310 taken 13 times.
✗ Branch 311 not taken.
✓ Branch 313 taken 13 times.
✗ Branch 314 not taken.
✓ Branch 316 taken 13 times.
✗ Branch 317 not taken.
✓ Branch 319 taken 13 times.
✗ Branch 320 not taken.
✓ Branch 322 taken 13 times.
✗ Branch 323 not taken.
✓ Branch 325 taken 13 times.
✗ Branch 326 not taken.
✓ Branch 328 taken 13 times.
✗ Branch 329 not taken.
✓ Branch 331 taken 13 times.
✗ Branch 332 not taken.
✓ Branch 334 taken 13 times.
✗ Branch 335 not taken.
✓ Branch 337 taken 13 times.
✗ Branch 338 not taken.
✓ Branch 340 taken 13 times.
✗ Branch 341 not taken.
✓ Branch 343 taken 13 times.
✗ Branch 344 not taken.
✓ Branch 346 taken 13 times.
✗ Branch 347 not taken.
✓ Branch 349 taken 13 times.
✗ Branch 350 not taken.
✓ Branch 352 taken 13 times.
✗ Branch 353 not taken.
✓ Branch 355 taken 17 times.
✗ Branch 356 not taken.
✓ Branch 358 taken 17 times.
✗ Branch 359 not taken.
✓ Branch 361 taken 17 times.
✗ Branch 362 not taken.
✓ Branch 364 taken 17 times.
✗ Branch 365 not taken.
✓ Branch 367 taken 61 times.
✗ Branch 368 not taken.
✓ Branch 370 taken 61 times.
✗ Branch 371 not taken.
✓ Branch 373 taken 113 times.
✗ Branch 374 not taken.
✓ Branch 376 taken 113 times.
✗ Branch 377 not taken.
✓ Branch 379 taken 13 times.
✗ Branch 380 not taken.
✓ Branch 382 taken 13 times.
✗ Branch 383 not taken.
✓ Branch 385 taken 13 times.
✗ Branch 386 not taken.
✓ Branch 388 taken 13 times.
✗ Branch 389 not taken.
✓ Branch 391 taken 13 times.
✗ Branch 392 not taken.
✓ Branch 394 taken 13 times.
✗ Branch 395 not taken.
✓ Branch 397 taken 13 times.
✗ Branch 398 not taken.
✓ Branch 400 taken 13 times.
✗ Branch 401 not taken.
✓ Branch 403 taken 13 times.
✗ Branch 404 not taken.
✓ Branch 406 taken 13 times.
✗ Branch 407 not taken.
✓ Branch 409 taken 13 times.
✗ Branch 410 not taken.
✓ Branch 412 taken 13 times.
✗ Branch 413 not taken.
|
11777 | mCurrentSettings->mParamAttrs[idx].emplace_back(attr); |
1046 | return *this; | ||
1047 | } | ||
1048 | |||
1049 | inline FunctionBuilder& | ||
1050 | addReturnAttribute(const llvm::Attribute::AttrKind attr) { | ||
1051 | mCurrentSettings->mRetAttrs.emplace_back(attr); | ||
1052 | return *this; | ||
1053 | } | ||
1054 | |||
1055 | inline FunctionBuilder& | ||
1056 | addFunctionAttribute(const llvm::Attribute::AttrKind attr) { | ||
1057 |
241/482✓ Branch 1 taken 2968 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2968 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2214 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1458 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1458 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 741 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 756 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 756 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 732 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 732 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 10 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 10 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 23 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 23 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 17 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 17 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 27 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 15 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 15 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 15 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 15 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 13 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 13 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 13 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 13 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 13 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 13 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 13 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 13 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 13 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 13 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 13 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 13 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 13 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 13 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 13 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 13 times.
✗ Branch 110 not taken.
✓ Branch 112 taken 13 times.
✗ Branch 113 not taken.
✓ Branch 115 taken 13 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 13 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 13 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 13 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 13 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 13 times.
✗ Branch 131 not taken.
✓ Branch 133 taken 13 times.
✗ Branch 134 not taken.
✓ Branch 136 taken 13 times.
✗ Branch 137 not taken.
✓ Branch 139 taken 13 times.
✗ Branch 140 not taken.
✓ Branch 142 taken 13 times.
✗ Branch 143 not taken.
✓ Branch 145 taken 13 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 13 times.
✗ Branch 149 not taken.
✓ Branch 151 taken 13 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 13 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 13 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 13 times.
✗ Branch 161 not taken.
✓ Branch 163 taken 1 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 1 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 1 times.
✗ Branch 170 not taken.
✓ Branch 172 taken 1 times.
✗ Branch 173 not taken.
✓ Branch 175 taken 13 times.
✗ Branch 176 not taken.
✓ Branch 178 taken 13 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 13 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 13 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 1 times.
✗ Branch 188 not taken.
✓ Branch 190 taken 1 times.
✗ Branch 191 not taken.
✓ Branch 193 taken 1 times.
✗ Branch 194 not taken.
✓ Branch 196 taken 1 times.
✗ Branch 197 not taken.
✓ Branch 199 taken 13 times.
✗ Branch 200 not taken.
✓ Branch 202 taken 13 times.
✗ Branch 203 not taken.
✓ Branch 205 taken 13 times.
✗ Branch 206 not taken.
✓ Branch 208 taken 13 times.
✗ Branch 209 not taken.
✓ Branch 211 taken 1 times.
✗ Branch 212 not taken.
✓ Branch 214 taken 1 times.
✗ Branch 215 not taken.
✓ Branch 217 taken 1 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 1 times.
✗ Branch 221 not taken.
✓ Branch 223 taken 13 times.
✗ Branch 224 not taken.
✓ Branch 226 taken 13 times.
✗ Branch 227 not taken.
✓ Branch 229 taken 13 times.
✗ Branch 230 not taken.
✓ Branch 232 taken 13 times.
✗ Branch 233 not taken.
✓ Branch 235 taken 13 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 13 times.
✗ Branch 239 not taken.
✓ Branch 241 taken 13 times.
✗ Branch 242 not taken.
✓ Branch 244 taken 13 times.
✗ Branch 245 not taken.
✓ Branch 247 taken 13 times.
✗ Branch 248 not taken.
✓ Branch 250 taken 13 times.
✗ Branch 251 not taken.
✓ Branch 253 taken 13 times.
✗ Branch 254 not taken.
✓ Branch 256 taken 13 times.
✗ Branch 257 not taken.
✓ Branch 259 taken 33 times.
✗ Branch 260 not taken.
✓ Branch 262 taken 33 times.
✗ Branch 263 not taken.
✓ Branch 265 taken 13 times.
✗ Branch 266 not taken.
✓ Branch 268 taken 13 times.
✗ Branch 269 not taken.
✓ Branch 271 taken 13 times.
✗ Branch 272 not taken.
✓ Branch 274 taken 13 times.
✗ Branch 275 not taken.
✓ Branch 277 taken 13 times.
✗ Branch 278 not taken.
✓ Branch 280 taken 13 times.
✗ Branch 281 not taken.
✓ Branch 283 taken 13 times.
✗ Branch 284 not taken.
✓ Branch 286 taken 13 times.
✗ Branch 287 not taken.
✓ Branch 289 taken 13 times.
✗ Branch 290 not taken.
✓ Branch 292 taken 13 times.
✗ Branch 293 not taken.
✓ Branch 295 taken 13 times.
✗ Branch 296 not taken.
✓ Branch 298 taken 13 times.
✗ Branch 299 not taken.
✓ Branch 301 taken 13 times.
✗ Branch 302 not taken.
✓ Branch 304 taken 37 times.
✗ Branch 305 not taken.
✓ Branch 307 taken 37 times.
✗ Branch 308 not taken.
✓ Branch 310 taken 49 times.
✗ Branch 311 not taken.
✓ Branch 313 taken 49 times.
✗ Branch 314 not taken.
✓ Branch 316 taken 50 times.
✗ Branch 317 not taken.
✓ Branch 319 taken 50 times.
✗ Branch 320 not taken.
✓ Branch 322 taken 13 times.
✗ Branch 323 not taken.
✓ Branch 325 taken 13 times.
✗ Branch 326 not taken.
✓ Branch 328 taken 13 times.
✗ Branch 329 not taken.
✓ Branch 331 taken 13 times.
✗ Branch 332 not taken.
✓ Branch 334 taken 13 times.
✗ Branch 335 not taken.
✓ Branch 337 taken 13 times.
✗ Branch 338 not taken.
✓ Branch 340 taken 13 times.
✗ Branch 341 not taken.
✓ Branch 343 taken 13 times.
✗ Branch 344 not taken.
✓ Branch 346 taken 13 times.
✗ Branch 347 not taken.
✓ Branch 349 taken 13 times.
✗ Branch 350 not taken.
✓ Branch 352 taken 13 times.
✗ Branch 353 not taken.
✓ Branch 355 taken 13 times.
✗ Branch 356 not taken.
✓ Branch 358 taken 13 times.
✗ Branch 359 not taken.
✓ Branch 361 taken 13 times.
✗ Branch 362 not taken.
✓ Branch 364 taken 13 times.
✗ Branch 365 not taken.
✓ Branch 367 taken 13 times.
✗ Branch 368 not taken.
✓ Branch 370 taken 13 times.
✗ Branch 371 not taken.
✓ Branch 373 taken 13 times.
✗ Branch 374 not taken.
✓ Branch 376 taken 13 times.
✗ Branch 377 not taken.
✓ Branch 379 taken 13 times.
✗ Branch 380 not taken.
✓ Branch 382 taken 13 times.
✗ Branch 383 not taken.
✓ Branch 385 taken 13 times.
✗ Branch 386 not taken.
✓ Branch 388 taken 153 times.
✗ Branch 389 not taken.
✓ Branch 391 taken 153 times.
✗ Branch 392 not taken.
✓ Branch 394 taken 153 times.
✗ Branch 395 not taken.
✓ Branch 397 taken 153 times.
✗ Branch 398 not taken.
✓ Branch 400 taken 13 times.
✗ Branch 401 not taken.
✓ Branch 403 taken 13 times.
✗ Branch 404 not taken.
✓ Branch 406 taken 13 times.
✗ Branch 407 not taken.
✓ Branch 409 taken 13 times.
✗ Branch 410 not taken.
✓ Branch 412 taken 13 times.
✗ Branch 413 not taken.
✓ Branch 415 taken 13 times.
✗ Branch 416 not taken.
✓ Branch 418 taken 13 times.
✗ Branch 419 not taken.
✓ Branch 421 taken 13 times.
✗ Branch 422 not taken.
✓ Branch 424 taken 13 times.
✗ Branch 425 not taken.
✓ Branch 427 taken 13 times.
✗ Branch 428 not taken.
✓ Branch 430 taken 13 times.
✗ Branch 431 not taken.
✓ Branch 433 taken 13 times.
✗ Branch 434 not taken.
✓ Branch 436 taken 13 times.
✗ Branch 437 not taken.
✓ Branch 439 taken 13 times.
✗ Branch 440 not taken.
✓ Branch 442 taken 13 times.
✗ Branch 443 not taken.
✓ Branch 445 taken 13 times.
✗ Branch 446 not taken.
✓ Branch 448 taken 85 times.
✗ Branch 449 not taken.
✓ Branch 451 taken 85 times.
✗ Branch 452 not taken.
✓ Branch 454 taken 85 times.
✗ Branch 455 not taken.
✓ Branch 457 taken 85 times.
✗ Branch 458 not taken.
✓ Branch 460 taken 105 times.
✗ Branch 461 not taken.
✓ Branch 463 taken 105 times.
✗ Branch 464 not taken.
✓ Branch 466 taken 105 times.
✗ Branch 467 not taken.
✓ Branch 469 taken 105 times.
✗ Branch 470 not taken.
✓ Branch 472 taken 105 times.
✗ Branch 473 not taken.
✓ Branch 475 taken 105 times.
✗ Branch 476 not taken.
✓ Branch 478 taken 105 times.
✗ Branch 479 not taken.
✓ Branch 481 taken 105 times.
✗ Branch 482 not taken.
✓ Branch 484 taken 13 times.
✗ Branch 485 not taken.
✓ Branch 487 taken 13 times.
✗ Branch 488 not taken.
✓ Branch 490 taken 13 times.
✗ Branch 491 not taken.
✓ Branch 493 taken 13 times.
✗ Branch 494 not taken.
✓ Branch 496 taken 17 times.
✗ Branch 497 not taken.
✓ Branch 499 taken 17 times.
✗ Branch 500 not taken.
✓ Branch 502 taken 61 times.
✗ Branch 503 not taken.
✓ Branch 505 taken 61 times.
✗ Branch 506 not taken.
✓ Branch 508 taken 61 times.
✗ Branch 509 not taken.
✓ Branch 511 taken 61 times.
✗ Branch 512 not taken.
✓ Branch 514 taken 113 times.
✗ Branch 515 not taken.
✓ Branch 517 taken 113 times.
✗ Branch 518 not taken.
✓ Branch 520 taken 113 times.
✗ Branch 521 not taken.
✓ Branch 523 taken 113 times.
✗ Branch 524 not taken.
✓ Branch 526 taken 13 times.
✗ Branch 527 not taken.
✓ Branch 529 taken 13 times.
✗ Branch 530 not taken.
✓ Branch 532 taken 13 times.
✗ Branch 533 not taken.
✓ Branch 535 taken 13 times.
✗ Branch 536 not taken.
✓ Branch 538 taken 13 times.
✗ Branch 539 not taken.
✓ Branch 541 taken 13 times.
✗ Branch 542 not taken.
✓ Branch 544 taken 13 times.
✗ Branch 545 not taken.
✓ Branch 547 taken 13 times.
✗ Branch 548 not taken.
✓ Branch 550 taken 13 times.
✗ Branch 551 not taken.
✓ Branch 553 taken 13 times.
✗ Branch 554 not taken.
✓ Branch 556 taken 13 times.
✗ Branch 557 not taken.
✓ Branch 559 taken 13 times.
✗ Branch 560 not taken.
✓ Branch 562 taken 13 times.
✗ Branch 563 not taken.
✓ Branch 565 taken 13 times.
✗ Branch 566 not taken.
✓ Branch 568 taken 13 times.
✗ Branch 569 not taken.
✓ Branch 571 taken 13 times.
✗ Branch 572 not taken.
✓ Branch 574 taken 13 times.
✗ Branch 575 not taken.
✓ Branch 577 taken 13 times.
✗ Branch 578 not taken.
✓ Branch 580 taken 13 times.
✗ Branch 581 not taken.
✓ Branch 583 taken 13 times.
✗ Branch 584 not taken.
✓ Branch 586 taken 13 times.
✗ Branch 587 not taken.
✓ Branch 589 taken 13 times.
✗ Branch 590 not taken.
✓ Branch 592 taken 13 times.
✗ Branch 593 not taken.
✓ Branch 595 taken 13 times.
✗ Branch 596 not taken.
✓ Branch 598 taken 13 times.
✗ Branch 599 not taken.
✓ Branch 601 taken 13 times.
✗ Branch 602 not taken.
✓ Branch 604 taken 13 times.
✗ Branch 605 not taken.
✓ Branch 607 taken 13 times.
✗ Branch 608 not taken.
✓ Branch 610 taken 13 times.
✗ Branch 611 not taken.
✓ Branch 613 taken 13 times.
✗ Branch 614 not taken.
✓ Branch 616 taken 13 times.
✗ Branch 617 not taken.
✓ Branch 619 taken 13 times.
✗ Branch 620 not taken.
✓ Branch 622 taken 13 times.
✗ Branch 623 not taken.
✓ Branch 625 taken 13 times.
✗ Branch 626 not taken.
✓ Branch 628 taken 49 times.
✗ Branch 629 not taken.
✓ Branch 631 taken 49 times.
✗ Branch 632 not taken.
✓ Branch 634 taken 49 times.
✗ Branch 635 not taken.
✓ Branch 637 taken 49 times.
✗ Branch 638 not taken.
✓ Branch 640 taken 617 times.
✗ Branch 641 not taken.
✓ Branch 643 taken 617 times.
✗ Branch 644 not taken.
✓ Branch 646 taken 617 times.
✗ Branch 647 not taken.
✓ Branch 649 taken 617 times.
✗ Branch 650 not taken.
✓ Branch 652 taken 13 times.
✗ Branch 653 not taken.
✓ Branch 655 taken 13 times.
✗ Branch 656 not taken.
✓ Branch 658 taken 13 times.
✗ Branch 659 not taken.
✓ Branch 661 taken 13 times.
✗ Branch 662 not taken.
✓ Branch 664 taken 13 times.
✗ Branch 665 not taken.
✓ Branch 667 taken 13 times.
✗ Branch 668 not taken.
✓ Branch 670 taken 13 times.
✗ Branch 671 not taken.
✓ Branch 673 taken 13 times.
✗ Branch 674 not taken.
✓ Branch 676 taken 13 times.
✗ Branch 677 not taken.
✓ Branch 679 taken 13 times.
✗ Branch 680 not taken.
✓ Branch 682 taken 13 times.
✗ Branch 683 not taken.
✓ Branch 685 taken 13 times.
✗ Branch 686 not taken.
✓ Branch 688 taken 13 times.
✗ Branch 689 not taken.
✓ Branch 691 taken 13 times.
✗ Branch 692 not taken.
✓ Branch 694 taken 13 times.
✗ Branch 695 not taken.
✓ Branch 697 taken 13 times.
✗ Branch 698 not taken.
✓ Branch 700 taken 13 times.
✗ Branch 701 not taken.
✓ Branch 703 taken 13 times.
✗ Branch 704 not taken.
✓ Branch 706 taken 13 times.
✗ Branch 707 not taken.
✓ Branch 709 taken 13 times.
✗ Branch 710 not taken.
✓ Branch 712 taken 125 times.
✗ Branch 713 not taken.
✓ Branch 715 taken 125 times.
✗ Branch 716 not taken.
✓ Branch 718 taken 125 times.
✗ Branch 719 not taken.
✓ Branch 721 taken 125 times.
✗ Branch 722 not taken.
|
13395 | mCurrentSettings->mFnAttrs.emplace_back(attr); |
1058 | return *this; | ||
1059 | } | ||
1060 | |||
1061 |
4/8✓ Branch 1 taken 120 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 60 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 114 times.
✗ Branch 11 not taken.
|
4261 | inline FunctionBuilder& setDocumentation(const char* doc) { mDoc = doc; return *this; } |
1062 |
80/160✓ Branch 1 taken 861 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 769 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 109 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 852 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1190 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1035 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 22 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 32 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 35 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 20 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 33 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 27 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 15 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 13 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 13 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 13 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 13 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 13 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 13 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 13 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 13 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 13 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 13 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 13 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 13 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 33 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 13 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 13 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 13 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 13 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 13 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 13 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 13 times.
✗ Branch 107 not taken.
✓ Branch 109 taken 37 times.
✗ Branch 110 not taken.
✓ Branch 112 taken 49 times.
✗ Branch 113 not taken.
✓ Branch 115 taken 50 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 13 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 13 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 13 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 13 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 13 times.
✗ Branch 131 not taken.
✓ Branch 133 taken 13 times.
✗ Branch 134 not taken.
✓ Branch 136 taken 153 times.
✗ Branch 137 not taken.
✓ Branch 139 taken 13 times.
✗ Branch 140 not taken.
✓ Branch 142 taken 13 times.
✗ Branch 143 not taken.
✓ Branch 145 taken 13 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 13 times.
✗ Branch 149 not taken.
✓ Branch 151 taken 13 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 14 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 13 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 85 times.
✗ Branch 161 not taken.
✓ Branch 163 taken 105 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 105 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 13 times.
✗ Branch 170 not taken.
✓ Branch 172 taken 17 times.
✗ Branch 173 not taken.
✓ Branch 175 taken 61 times.
✗ Branch 176 not taken.
✓ Branch 178 taken 113 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 13 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 13 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 13 times.
✗ Branch 188 not taken.
✓ Branch 190 taken 13 times.
✗ Branch 191 not taken.
✓ Branch 193 taken 13 times.
✗ Branch 194 not taken.
✓ Branch 196 taken 13 times.
✗ Branch 197 not taken.
✓ Branch 199 taken 13 times.
✗ Branch 200 not taken.
✓ Branch 202 taken 13 times.
✗ Branch 203 not taken.
✓ Branch 205 taken 13 times.
✗ Branch 206 not taken.
✓ Branch 208 taken 49 times.
✗ Branch 209 not taken.
✓ Branch 211 taken 617 times.
✗ Branch 212 not taken.
✓ Branch 214 taken 13 times.
✗ Branch 215 not taken.
✓ Branch 217 taken 13 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 13 times.
✗ Branch 221 not taken.
✓ Branch 223 taken 13 times.
✗ Branch 224 not taken.
✓ Branch 226 taken 13 times.
✗ Branch 227 not taken.
✓ Branch 229 taken 125 times.
✗ Branch 230 not taken.
✓ Branch 232 taken 1 times.
✗ Branch 233 not taken.
✓ Branch 235 taken 1 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 1 times.
✗ Branch 239 not taken.
|
7217 | inline FunctionBuilder& setPreferredImpl(DeclPreferrence pref) { mDeclPref = pref; return *this; } |
1063 | |||
1064 | 11436 | inline FunctionGroup::UniquePtr get() const | |
1065 | { | ||
1066 |
2/2✓ Branch 0 taken 95390 times.
✓ Branch 1 taken 11436 times.
|
106826 | for (auto& decl : mCFunctions) { |
1067 | 95390 | const auto& s = mSettings.at(decl.get()); | |
1068 |
2/2✓ Branch 1 taken 93583 times.
✓ Branch 2 taken 1807 times.
|
190780 | decl->setDependencies(s->mDeps); |
1069 |
2/2✓ Branch 0 taken 93583 times.
✓ Branch 1 taken 1807 times.
|
95390 | decl->setConstantFold(s->mConstantFold); |
1070 |
2/2✓ Branch 0 taken 93583 times.
✓ Branch 1 taken 1807 times.
|
95390 | if (!s->mFnAttrs.empty()) decl->setFnAttributes(s->mFnAttrs); |
1071 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 95390 times.
|
95390 | if (!s->mRetAttrs.empty()) decl->setRetAttributes(s->mRetAttrs); |
1072 |
2/2✓ Branch 0 taken 90021 times.
✓ Branch 1 taken 5369 times.
|
95390 | if (!s->mParamAttrs.empty()) { |
1073 |
2/2✓ Branch 0 taken 243012 times.
✓ Branch 1 taken 90021 times.
|
333033 | for (auto& idxAttrs : s->mParamAttrs) { |
1074 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 243012 times.
|
243012 | if (idxAttrs.first > decl->size()) continue; |
1075 | 243012 | decl->setParamAttributes(idxAttrs.first, idxAttrs.second); | |
1076 | } | ||
1077 | } | ||
1078 |
2/2✓ Branch 0 taken 7412 times.
✓ Branch 1 taken 87978 times.
|
102802 | if (s->mNames) decl->setArgumentNames(*s->mNames); |
1079 | } | ||
1080 | |||
1081 |
2/2✓ Branch 0 taken 12814 times.
✓ Branch 1 taken 11436 times.
|
24250 | for (auto& decl : mIRFunctions) { |
1082 | 12814 | const auto& s = mSettings.at(decl.get()); | |
1083 |
2/2✓ Branch 1 taken 10521 times.
✓ Branch 2 taken 2293 times.
|
25628 | decl->setDependencies(s->mDeps); |
1084 |
2/2✓ Branch 0 taken 10521 times.
✓ Branch 1 taken 2293 times.
|
12814 | decl->setEmbedIR(s->mEmbedIR); |
1085 |
2/2✓ Branch 0 taken 10521 times.
✓ Branch 1 taken 2293 times.
|
12814 | if (!s->mFnAttrs.empty()) decl->setFnAttributes(s->mFnAttrs); |
1086 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 12814 times.
|
12814 | if (!s->mRetAttrs.empty()) decl->setRetAttributes(s->mRetAttrs); |
1087 |
2/2✓ Branch 0 taken 6754 times.
✓ Branch 1 taken 6060 times.
|
12814 | if (!s->mParamAttrs.empty()) { |
1088 |
2/2✓ Branch 0 taken 27538 times.
✓ Branch 1 taken 6754 times.
|
34292 | for (auto& idxAttrs : s->mParamAttrs) { |
1089 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 27538 times.
|
27538 | if (idxAttrs.first > decl->size()) continue; |
1090 | 27538 | decl->setParamAttributes(idxAttrs.first, idxAttrs.second); | |
1091 | } | ||
1092 | } | ||
1093 |
2/2✓ Branch 0 taken 8173 times.
✓ Branch 1 taken 4641 times.
|
20987 | if (s->mNames) decl->setArgumentNames(*s->mNames); |
1094 | } | ||
1095 | |||
1096 | 11436 | std::vector<Function::Ptr> functions; | |
1097 | |||
1098 |
2/2✓ Branch 0 taken 9018 times.
✓ Branch 1 taken 2418 times.
|
11436 | if (mDeclPref == DeclPreferrence::IR) { |
1099 |
1/2✓ Branch 1 taken 9018 times.
✗ Branch 2 not taken.
|
9018 | functions.insert(functions.end(), mIRFunctions.begin(), mIRFunctions.end()); |
1100 | } | ||
1101 |
2/2✓ Branch 0 taken 2418 times.
✓ Branch 1 taken 9018 times.
|
11436 | if (mDeclPref == DeclPreferrence::C) { |
1102 |
1/2✓ Branch 1 taken 2418 times.
✗ Branch 2 not taken.
|
2418 | functions.insert(functions.end(), mCFunctions.begin(), mCFunctions.end()); |
1103 | } | ||
1104 |
2/2✓ Branch 0 taken 2773 times.
✓ Branch 1 taken 8663 times.
|
11436 | if (functions.empty()) { |
1105 |
2/4✓ Branch 1 taken 2773 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2773 times.
✗ Branch 5 not taken.
|
2773 | functions.insert(functions.end(), mIRFunctions.begin(), mIRFunctions.end()); |
1106 |
1/2✓ Branch 1 taken 2773 times.
✗ Branch 2 not taken.
|
2773 | functions.insert(functions.end(), mCFunctions.begin(), mCFunctions.end()); |
1107 | } | ||
1108 | |||
1109 |
2/4✓ Branch 1 taken 11436 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 11436 times.
✗ Branch 5 not taken.
|
11436 | FunctionGroup::UniquePtr group(new FunctionGroup(mName, mDoc, functions)); |
1110 | 11436 | return group; | |
1111 | } | ||
1112 | |||
1113 | private: | ||
1114 | |||
1115 | template <typename Signature> | ||
1116 | 104156 | std::string genSymbol() const | |
1117 | { | ||
1118 | using Traits = FunctionTraits<Signature>; | ||
1119 | |||
1120 | std::string args; | ||
1121 | 479727 | auto callback = [&args](auto type) { | |
1122 | using Type = decltype(type); | ||
1123 | 656149 | args += TypeToSymbol<Type>::s(); | |
1124 | }; | ||
1125 | |||
1126 | 94945 | ArgumentIterator<Signature>::apply(callback, /*forwards*/true); | |
1127 | /// @note important to prefix all symbols with "ax." so that | ||
1128 | /// they will never conflict with internal llvm symbol | ||
1129 | /// names (such as standard library methods e.g, cos, cosh | ||
1130 | |||
1131 | // assemble the symbol | ||
1132 | 104156 | return "ax." + std::string(this->mName) + "." + | |
1133 | 208312 | TypeToSymbol<typename Traits::ReturnType>::s() + args; | |
1134 | } | ||
1135 | |||
1136 | const char* mName = ""; | ||
1137 | const char* mDoc = ""; | ||
1138 | DeclPreferrence mDeclPref = IR; | ||
1139 | std::vector<CFunctionBase::Ptr> mCFunctions = {}; | ||
1140 | std::vector<IRFunctionBase::Ptr> mIRFunctions = {}; | ||
1141 | std::map<const Function*, Settings::Ptr> mSettings = {}; | ||
1142 | Settings::Ptr mCurrentSettings = nullptr; | ||
1143 | }; | ||
1144 | |||
1145 | } // namespace codegen | ||
1146 | } // namespace ax | ||
1147 | } // namespace OPENVDB_VERSION_NAME | ||
1148 | } // namespace openvdb | ||
1149 | |||
1150 | #endif // OPENVDB_AX_CODEGEN_FUNCTION_TYPES_HAS_BEEN_INCLUDED | ||
1151 | |||
1152 |