1 //===-- runtime/type-code.cpp ---------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 #include "flang/Runtime/type-code.h"
11 namespace Fortran::runtime
{
13 RT_OFFLOAD_API_GROUP_BEGIN
15 RT_API_ATTRS
TypeCode::TypeCode(TypeCategory f
, int kind
) {
17 case TypeCategory::Integer
:
20 raw_
= CFI_type_int8_t
;
23 raw_
= CFI_type_int16_t
;
26 raw_
= CFI_type_int32_t
;
29 raw_
= CFI_type_int64_t
;
32 raw_
= CFI_type_int128_t
;
36 case TypeCategory::Unsigned
:
39 raw_
= CFI_type_uint8_t
;
42 raw_
= CFI_type_uint16_t
;
45 raw_
= CFI_type_uint32_t
;
48 raw_
= CFI_type_uint64_t
;
51 raw_
= CFI_type_uint128_t
;
55 case TypeCategory::Real
:
58 raw_
= CFI_type_half_float
;
61 raw_
= CFI_type_bfloat
;
64 raw_
= CFI_type_float
;
67 raw_
= CFI_type_double
;
70 raw_
= CFI_type_extended_double
;
73 raw_
= CFI_type_float128
;
77 case TypeCategory::Complex
:
80 raw_
= CFI_type_half_float_Complex
;
83 raw_
= CFI_type_bfloat_Complex
;
86 raw_
= CFI_type_float_Complex
;
89 raw_
= CFI_type_double_Complex
;
92 raw_
= CFI_type_extended_double_Complex
;
95 raw_
= CFI_type_long_double_Complex
;
99 case TypeCategory::Character
:
102 raw_
= CFI_type_char
;
105 raw_
= CFI_type_char16_t
;
108 raw_
= CFI_type_char32_t
;
112 case TypeCategory::Logical
:
115 raw_
= CFI_type_Bool
;
118 raw_
= CFI_type_int_least16_t
;
121 raw_
= CFI_type_int_least32_t
;
124 raw_
= CFI_type_int_least64_t
;
128 case TypeCategory::Derived
:
129 raw_
= CFI_type_struct
;
134 RT_API_ATTRS
Fortran::common::optional
<std::pair
<TypeCategory
, int>>
135 TypeCode::GetCategoryAndKind() const {
137 case CFI_type_signed_char
:
138 return std::make_pair(TypeCategory::Character
, sizeof(signed char));
140 return std::make_pair(TypeCategory::Integer
, sizeof(short));
142 return std::make_pair(TypeCategory::Integer
, sizeof(int));
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);
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);
214 return std::make_pair(TypeCategory::Logical
, 1);
216 return std::make_pair(TypeCategory::Character
, 1);
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);
236 return Fortran::common::nullopt
;
240 RT_OFFLOAD_API_GROUP_END
242 } // namespace Fortran::runtime