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