1 /* Convert types from GDB to GCC
3 Copyright (C) 2014-2018 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 /* An object that maps a gdb type to a gcc type. */
29 struct type_map_instance
35 /* The corresponding gcc type handle. */
37 gcc_type gcc_type_handle
;
40 /* Hash a type_map_instance. */
43 hash_type_map_instance (const void *p
)
45 const struct type_map_instance
*inst
= (const struct type_map_instance
*) p
;
47 return htab_hash_pointer (inst
->type
);
50 /* Check two type_map_instance objects for equality. */
53 eq_type_map_instance (const void *a
, const void *b
)
55 const struct type_map_instance
*insta
= (const struct type_map_instance
*) a
;
56 const struct type_map_instance
*instb
= (const struct type_map_instance
*) b
;
58 return insta
->type
== instb
->type
;
63 /* Insert an entry into the type map associated with CONTEXT that maps
64 from the gdb type TYPE to the gcc type GCC_TYPE. It is ok for a
65 given type to be inserted more than once, provided that the exact
66 same association is made each time. This simplifies how type
67 caching works elsewhere in this file -- see how struct type caching
71 insert_type (struct compile_c_instance
*context
, struct type
*type
,
74 struct type_map_instance inst
, *add
;
78 inst
.gcc_type_handle
= gcc_type
;
79 slot
= htab_find_slot (context
->type_map
, &inst
, INSERT
);
81 add
= (struct type_map_instance
*) *slot
;
82 /* The type might have already been inserted in order to handle
84 if (add
!= NULL
&& add
->gcc_type_handle
!= gcc_type
)
85 error (_("Unexpected type id from GCC, check you use recent enough GCC."));
89 add
= XNEW (struct type_map_instance
);
95 /* Convert a pointer type to its gcc representation. */
98 convert_pointer (struct compile_c_instance
*context
, struct type
*type
)
100 gcc_type target
= convert_type (context
, TYPE_TARGET_TYPE (type
));
102 return C_CTX (context
)->c_ops
->build_pointer_type (C_CTX (context
),
106 /* Convert an array type to its gcc representation. */
109 convert_array (struct compile_c_instance
*context
, struct type
*type
)
111 gcc_type element_type
;
112 struct type
*range
= TYPE_INDEX_TYPE (type
);
114 element_type
= convert_type (context
, TYPE_TARGET_TYPE (type
));
116 if (TYPE_LOW_BOUND_KIND (range
) != PROP_CONST
)
117 return C_CTX (context
)->c_ops
->error (C_CTX (context
),
118 _("array type with non-constant"
119 " lower bound is not supported"));
120 if (TYPE_LOW_BOUND (range
) != 0)
121 return C_CTX (context
)->c_ops
->error (C_CTX (context
),
122 _("cannot convert array type with "
123 "non-zero lower bound to C"));
125 if (TYPE_HIGH_BOUND_KIND (range
) == PROP_LOCEXPR
126 || TYPE_HIGH_BOUND_KIND (range
) == PROP_LOCLIST
)
130 if (TYPE_VECTOR (type
))
131 return C_CTX (context
)->c_ops
->error (C_CTX (context
),
132 _("variably-sized vector type"
133 " is not supported"));
135 std::string upper_bound
136 = c_get_range_decl_name (&TYPE_RANGE_DATA (range
)->high
);
137 result
= C_CTX (context
)->c_ops
->build_vla_array_type (C_CTX (context
),
139 upper_bound
.c_str ());
144 LONGEST low_bound
, high_bound
, count
;
146 if (get_array_bounds (type
, &low_bound
, &high_bound
) == 0)
150 gdb_assert (low_bound
== 0); /* Ensured above. */
151 count
= high_bound
+ 1;
154 if (TYPE_VECTOR (type
))
155 return C_CTX (context
)->c_ops
->build_vector_type (C_CTX (context
),
158 return C_CTX (context
)->c_ops
->build_array_type (C_CTX (context
),
159 element_type
, count
);
163 /* Convert a struct or union type to its gcc representation. */
166 convert_struct_or_union (struct compile_c_instance
*context
, struct type
*type
)
171 /* First we create the resulting type and enter it into our hash
172 table. This lets recursive types work. */
173 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
174 result
= C_CTX (context
)->c_ops
->build_record_type (C_CTX (context
));
177 gdb_assert (TYPE_CODE (type
) == TYPE_CODE_UNION
);
178 result
= C_CTX (context
)->c_ops
->build_union_type (C_CTX (context
));
180 insert_type (context
, type
, result
);
182 for (i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
185 unsigned long bitsize
= TYPE_FIELD_BITSIZE (type
, i
);
187 field_type
= convert_type (context
, TYPE_FIELD_TYPE (type
, i
));
189 bitsize
= 8 * TYPE_LENGTH (TYPE_FIELD_TYPE (type
, i
));
190 C_CTX (context
)->c_ops
->build_add_field (C_CTX (context
), result
,
191 TYPE_FIELD_NAME (type
, i
),
194 TYPE_FIELD_BITPOS (type
, i
));
197 C_CTX (context
)->c_ops
->finish_record_or_union (C_CTX (context
), result
,
202 /* Convert an enum type to its gcc representation. */
205 convert_enum (struct compile_c_instance
*context
, struct type
*type
)
207 gcc_type int_type
, result
;
209 struct gcc_c_context
*ctx
= C_CTX (context
);
211 int_type
= ctx
->c_ops
->int_type_v0 (ctx
,
212 TYPE_UNSIGNED (type
),
215 result
= ctx
->c_ops
->build_enum_type (ctx
, int_type
);
216 for (i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
218 ctx
->c_ops
->build_add_enum_constant (ctx
,
220 TYPE_FIELD_NAME (type
, i
),
221 TYPE_FIELD_ENUMVAL (type
, i
));
224 ctx
->c_ops
->finish_enum_type (ctx
, result
);
229 /* Convert a function type to its gcc representation. */
232 convert_func (struct compile_c_instance
*context
, struct type
*type
)
235 gcc_type result
, return_type
;
236 struct gcc_type_array array
;
237 int is_varargs
= TYPE_VARARGS (type
) || !TYPE_PROTOTYPED (type
);
239 struct type
*target_type
= TYPE_TARGET_TYPE (type
);
241 /* Functions with no debug info have no return type. Ideally we'd
242 want to fallback to the type of the cast just before the
243 function, like GDB's built-in expression parser, but we don't
244 have access to that type here. For now, fallback to int, like
245 GDB's parser used to do. */
246 if (target_type
== NULL
)
248 if (TYPE_OBJFILE_OWNED (type
))
249 target_type
= objfile_type (TYPE_OWNER (type
).objfile
)->builtin_int
;
251 target_type
= builtin_type (TYPE_OWNER (type
).gdbarch
)->builtin_int
;
252 warning (_("function has unknown return type; assuming int"));
255 /* This approach means we can't make self-referential function
256 types. Those are impossible in C, though. */
257 return_type
= convert_type (context
, target_type
);
259 array
.n_elements
= TYPE_NFIELDS (type
);
260 array
.elements
= XNEWVEC (gcc_type
, TYPE_NFIELDS (type
));
261 for (i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
262 array
.elements
[i
] = convert_type (context
, TYPE_FIELD_TYPE (type
, i
));
264 result
= C_CTX (context
)->c_ops
->build_function_type (C_CTX (context
),
267 xfree (array
.elements
);
272 /* Convert an integer type to its gcc representation. */
275 convert_int (struct compile_c_instance
*context
, struct type
*type
)
277 if (C_CTX (context
)->c_ops
->c_version
>= GCC_C_FE_VERSION_1
)
279 if (TYPE_NOSIGN (type
))
281 gdb_assert (TYPE_LENGTH (type
) == 1);
282 return C_CTX (context
)->c_ops
->char_type (C_CTX (context
));
284 return C_CTX (context
)->c_ops
->int_type (C_CTX (context
),
285 TYPE_UNSIGNED (type
),
290 return C_CTX (context
)->c_ops
->int_type_v0 (C_CTX (context
),
291 TYPE_UNSIGNED (type
),
295 /* Convert a floating-point type to its gcc representation. */
298 convert_float (struct compile_c_instance
*context
, struct type
*type
)
300 if (C_CTX (context
)->c_ops
->c_version
>= GCC_C_FE_VERSION_1
)
301 return C_CTX (context
)->c_ops
->float_type (C_CTX (context
),
305 return C_CTX (context
)->c_ops
->float_type_v0 (C_CTX (context
),
309 /* Convert the 'void' type to its gcc representation. */
312 convert_void (struct compile_c_instance
*context
, struct type
*type
)
314 return C_CTX (context
)->c_ops
->void_type (C_CTX (context
));
317 /* Convert a boolean type to its gcc representation. */
320 convert_bool (struct compile_c_instance
*context
, struct type
*type
)
322 return C_CTX (context
)->c_ops
->bool_type (C_CTX (context
));
325 /* Convert a qualified type to its gcc representation. */
328 convert_qualified (struct compile_c_instance
*context
, struct type
*type
)
330 struct type
*unqual
= make_unqualified_type (type
);
331 gcc_type unqual_converted
;
332 gcc_qualifiers_flags quals
= 0;
334 unqual_converted
= convert_type (context
, unqual
);
336 if (TYPE_CONST (type
))
337 quals
|= GCC_QUALIFIER_CONST
;
338 if (TYPE_VOLATILE (type
))
339 quals
|= GCC_QUALIFIER_VOLATILE
;
340 if (TYPE_RESTRICT (type
))
341 quals
|= GCC_QUALIFIER_RESTRICT
;
343 return C_CTX (context
)->c_ops
->build_qualified_type (C_CTX (context
),
348 /* Convert a complex type to its gcc representation. */
351 convert_complex (struct compile_c_instance
*context
, struct type
*type
)
353 gcc_type base
= convert_type (context
, TYPE_TARGET_TYPE (type
));
355 return C_CTX (context
)->c_ops
->build_complex_type (C_CTX (context
), base
);
358 /* A helper function which knows how to convert most types from their
359 gdb representation to the corresponding gcc form. This examines
360 the TYPE and dispatches to the appropriate conversion function. It
361 returns the gcc type. */
364 convert_type_basic (struct compile_c_instance
*context
, struct type
*type
)
366 /* If we are converting a qualified type, first convert the
367 unqualified type and then apply the qualifiers. */
368 if ((TYPE_INSTANCE_FLAGS (type
) & (TYPE_INSTANCE_FLAG_CONST
369 | TYPE_INSTANCE_FLAG_VOLATILE
370 | TYPE_INSTANCE_FLAG_RESTRICT
)) != 0)
371 return convert_qualified (context
, type
);
373 switch (TYPE_CODE (type
))
376 return convert_pointer (context
, type
);
378 case TYPE_CODE_ARRAY
:
379 return convert_array (context
, type
);
381 case TYPE_CODE_STRUCT
:
382 case TYPE_CODE_UNION
:
383 return convert_struct_or_union (context
, type
);
386 return convert_enum (context
, type
);
389 return convert_func (context
, type
);
392 return convert_int (context
, type
);
395 return convert_float (context
, type
);
398 return convert_void (context
, type
);
401 return convert_bool (context
, type
);
403 case TYPE_CODE_COMPLEX
:
404 return convert_complex (context
, type
);
406 case TYPE_CODE_ERROR
:
408 /* Ideally, if we get here due to a cast expression, we'd use
409 the cast-to type as the variable's type, like GDB's
410 built-in parser does. For now, assume "int" like GDB's
411 built-in parser used to do, but at least warn. */
412 struct type
*fallback
;
413 if (TYPE_OBJFILE_OWNED (type
))
414 fallback
= objfile_type (TYPE_OWNER (type
).objfile
)->builtin_int
;
416 fallback
= builtin_type (TYPE_OWNER (type
).gdbarch
)->builtin_int
;
417 warning (_("variable has unknown type; assuming int"));
418 return convert_int (context
, fallback
);
422 return C_CTX (context
)->c_ops
->error (C_CTX (context
),
423 _("cannot convert gdb type "
427 /* See compile-internal.h. */
430 convert_type (struct compile_c_instance
*context
, struct type
*type
)
432 struct type_map_instance inst
, *found
;
435 /* We don't ever have to deal with typedefs in this code, because
436 those are only needed as symbols by the C compiler. */
437 type
= check_typedef (type
);
440 found
= (struct type_map_instance
*) htab_find (context
->type_map
, &inst
);
442 return found
->gcc_type_handle
;
444 result
= convert_type_basic (context
, type
);
445 insert_type (context
, type
, result
);
451 /* Delete the compiler instance C. */
454 delete_instance (struct compile_instance
*c
)
456 struct compile_c_instance
*context
= (struct compile_c_instance
*) c
;
458 context
->base
.fe
->ops
->destroy (context
->base
.fe
);
459 htab_delete (context
->type_map
);
460 if (context
->symbol_err_map
!= NULL
)
461 htab_delete (context
->symbol_err_map
);
465 /* See compile-internal.h. */
467 struct compile_instance
*
468 new_compile_instance (struct gcc_c_context
*fe
)
470 struct compile_c_instance
*result
= XCNEW (struct compile_c_instance
);
472 result
->base
.fe
= &fe
->base
;
473 result
->base
.destroy
= delete_instance
;
474 result
->base
.gcc_target_options
= ("-std=gnu11"
475 /* Otherwise the .o file may need
477 "__gcc_personality_v0". */
480 result
->type_map
= htab_create_alloc (10, hash_type_map_instance
,
481 eq_type_map_instance
,
482 xfree
, xcalloc
, xfree
);
484 fe
->c_ops
->set_callbacks (fe
, gcc_convert_symbol
,
485 gcc_symbol_address
, result
);
487 return &result
->base
;