243 lines · cpp
1//===-- lib/runtime/type-code.cpp -------------------------------*- C++ -*-===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "flang-rt/runtime/type-code.h"10 11namespace Fortran::runtime {12 13RT_OFFLOAD_API_GROUP_BEGIN14 15RT_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_float128_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 134RT_API_ATTRS common::optional<std::pair<TypeCategory, int>>135TypeCode::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 common::nullopt;237 }238}239 240RT_OFFLOAD_API_GROUP_END241 242} // namespace Fortran::runtime243