1 //===-- runtime/type-code.cpp ---------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "flang/Runtime/type-code.h" 10 11 namespace Fortran::runtime { 12 13 TypeCode::TypeCode(TypeCategory f, int kind) { 14 switch (f) { 15 case TypeCategory::Integer: 16 switch (kind) { 17 case 1: 18 raw_ = CFI_type_int8_t; 19 break; 20 case 2: 21 raw_ = CFI_type_int16_t; 22 break; 23 case 4: 24 raw_ = CFI_type_int32_t; 25 break; 26 case 8: 27 raw_ = CFI_type_int64_t; 28 break; 29 case 16: 30 raw_ = CFI_type_int128_t; 31 break; 32 } 33 break; 34 case TypeCategory::Real: 35 switch (kind) { 36 case 2: 37 raw_ = CFI_type_half_float; 38 break; 39 case 3: 40 raw_ = CFI_type_bfloat; 41 break; 42 case 4: 43 raw_ = CFI_type_float; 44 break; 45 case 8: 46 raw_ = CFI_type_double; 47 break; 48 case 10: 49 raw_ = CFI_type_extended_double; 50 break; 51 case 16: 52 raw_ = CFI_type_float128; 53 break; 54 } 55 break; 56 case TypeCategory::Complex: 57 switch (kind) { 58 case 4: 59 raw_ = CFI_type_float_Complex; 60 break; 61 case 8: 62 raw_ = CFI_type_double_Complex; 63 break; 64 case 10: 65 case 16: 66 raw_ = CFI_type_long_double_Complex; 67 break; 68 } 69 break; 70 case TypeCategory::Character: 71 switch (kind) { 72 case 1: 73 raw_ = CFI_type_char; 74 break; 75 case 2: 76 raw_ = CFI_type_char16_t; 77 break; 78 case 4: 79 raw_ = CFI_type_char32_t; 80 break; 81 } 82 break; 83 case TypeCategory::Logical: 84 switch (kind) { 85 case 1: 86 raw_ = CFI_type_Bool; 87 break; 88 case 2: 89 raw_ = CFI_type_int_least16_t; 90 break; 91 case 4: 92 raw_ = CFI_type_int_least32_t; 93 break; 94 case 8: 95 raw_ = CFI_type_int_least64_t; 96 break; 97 } 98 break; 99 case TypeCategory::Derived: 100 raw_ = CFI_type_struct; 101 break; 102 } 103 } 104 105 std::optional<std::pair<TypeCategory, int>> 106 TypeCode::GetCategoryAndKind() const { 107 switch (raw_) { 108 case CFI_type_int8_t: 109 return std::make_pair(TypeCategory::Integer, 1); 110 case CFI_type_int16_t: 111 return std::make_pair(TypeCategory::Integer, 2); 112 case CFI_type_int32_t: 113 return std::make_pair(TypeCategory::Integer, 4); 114 case CFI_type_int64_t: 115 return std::make_pair(TypeCategory::Integer, 8); 116 case CFI_type_int128_t: 117 return std::make_pair(TypeCategory::Integer, 16); 118 case CFI_type_half_float: 119 return std::make_pair(TypeCategory::Real, 2); 120 case CFI_type_bfloat: 121 return std::make_pair(TypeCategory::Real, 3); 122 case CFI_type_float: 123 return std::make_pair(TypeCategory::Real, 4); 124 case CFI_type_double: 125 return std::make_pair(TypeCategory::Real, 8); 126 case CFI_type_extended_double: 127 return std::make_pair(TypeCategory::Real, 10); 128 case CFI_type_long_double: 129 #if __x86_64__ 130 return std::make_pair(TypeCategory::Real, 10); 131 #else 132 return std::make_pair(TypeCategory::Real, 16); 133 #endif 134 case CFI_type_float128: 135 return std::make_pair(TypeCategory::Real, 16); 136 case CFI_type_half_float_Complex: 137 return std::make_pair(TypeCategory::Complex, 2); 138 case CFI_type_bfloat_Complex: 139 return std::make_pair(TypeCategory::Complex, 3); 140 case CFI_type_float_Complex: 141 return std::make_pair(TypeCategory::Complex, 4); 142 case CFI_type_double_Complex: 143 return std::make_pair(TypeCategory::Complex, 8); 144 case CFI_type_extended_double_Complex: 145 return std::make_pair(TypeCategory::Complex, 10); 146 case CFI_type_long_double_Complex: 147 #if __x86_64__ 148 return std::make_pair(TypeCategory::Complex, 10); 149 #else 150 return std::make_pair(TypeCategory::Complex, 16); 151 #endif 152 case CFI_type_float128_Complex: 153 return std::make_pair(TypeCategory::Complex, 16); 154 case CFI_type_char: 155 return std::make_pair(TypeCategory::Character, 1); 156 case CFI_type_char16_t: 157 return std::make_pair(TypeCategory::Character, 2); 158 case CFI_type_char32_t: 159 return std::make_pair(TypeCategory::Character, 4); 160 case CFI_type_Bool: 161 return std::make_pair(TypeCategory::Logical, 1); 162 case CFI_type_int_least8_t: 163 return std::make_pair(TypeCategory::Logical, 1); 164 case CFI_type_int_least16_t: 165 return std::make_pair(TypeCategory::Logical, 2); 166 case CFI_type_int_least32_t: 167 return std::make_pair(TypeCategory::Logical, 4); 168 case CFI_type_int_least64_t: 169 return std::make_pair(TypeCategory::Logical, 8); 170 case CFI_type_struct: 171 return std::make_pair(TypeCategory::Derived, 0); 172 default: 173 return std::nullopt; 174 } 175 } 176 } // namespace Fortran::runtime 177