1352d347aSAlexis Perry //===-- runtime/type-code.cpp ---------------------------------------------===// 2352d347aSAlexis Perry // 3352d347aSAlexis Perry // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4352d347aSAlexis Perry // See https://llvm.org/LICENSE.txt for license information. 5352d347aSAlexis Perry // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6352d347aSAlexis Perry // 7352d347aSAlexis Perry //===----------------------------------------------------------------------===// 8352d347aSAlexis Perry 9830c0b90SPeter Klausler #include "flang/Runtime/type-code.h" 10352d347aSAlexis Perry 11352d347aSAlexis Perry namespace Fortran::runtime { 12352d347aSAlexis Perry 134bdec583SSlava Zakharin RT_OFFLOAD_API_GROUP_BEGIN 144bdec583SSlava Zakharin 154bdec583SSlava Zakharin RT_API_ATTRS TypeCode::TypeCode(TypeCategory f, int kind) { 16352d347aSAlexis Perry switch (f) { 17352d347aSAlexis Perry case TypeCategory::Integer: 18352d347aSAlexis Perry switch (kind) { 191f879005STim Keith case 1: 201f879005STim Keith raw_ = CFI_type_int8_t; 211f879005STim Keith break; 221f879005STim Keith case 2: 231f879005STim Keith raw_ = CFI_type_int16_t; 241f879005STim Keith break; 251f879005STim Keith case 4: 261f879005STim Keith raw_ = CFI_type_int32_t; 271f879005STim Keith break; 281f879005STim Keith case 8: 291f879005STim Keith raw_ = CFI_type_int64_t; 301f879005STim Keith break; 311f879005STim Keith case 16: 321f879005STim Keith raw_ = CFI_type_int128_t; 331f879005STim Keith break; 34352d347aSAlexis Perry } 35352d347aSAlexis Perry break; 36*fc97d2e6SPeter Klausler case TypeCategory::Unsigned: 37*fc97d2e6SPeter Klausler switch (kind) { 38*fc97d2e6SPeter Klausler case 1: 39*fc97d2e6SPeter Klausler raw_ = CFI_type_uint8_t; 40*fc97d2e6SPeter Klausler break; 41*fc97d2e6SPeter Klausler case 2: 42*fc97d2e6SPeter Klausler raw_ = CFI_type_uint16_t; 43*fc97d2e6SPeter Klausler break; 44*fc97d2e6SPeter Klausler case 4: 45*fc97d2e6SPeter Klausler raw_ = CFI_type_uint32_t; 46*fc97d2e6SPeter Klausler break; 47*fc97d2e6SPeter Klausler case 8: 48*fc97d2e6SPeter Klausler raw_ = CFI_type_uint64_t; 49*fc97d2e6SPeter Klausler break; 50*fc97d2e6SPeter Klausler case 16: 51*fc97d2e6SPeter Klausler raw_ = CFI_type_uint128_t; 52*fc97d2e6SPeter Klausler break; 53*fc97d2e6SPeter Klausler } 54*fc97d2e6SPeter Klausler break; 55352d347aSAlexis Perry case TypeCategory::Real: 56352d347aSAlexis Perry switch (kind) { 57e43b2e4fSV Donaldson case 2: 58e43b2e4fSV Donaldson raw_ = CFI_type_half_float; 59e43b2e4fSV Donaldson break; 60e43b2e4fSV Donaldson case 3: 61e43b2e4fSV Donaldson raw_ = CFI_type_bfloat; 62e43b2e4fSV Donaldson break; 631f879005STim Keith case 4: 641f879005STim Keith raw_ = CFI_type_float; 651f879005STim Keith break; 661f879005STim Keith case 8: 671f879005STim Keith raw_ = CFI_type_double; 681f879005STim Keith break; 69352d347aSAlexis Perry case 10: 70e43b2e4fSV Donaldson raw_ = CFI_type_extended_double; 71e43b2e4fSV Donaldson break; 721f879005STim Keith case 16: 73e43b2e4fSV Donaldson raw_ = CFI_type_float128; 741f879005STim Keith break; 75352d347aSAlexis Perry } 76352d347aSAlexis Perry break; 77352d347aSAlexis Perry case TypeCategory::Complex: 78352d347aSAlexis Perry switch (kind) { 79a69cb782SJean Perier case 2: 80a69cb782SJean Perier raw_ = CFI_type_half_float_Complex; 81a69cb782SJean Perier break; 82a69cb782SJean Perier case 3: 83a69cb782SJean Perier raw_ = CFI_type_bfloat_Complex; 84a69cb782SJean Perier break; 851f879005STim Keith case 4: 861f879005STim Keith raw_ = CFI_type_float_Complex; 871f879005STim Keith break; 881f879005STim Keith case 8: 891f879005STim Keith raw_ = CFI_type_double_Complex; 901f879005STim Keith break; 91352d347aSAlexis Perry case 10: 92a69cb782SJean Perier raw_ = CFI_type_extended_double_Complex; 93a69cb782SJean Perier break; 941f879005STim Keith case 16: 951f879005STim Keith raw_ = CFI_type_long_double_Complex; 961f879005STim Keith break; 97352d347aSAlexis Perry } 98352d347aSAlexis Perry break; 99352d347aSAlexis Perry case TypeCategory::Character: 1003d627d6fSpeter klausler switch (kind) { 1013d627d6fSpeter klausler case 1: 102352d347aSAlexis Perry raw_ = CFI_type_char; 1033d627d6fSpeter klausler break; 1043d627d6fSpeter klausler case 2: 1053d627d6fSpeter klausler raw_ = CFI_type_char16_t; 1063d627d6fSpeter klausler break; 1073d627d6fSpeter klausler case 4: 1083d627d6fSpeter klausler raw_ = CFI_type_char32_t; 1093d627d6fSpeter klausler break; 110352d347aSAlexis Perry } 111352d347aSAlexis Perry break; 112352d347aSAlexis Perry case TypeCategory::Logical: 113352d347aSAlexis Perry switch (kind) { 1141f879005STim Keith case 1: 1151f879005STim Keith raw_ = CFI_type_Bool; 1161f879005STim Keith break; 1171f879005STim Keith case 2: 118e372e0f9Speter klausler raw_ = CFI_type_int_least16_t; 1191f879005STim Keith break; 1201f879005STim Keith case 4: 121e372e0f9Speter klausler raw_ = CFI_type_int_least32_t; 1221f879005STim Keith break; 1231f879005STim Keith case 8: 124e372e0f9Speter klausler raw_ = CFI_type_int_least64_t; 1251f879005STim Keith break; 126352d347aSAlexis Perry } 127352d347aSAlexis Perry break; 1281f879005STim Keith case TypeCategory::Derived: 1291f879005STim Keith raw_ = CFI_type_struct; 1301f879005STim Keith break; 131352d347aSAlexis Perry } 132352d347aSAlexis Perry } 133cc01194cSpeter klausler 13471e0261fSSlava Zakharin RT_API_ATTRS Fortran::common::optional<std::pair<TypeCategory, int>> 135cc01194cSpeter klausler TypeCode::GetCategoryAndKind() const { 136cc01194cSpeter klausler switch (raw_) { 137d37250c9SSlava Zakharin case CFI_type_signed_char: 138d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Character, sizeof(signed char)); 139d37250c9SSlava Zakharin case CFI_type_short: 140d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, sizeof(short)); 141d37250c9SSlava Zakharin case CFI_type_int: 142d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, sizeof(int)); 143d37250c9SSlava Zakharin case CFI_type_long: 144d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, sizeof(long)); 145d37250c9SSlava Zakharin case CFI_type_long_long: 146d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, sizeof(long long)); 147d37250c9SSlava Zakharin case CFI_type_size_t: 148d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, sizeof(std::size_t)); 149cc01194cSpeter klausler case CFI_type_int8_t: 150cc01194cSpeter klausler return std::make_pair(TypeCategory::Integer, 1); 151cc01194cSpeter klausler case CFI_type_int16_t: 152cc01194cSpeter klausler return std::make_pair(TypeCategory::Integer, 2); 153cc01194cSpeter klausler case CFI_type_int32_t: 154cc01194cSpeter klausler return std::make_pair(TypeCategory::Integer, 4); 155cc01194cSpeter klausler case CFI_type_int64_t: 156cc01194cSpeter klausler return std::make_pair(TypeCategory::Integer, 8); 157cc01194cSpeter klausler case CFI_type_int128_t: 158cc01194cSpeter klausler return std::make_pair(TypeCategory::Integer, 16); 159d37250c9SSlava Zakharin case CFI_type_int_least8_t: 160d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Logical, 1); 161d37250c9SSlava Zakharin case CFI_type_int_least16_t: 162d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Logical, 2); 163d37250c9SSlava Zakharin case CFI_type_int_least32_t: 164d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Logical, 4); 165d37250c9SSlava Zakharin case CFI_type_int_least64_t: 166d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Logical, 8); 167d37250c9SSlava Zakharin case CFI_type_int_least128_t: 168d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, 16); 169d37250c9SSlava Zakharin case CFI_type_int_fast8_t: 170d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast8_t)); 171d37250c9SSlava Zakharin case CFI_type_int_fast16_t: 172d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast16_t)); 173d37250c9SSlava Zakharin case CFI_type_int_fast32_t: 174d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast32_t)); 175d37250c9SSlava Zakharin case CFI_type_int_fast64_t: 176d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast64_t)); 177d37250c9SSlava Zakharin case CFI_type_int_fast128_t: 178d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, 16); 179d37250c9SSlava Zakharin case CFI_type_intmax_t: 180d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, sizeof(std::intmax_t)); 181d37250c9SSlava Zakharin case CFI_type_intptr_t: 182d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, sizeof(std::intptr_t)); 183d37250c9SSlava Zakharin case CFI_type_ptrdiff_t: 184d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, sizeof(std::ptrdiff_t)); 185e43b2e4fSV Donaldson case CFI_type_half_float: 186e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Real, 2); 187e43b2e4fSV Donaldson case CFI_type_bfloat: 188e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Real, 3); 189cc01194cSpeter klausler case CFI_type_float: 190cc01194cSpeter klausler return std::make_pair(TypeCategory::Real, 4); 191cc01194cSpeter klausler case CFI_type_double: 192cc01194cSpeter klausler return std::make_pair(TypeCategory::Real, 8); 193e43b2e4fSV Donaldson case CFI_type_extended_double: 194e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Real, 10); 195cc01194cSpeter klausler case CFI_type_long_double: 196cc01194cSpeter klausler return std::make_pair(TypeCategory::Real, 16); 197e43b2e4fSV Donaldson case CFI_type_float128: 198e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Real, 16); 199e43b2e4fSV Donaldson case CFI_type_half_float_Complex: 200e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Complex, 2); 201e43b2e4fSV Donaldson case CFI_type_bfloat_Complex: 202e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Complex, 3); 203cc01194cSpeter klausler case CFI_type_float_Complex: 204cc01194cSpeter klausler return std::make_pair(TypeCategory::Complex, 4); 205cc01194cSpeter klausler case CFI_type_double_Complex: 206cc01194cSpeter klausler return std::make_pair(TypeCategory::Complex, 8); 207e43b2e4fSV Donaldson case CFI_type_extended_double_Complex: 208e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Complex, 10); 209cc01194cSpeter klausler case CFI_type_long_double_Complex: 210cc01194cSpeter klausler return std::make_pair(TypeCategory::Complex, 16); 211e43b2e4fSV Donaldson case CFI_type_float128_Complex: 212e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Complex, 16); 213d37250c9SSlava Zakharin case CFI_type_Bool: 214d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Logical, 1); 215cc01194cSpeter klausler case CFI_type_char: 216cc01194cSpeter klausler return std::make_pair(TypeCategory::Character, 1); 217d37250c9SSlava Zakharin case CFI_type_cptr: 218d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Integer, sizeof(void *)); 219d37250c9SSlava Zakharin case CFI_type_struct: 220d37250c9SSlava Zakharin return std::make_pair(TypeCategory::Derived, 0); 221cc01194cSpeter klausler case CFI_type_char16_t: 222cc01194cSpeter klausler return std::make_pair(TypeCategory::Character, 2); 223cc01194cSpeter klausler case CFI_type_char32_t: 224cc01194cSpeter klausler return std::make_pair(TypeCategory::Character, 4); 225*fc97d2e6SPeter Klausler case CFI_type_uint8_t: 226*fc97d2e6SPeter Klausler return std::make_pair(TypeCategory::Unsigned, 1); 227*fc97d2e6SPeter Klausler case CFI_type_uint16_t: 228*fc97d2e6SPeter Klausler return std::make_pair(TypeCategory::Unsigned, 2); 229*fc97d2e6SPeter Klausler case CFI_type_uint32_t: 230*fc97d2e6SPeter Klausler return std::make_pair(TypeCategory::Unsigned, 4); 231*fc97d2e6SPeter Klausler case CFI_type_uint64_t: 232*fc97d2e6SPeter Klausler return std::make_pair(TypeCategory::Unsigned, 8); 233*fc97d2e6SPeter Klausler case CFI_type_uint128_t: 234*fc97d2e6SPeter Klausler return std::make_pair(TypeCategory::Unsigned, 16); 235cc01194cSpeter klausler default: 23671e0261fSSlava Zakharin return Fortran::common::nullopt; 237cc01194cSpeter klausler } 238cc01194cSpeter klausler } 2394bdec583SSlava Zakharin 2404bdec583SSlava Zakharin RT_OFFLOAD_API_GROUP_END 2414bdec583SSlava Zakharin 2421f879005STim Keith } // namespace Fortran::runtime 243