brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.0 KiB · 68093de Raw
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