xref: /llvm-project/flang/runtime/type-code.cpp (revision fc97d2e68b03bc2979395e84b645e5b3ba35aecd)
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