1 /* Convert types from GDB to GCC
3 Copyright (C) 2014-2022 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 #include "compile-internal.h"
24 #include "compile-c.h"
27 /* Convert a pointer type to its gcc representation. */
30 convert_pointer (compile_c_instance
*context
, struct type
*type
)
32 gcc_type target
= context
->convert_type (TYPE_TARGET_TYPE (type
));
34 return context
->plugin ().build_pointer_type (target
);
37 /* Convert an array type to its gcc representation. */
40 convert_array (compile_c_instance
*context
, struct type
*type
)
42 gcc_type element_type
;
43 struct type
*range
= type
->index_type ();
45 element_type
= context
->convert_type (TYPE_TARGET_TYPE (type
));
47 if (range
->bounds ()->low
.kind () != PROP_CONST
)
48 return context
->plugin ().error (_("array type with non-constant"
49 " lower bound is not supported"));
50 if (range
->bounds ()->low
.const_val () != 0)
51 return context
->plugin ().error (_("cannot convert array type with "
52 "non-zero lower bound to C"));
54 if (range
->bounds ()->high
.kind () == PROP_LOCEXPR
55 || range
->bounds ()->high
.kind () == PROP_LOCLIST
)
59 if (type
->is_vector ())
60 return context
->plugin ().error (_("variably-sized vector type"
61 " is not supported"));
63 std::string upper_bound
64 = c_get_range_decl_name (&range
->bounds ()->high
);
65 result
= context
->plugin ().build_vla_array_type (element_type
,
66 upper_bound
.c_str ());
71 LONGEST low_bound
, high_bound
, count
;
73 if (!get_array_bounds (type
, &low_bound
, &high_bound
))
77 gdb_assert (low_bound
== 0); /* Ensured above. */
78 count
= high_bound
+ 1;
81 if (type
->is_vector ())
82 return context
->plugin ().build_vector_type (element_type
, count
);
83 return context
->plugin ().build_array_type (element_type
, count
);
87 /* Convert a struct or union type to its gcc representation. */
90 convert_struct_or_union (compile_c_instance
*context
, struct type
*type
)
95 /* First we create the resulting type and enter it into our hash
96 table. This lets recursive types work. */
97 if (type
->code () == TYPE_CODE_STRUCT
)
98 result
= context
->plugin ().build_record_type ();
101 gdb_assert (type
->code () == TYPE_CODE_UNION
);
102 result
= context
->plugin ().build_union_type ();
104 context
->insert_type (type
, result
);
106 for (i
= 0; i
< type
->num_fields (); ++i
)
109 unsigned long bitsize
= TYPE_FIELD_BITSIZE (type
, i
);
111 field_type
= context
->convert_type (type
->field (i
).type ());
113 bitsize
= 8 * TYPE_LENGTH (type
->field (i
).type ());
114 context
->plugin ().build_add_field (result
,
115 TYPE_FIELD_NAME (type
, i
),
118 TYPE_FIELD_BITPOS (type
, i
));
121 context
->plugin ().finish_record_or_union (result
, TYPE_LENGTH (type
));
125 /* Convert an enum type to its gcc representation. */
128 convert_enum (compile_c_instance
*context
, struct type
*type
)
130 gcc_type int_type
, result
;
133 int_type
= context
->plugin ().int_type_v0 (type
->is_unsigned (),
136 result
= context
->plugin ().build_enum_type (int_type
);
137 for (i
= 0; i
< type
->num_fields (); ++i
)
139 context
->plugin ().build_add_enum_constant
140 (result
, TYPE_FIELD_NAME (type
, i
), TYPE_FIELD_ENUMVAL (type
, i
));
143 context
->plugin ().finish_enum_type (result
);
148 /* Convert a function type to its gcc representation. */
151 convert_func (compile_c_instance
*context
, struct type
*type
)
154 gcc_type result
, return_type
;
155 struct gcc_type_array array
;
156 int is_varargs
= type
->has_varargs () || !type
->is_prototyped ();
158 struct type
*target_type
= TYPE_TARGET_TYPE (type
);
160 /* Functions with no debug info have no return type. Ideally we'd
161 want to fallback to the type of the cast just before the
162 function, like GDB's built-in expression parser, but we don't
163 have access to that type here. For now, fallback to int, like
164 GDB's parser used to do. */
165 if (target_type
== NULL
)
167 if (type
->is_objfile_owned ())
168 target_type
= objfile_type (type
->objfile_owner ())->builtin_int
;
170 target_type
= builtin_type (type
->arch_owner ())->builtin_int
;
171 warning (_("function has unknown return type; assuming int"));
174 /* This approach means we can't make self-referential function
175 types. Those are impossible in C, though. */
176 return_type
= context
->convert_type (target_type
);
178 array
.n_elements
= type
->num_fields ();
179 std::vector
<gcc_type
> elements (array
.n_elements
);
180 array
.elements
= elements
.data ();
181 for (i
= 0; i
< type
->num_fields (); ++i
)
182 array
.elements
[i
] = context
->convert_type (type
->field (i
).type ());
184 result
= context
->plugin ().build_function_type (return_type
,
190 /* Convert an integer type to its gcc representation. */
193 convert_int (compile_c_instance
*context
, struct type
*type
)
195 if (context
->plugin ().version () >= GCC_C_FE_VERSION_1
)
197 if (type
->has_no_signedness ())
199 gdb_assert (TYPE_LENGTH (type
) == 1);
200 return context
->plugin ().char_type ();
202 return context
->plugin ().int_type (type
->is_unsigned (),
207 return context
->plugin ().int_type_v0 (type
->is_unsigned (),
211 /* Convert a floating-point type to its gcc representation. */
214 convert_float (compile_c_instance
*context
, struct type
*type
)
216 if (context
->plugin ().version () >= GCC_C_FE_VERSION_1
)
217 return context
->plugin ().float_type (TYPE_LENGTH (type
),
220 return context
->plugin ().float_type_v0 (TYPE_LENGTH (type
));
223 /* Convert the 'void' type to its gcc representation. */
226 convert_void (compile_c_instance
*context
, struct type
*type
)
228 return context
->plugin ().void_type ();
231 /* Convert a boolean type to its gcc representation. */
234 convert_bool (compile_c_instance
*context
, struct type
*type
)
236 return context
->plugin ().bool_type ();
239 /* Convert a qualified type to its gcc representation. */
242 convert_qualified (compile_c_instance
*context
, struct type
*type
)
244 struct type
*unqual
= make_unqualified_type (type
);
245 gcc_type unqual_converted
;
246 gcc_qualifiers_flags quals
= 0;
248 unqual_converted
= context
->convert_type (unqual
);
250 if (TYPE_CONST (type
))
251 quals
|= GCC_QUALIFIER_CONST
;
252 if (TYPE_VOLATILE (type
))
253 quals
|= GCC_QUALIFIER_VOLATILE
;
254 if (TYPE_RESTRICT (type
))
255 quals
|= GCC_QUALIFIER_RESTRICT
;
257 return context
->plugin ().build_qualified_type (unqual_converted
,
261 /* Convert a complex type to its gcc representation. */
264 convert_complex (compile_c_instance
*context
, struct type
*type
)
266 gcc_type base
= context
->convert_type (TYPE_TARGET_TYPE (type
));
268 return context
->plugin ().build_complex_type (base
);
271 /* A helper function which knows how to convert most types from their
272 gdb representation to the corresponding gcc form. This examines
273 the TYPE and dispatches to the appropriate conversion function. It
274 returns the gcc type. */
277 convert_type_basic (compile_c_instance
*context
, struct type
*type
)
279 /* If we are converting a qualified type, first convert the
280 unqualified type and then apply the qualifiers. */
281 if ((type
->instance_flags () & (TYPE_INSTANCE_FLAG_CONST
282 | TYPE_INSTANCE_FLAG_VOLATILE
283 | TYPE_INSTANCE_FLAG_RESTRICT
)) != 0)
284 return convert_qualified (context
, type
);
286 switch (type
->code ())
289 return convert_pointer (context
, type
);
291 case TYPE_CODE_ARRAY
:
292 return convert_array (context
, type
);
294 case TYPE_CODE_STRUCT
:
295 case TYPE_CODE_UNION
:
296 return convert_struct_or_union (context
, type
);
299 return convert_enum (context
, type
);
302 return convert_func (context
, type
);
305 return convert_int (context
, type
);
308 return convert_float (context
, type
);
311 return convert_void (context
, type
);
314 return convert_bool (context
, type
);
316 case TYPE_CODE_COMPLEX
:
317 return convert_complex (context
, type
);
319 case TYPE_CODE_ERROR
:
321 /* Ideally, if we get here due to a cast expression, we'd use
322 the cast-to type as the variable's type, like GDB's
323 built-in parser does. For now, assume "int" like GDB's
324 built-in parser used to do, but at least warn. */
325 struct type
*fallback
;
326 if (type
->is_objfile_owned ())
327 fallback
= objfile_type (type
->objfile_owner ())->builtin_int
;
329 fallback
= builtin_type (type
->arch_owner ())->builtin_int
;
330 warning (_("variable has unknown type; assuming int"));
331 return convert_int (context
, fallback
);
335 return context
->plugin ().error (_("cannot convert gdb type to gcc type"));
338 /* Default compile flags for C. */
340 const char *compile_c_instance::m_default_cflags
= "-std=gnu11"
341 /* Otherwise the .o file may need
343 "__gcc_personality_v0". */
345 " -Wno-implicit-function-declaration";
347 /* See compile-c.h. */
350 compile_c_instance::convert_type (struct type
*type
)
352 /* We don't ever have to deal with typedefs in this code, because
353 those are only needed as symbols by the C compiler. */
354 type
= check_typedef (type
);
357 if (get_cached_type (type
, &result
))
360 result
= convert_type_basic (this, type
);
361 insert_type (type
, result
);
367 /* C plug-in wrapper. */
369 #define FORWARD(OP,...) m_context->c_ops->OP(m_context, ##__VA_ARGS__)
370 #define GCC_METHOD0(R, N) \
371 R gcc_c_plugin::N () const \
372 { return FORWARD (N); }
373 #define GCC_METHOD1(R, N, A) \
374 R gcc_c_plugin::N (A a) const \
375 { return FORWARD (N, a); }
376 #define GCC_METHOD2(R, N, A, B) \
377 R gcc_c_plugin::N (A a, B b) const \
378 { return FORWARD (N, a, b); }
379 #define GCC_METHOD3(R, N, A, B, C) \
380 R gcc_c_plugin::N (A a, B b, C c) const \
381 { return FORWARD (N, a, b, c); }
382 #define GCC_METHOD4(R, N, A, B, C, D) \
383 R gcc_c_plugin::N (A a, B b, C c, D d) const \
384 { return FORWARD (N, a, b, c, d); }
385 #define GCC_METHOD5(R, N, A, B, C, D, E) \
386 R gcc_c_plugin::N (A a, B b, C c, D d, E e) const \
387 { return FORWARD (N, a, b, c, d, e); }
388 #define GCC_METHOD7(R, N, A, B, C, D, E, F, G) \
389 R gcc_c_plugin::N (A a, B b, C c, D d, E e, F f, G g) const \
390 { return FORWARD (N, a, b, c, d, e, f, g); }
392 #include "gcc-c-fe.def"