1 /* Convert types from GDB to GCC
3 Copyright (C) 2014-2019 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/>. */
22 #include "common/preprocessor.h"
24 #include "compile-internal.h"
25 #include "compile-cplus.h"
26 #include "common/gdb_assert.h"
29 #include "cp-support.h"
35 #include "compile-c.h"
38 /* Default compile flags for C++. */
40 const char *compile_cplus_instance::m_default_cflags
= "-std=gnu++11";
42 /* Flag to enable internal debugging. */
44 static int debug_compile_cplus_types
= 0;
46 /* Flag to enable internal scope switching debugging. */
48 static int debug_compile_cplus_scopes
= 0;
50 /* Forward declarations. */
52 static gcc_type
compile_cplus_convert_func (compile_cplus_instance
*instance
,
54 bool strip_artificial
);
56 /* See description in compile-cplus.h. */
58 gdb::unique_xmalloc_ptr
<char>
59 compile_cplus_instance::decl_name (const char *natural
)
61 if (natural
== nullptr)
64 gdb::unique_xmalloc_ptr
<char> name
= cp_func_name (natural
);
68 return gdb::unique_xmalloc_ptr
<char> (xstrdup (natural
));
71 /* Get the access flag for the NUM'th field of TYPE. */
73 static enum gcc_cp_symbol_kind
74 get_field_access_flag (const struct type
*type
, int num
)
76 if (TYPE_FIELD_PROTECTED (type
, num
))
77 return GCC_CP_ACCESS_PROTECTED
;
78 else if (TYPE_FIELD_PRIVATE (type
, num
))
79 return GCC_CP_ACCESS_PRIVATE
;
81 /* GDB assumes everything else is public. */
82 return GCC_CP_ACCESS_PUBLIC
;
85 /* Get the access flag for the NUM'th method of TYPE's FNI'th
88 enum gcc_cp_symbol_kind
89 get_method_access_flag (const struct type
*type
, int fni
, int num
)
91 gdb_assert (TYPE_CODE (type
) == TYPE_CODE_STRUCT
);
93 /* If this type was not declared a class, everything is public. */
94 if (!TYPE_DECLARED_CLASS (type
))
95 return GCC_CP_ACCESS_PUBLIC
;
97 /* Otherwise, read accessibility from the fn_field. */
98 const struct fn_field
*methods
= TYPE_FN_FIELDLIST1 (type
, fni
);
99 if (TYPE_FN_FIELD_PROTECTED (methods
, num
))
100 return GCC_CP_ACCESS_PROTECTED
;
101 else if (TYPE_FN_FIELD_PRIVATE (methods
, num
))
102 return GCC_CP_ACCESS_PRIVATE
;
104 return GCC_CP_ACCESS_PUBLIC
;
107 /* A useful debugging function to output the scope SCOPE to stdout. */
109 static void __attribute__ ((used
))
110 debug_print_scope (const compile_scope
&scope
)
112 for (const auto &comp
: scope
)
114 const char *symbol
= (comp
.bsymbol
.symbol
!= nullptr
115 ? SYMBOL_NATURAL_NAME (comp
.bsymbol
.symbol
)
118 printf_unfiltered ("\tname = %s, symbol = %s\n", comp
.name
.c_str (),
123 /* See description in compile-cplus.h. */
126 type_name_to_scope (const char *type_name
, const struct block
*block
)
130 if (type_name
== nullptr)
132 /* An anonymous type. We cannot really do much here. We simply cannot
133 look up anonymous types easily/at all. */
137 const char *p
= type_name
;
138 std::string lookup_name
;
142 /* Create a string token of the first component of TYPE_NAME. */
143 int len
= cp_find_first_component (p
);
144 std::string
s (p
, len
);
146 /* Advance past the last token. */
149 /* Look up the symbol and decide when to stop. */
150 if (!lookup_name
.empty ())
154 /* Look up the resulting name. */
155 struct block_symbol bsymbol
156 = lookup_symbol (lookup_name
.c_str (), block
, VAR_DOMAIN
, nullptr);
158 if (bsymbol
.symbol
!= nullptr)
160 scope_component comp
= {s
, bsymbol
};
162 scope
.push_back (comp
);
164 if (TYPE_CODE (SYMBOL_TYPE (bsymbol
.symbol
)) != TYPE_CODE_NAMESPACE
)
178 /* This shouldn't happen since we are not attempting to
179 loop over user input. This name is generated by GDB
181 internal_error (__FILE__
, __LINE__
,
182 _("malformed TYPE_NAME during parsing"));
190 /* Compare two scope_components for equality. These are equal if the names
191 of the two components' are the same. */
194 operator== (const scope_component
&lhs
, const scope_component
&rhs
)
196 return lhs
.name
== rhs
.name
;
199 /* Compare two scope_components for inequality. These are not equal if
200 the two components' names are not equal. */
203 operator!= (const scope_component
&lhs
, const scope_component
&rhs
)
205 return lhs
.name
!= rhs
.name
;
208 /* Compare two compile_scopes for equality. These are equal if they are both
209 contain the same number of components and each component is equal. */
212 operator== (const compile_scope
&lhs
, const compile_scope
&rhs
)
214 if (lhs
.size () != rhs
.size ())
217 for (int i
= 0; i
< lhs
.size (); ++i
)
219 if (lhs
[i
] != rhs
[i
])
226 /* Compare two compile_scopes for inequality. These are inequal if they
227 contain unequal number of elements or if any of the components are not
231 operator!= (const compile_scope
&lhs
, const compile_scope
&rhs
)
233 if (lhs
.size () != rhs
.size ())
236 for (int i
= 0; i
< lhs
.size (); ++i
)
238 if (lhs
[i
] != rhs
[i
])
245 /* See description in compile-cplus.h. */
248 compile_cplus_instance::enter_scope (compile_scope
&&new_scope
)
250 bool must_push
= m_scopes
.empty () || m_scopes
.back () != new_scope
;
252 new_scope
.m_pushed
= must_push
;
254 /* Save the new scope. */
255 m_scopes
.push_back (std::move (new_scope
));
259 if (debug_compile_cplus_scopes
)
261 fprintf_unfiltered (gdb_stdlog
, "entering new scope %s\n",
262 host_address_to_string (&m_scopes
.back ()));
265 /* Push the global namespace. */
266 plugin ().push_namespace ("");
268 /* Push all other namespaces. Note that we do not push the last
269 scope_component -- that's the actual type we are converting. */
271 (m_scopes
.back ().begin (), m_scopes
.back ().end () - 1,
272 [this] (const scope_component
&comp
)
274 gdb_assert (TYPE_CODE (SYMBOL_TYPE (comp
.bsymbol
.symbol
))
275 == TYPE_CODE_NAMESPACE
);
277 const char *ns
= (comp
.name
== CP_ANONYMOUS_NAMESPACE_STR
? nullptr
278 : comp
.name
.c_str ());
280 this->plugin ().push_namespace (ns
);
285 if (debug_compile_cplus_scopes
)
287 fprintf_unfiltered (gdb_stdlog
, "staying in current scope -- "
288 "scopes are identical\n");
293 /* See description in compile-cplus.h. */
296 compile_cplus_instance::leave_scope ()
298 /* Get the current scope and remove it from the internal list of
300 compile_scope current
= m_scopes
.back ();
302 m_scopes
.pop_back ();
304 if (current
.m_pushed
)
306 if (debug_compile_cplus_scopes
)
308 fprintf_unfiltered (gdb_stdlog
, "leaving scope %s\n",
309 host_address_to_string (¤t
));
312 /* Pop namespaces. */
314 (current
.begin (),current
.end () - 1,
315 [this] (const scope_component
&comp
) {
316 gdb_assert (TYPE_CODE (SYMBOL_TYPE (comp
.bsymbol
.symbol
))
317 == TYPE_CODE_NAMESPACE
);
318 this->plugin ().pop_binding_level (comp
.name
.c_str ());
321 /* Pop global namespace. */
322 plugin ().pop_binding_level ("");
326 if (debug_compile_cplus_scopes
)
327 fprintf_unfiltered (gdb_stdlog
,
328 "identical scopes -- not leaving scope\n");
332 /* See description in compile-cplus.h. */
335 compile_cplus_instance::new_scope (const char *type_name
, struct type
*type
)
337 /* Break the type name into components. If TYPE was defined in some
338 superclass, we do not process TYPE but process the enclosing type
340 compile_scope scope
= type_name_to_scope (type_name
, block ());
344 /* Get the name of the last component, which should be the
345 unqualified name of the type to process. */
346 scope_component
&comp
= scope
.back ();
348 if (!types_equal (type
, SYMBOL_TYPE (comp
.bsymbol
.symbol
))
349 && (m_scopes
.empty ()
350 || (m_scopes
.back ().back ().bsymbol
.symbol
351 != comp
.bsymbol
.symbol
)))
353 /* The type is defined inside another class(es). Convert that
354 type instead of defining this type. */
355 convert_type (SYMBOL_TYPE (comp
.bsymbol
.symbol
));
357 /* If the original type (passed in to us) is defined in a nested
358 class, the previous call will give us that type's gcc_type.
359 Upper layers are expecting to get the original type's
361 get_cached_type (type
, &scope
.m_nested_type
);
367 if (TYPE_NAME (type
) == nullptr)
371 /* We don't have a qualified name for this to look up, but
372 we need a scope. We have to assume, then, that it is the same
373 as the current scope, if any. */
374 if (!m_scopes
.empty ())
376 scope
= m_scopes
.back ();
377 scope
.m_pushed
= false;
380 scope
.push_back (scope_component ());
386 decl_name (TYPE_NAME (type
)).get (),
387 lookup_symbol (TYPE_NAME (type
), block (), VAR_DOMAIN
, nullptr)
389 scope
.push_back (comp
);
393 /* There must be at least one component in the compile_scope. */
394 gdb_assert (scope
.size () > 0);
398 /* See description in compile-cplus.h. */
401 compile_cplus_instance::convert_reference_base
402 (gcc_type base
, enum gcc_cp_ref_qualifiers rquals
)
404 return this->plugin ().build_reference_type (base
, rquals
);
407 /* Convert a reference type to its gcc representation. */
410 compile_cplus_convert_reference (compile_cplus_instance
*instance
,
413 gcc_type target
= instance
->convert_type (TYPE_TARGET_TYPE (type
));
415 enum gcc_cp_ref_qualifiers quals
= GCC_CP_REF_QUAL_NONE
;
416 switch (TYPE_CODE (type
))
419 quals
= GCC_CP_REF_QUAL_LVALUE
;
421 case TYPE_CODE_RVALUE_REF
:
422 quals
= GCC_CP_REF_QUAL_RVALUE
;
425 gdb_assert_not_reached ("unexpected type code for reference type");
428 return instance
->convert_reference_base (target
, quals
);
431 /* See description in compile-cplus.h. */
434 compile_cplus_instance::convert_pointer_base(gcc_type target
)
436 return plugin ().build_pointer_type (target
);
439 /* Convert a pointer type to its gcc representation. */
442 compile_cplus_convert_pointer (compile_cplus_instance
*instance
,
445 gcc_type target
= instance
->convert_type (TYPE_TARGET_TYPE (type
));
447 return instance
->convert_pointer_base (target
);
450 /* Convert an array type to its gcc representation. */
453 compile_cplus_convert_array (compile_cplus_instance
*instance
,
456 struct type
*range
= TYPE_INDEX_TYPE (type
);
457 gcc_type element_type
= instance
->convert_type (TYPE_TARGET_TYPE (type
));
459 if (TYPE_LOW_BOUND_KIND (range
) != PROP_CONST
)
461 const char *s
= _("array type with non-constant"
462 " lower bound is not supported");
464 return instance
->plugin ().error (s
);
467 if (TYPE_LOW_BOUND (range
) != 0)
469 const char *s
= _("cannot convert array type with "
470 "non-zero lower bound to C");
472 return instance
->plugin ().error (s
);
475 if (TYPE_HIGH_BOUND_KIND (range
) == PROP_LOCEXPR
476 || TYPE_HIGH_BOUND_KIND (range
) == PROP_LOCLIST
)
478 if (TYPE_VECTOR (type
))
480 const char *s
= _("variably-sized vector type is not supported");
482 return instance
->plugin ().error (s
);
485 std::string upper_bound
486 = c_get_range_decl_name (&TYPE_RANGE_DATA (range
)->high
);
487 return instance
->plugin ().build_vla_array_type (element_type
,
488 upper_bound
.c_str ());
492 LONGEST low_bound
, high_bound
, count
;
494 if (get_array_bounds (type
, &low_bound
, &high_bound
) == 0)
498 gdb_assert (low_bound
== 0); /* Ensured above. */
499 count
= high_bound
+ 1;
502 if (TYPE_VECTOR (type
))
503 return instance
->plugin ().build_vector_type (element_type
, count
);
505 return instance
->plugin ().build_array_type (element_type
, count
);
509 /* Convert a typedef of TYPE. If not GCC_CP_ACCESS_NONE, NESTED_ACCESS
510 will define the accessibility of the typedef definition in its
514 compile_cplus_convert_typedef (compile_cplus_instance
*instance
,
516 enum gcc_cp_symbol_kind nested_access
)
518 compile_scope scope
= instance
->new_scope (TYPE_NAME (type
), type
);
520 if (scope
.nested_type () != GCC_TYPE_NONE
)
521 return scope
.nested_type ();
523 gdb::unique_xmalloc_ptr
<char> name
524 = compile_cplus_instance::decl_name (TYPE_NAME (type
));
526 /* Make sure the scope for this type has been pushed. */
527 instance
->enter_scope (std::move (scope
));
529 /* Convert the typedef's real type. */
530 gcc_type typedef_type
= instance
->convert_type (check_typedef (type
));
532 instance
->plugin ().build_decl ("typedef", name
.get (),
533 GCC_CP_SYMBOL_TYPEDEF
| nested_access
,
534 typedef_type
, 0, 0, nullptr, 0);
536 /* Completed this scope. */
537 instance
->leave_scope ();
541 /* Convert types defined in TYPE. */
544 compile_cplus_convert_type_defns (compile_cplus_instance
*instance
,
548 enum gcc_cp_symbol_kind accessibility
;
550 /* Convert typedefs. */
551 for (i
= 0; i
< TYPE_TYPEDEF_FIELD_COUNT (type
); ++i
)
553 if (TYPE_TYPEDEF_FIELD_PROTECTED (type
, i
))
554 accessibility
= GCC_CP_ACCESS_PROTECTED
;
555 else if (TYPE_TYPEDEF_FIELD_PRIVATE (type
, i
))
556 accessibility
= GCC_CP_ACCESS_PRIVATE
;
558 accessibility
= GCC_CP_ACCESS_PUBLIC
;
559 instance
->convert_type (TYPE_TYPEDEF_FIELD_TYPE (type
, i
), accessibility
);
562 /* Convert nested types. */
563 for (i
= 0; i
< TYPE_NESTED_TYPES_COUNT (type
); ++i
)
565 if (TYPE_NESTED_TYPES_FIELD_PROTECTED (type
, i
))
566 accessibility
= GCC_CP_ACCESS_PROTECTED
;
567 else if (TYPE_NESTED_TYPES_FIELD_PRIVATE (type
, i
))
568 accessibility
= GCC_CP_ACCESS_PRIVATE
;
570 accessibility
= GCC_CP_ACCESS_PUBLIC
;
571 instance
->convert_type (TYPE_NESTED_TYPES_FIELD_TYPE (type
, i
),
576 /* Convert data members defined in TYPE, which should be struct/class/union
577 with gcc_type COMP_TYPE. */
580 compile_cplus_convert_struct_or_union_members
581 (compile_cplus_instance
*instance
, struct type
*type
, gcc_type comp_type
)
583 for (int i
= TYPE_N_BASECLASSES (type
); i
< TYPE_NFIELDS (type
); ++i
)
585 const char *field_name
= TYPE_FIELD_NAME (type
, i
);
587 if (TYPE_FIELD_IGNORE (type
, i
)
588 || TYPE_FIELD_ARTIFICIAL (type
, i
))
591 /* GDB records unnamed/anonymous fields with empty string names. */
592 if (*field_name
== '\0')
593 field_name
= nullptr;
596 = instance
->convert_type (TYPE_FIELD_TYPE (type
, i
));
598 if (field_is_static (&TYPE_FIELD (type
, i
)))
602 switch (TYPE_FIELD_LOC_KIND (type
, i
))
604 case FIELD_LOC_KIND_PHYSADDR
:
606 physaddr
= TYPE_FIELD_STATIC_PHYSADDR (type
, i
);
608 instance
->plugin ().build_decl
609 ("field physaddr", field_name
,
610 (GCC_CP_SYMBOL_VARIABLE
| get_field_access_flag (type
, i
)),
611 field_type
, nullptr, physaddr
, nullptr, 0);
615 case FIELD_LOC_KIND_PHYSNAME
:
617 const char *physname
= TYPE_FIELD_STATIC_PHYSNAME (type
, i
);
618 struct block_symbol sym
619 = lookup_symbol (physname
, instance
->block (),
620 VAR_DOMAIN
, nullptr);
622 if (sym
.symbol
== nullptr)
624 /* We didn't actually find the symbol. There's little
625 we can do but ignore this member. */
628 const char *filename
= symbol_symtab (sym
.symbol
)->filename
;
629 unsigned int line
= SYMBOL_LINE (sym
.symbol
);
631 physaddr
= SYMBOL_VALUE_ADDRESS (sym
.symbol
);
632 instance
->plugin ().build_decl
633 ("field physname", field_name
,
634 (GCC_CP_SYMBOL_VARIABLE
| get_field_access_flag (type
, i
)),
635 field_type
, nullptr, physaddr
, filename
, line
);
640 gdb_assert_not_reached
641 ("unexpected static field location kind");
646 unsigned long bitsize
= TYPE_FIELD_BITSIZE (type
, i
);
647 enum gcc_cp_symbol_kind field_flags
= GCC_CP_SYMBOL_FIELD
648 | get_field_access_flag (type
, i
);
651 bitsize
= 8 * TYPE_LENGTH (TYPE_FIELD_TYPE (type
, i
));
653 instance
->plugin ().build_field
654 (field_name
, field_type
, field_flags
, bitsize
,
655 TYPE_FIELD_BITPOS (type
, i
));
660 /* Convert a method type to its gcc representation. */
663 compile_cplus_convert_method (compile_cplus_instance
*instance
,
664 struct type
*parent_type
,
665 struct type
*method_type
)
667 /* Get the actual function type of the method, the corresponding class's
668 type and corresponding qualifier flags. */
669 gcc_type func_type
= compile_cplus_convert_func (instance
, method_type
, true);
670 gcc_type class_type
= instance
->convert_type (parent_type
);
671 gcc_cp_qualifiers_flags quals
= (enum gcc_cp_qualifiers
) 0;
673 if (TYPE_CONST (method_type
))
674 quals
|= GCC_CP_QUALIFIER_CONST
;
675 if (TYPE_VOLATILE (method_type
))
676 quals
|= GCC_CP_QUALIFIER_VOLATILE
;
677 if (TYPE_RESTRICT (method_type
))
678 quals
|= GCC_CP_QUALIFIER_RESTRICT
;
680 /* Not yet implemented. */
681 gcc_cp_ref_qualifiers_flags rquals
= GCC_CP_REF_QUAL_NONE
;
683 return instance
->plugin ().build_method_type
684 (class_type
, func_type
, quals
, rquals
);
687 /* Convert a member or method pointer represented by TYPE. */
690 compile_cplus_convert_memberptr (compile_cplus_instance
*instance
,
693 struct type
*containing_class
= TYPE_SELF_TYPE (type
);
695 if (containing_class
== nullptr)
696 return GCC_TYPE_NONE
;
698 gcc_type class_type
= instance
->convert_type (containing_class
);
700 = instance
->convert_type (TYPE_TARGET_TYPE (type
));
702 return instance
->plugin ().build_pointer_to_member_type
703 (class_type
, member_type
);
706 /* Convert all methods defined in TYPE, which should be a class/struct/union
707 with gcc_type CLASS_TYPE. */
710 compile_cplus_convert_struct_or_union_methods (compile_cplus_instance
*instance
,
714 for (int i
= 0; i
< TYPE_NFN_FIELDS (type
); ++i
)
716 struct fn_field
*methods
= TYPE_FN_FIELDLIST1 (type
, i
);
717 gdb::unique_xmalloc_ptr
<char> overloaded_name
718 = compile_cplus_instance::decl_name (TYPE_FN_FIELDLIST_NAME (type
, i
));
720 /* Loop through the fieldlist, adding decls to the compiler's
721 representation of the class. */
722 for (int j
= 0; j
< TYPE_FN_FIELDLIST_LENGTH (type
, i
); ++j
)
724 /* Skip artificial methods. */
725 if (TYPE_FN_FIELD_ARTIFICIAL (methods
, j
))
728 gcc_cp_symbol_kind_flags sym_kind
= GCC_CP_SYMBOL_FUNCTION
;
729 gcc_type method_type
;
730 struct block_symbol sym
731 = lookup_symbol (TYPE_FN_FIELD_PHYSNAME (methods
, j
),
732 instance
->block (), VAR_DOMAIN
, nullptr);
734 if (sym
.symbol
== nullptr)
736 if (TYPE_FN_FIELD_VIRTUAL_P (methods
, j
))
738 /* This is beyond hacky, and is really only a workaround for
739 detecting pure virtual methods. */
740 method_type
= compile_cplus_convert_method
741 (instance
, type
, TYPE_FN_FIELD_TYPE (methods
, j
));
743 instance
->plugin ().build_decl
744 ("pure virtual method", overloaded_name
.get (),
746 | get_method_access_flag (type
, i
, j
)
747 | GCC_CP_FLAG_VIRTUAL_FUNCTION
748 | GCC_CP_FLAG_PURE_VIRTUAL_FUNCTION
),
749 method_type
, nullptr, 0, nullptr, 0);
753 /* This can happen if we have a DW_AT_declaration DIE
754 for the method, but no "definition"-type DIE (with
755 DW_AT_specification referencing the decl DIE), i.e.,
756 the compiler has probably optimized the method away.
758 In this case, all we can hope to do is issue a warning
759 to the user letting him know. If the user has not actually
760 requested using this method, things should still work. */
761 warning (_("Method %s appears to be optimized out.\n"
762 "All references to this method will be undefined."),
763 TYPE_FN_FIELD_PHYSNAME (methods
, j
));
767 const char *filename
= symbol_symtab (sym
.symbol
)->filename
;
768 unsigned int line
= SYMBOL_LINE (sym
.symbol
);
769 CORE_ADDR address
= BLOCK_START (SYMBOL_BLOCK_VALUE (sym
.symbol
));
772 if (TYPE_FN_FIELD_STATIC_P (methods
, j
))
774 kind
= "static method";
775 method_type
= compile_cplus_convert_func
776 (instance
, TYPE_FN_FIELD_TYPE (methods
, j
), true);
781 method_type
= (compile_cplus_convert_method
782 (instance
, type
, TYPE_FN_FIELD_TYPE (methods
, j
)));
785 if (TYPE_FN_FIELD_VIRTUAL_P (methods
, j
))
786 sym_kind
|= GCC_CP_FLAG_VIRTUAL_FUNCTION
;
788 instance
->plugin ().build_decl
789 (kind
, overloaded_name
.get (),
790 sym_kind
| get_method_access_flag (type
, i
, j
),
791 method_type
, nullptr, address
, filename
, line
);
796 /* Convert a struct or union type to its gcc representation. If this type
797 was defined in another type, NESTED_ACCESS should indicate the
798 accessibility of this type. */
801 compile_cplus_convert_struct_or_union (compile_cplus_instance
*instance
,
803 enum gcc_cp_symbol_kind nested_access
)
805 const char *filename
= nullptr;
806 unsigned short line
= 0;
808 /* Get the decl name of this type. */
809 gdb::unique_xmalloc_ptr
<char> name
810 = compile_cplus_instance::decl_name (TYPE_NAME (type
));
812 /* Create a new scope for TYPE. */
813 compile_scope scope
= instance
->new_scope (TYPE_NAME (type
), type
);
815 if (scope
.nested_type () != GCC_TYPE_NONE
)
817 /* The type requested was actually defined inside another type,
818 such as a nested class definition. Return that type. */
819 return scope
.nested_type ();
822 /* Push all scopes. */
823 instance
->enter_scope (std::move (scope
));
825 /* First we create the resulting type and enter it into our hash
826 table. This lets recursive types work. */
829 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
831 const char *what
= TYPE_DECLARED_CLASS (type
) ? "struct" : "class";
833 resuld
= instance
->plugin ().build_decl
834 (what
, name
.get (), (GCC_CP_SYMBOL_CLASS
| nested_access
835 | (TYPE_DECLARED_CLASS (type
)
836 ? GCC_CP_FLAG_CLASS_NOFLAG
837 : GCC_CP_FLAG_CLASS_IS_STRUCT
)),
838 0, nullptr, 0, filename
, line
);
842 gdb_assert (TYPE_CODE (type
) == TYPE_CODE_UNION
);
843 resuld
= instance
->plugin ().build_decl
844 ("union", name
.get (), GCC_CP_SYMBOL_UNION
| nested_access
,
845 0, nullptr, 0, filename
, line
);
849 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
851 struct gcc_vbase_array bases
;
852 int num_baseclasses
= TYPE_N_BASECLASSES (type
);
854 memset (&bases
, 0, sizeof (bases
));
856 if (num_baseclasses
> 0)
858 bases
.elements
= XNEWVEC (gcc_type
, num_baseclasses
);
859 bases
.flags
= XNEWVEC (enum gcc_cp_symbol_kind
, num_baseclasses
);
860 bases
.n_elements
= num_baseclasses
;
861 for (int i
= 0; i
< num_baseclasses
; ++i
)
863 struct type
*base_type
= TYPE_BASECLASS (type
, i
);
865 bases
.flags
[i
] = GCC_CP_SYMBOL_BASECLASS
866 | get_field_access_flag (type
, i
)
867 | (BASETYPE_VIA_VIRTUAL (type
, i
)
868 ? GCC_CP_FLAG_BASECLASS_VIRTUAL
869 : GCC_CP_FLAG_BASECLASS_NOFLAG
);
870 bases
.elements
[i
] = instance
->convert_type (base_type
);
874 result
= instance
->plugin ().start_class_type
875 (name
.get (), resuld
, &bases
, filename
, line
);
877 xfree (bases
.elements
);
881 gdb_assert (TYPE_CODE (type
) == TYPE_CODE_UNION
);
882 result
= instance
->plugin ().start_class_type
883 (name
.get (), resuld
, nullptr, filename
, line
);
886 instance
->insert_type (type
, result
);
888 /* Add definitions. */
889 compile_cplus_convert_type_defns (instance
, type
);
892 compile_cplus_convert_struct_or_union_methods (instance
, type
, result
);
895 compile_cplus_convert_struct_or_union_members (instance
, type
, result
);
898 instance
->plugin ().finish_class_type (name
.get (), TYPE_LENGTH (type
));
900 /* Pop all scopes. */
901 instance
->leave_scope ();
905 /* Convert an enum type to its gcc representation. If this type
906 was defined in another type, NESTED_ACCESS should indicate the
907 accessibility of this type.*/
910 compile_cplus_convert_enum (compile_cplus_instance
*instance
, struct type
*type
,
911 enum gcc_cp_symbol_kind nested_access
)
913 bool scoped_enum_p
= false;
915 /* Create a new scope for this type. */
916 compile_scope scope
= instance
->new_scope (TYPE_NAME (type
), type
);
918 if (scope
.nested_type () != GCC_TYPE_NONE
)
920 /* The type requested was actually defined inside another type,
921 such as a nested class definition. Return that type. */
922 return scope
.nested_type ();
925 gdb::unique_xmalloc_ptr
<char> name
926 = compile_cplus_instance::decl_name (TYPE_NAME (type
));
928 /* Push all scopes. */
929 instance
->enter_scope (std::move (scope
));
932 = instance
->plugin ().get_int_type (TYPE_UNSIGNED (type
),
933 TYPE_LENGTH (type
), nullptr);
935 = instance
->plugin ().start_enum_type (name
.get (), int_type
,
936 GCC_CP_SYMBOL_ENUM
| nested_access
938 ? GCC_CP_FLAG_ENUM_SCOPED
939 : GCC_CP_FLAG_ENUM_NOFLAG
),
941 for (int i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
943 gdb::unique_xmalloc_ptr
<char> fname
944 = compile_cplus_instance::decl_name (TYPE_FIELD_NAME (type
, i
));
946 if (TYPE_FIELD_LOC_KIND (type
, i
) != FIELD_LOC_KIND_ENUMVAL
950 instance
->plugin ().build_enum_constant (result
, fname
.get (),
951 TYPE_FIELD_ENUMVAL (type
, i
));
954 /* Finish enum definition and pop scopes. */
955 instance
->plugin ().finish_enum_type (result
);
956 instance
->leave_scope ();
960 /* Convert a function type to its gcc representation. This function does
961 not deal with function templates. */
964 compile_cplus_convert_func (compile_cplus_instance
*instance
,
965 struct type
*type
, bool strip_artificial
)
967 int is_varargs
= TYPE_VARARGS (type
);
968 struct type
*target_type
= TYPE_TARGET_TYPE (type
);
970 /* Functions with no debug info have no return type. Ideally we'd
971 want to fallback to the type of the cast just before the
972 function, like GDB's built-in expression parser, but we don't
973 have access to that type here. For now, fallback to int, like
974 GDB's parser used to do. */
975 if (target_type
== nullptr)
977 if (TYPE_OBJFILE_OWNED (type
))
978 target_type
= objfile_type (TYPE_OWNER (type
).objfile
)->builtin_int
;
980 target_type
= builtin_type (TYPE_OWNER (type
).gdbarch
)->builtin_int
;
981 warning (_("function has unknown return type; assuming int"));
984 /* This approach means we can't make self-referential function
985 types. Those are impossible in C, though. */
986 gcc_type return_type
= instance
->convert_type (target_type
);
988 struct gcc_type_array array
=
989 { TYPE_NFIELDS (type
), XNEWVEC (gcc_type
, TYPE_NFIELDS (type
)) };
991 for (int i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
993 if (strip_artificial
&& TYPE_FIELD_ARTIFICIAL (type
, i
))
1000 array
.elements
[i
- artificials
]
1001 = instance
->convert_type (TYPE_FIELD_TYPE (type
, i
));
1005 /* We omit setting the argument types to `void' to be a little flexible
1006 with some minsyms like printf (compile-cplus.exp has examples). */
1007 gcc_type result
= instance
->plugin ().build_function_type
1008 (return_type
, &array
, is_varargs
);
1009 xfree (array
.elements
);
1013 /* Convert an integer type to its gcc representation. */
1016 compile_cplus_convert_int (compile_cplus_instance
*instance
, struct type
*type
)
1018 if (TYPE_NOSIGN (type
))
1020 gdb_assert (TYPE_LENGTH (type
) == 1);
1021 return instance
->plugin ().get_char_type ();
1024 return instance
->plugin ().get_int_type
1025 (TYPE_UNSIGNED (type
), TYPE_LENGTH (type
), TYPE_NAME (type
));
1028 /* Convert a floating-point type to its gcc representation. */
1031 compile_cplus_convert_float (compile_cplus_instance
*instance
,
1034 return instance
->plugin ().get_float_type
1035 (TYPE_LENGTH (type
), TYPE_NAME (type
));
1038 /* Convert the 'void' type to its gcc representation. */
1041 compile_cplus_convert_void (compile_cplus_instance
*instance
, struct type
*type
)
1043 return instance
->plugin ().get_void_type ();
1046 /* Convert a boolean type to its gcc representation. */
1049 compile_cplus_convert_bool (compile_cplus_instance
*instance
, struct type
*type
)
1051 return instance
->plugin ().get_bool_type ();
1054 /* See description in compile-cplus.h. */
1057 compile_cplus_instance::convert_qualified_base (gcc_type base
,
1058 gcc_cp_qualifiers_flags quals
)
1060 gcc_type result
= base
;
1063 result
= plugin ().build_qualified_type (base
, quals
);
1068 /* See description in compile-cplus.h. */
1071 compile_cplus_convert_qualified (compile_cplus_instance
*instance
,
1074 struct type
*unqual
= make_unqualified_type (type
);
1075 gcc_cp_qualifiers_flags quals
= (enum gcc_cp_qualifiers
) 0;
1076 gcc_type unqual_converted
= instance
->convert_type (unqual
);
1078 if (TYPE_CONST (type
))
1079 quals
|= GCC_CP_QUALIFIER_CONST
;
1080 if (TYPE_VOLATILE (type
))
1081 quals
|= GCC_CP_QUALIFIER_VOLATILE
;
1082 if (TYPE_RESTRICT (type
))
1083 quals
|= GCC_CP_QUALIFIER_RESTRICT
;
1085 return instance
->convert_qualified_base (unqual_converted
, quals
);
1088 /* Convert a complex type to its gcc representation. */
1091 compile_cplus_convert_complex (compile_cplus_instance
*instance
,
1094 gcc_type base
= instance
->convert_type (TYPE_TARGET_TYPE (type
));
1096 return instance
->plugin ().build_complex_type (base
);
1099 /* Convert a namespace of TYPE. */
1102 compile_cplus_convert_namespace (compile_cplus_instance
*instance
,
1105 compile_scope scope
= instance
->new_scope (TYPE_NAME (type
), type
);
1106 gdb::unique_xmalloc_ptr
<char> name
1107 = compile_cplus_instance::decl_name (TYPE_NAME (type
));
1110 instance
->enter_scope (std::move (scope
));
1112 /* Convert this namespace. */
1113 instance
->plugin ().push_namespace (name
.get ());
1114 instance
->plugin ().pop_binding_level (name
.get ());
1117 instance
->leave_scope ();
1119 /* Namespaces are non-cacheable types. */
1120 return GCC_TYPE_NONE
;
1123 /* A helper function which knows how to convert most types from their
1124 gdb representation to the corresponding gcc form. This examines
1125 the TYPE and dispatches to the appropriate conversion function. It
1126 returns the gcc type.
1128 If the type was defined in another type, NESTED_ACCESS should indicate the
1129 accessibility of this type. */
1132 convert_type_cplus_basic (compile_cplus_instance
*instance
,
1134 enum gcc_cp_symbol_kind nested_access
)
1136 /* If we are converting a qualified type, first convert the
1137 unqualified type and then apply the qualifiers. */
1138 if ((TYPE_INSTANCE_FLAGS (type
) & (TYPE_INSTANCE_FLAG_CONST
1139 | TYPE_INSTANCE_FLAG_VOLATILE
1140 | TYPE_INSTANCE_FLAG_RESTRICT
)) != 0)
1141 return compile_cplus_convert_qualified (instance
, type
);
1143 switch (TYPE_CODE (type
))
1146 case TYPE_CODE_RVALUE_REF
:
1147 return compile_cplus_convert_reference (instance
, type
);
1150 return compile_cplus_convert_pointer (instance
, type
);
1152 case TYPE_CODE_ARRAY
:
1153 return compile_cplus_convert_array (instance
, type
);
1155 case TYPE_CODE_STRUCT
:
1156 case TYPE_CODE_UNION
:
1158 compile_cplus_convert_struct_or_union (instance
, type
, nested_access
);
1160 case TYPE_CODE_ENUM
:
1161 return compile_cplus_convert_enum (instance
, type
, nested_access
);
1163 case TYPE_CODE_FUNC
:
1164 return compile_cplus_convert_func (instance
, type
, false);
1166 case TYPE_CODE_METHOD
:
1168 compile_cplus_convert_method (instance
, TYPE_SELF_TYPE (type
), type
);
1170 case TYPE_CODE_MEMBERPTR
:
1171 case TYPE_CODE_METHODPTR
:
1172 return compile_cplus_convert_memberptr (instance
, type
);
1176 return compile_cplus_convert_int (instance
, type
);
1179 return compile_cplus_convert_float (instance
, type
);
1181 case TYPE_CODE_VOID
:
1182 return compile_cplus_convert_void (instance
, type
);
1184 case TYPE_CODE_BOOL
:
1185 return compile_cplus_convert_bool (instance
, type
);
1187 case TYPE_CODE_COMPLEX
:
1188 return compile_cplus_convert_complex (instance
, type
);
1190 case TYPE_CODE_NAMESPACE
:
1191 return compile_cplus_convert_namespace (instance
, type
);
1193 case TYPE_CODE_TYPEDEF
:
1194 return compile_cplus_convert_typedef (instance
, type
, nested_access
);
1200 std::string s
= string_printf (_("unhandled TYPE_CODE %d"),
1203 return instance
->plugin ().error (s
.c_str ());
1207 compile_cplus_instance::convert_type (struct type
*type
,
1208 enum gcc_cp_symbol_kind nested_access
)
1210 /* Check if TYPE has already been converted. */
1212 if (get_cached_type (type
, &result
))
1215 /* It is the first time this type has been seen -- convert it
1216 and cache it, if appropriate.. */
1217 result
= convert_type_cplus_basic (this, type
, nested_access
);
1218 if (result
!= GCC_TYPE_NONE
)
1219 insert_type (type
, result
);
1224 compile_cplus_instance::gcc_cplus_enter_scope
1225 (void *datum
, struct gcc_cp_context
*gcc_context
)
1230 compile_cplus_instance::gcc_cplus_leave_scope
1231 (void *datum
, struct gcc_cp_context
*gcc_context
)
1237 /* Plug-in forwards. */
1239 /* C++ plug-in wrapper. */
1241 /* A result printer for plug-in calls that return a gcc_type or
1245 compile_cplus_debug_output_1 (ULONGEST arg
)
1247 fprintf_unfiltered (gdb_stdlog
, "%s", pulongest (arg
));
1251 compile_cplus_debug_output_1 (const char *arg
)
1254 fputs_unfiltered ("NULL", gdb_stdlog
);
1256 fputs_unfiltered (arg
, gdb_stdlog
);
1260 compile_cplus_debug_output ()
1264 template <typename T
>
1266 compile_cplus_debug_output_1 (const T
*arg
)
1270 template <typename T
, typename
... Targs
>
1272 compile_cplus_debug_output (T arg
, Targs
... Args
)
1274 compile_cplus_debug_output_1 (arg
);
1275 fputc_unfiltered (' ', gdb_stdlog
);
1276 compile_cplus_debug_output (Args
...);
1279 #define FORWARD(OP,...) m_context->cp_ops->OP(m_context, ##__VA_ARGS__)
1280 #define OUTPUT_DEBUG_RESULT(R) \
1281 if (debug_compile_cplus_types) \
1283 fputs_unfiltered (": ", gdb_stdlog); \
1284 compile_cplus_debug_output (R); \
1285 fputc_unfiltered ('\n', gdb_stdlog); \
1288 #define GCC_METHOD0(R, N) \
1289 R gcc_cp_plugin::N () const \
1291 if (debug_compile_cplus_types) \
1292 compile_cplus_debug_output (STRINGIFY (N)); \
1293 auto result = FORWARD (N); \
1294 OUTPUT_DEBUG_RESULT (result); \
1297 #define GCC_METHOD1(R, N, A) \
1298 R gcc_cp_plugin::N (A a) const \
1300 if (debug_compile_cplus_types) \
1301 compile_cplus_debug_output (STRINGIFY (N), a); \
1302 auto result = FORWARD (N, a); \
1303 OUTPUT_DEBUG_RESULT (result); \
1306 #define GCC_METHOD2(R, N, A, B) \
1307 R gcc_cp_plugin::N (A a, B b) const \
1309 if (debug_compile_cplus_types) \
1310 compile_cplus_debug_output (STRINGIFY (N), a, b); \
1311 auto result = FORWARD (N, a, b); \
1312 OUTPUT_DEBUG_RESULT (result); \
1315 #define GCC_METHOD3(R, N, A, B, C) \
1316 R gcc_cp_plugin::N (A a, B b, C c) const \
1318 if (debug_compile_cplus_types) \
1319 compile_cplus_debug_output (STRINGIFY (N), a, b, c); \
1320 auto result = FORWARD (N, a, b, c); \
1321 OUTPUT_DEBUG_RESULT (result); \
1324 #define GCC_METHOD4(R, N, A, B, C, D) \
1325 R gcc_cp_plugin::N (A a, B b, C c, D d) const \
1327 if (debug_compile_cplus_types) \
1328 compile_cplus_debug_output (STRINGIFY (N), a, b, c, d); \
1329 auto result = FORWARD (N, a, b, c, d); \
1330 OUTPUT_DEBUG_RESULT (result); \
1333 #define GCC_METHOD5(R, N, A, B, C, D, E) \
1334 R gcc_cp_plugin::N (A a, B b, C c, D d, E e) const \
1336 if (debug_compile_cplus_types) \
1337 compile_cplus_debug_output (STRINGIFY (N), a, b, c, d, e); \
1338 auto result = FORWARD (N, a, b, c, d, e); \
1339 OUTPUT_DEBUG_RESULT (result); \
1342 #define GCC_METHOD7(R, N, A, B, C, D, E, F, G) \
1343 R gcc_cp_plugin::N (A a, B b, C c, D d, E e, F f, G g) const \
1345 if (debug_compile_cplus_types) \
1346 compile_cplus_debug_output (STRINGIFY (N), a, b, c, d, e, f, g); \
1347 auto result = FORWARD (N, a, b, c, d, e, f, g); \
1348 OUTPUT_DEBUG_RESULT (result); \
1352 #include "gcc-cp-fe.def"
1362 #undef OUTPUT_DEBUG_RESULT
1365 gcc_cp_plugin::build_decl (const char *debug_decltype
, const char *name
,
1366 enum gcc_cp_symbol_kind sym_kind
, gcc_type sym_type
,
1367 const char *substitution_name
, gcc_address address
,
1368 const char *filename
, unsigned int line_number
)
1370 if (debug_compile_cplus_types
)
1371 fprintf_unfiltered (gdb_stdlog
, "<%s> ", debug_decltype
);
1373 return build_decl (name
, sym_kind
, sym_type
, substitution_name
,
1374 address
, filename
, line_number
);
1378 gcc_cp_plugin::start_class_type (const char *debug_name
, gcc_decl typedecl
,
1379 const struct gcc_vbase_array
*base_classes
,
1380 const char *filename
, unsigned int line_number
)
1382 if (debug_compile_cplus_types
)
1383 fprintf_unfiltered (gdb_stdlog
, "<%s> ", debug_name
);
1385 return start_class_type (typedecl
, base_classes
, filename
, line_number
);
1389 gcc_cp_plugin::finish_class_type (const char *debug_name
,
1390 unsigned long size_in_bytes
)
1392 if (debug_compile_cplus_types
)
1393 fprintf_unfiltered (gdb_stdlog
, "<%s> ", debug_name
);
1395 return finish_class_type (size_in_bytes
);
1399 gcc_cp_plugin::pop_binding_level (const char *debug_name
)
1401 if (debug_compile_cplus_types
)
1402 fprintf_unfiltered (gdb_stdlog
, "<%s> ", debug_name
);
1404 return pop_binding_level ();
1408 _initialize_compile_cplus_types ()
1410 add_setshow_boolean_cmd ("compile-cplus-types", no_class
,
1411 &debug_compile_cplus_types
, _("\
1412 Set debugging of C++ compile type conversion."), _("\
1413 Show debugging of C++ compile type conversion."), _("\
1414 When enabled debugging messages are printed during C++ type conversion for\n\
1415 the compile commands."),
1421 add_setshow_boolean_cmd ("compile-cplus-scopes", no_class
,
1422 &debug_compile_cplus_scopes
, _("\
1423 Set debugging of C++ compile scopes."), _("\
1424 Show debugging of C++ compile scopes."), _("\
1425 When enabled debugging messages are printed about definition scopes during\n\
1426 C++ type conversion for the compile commands."),