xref: /llvm-project/flang/runtime/type-code.cpp (revision fc97d2e68b03bc2979395e84b645e5b3ba35aecd)
1 //===-- runtime/type-code.cpp ---------------------------------------------===//
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "flang/Runtime/type-code.h"
10 
11 namespace Fortran::runtime {
12 
13 RT_OFFLOAD_API_GROUP_BEGIN
14 
15 RT_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_long_double_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 
134 RT_API_ATTRS Fortran::common::optional<std::pair<TypeCategory, int>>
135 TypeCode::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 Fortran::common::nullopt;
237   }
238 }
239 
240 RT_OFFLOAD_API_GROUP_END
241 
242 } // namespace Fortran::runtime
243