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 RT_OFFLOAD_API_GROUP_BEGIN 14 15 RT_API_ATTRS TypeCode::TypeCode(TypeCategory f, int kind) { 16 switch (f) { 17 case TypeCategory::Integer: 18 switch (kind) { 19 case 1: 20 raw_ = CFI_type_int8_t; 21 break; 22 case 2: 23 raw_ = CFI_type_int16_t; 24 break; 25 case 4: 26 raw_ = CFI_type_int32_t; 27 break; 28 case 8: 29 raw_ = CFI_type_int64_t; 30 break; 31 case 16: 32 raw_ = CFI_type_int128_t; 33 break; 34 } 35 break; 36 case TypeCategory::Unsigned: 37 switch (kind) { 38 case 1: 39 raw_ = CFI_type_uint8_t; 40 break; 41 case 2: 42 raw_ = CFI_type_uint16_t; 43 break; 44 case 4: 45 raw_ = CFI_type_uint32_t; 46 break; 47 case 8: 48 raw_ = CFI_type_uint64_t; 49 break; 50 case 16: 51 raw_ = CFI_type_uint128_t; 52 break; 53 } 54 break; 55 case TypeCategory::Real: 56 switch (kind) { 57 case 2: 58 raw_ = CFI_type_half_float; 59 break; 60 case 3: 61 raw_ = CFI_type_bfloat; 62 break; 63 case 4: 64 raw_ = CFI_type_float; 65 break; 66 case 8: 67 raw_ = CFI_type_double; 68 break; 69 case 10: 70 raw_ = CFI_type_extended_double; 71 break; 72 case 16: 73 raw_ = CFI_type_float128; 74 break; 75 } 76 break; 77 case TypeCategory::Complex: 78 switch (kind) { 79 case 2: 80 raw_ = CFI_type_half_float_Complex; 81 break; 82 case 3: 83 raw_ = CFI_type_bfloat_Complex; 84 break; 85 case 4: 86 raw_ = CFI_type_float_Complex; 87 break; 88 case 8: 89 raw_ = CFI_type_double_Complex; 90 break; 91 case 10: 92 raw_ = CFI_type_extended_double_Complex; 93 break; 94 case 16: 95 raw_ = CFI_type_long_double_Complex; 96 break; 97 } 98 break; 99 case TypeCategory::Character: 100 switch (kind) { 101 case 1: 102 raw_ = CFI_type_char; 103 break; 104 case 2: 105 raw_ = CFI_type_char16_t; 106 break; 107 case 4: 108 raw_ = CFI_type_char32_t; 109 break; 110 } 111 break; 112 case TypeCategory::Logical: 113 switch (kind) { 114 case 1: 115 raw_ = CFI_type_Bool; 116 break; 117 case 2: 118 raw_ = CFI_type_int_least16_t; 119 break; 120 case 4: 121 raw_ = CFI_type_int_least32_t; 122 break; 123 case 8: 124 raw_ = CFI_type_int_least64_t; 125 break; 126 } 127 break; 128 case TypeCategory::Derived: 129 raw_ = CFI_type_struct; 130 break; 131 } 132 } 133 134 RT_API_ATTRS Fortran::common::optional<std::pair<TypeCategory, int>> 135 TypeCode::GetCategoryAndKind() const { 136 switch (raw_) { 137 case CFI_type_signed_char: 138 return std::make_pair(TypeCategory::Character, sizeof(signed char)); 139 case CFI_type_short: 140 return std::make_pair(TypeCategory::Integer, sizeof(short)); 141 case CFI_type_int: 142 return std::make_pair(TypeCategory::Integer, sizeof(int)); 143 case CFI_type_long: 144 return std::make_pair(TypeCategory::Integer, sizeof(long)); 145 case CFI_type_long_long: 146 return std::make_pair(TypeCategory::Integer, sizeof(long long)); 147 case CFI_type_size_t: 148 return std::make_pair(TypeCategory::Integer, sizeof(std::size_t)); 149 case CFI_type_int8_t: 150 return std::make_pair(TypeCategory::Integer, 1); 151 case CFI_type_int16_t: 152 return std::make_pair(TypeCategory::Integer, 2); 153 case CFI_type_int32_t: 154 return std::make_pair(TypeCategory::Integer, 4); 155 case CFI_type_int64_t: 156 return std::make_pair(TypeCategory::Integer, 8); 157 case CFI_type_int128_t: 158 return std::make_pair(TypeCategory::Integer, 16); 159 case CFI_type_int_least8_t: 160 return std::make_pair(TypeCategory::Logical, 1); 161 case CFI_type_int_least16_t: 162 return std::make_pair(TypeCategory::Logical, 2); 163 case CFI_type_int_least32_t: 164 return std::make_pair(TypeCategory::Logical, 4); 165 case CFI_type_int_least64_t: 166 return std::make_pair(TypeCategory::Logical, 8); 167 case CFI_type_int_least128_t: 168 return std::make_pair(TypeCategory::Integer, 16); 169 case CFI_type_int_fast8_t: 170 return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast8_t)); 171 case CFI_type_int_fast16_t: 172 return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast16_t)); 173 case CFI_type_int_fast32_t: 174 return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast32_t)); 175 case CFI_type_int_fast64_t: 176 return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast64_t)); 177 case CFI_type_int_fast128_t: 178 return std::make_pair(TypeCategory::Integer, 16); 179 case CFI_type_intmax_t: 180 return std::make_pair(TypeCategory::Integer, sizeof(std::intmax_t)); 181 case CFI_type_intptr_t: 182 return std::make_pair(TypeCategory::Integer, sizeof(std::intptr_t)); 183 case CFI_type_ptrdiff_t: 184 return std::make_pair(TypeCategory::Integer, sizeof(std::ptrdiff_t)); 185 case CFI_type_half_float: 186 return std::make_pair(TypeCategory::Real, 2); 187 case CFI_type_bfloat: 188 return std::make_pair(TypeCategory::Real, 3); 189 case CFI_type_float: 190 return std::make_pair(TypeCategory::Real, 4); 191 case CFI_type_double: 192 return std::make_pair(TypeCategory::Real, 8); 193 case CFI_type_extended_double: 194 return std::make_pair(TypeCategory::Real, 10); 195 case CFI_type_long_double: 196 return std::make_pair(TypeCategory::Real, 16); 197 case CFI_type_float128: 198 return std::make_pair(TypeCategory::Real, 16); 199 case CFI_type_half_float_Complex: 200 return std::make_pair(TypeCategory::Complex, 2); 201 case CFI_type_bfloat_Complex: 202 return std::make_pair(TypeCategory::Complex, 3); 203 case CFI_type_float_Complex: 204 return std::make_pair(TypeCategory::Complex, 4); 205 case CFI_type_double_Complex: 206 return std::make_pair(TypeCategory::Complex, 8); 207 case CFI_type_extended_double_Complex: 208 return std::make_pair(TypeCategory::Complex, 10); 209 case CFI_type_long_double_Complex: 210 return std::make_pair(TypeCategory::Complex, 16); 211 case CFI_type_float128_Complex: 212 return std::make_pair(TypeCategory::Complex, 16); 213 case CFI_type_Bool: 214 return std::make_pair(TypeCategory::Logical, 1); 215 case CFI_type_char: 216 return std::make_pair(TypeCategory::Character, 1); 217 case CFI_type_cptr: 218 return std::make_pair(TypeCategory::Integer, sizeof(void *)); 219 case CFI_type_struct: 220 return std::make_pair(TypeCategory::Derived, 0); 221 case CFI_type_char16_t: 222 return std::make_pair(TypeCategory::Character, 2); 223 case CFI_type_char32_t: 224 return std::make_pair(TypeCategory::Character, 4); 225 case CFI_type_uint8_t: 226 return std::make_pair(TypeCategory::Unsigned, 1); 227 case CFI_type_uint16_t: 228 return std::make_pair(TypeCategory::Unsigned, 2); 229 case CFI_type_uint32_t: 230 return std::make_pair(TypeCategory::Unsigned, 4); 231 case CFI_type_uint64_t: 232 return std::make_pair(TypeCategory::Unsigned, 8); 233 case CFI_type_uint128_t: 234 return std::make_pair(TypeCategory::Unsigned, 16); 235 default: 236 return Fortran::common::nullopt; 237 } 238 } 239 240 RT_OFFLOAD_API_GROUP_END 241 242 } // namespace Fortran::runtime 243