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 4: 37 raw_ = CFI_type_float; 38 break; 39 case 8: 40 raw_ = CFI_type_double; 41 break; 42 case 10: 43 case 16: 44 raw_ = CFI_type_long_double; 45 break; 46 } 47 break; 48 case TypeCategory::Complex: 49 switch (kind) { 50 case 4: 51 raw_ = CFI_type_float_Complex; 52 break; 53 case 8: 54 raw_ = CFI_type_double_Complex; 55 break; 56 case 10: 57 case 16: 58 raw_ = CFI_type_long_double_Complex; 59 break; 60 } 61 break; 62 case TypeCategory::Character: 63 switch (kind) { 64 case 1: 65 raw_ = CFI_type_char; 66 break; 67 case 2: 68 raw_ = CFI_type_char16_t; 69 break; 70 case 4: 71 raw_ = CFI_type_char32_t; 72 break; 73 } 74 break; 75 case TypeCategory::Logical: 76 switch (kind) { 77 case 1: 78 raw_ = CFI_type_Bool; 79 break; 80 case 2: 81 raw_ = CFI_type_int_least16_t; 82 break; 83 case 4: 84 raw_ = CFI_type_int_least32_t; 85 break; 86 case 8: 87 raw_ = CFI_type_int_least64_t; 88 break; 89 } 90 break; 91 case TypeCategory::Derived: 92 raw_ = CFI_type_struct; 93 break; 94 } 95 } 96 97 std::optional<std::pair<TypeCategory, int>> 98 TypeCode::GetCategoryAndKind() const { 99 switch (raw_) { 100 case CFI_type_int8_t: 101 return std::make_pair(TypeCategory::Integer, 1); 102 case CFI_type_int16_t: 103 return std::make_pair(TypeCategory::Integer, 2); 104 case CFI_type_int32_t: 105 return std::make_pair(TypeCategory::Integer, 4); 106 case CFI_type_int64_t: 107 return std::make_pair(TypeCategory::Integer, 8); 108 case CFI_type_int128_t: 109 return std::make_pair(TypeCategory::Integer, 16); 110 case CFI_type_float: 111 return std::make_pair(TypeCategory::Real, 4); 112 case CFI_type_double: 113 return std::make_pair(TypeCategory::Real, 8); 114 case CFI_type_long_double: 115 #if __x86_64__ 116 return std::make_pair(TypeCategory::Real, 10); 117 #else 118 return std::make_pair(TypeCategory::Real, 16); 119 #endif 120 case CFI_type_float_Complex: 121 return std::make_pair(TypeCategory::Complex, 4); 122 case CFI_type_double_Complex: 123 return std::make_pair(TypeCategory::Complex, 8); 124 case CFI_type_long_double_Complex: 125 #if __x86_64__ 126 return std::make_pair(TypeCategory::Complex, 10); 127 #else 128 return std::make_pair(TypeCategory::Complex, 16); 129 #endif 130 case CFI_type_char: 131 return std::make_pair(TypeCategory::Character, 1); 132 case CFI_type_char16_t: 133 return std::make_pair(TypeCategory::Character, 2); 134 case CFI_type_char32_t: 135 return std::make_pair(TypeCategory::Character, 4); 136 case CFI_type_Bool: 137 return std::make_pair(TypeCategory::Logical, 1); 138 case CFI_type_int_least8_t: 139 return std::make_pair(TypeCategory::Logical, 1); 140 case CFI_type_int_least16_t: 141 return std::make_pair(TypeCategory::Logical, 2); 142 case CFI_type_int_least32_t: 143 return std::make_pair(TypeCategory::Logical, 4); 144 case CFI_type_int_least64_t: 145 return std::make_pair(TypeCategory::Logical, 8); 146 case CFI_type_struct: 147 return std::make_pair(TypeCategory::Derived, 0); 148 default: 149 return std::nullopt; 150 } 151 } 152 } // namespace Fortran::runtime 153