| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // Copyright Contributors to the OpenVDB Project | ||
| 2 | // SPDX-License-Identifier: MPL-2.0 | ||
| 3 | |||
| 4 | /// @file codegen/Types.cc | ||
| 5 | /// | ||
| 6 | /// @authors Nick Avramoussis | ||
| 7 | /// | ||
| 8 | |||
| 9 | #include "Types.h" | ||
| 10 | |||
| 11 | namespace openvdb { | ||
| 12 | OPENVDB_USE_VERSION_NAMESPACE | ||
| 13 | namespace OPENVDB_VERSION_NAME { | ||
| 14 | |||
| 15 | namespace ax { | ||
| 16 | namespace codegen { | ||
| 17 | |||
| 18 | /// @brief Returns an llvm IntegerType given a requested size and context | ||
| 19 | /// @param size The number of bits of the integer type | ||
| 20 | /// @param C The LLVMContext to request the Type from. | ||
| 21 | /// | ||
| 22 | llvm::IntegerType* | ||
| 23 | ✗ | llvmIntType(const uint32_t size, llvm::LLVMContext& C) | |
| 24 | { | ||
| 25 | ✗ | switch (size) { | |
| 26 | ✗ | case 1 : return llvm::cast<llvm::IntegerType>(LLVMType<bool>::get(C)); | |
| 27 | ✗ | case 8 : return llvm::cast<llvm::IntegerType>(LLVMType<int8_t>::get(C)); | |
| 28 | ✗ | case 16 : return llvm::cast<llvm::IntegerType>(LLVMType<int16_t>::get(C)); | |
| 29 | ✗ | case 32 : return llvm::cast<llvm::IntegerType>(LLVMType<int32_t>::get(C)); | |
| 30 | ✗ | case 64 : return llvm::cast<llvm::IntegerType>(LLVMType<int64_t>::get(C)); | |
| 31 | ✗ | default : return llvm::Type::getIntNTy(C, size); | |
| 32 | } | ||
| 33 | } | ||
| 34 | |||
| 35 | |||
| 36 | /// @brief Returns an llvm floating point Type given a requested size and context | ||
| 37 | /// @param size The size of the float to request, i.e. float - 32, double - 64 etc. | ||
| 38 | /// @param C The LLVMContext to request the Type from. | ||
| 39 | /// | ||
| 40 | llvm::Type* | ||
| 41 | ✗ | llvmFloatType(const uint32_t size, llvm::LLVMContext& C) | |
| 42 | { | ||
| 43 | ✗ | switch (size) { | |
| 44 | ✗ | case 32 : return LLVMType<float>::get(C); | |
| 45 | ✗ | case 64 : return LLVMType<double>::get(C); | |
| 46 | ✗ | default : OPENVDB_THROW(AXCodeGenError, | |
| 47 | "Invalid float size requested from LLVM Context"); | ||
| 48 | } | ||
| 49 | } | ||
| 50 | |||
| 51 | /// @brief Returns an llvm type representing a type defined by a string. | ||
| 52 | /// @note For string types, this function returns the element type, not the | ||
| 53 | /// object type! The llvm type representing a char block of memory | ||
| 54 | /// is LLVMType<char*>::get(C); | ||
| 55 | /// @param type The name of the type to request. | ||
| 56 | /// @param C The LLVMContext to request the Type from. | ||
| 57 | /// | ||
| 58 | llvm::Type* | ||
| 59 | 54711 | llvmTypeFromToken(const ast::tokens::CoreType& type, | |
| 60 | llvm::LLVMContext& C) | ||
| 61 | { | ||
| 62 |
20/21✓ Branch 0 taken 7241 times.
✓ Branch 1 taken 564 times.
✓ Branch 2 taken 5000 times.
✓ Branch 3 taken 1640 times.
✓ Branch 4 taken 10425 times.
✓ Branch 5 taken 6495 times.
✓ Branch 6 taken 885 times.
✓ Branch 7 taken 929 times.
✓ Branch 8 taken 920 times.
✓ Branch 9 taken 1451 times.
✓ Branch 10 taken 6383 times.
✓ Branch 11 taken 2442 times.
✓ Branch 12 taken 1249 times.
✓ Branch 13 taken 1282 times.
✓ Branch 14 taken 1327 times.
✓ Branch 15 taken 1322 times.
✓ Branch 16 taken 1465 times.
✓ Branch 17 taken 1341 times.
✓ Branch 18 taken 1486 times.
✓ Branch 19 taken 864 times.
✗ Branch 20 not taken.
|
54711 | switch (type) { |
| 63 | 7241 | case ast::tokens::BOOL : return LLVMType<bool>::get(C); | |
| 64 | 564 | case ast::tokens::INT16 : return LLVMType<int16_t>::get(C); | |
| 65 | 5000 | case ast::tokens::INT32 : return LLVMType<int32_t>::get(C); | |
| 66 | 1640 | case ast::tokens::INT64 : return LLVMType<int64_t>::get(C); | |
| 67 | 10425 | case ast::tokens::FLOAT : return LLVMType<float>::get(C); | |
| 68 | 6495 | case ast::tokens::DOUBLE : return LLVMType<double>::get(C); | |
| 69 | 885 | case ast::tokens::VEC2I : return LLVMType<int32_t[2]>::get(C); | |
| 70 | 929 | case ast::tokens::VEC2F : return LLVMType<float[2]>::get(C); | |
| 71 | 920 | case ast::tokens::VEC2D : return LLVMType<double[2]>::get(C); | |
| 72 | 1451 | case ast::tokens::VEC3I : return LLVMType<int32_t[3]>::get(C); | |
| 73 | 6383 | case ast::tokens::VEC3F : return LLVMType<float[3]>::get(C); | |
| 74 | 2442 | case ast::tokens::VEC3D : return LLVMType<double[3]>::get(C); | |
| 75 | 1249 | case ast::tokens::VEC4I : return LLVMType<int32_t[4]>::get(C); | |
| 76 | 1282 | case ast::tokens::VEC4F : return LLVMType<float[4]>::get(C); | |
| 77 | 1327 | case ast::tokens::VEC4D : return LLVMType<double[4]>::get(C); | |
| 78 | 1322 | case ast::tokens::MAT3F : return LLVMType<float[9]>::get(C); | |
| 79 | 1465 | case ast::tokens::MAT3D : return LLVMType<double[9]>::get(C); | |
| 80 | 1341 | case ast::tokens::MAT4F : return LLVMType<float[16]>::get(C); | |
| 81 | 1486 | case ast::tokens::MAT4D : return LLVMType<double[16]>::get(C); | |
| 82 | 864 | case ast::tokens::STRING : return LLVMType<codegen::String>::get(C); | |
| 83 | case ast::tokens::UNKNOWN : | ||
| 84 | default : | ||
| 85 | ✗ | OPENVDB_THROW(AXCodeGenError, | |
| 86 | "Token type not recognised in request for LLVM type"); | ||
| 87 | } | ||
| 88 | } | ||
| 89 | |||
| 90 | ast::tokens::CoreType | ||
| 91 |
2/2✓ Branch 0 taken 23 times.
✓ Branch 1 taken 44 times.
|
67 | tokenFromLLVMType(const llvm::Type* type) |
| 92 | { | ||
| 93 |
2/2✓ Branch 0 taken 23 times.
✓ Branch 1 taken 44 times.
|
67 | if (type->isPointerTy()) { |
| 94 | type = type->getPointerElementType(); | ||
| 95 | } | ||
| 96 |
2/2✓ Branch 1 taken 66 times.
✓ Branch 2 taken 1 times.
|
67 | if (type->isIntegerTy(1)) return ast::tokens::BOOL; |
| 97 |
2/2✓ Branch 1 taken 64 times.
✓ Branch 2 taken 2 times.
|
66 | if (type->isIntegerTy(16)) return ast::tokens::INT16; |
| 98 |
2/2✓ Branch 1 taken 51 times.
✓ Branch 2 taken 13 times.
|
64 | if (type->isIntegerTy(32)) return ast::tokens::INT32; |
| 99 |
2/2✓ Branch 1 taken 44 times.
✓ Branch 2 taken 7 times.
|
51 | if (type->isIntegerTy(64)) return ast::tokens::INT64; |
| 100 |
2/2✓ Branch 0 taken 34 times.
✓ Branch 1 taken 10 times.
|
44 | if (type->isFloatTy()) return ast::tokens::FLOAT; |
| 101 |
2/2✓ Branch 0 taken 28 times.
✓ Branch 1 taken 6 times.
|
34 | if (type->isDoubleTy()) return ast::tokens::DOUBLE; |
| 102 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 8 times.
|
28 | if (type->isArrayTy()) { |
| 103 | const ast::tokens::CoreType elementType = | ||
| 104 | 20 | tokenFromLLVMType(type->getArrayElementType()); | |
| 105 | const size_t size = type->getArrayNumElements(); | ||
| 106 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 17 times.
|
20 | if (size == 2) { |
| 107 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
|
3 | if (elementType == ast::tokens::INT32) return ast::tokens::VEC2I; |
| 108 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
|
2 | if (elementType == ast::tokens::FLOAT) return ast::tokens::VEC2F; |
| 109 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if (elementType == ast::tokens::DOUBLE) return ast::tokens::VEC2D; |
| 110 | } | ||
| 111 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 9 times.
|
17 | else if (size == 3) { |
| 112 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
|
8 | if (elementType == ast::tokens::INT32) return ast::tokens::VEC3I; |
| 113 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
|
6 | if (elementType == ast::tokens::FLOAT) return ast::tokens::VEC3F; |
| 114 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if (elementType == ast::tokens::DOUBLE) return ast::tokens::VEC3D; |
| 115 | } | ||
| 116 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 6 times.
|
9 | else if (size == 4) { |
| 117 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
|
3 | if (elementType == ast::tokens::INT32) return ast::tokens::VEC4I; |
| 118 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
|
2 | if (elementType == ast::tokens::FLOAT) return ast::tokens::VEC4F; |
| 119 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if (elementType == ast::tokens::DOUBLE) return ast::tokens::VEC4D; |
| 120 | } | ||
| 121 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
6 | else if (size == 9) { |
| 122 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
|
3 | if (elementType == ast::tokens::FLOAT) return ast::tokens::MAT3F; |
| 123 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
|
2 | if (elementType == ast::tokens::DOUBLE) return ast::tokens::MAT3D; |
| 124 | } | ||
| 125 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | else if (size == 16) { |
| 126 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
|
3 | if (elementType == ast::tokens::FLOAT) return ast::tokens::MAT4F; |
| 127 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
|
2 | if (elementType == ast::tokens::DOUBLE) return ast::tokens::MAT4D; |
| 128 | } | ||
| 129 | } | ||
| 130 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 7 times.
|
10 | if (type == LLVMType<codegen::String>::get(type->getContext())) { |
| 131 | 3 | return ast::tokens::STRING; | |
| 132 | } | ||
| 133 | return ast::tokens::UNKNOWN; | ||
| 134 | } | ||
| 135 | |||
| 136 | } // namespace codegen | ||
| 137 | } // namespace ax | ||
| 138 | } // namespace OPENVDB_VERSION_NAME | ||
| 139 | } // namespace openvdb | ||
| 140 | |||
| 141 |