1 | //===-- lib/runtime/type-code.cpp -------------------------------*- C++ -*-===// |
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-rt/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 | |