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
TypeCode(TypeCategory f,int kind)13352d347aSAlexis Perry TypeCode::TypeCode(TypeCategory f, int kind) {
14352d347aSAlexis Perry switch (f) {
15352d347aSAlexis Perry case TypeCategory::Integer:
16352d347aSAlexis Perry switch (kind) {
171f879005STim Keith case 1:
181f879005STim Keith raw_ = CFI_type_int8_t;
191f879005STim Keith break;
201f879005STim Keith case 2:
211f879005STim Keith raw_ = CFI_type_int16_t;
221f879005STim Keith break;
231f879005STim Keith case 4:
241f879005STim Keith raw_ = CFI_type_int32_t;
251f879005STim Keith break;
261f879005STim Keith case 8:
271f879005STim Keith raw_ = CFI_type_int64_t;
281f879005STim Keith break;
291f879005STim Keith case 16:
301f879005STim Keith raw_ = CFI_type_int128_t;
311f879005STim Keith break;
32352d347aSAlexis Perry }
33352d347aSAlexis Perry break;
34352d347aSAlexis Perry case TypeCategory::Real:
35352d347aSAlexis Perry switch (kind) {
36e43b2e4fSV Donaldson case 2:
37e43b2e4fSV Donaldson raw_ = CFI_type_half_float;
38e43b2e4fSV Donaldson break;
39e43b2e4fSV Donaldson case 3:
40e43b2e4fSV Donaldson raw_ = CFI_type_bfloat;
41e43b2e4fSV Donaldson break;
421f879005STim Keith case 4:
431f879005STim Keith raw_ = CFI_type_float;
441f879005STim Keith break;
451f879005STim Keith case 8:
461f879005STim Keith raw_ = CFI_type_double;
471f879005STim Keith break;
48352d347aSAlexis Perry case 10:
49e43b2e4fSV Donaldson raw_ = CFI_type_extended_double;
50e43b2e4fSV Donaldson break;
511f879005STim Keith case 16:
52e43b2e4fSV Donaldson raw_ = CFI_type_float128;
531f879005STim Keith break;
54352d347aSAlexis Perry }
55352d347aSAlexis Perry break;
56352d347aSAlexis Perry case TypeCategory::Complex:
57352d347aSAlexis Perry switch (kind) {
58*a69cb782SJean Perier case 2:
59*a69cb782SJean Perier raw_ = CFI_type_half_float_Complex;
60*a69cb782SJean Perier break;
61*a69cb782SJean Perier case 3:
62*a69cb782SJean Perier raw_ = CFI_type_bfloat_Complex;
63*a69cb782SJean Perier break;
641f879005STim Keith case 4:
651f879005STim Keith raw_ = CFI_type_float_Complex;
661f879005STim Keith break;
671f879005STim Keith case 8:
681f879005STim Keith raw_ = CFI_type_double_Complex;
691f879005STim Keith break;
70352d347aSAlexis Perry case 10:
71*a69cb782SJean Perier raw_ = CFI_type_extended_double_Complex;
72*a69cb782SJean Perier break;
731f879005STim Keith case 16:
741f879005STim Keith raw_ = CFI_type_long_double_Complex;
751f879005STim Keith break;
76352d347aSAlexis Perry }
77352d347aSAlexis Perry break;
78352d347aSAlexis Perry case TypeCategory::Character:
793d627d6fSpeter klausler switch (kind) {
803d627d6fSpeter klausler case 1:
81352d347aSAlexis Perry raw_ = CFI_type_char;
823d627d6fSpeter klausler break;
833d627d6fSpeter klausler case 2:
843d627d6fSpeter klausler raw_ = CFI_type_char16_t;
853d627d6fSpeter klausler break;
863d627d6fSpeter klausler case 4:
873d627d6fSpeter klausler raw_ = CFI_type_char32_t;
883d627d6fSpeter klausler break;
89352d347aSAlexis Perry }
90352d347aSAlexis Perry break;
91352d347aSAlexis Perry case TypeCategory::Logical:
92352d347aSAlexis Perry switch (kind) {
931f879005STim Keith case 1:
941f879005STim Keith raw_ = CFI_type_Bool;
951f879005STim Keith break;
961f879005STim Keith case 2:
97e372e0f9Speter klausler raw_ = CFI_type_int_least16_t;
981f879005STim Keith break;
991f879005STim Keith case 4:
100e372e0f9Speter klausler raw_ = CFI_type_int_least32_t;
1011f879005STim Keith break;
1021f879005STim Keith case 8:
103e372e0f9Speter klausler raw_ = CFI_type_int_least64_t;
1041f879005STim Keith break;
105352d347aSAlexis Perry }
106352d347aSAlexis Perry break;
1071f879005STim Keith case TypeCategory::Derived:
1081f879005STim Keith raw_ = CFI_type_struct;
1091f879005STim Keith break;
110352d347aSAlexis Perry }
111352d347aSAlexis Perry }
112cc01194cSpeter klausler
113cc01194cSpeter klausler std::optional<std::pair<TypeCategory, int>>
GetCategoryAndKind() const114cc01194cSpeter klausler TypeCode::GetCategoryAndKind() const {
115cc01194cSpeter klausler switch (raw_) {
116cc01194cSpeter klausler case CFI_type_int8_t:
117cc01194cSpeter klausler return std::make_pair(TypeCategory::Integer, 1);
118cc01194cSpeter klausler case CFI_type_int16_t:
119cc01194cSpeter klausler return std::make_pair(TypeCategory::Integer, 2);
120cc01194cSpeter klausler case CFI_type_int32_t:
121cc01194cSpeter klausler return std::make_pair(TypeCategory::Integer, 4);
122cc01194cSpeter klausler case CFI_type_int64_t:
123cc01194cSpeter klausler return std::make_pair(TypeCategory::Integer, 8);
124cc01194cSpeter klausler case CFI_type_int128_t:
125cc01194cSpeter klausler return std::make_pair(TypeCategory::Integer, 16);
126e43b2e4fSV Donaldson case CFI_type_half_float:
127e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Real, 2);
128e43b2e4fSV Donaldson case CFI_type_bfloat:
129e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Real, 3);
130cc01194cSpeter klausler case CFI_type_float:
131cc01194cSpeter klausler return std::make_pair(TypeCategory::Real, 4);
132cc01194cSpeter klausler case CFI_type_double:
133cc01194cSpeter klausler return std::make_pair(TypeCategory::Real, 8);
134e43b2e4fSV Donaldson case CFI_type_extended_double:
135e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Real, 10);
136cc01194cSpeter klausler case CFI_type_long_double:
137cc01194cSpeter klausler return std::make_pair(TypeCategory::Real, 16);
138e43b2e4fSV Donaldson case CFI_type_float128:
139e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Real, 16);
140e43b2e4fSV Donaldson case CFI_type_half_float_Complex:
141e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Complex, 2);
142e43b2e4fSV Donaldson case CFI_type_bfloat_Complex:
143e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Complex, 3);
144cc01194cSpeter klausler case CFI_type_float_Complex:
145cc01194cSpeter klausler return std::make_pair(TypeCategory::Complex, 4);
146cc01194cSpeter klausler case CFI_type_double_Complex:
147cc01194cSpeter klausler return std::make_pair(TypeCategory::Complex, 8);
148e43b2e4fSV Donaldson case CFI_type_extended_double_Complex:
149e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Complex, 10);
150cc01194cSpeter klausler case CFI_type_long_double_Complex:
151cc01194cSpeter klausler return std::make_pair(TypeCategory::Complex, 16);
152e43b2e4fSV Donaldson case CFI_type_float128_Complex:
153e43b2e4fSV Donaldson return std::make_pair(TypeCategory::Complex, 16);
154cc01194cSpeter klausler case CFI_type_char:
155cc01194cSpeter klausler return std::make_pair(TypeCategory::Character, 1);
156cc01194cSpeter klausler case CFI_type_char16_t:
157cc01194cSpeter klausler return std::make_pair(TypeCategory::Character, 2);
158cc01194cSpeter klausler case CFI_type_char32_t:
159cc01194cSpeter klausler return std::make_pair(TypeCategory::Character, 4);
160cc01194cSpeter klausler case CFI_type_Bool:
161cc01194cSpeter klausler return std::make_pair(TypeCategory::Logical, 1);
162e372e0f9Speter klausler case CFI_type_int_least8_t:
163cc01194cSpeter klausler return std::make_pair(TypeCategory::Logical, 1);
164e372e0f9Speter klausler case CFI_type_int_least16_t:
165cc01194cSpeter klausler return std::make_pair(TypeCategory::Logical, 2);
166e372e0f9Speter klausler case CFI_type_int_least32_t:
167cc01194cSpeter klausler return std::make_pair(TypeCategory::Logical, 4);
168e372e0f9Speter klausler case CFI_type_int_least64_t:
169cc01194cSpeter klausler return std::make_pair(TypeCategory::Logical, 8);
170cc01194cSpeter klausler case CFI_type_struct:
171cc01194cSpeter klausler return std::make_pair(TypeCategory::Derived, 0);
172cc01194cSpeter klausler default:
173cc01194cSpeter klausler return std::nullopt;
174cc01194cSpeter klausler }
175cc01194cSpeter klausler }
1761f879005STim Keith } // namespace Fortran::runtime
177