Use host_address_to_string in compile_cplus_instance::enter_scope
[deliverable/binutils-gdb.git] / gdb / compile / compile-cplus-types.c
1 /* Convert types from GDB to GCC
2
3 Copyright (C) 2014-2018 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
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.
11
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.
16
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/>. */
19
20
21 #include "defs.h"
22 #include "common/preprocessor.h"
23 #include "gdbtypes.h"
24 #include "compile-internal.h"
25 #include "compile-cplus.h"
26 #include "gdb_assert.h"
27 #include "symtab.h"
28 #include "source.h"
29 #include "cp-support.h"
30 #include "cp-abi.h"
31 #include "symtab.h"
32 #include "objfiles.h"
33 #include "block.h"
34 #include "gdbcmd.h"
35 #include "c-lang.h"
36 #include "compile-c.h" /* Included for c_get_range_decl_name
37 et al. */
38 #include <algorithm>
39
40 /* Default compile flags for C++. */
41
42 const char *compile_cplus_instance::m_default_cflags = "-std=gnu++11";
43
44 /* Flag to enable internal debugging. */
45
46 static int debug_compile_cplus_types = 0;
47
48 /* Flag to enable internal scope switching debugging. */
49
50 static int debug_compile_cplus_scopes = 0;
51
52 /* Forward declarations. */
53
54 static gcc_type compile_cplus_convert_func (compile_cplus_instance *instance,
55 struct type *type,
56 bool strip_artificial);
57
58 /* See description in compile-cplus.h. */
59
60 gdb::unique_xmalloc_ptr<char>
61 compile_cplus_instance::decl_name (const char *natural)
62 {
63 if (natural == nullptr)
64 return nullptr;
65
66 char *name = cp_func_name (natural);
67 if (name != nullptr)
68 return gdb::unique_xmalloc_ptr<char> (name);
69
70 return gdb::unique_xmalloc_ptr<char> (xstrdup (natural));
71 }
72
73 /* Get the access flag for the NUM'th field of TYPE. */
74
75 static enum gcc_cp_symbol_kind
76 get_field_access_flag (const struct type *type, int num)
77 {
78 if (TYPE_FIELD_PROTECTED (type, num))
79 return GCC_CP_ACCESS_PROTECTED;
80 else if (TYPE_FIELD_PRIVATE (type, num))
81 return GCC_CP_ACCESS_PRIVATE;
82
83 /* GDB assumes everything else is public. */
84 return GCC_CP_ACCESS_PUBLIC;
85 }
86
87 /* Get the access flag for the NUM'th method of TYPE's FNI'th
88 fieldlist. */
89
90 enum gcc_cp_symbol_kind
91 get_method_access_flag (const struct type *type, int fni, int num)
92 {
93 gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT);
94
95 /* If this type was not declared a class, everything is public. */
96 if (!TYPE_DECLARED_CLASS (type))
97 return GCC_CP_ACCESS_PUBLIC;
98
99 /* Otherwise, read accessibility from the fn_field. */
100 const struct fn_field *methods = TYPE_FN_FIELDLIST1 (type, fni);
101 if (TYPE_FN_FIELD_PROTECTED (methods, num))
102 return GCC_CP_ACCESS_PROTECTED;
103 else if (TYPE_FN_FIELD_PRIVATE (methods, num))
104 return GCC_CP_ACCESS_PRIVATE;
105 else
106 return GCC_CP_ACCESS_PUBLIC;
107 }
108
109 /* A useful debugging function to output the scope SCOPE to stdout. */
110
111 static void __attribute__ ((used))
112 debug_print_scope (const compile_scope &scope)
113 {
114 for (const auto &comp: scope)
115 {
116 const char *symbol = (comp.bsymbol.symbol != nullptr
117 ? SYMBOL_NATURAL_NAME (comp.bsymbol.symbol)
118 : "<none>");
119
120 printf_unfiltered ("\tname = %s, symbol = %s\n", comp.name.c_str (),
121 symbol);
122 }
123 }
124
125 /* See description in compile-cplus.h. */
126
127 compile_scope
128 type_name_to_scope (const char *type_name, const struct block *block)
129 {
130 compile_scope scope;
131
132 if (type_name == nullptr)
133 {
134 /* An anonymous type. We cannot really do much here. We simply cannot
135 look up anonymous types easily/at all. */
136 return scope;
137 }
138
139 const char *p = type_name;
140 std::string lookup_name;
141
142 while (*p != '\0')
143 {
144 /* Create a string token of the first component of TYPE_NAME. */
145 int len = cp_find_first_component (p);
146 std::string s (p, len);
147
148 /* Advance past the last token. */
149 p += len;
150
151 /* Look up the symbol and decide when to stop. */
152 if (!lookup_name.empty ())
153 lookup_name += "::";
154 lookup_name += s;
155
156 /* Look up the resulting name. */
157 struct block_symbol bsymbol
158 = lookup_symbol (lookup_name.c_str (), block, VAR_DOMAIN, nullptr);
159
160 if (bsymbol.symbol != nullptr)
161 {
162 scope_component comp = {s, bsymbol};
163
164 scope.push_back (comp);
165
166 if (TYPE_CODE (SYMBOL_TYPE (bsymbol.symbol)) != TYPE_CODE_NAMESPACE)
167 {
168 /* We're done. */
169 break;
170 }
171 }
172
173 if (*p == ':')
174 {
175 ++p;
176 if (*p == ':')
177 ++p;
178 else
179 {
180 /* This shouldn't happen since we are not attempting to
181 loop over user input. This name is generated by GDB
182 from debug info. */
183 internal_error (__FILE__, __LINE__,
184 _("malformed TYPE_NAME during parsing"));
185 }
186 }
187 }
188
189 return scope;
190 }
191
192 /* Compare two scope_components for equality. These are equal if the names
193 of the two components' are the same. */
194
195 bool
196 operator== (const scope_component &lhs, const scope_component &rhs)
197 {
198 return lhs.name == rhs.name;
199 }
200
201 /* Compare two scope_components for inequality. These are not equal if
202 the two components' names are not equal. */
203
204 bool
205 operator!= (const scope_component &lhs, const scope_component &rhs)
206 {
207 return lhs.name != rhs.name;
208 }
209
210 /* Compare two compile_scopes for equality. These are equal if they are both
211 contain the same number of components and each component is equal. */
212
213 bool
214 operator== (const compile_scope &lhs, const compile_scope &rhs)
215 {
216 if (lhs.size () != rhs.size ())
217 return false;
218
219 for (int i = 0; i < lhs.size (); ++i)
220 {
221 if (lhs[i] != rhs[i])
222 return false;
223 }
224
225 return true;
226 }
227
228 /* Compare two compile_scopes for inequality. These are inequal if they
229 contain unequal number of elements or if any of the components are not
230 the same. */
231
232 bool
233 operator!= (const compile_scope &lhs, const compile_scope &rhs)
234 {
235 if (lhs.size () != rhs.size ())
236 return true;
237
238 for (int i = 0; i < lhs.size (); ++i)
239 {
240 if (lhs[i] != rhs[i])
241 return true;
242 }
243
244 return false;
245 }
246
247 /* See description in compile-cplus.h. */
248
249 void
250 compile_cplus_instance::enter_scope (compile_scope &new_scope)
251 {
252 bool must_push = m_scopes.empty () || m_scopes.back () != new_scope;
253
254 new_scope.m_pushed = must_push;
255
256 /* Save the new scope. */
257 m_scopes.push_back (new_scope);
258
259 if (must_push)
260 {
261 if (debug_compile_cplus_scopes)
262 {
263 fprintf_unfiltered (gdb_stdlog, "entering new scope %s\n",
264 host_address_to_string (&new_scope));
265 }
266
267 /* Push the global namespace. */
268 plugin ().push_namespace ("");
269
270 /* Push all other namespaces. Note that we do not push the last
271 scope_component -- that's the actual type we are converting. */
272 std::for_each
273 (new_scope.begin (), new_scope.end () - 1,
274 [this] (const scope_component &comp)
275 {
276 gdb_assert (TYPE_CODE (SYMBOL_TYPE (comp.bsymbol.symbol))
277 == TYPE_CODE_NAMESPACE);
278
279 const char *ns = (comp.name == CP_ANONYMOUS_NAMESPACE_STR ? nullptr
280 : comp.name.c_str ());
281
282 this->plugin ().push_namespace (ns);
283 });
284 }
285 else
286 {
287 if (debug_compile_cplus_scopes)
288 {
289 fprintf_unfiltered (gdb_stdlog, "staying in current scope -- "
290 "scopes are identical\n");
291 }
292 }
293 }
294
295 /* See description in compile-cplus.h. */
296
297 void
298 compile_cplus_instance::leave_scope ()
299 {
300 /* Get the current scope and remove it from the internal list of
301 scopes. */
302 compile_scope current = m_scopes.back ();
303
304 m_scopes.pop_back ();
305
306 if (current.m_pushed)
307 {
308 if (debug_compile_cplus_scopes)
309 fprintf_unfiltered (gdb_stdlog, "leaving scope %p\n", current);
310
311 /* Pop namespaces. */
312 std::for_each
313 (current.begin (),current.end () - 1,
314 [this] (const scope_component &comp) {
315 gdb_assert (TYPE_CODE (SYMBOL_TYPE (comp.bsymbol.symbol))
316 == TYPE_CODE_NAMESPACE);
317 this->plugin ().pop_binding_level (comp.name.c_str ());
318 });
319
320 /* Pop global namespace. */
321 plugin ().pop_binding_level ("");
322 }
323 else
324 {
325 if (debug_compile_cplus_scopes)
326 fprintf_unfiltered (gdb_stdlog,
327 "identical scopes -- not leaving scope\n");
328 }
329 }
330
331 /* See description in compile-cplus.h. */
332
333 compile_scope
334 compile_cplus_instance::new_scope (const char *type_name, struct type *type)
335 {
336 /* Break the type name into components. If TYPE was defined in some
337 superclass, we do not process TYPE but process the enclosing type
338 instead. */
339 compile_scope scope = type_name_to_scope (type_name, block ());
340
341 if (!scope.empty ())
342 {
343 /* Get the name of the last component, which should be the
344 unqualified name of the type to process. */
345 scope_component &comp = scope.back ();
346
347 if (!types_equal (type, SYMBOL_TYPE (comp.bsymbol.symbol))
348 && (m_scopes.empty ()
349 || (m_scopes.back ().back ().bsymbol.symbol
350 != comp.bsymbol.symbol)))
351 {
352 /* The type is defined inside another class(es). Convert that
353 type instead of defining this type. */
354 convert_type (SYMBOL_TYPE (comp.bsymbol.symbol));
355
356 /* If the original type (passed in to us) is defined in a nested
357 class, the previous call will give us that type's gcc_type.
358 Upper layers are expecting to get the original type's
359 gcc_type! */
360 get_cached_type (type, scope.m_nested_type);
361 return scope;
362 }
363 }
364 else
365 {
366 if (TYPE_NAME (type) == nullptr)
367 {
368 /* Anonymous type */
369
370 /* We don't have a qualified name for this to look up, but
371 we need a scope. We have to assume, then, that it is the same
372 as the current scope, if any. */
373 if (!m_scopes.empty ())
374 {
375 scope = m_scopes.back ();
376 scope.m_pushed = false;
377 }
378 else
379 scope.push_back (scope_component ());
380 }
381 else
382 {
383 scope_component comp
384 = {
385 decl_name (TYPE_NAME (type)).get (),
386 lookup_symbol (TYPE_NAME (type), block (), VAR_DOMAIN, nullptr)
387 };
388 scope.push_back (comp);
389 }
390 }
391
392 /* There must be at least one component in the compile_scope. */
393 gdb_assert (scope.size () > 0);
394 return scope;
395 }
396
397 /* See description in compile-cplus.h. */
398
399 gcc_type
400 compile_cplus_instance::convert_reference_base
401 (gcc_type base, enum gcc_cp_ref_qualifiers rquals)
402 {
403 return this->plugin ().build_reference_type (base, rquals);
404 }
405
406 /* Convert a reference type to its gcc representation. */
407
408 static gcc_type
409 compile_cplus_convert_reference (compile_cplus_instance *instance,
410 struct type *type)
411 {
412 gcc_type target = instance->convert_type (TYPE_TARGET_TYPE (type));
413
414 enum gcc_cp_ref_qualifiers quals = GCC_CP_REF_QUAL_NONE;
415 switch (TYPE_CODE (type))
416 {
417 case TYPE_CODE_REF:
418 quals = GCC_CP_REF_QUAL_LVALUE;
419 break;
420 case TYPE_CODE_RVALUE_REF:
421 quals = GCC_CP_REF_QUAL_RVALUE;
422 break;
423 default:
424 gdb_assert_not_reached ("unexpected type code for reference type");
425 }
426
427 return instance->convert_reference_base (target, quals);
428 }
429
430 /* See description in compile-cplus.h. */
431
432 gcc_type
433 compile_cplus_instance::convert_pointer_base(gcc_type target)
434 {
435 return plugin ().build_pointer_type (target);
436 }
437
438 /* Convert a pointer type to its gcc representation. */
439
440 static gcc_type
441 compile_cplus_convert_pointer (compile_cplus_instance *instance,
442 struct type *type)
443 {
444 gcc_type target = instance->convert_type (TYPE_TARGET_TYPE (type));
445
446 return instance->convert_pointer_base (target);
447 }
448
449 /* Convert an array type to its gcc representation. */
450
451 static gcc_type
452 compile_cplus_convert_array (compile_cplus_instance *instance,
453 struct type *type)
454 {
455 struct type *range = TYPE_INDEX_TYPE (type);
456 gcc_type element_type = instance->convert_type (TYPE_TARGET_TYPE (type));
457
458 if (TYPE_LOW_BOUND_KIND (range) != PROP_CONST)
459 {
460 const char *s = _("array type with non-constant"
461 " lower bound is not supported");
462
463 return instance->plugin ().error (s);
464 }
465
466 if (TYPE_LOW_BOUND (range) != 0)
467 {
468 const char *s = _("cannot convert array type with "
469 "non-zero lower bound to C");
470
471 return instance->plugin ().error (s);
472 }
473
474 if (TYPE_HIGH_BOUND_KIND (range) == PROP_LOCEXPR
475 || TYPE_HIGH_BOUND_KIND (range) == PROP_LOCLIST)
476 {
477 if (TYPE_VECTOR (type))
478 {
479 const char *s = _("variably-sized vector type is not supported");
480
481 return instance->plugin ().error (s);
482 }
483
484 std::string upper_bound
485 = c_get_range_decl_name (&TYPE_RANGE_DATA (range)->high);
486 return instance->plugin ().build_vla_array_type (element_type,
487 upper_bound.c_str ());
488 }
489 else
490 {
491 LONGEST low_bound, high_bound, count;
492
493 if (get_array_bounds (type, &low_bound, &high_bound) == 0)
494 count = -1;
495 else
496 {
497 gdb_assert (low_bound == 0); /* Ensured above. */
498 count = high_bound + 1;
499 }
500
501 if (TYPE_VECTOR (type))
502 return instance->plugin ().build_vector_type (element_type, count);
503
504 return instance->plugin ().build_array_type (element_type, count);
505 }
506 }
507
508 /* Convert a typedef of TYPE. If not GCC_CP_ACCESS_NONE, NESTED_ACCESS
509 will define the accessibility of the typedef definition in its
510 containing class. */
511
512 static gcc_type
513 compile_cplus_convert_typedef (compile_cplus_instance *instance,
514 struct type *type,
515 enum gcc_cp_symbol_kind nested_access)
516 {
517 compile_scope scope = instance->new_scope (TYPE_NAME (type), type);
518
519 if (scope.nested_type () != GCC_TYPE_NONE)
520 return scope.nested_type ();
521
522 gdb::unique_xmalloc_ptr<char> name
523 = compile_cplus_instance::decl_name (TYPE_NAME (type));
524
525 /* Make sure the scope for this type has been pushed. */
526 instance->enter_scope (scope);
527
528 /* Convert the typedef's real type. */
529 gcc_type typedef_type = instance->convert_type (check_typedef (type));
530
531 instance->plugin ().build_decl ("typedef", name.get (),
532 GCC_CP_SYMBOL_TYPEDEF | nested_access,
533 typedef_type, 0, 0, nullptr, 0);
534
535 /* Completed this scope. */
536 instance->leave_scope ();
537 return typedef_type;
538 }
539
540 /* Convert types defined in TYPE. */
541
542 static void
543 compile_cplus_convert_type_defns (compile_cplus_instance *instance,
544 struct type *type)
545 {
546 int i;
547 enum gcc_cp_symbol_kind accessibility;
548
549 /* Convert typedefs. */
550 for (i = 0; i < TYPE_TYPEDEF_FIELD_COUNT (type); ++i)
551 {
552 if (TYPE_TYPEDEF_FIELD_PROTECTED (type, i))
553 accessibility = GCC_CP_ACCESS_PROTECTED;
554 else if (TYPE_TYPEDEF_FIELD_PRIVATE (type, i))
555 accessibility = GCC_CP_ACCESS_PRIVATE;
556 else
557 accessibility = GCC_CP_ACCESS_PUBLIC;
558 instance->convert_type (TYPE_TYPEDEF_FIELD_TYPE (type, i), accessibility);
559 }
560
561 /* Convert nested types. */
562 for (i = 0; i < TYPE_NESTED_TYPES_COUNT (type); ++i)
563 {
564 if (TYPE_NESTED_TYPES_FIELD_PROTECTED (type, i))
565 accessibility = GCC_CP_ACCESS_PROTECTED;
566 else if (TYPE_NESTED_TYPES_FIELD_PRIVATE (type, i))
567 accessibility = GCC_CP_ACCESS_PRIVATE;
568 else
569 accessibility = GCC_CP_ACCESS_PUBLIC;
570 instance->convert_type (TYPE_NESTED_TYPES_FIELD_TYPE (type, i),
571 accessibility);
572 }
573 }
574
575 /* Convert data members defined in TYPE, which should be struct/class/union
576 with gcc_type COMP_TYPE. */
577
578 static void
579 compile_cplus_convert_struct_or_union_members
580 (compile_cplus_instance *instance, struct type *type, gcc_type comp_type)
581 {
582 for (int i = TYPE_N_BASECLASSES (type); i < TYPE_NFIELDS (type); ++i)
583 {
584 const char *field_name = TYPE_FIELD_NAME (type, i);
585
586 if (TYPE_FIELD_IGNORE (type, i)
587 || TYPE_FIELD_ARTIFICIAL (type, i))
588 continue;
589
590 /* GDB records unnamed/anonymous fields with empty string names. */
591 if (*field_name == '\0')
592 field_name = nullptr;
593
594 gcc_type field_type
595 = instance->convert_type (TYPE_FIELD_TYPE (type, i));
596
597 if (field_is_static (&TYPE_FIELD (type, i)))
598 {
599 CORE_ADDR physaddr;
600
601 switch (TYPE_FIELD_LOC_KIND (type, i))
602 {
603 case FIELD_LOC_KIND_PHYSADDR:
604 {
605 physaddr = TYPE_FIELD_STATIC_PHYSADDR (type, i);
606
607 instance->plugin ().build_decl
608 ("field physaddr", field_name,
609 (GCC_CP_SYMBOL_VARIABLE | get_field_access_flag (type, i)),
610 field_type, nullptr, physaddr, nullptr, 0);
611 }
612 break;
613
614 case FIELD_LOC_KIND_PHYSNAME:
615 {
616 const char *physname = TYPE_FIELD_STATIC_PHYSNAME (type, i);
617 struct block_symbol sym
618 = lookup_symbol (physname, instance->block (),
619 VAR_DOMAIN, nullptr);
620
621 if (sym.symbol == nullptr)
622 {
623 /* We didn't actually find the symbol. There's little
624 we can do but ignore this member. */
625 continue;
626 }
627 const char *filename = symbol_symtab (sym.symbol)->filename;
628 unsigned int line = SYMBOL_LINE (sym.symbol);
629
630 physaddr = SYMBOL_VALUE_ADDRESS (sym.symbol);
631 instance->plugin ().build_decl
632 ("field physname", field_name,
633 (GCC_CP_SYMBOL_VARIABLE| get_field_access_flag (type, i)),
634 field_type, nullptr, physaddr, filename, line);
635 }
636 break;
637
638 default:
639 gdb_assert_not_reached
640 ("unexpected static field location kind");
641 }
642 }
643 else
644 {
645 unsigned long bitsize = TYPE_FIELD_BITSIZE (type, i);
646 enum gcc_cp_symbol_kind field_flags = GCC_CP_SYMBOL_FIELD
647 | get_field_access_flag (type, i);
648
649 if (bitsize == 0)
650 bitsize = 8 * TYPE_LENGTH (TYPE_FIELD_TYPE (type, i));
651
652 instance->plugin ().build_field
653 (field_name, field_type, field_flags, bitsize,
654 TYPE_FIELD_BITPOS (type, i));
655 }
656 }
657 }
658
659 /* Convert a method type to its gcc representation. */
660
661 static gcc_type
662 compile_cplus_convert_method (compile_cplus_instance *instance,
663 struct type *parent_type,
664 struct type *method_type)
665 {
666 /* Get the actual function type of the method, the corresponding class's
667 type and corresponding qualifier flags. */
668 gcc_type func_type = compile_cplus_convert_func (instance, method_type, true);
669 gcc_type class_type = instance->convert_type (parent_type);
670 gcc_cp_qualifiers_flags quals = (enum gcc_cp_qualifiers) 0;
671
672 if (TYPE_CONST (method_type))
673 quals |= GCC_CP_QUALIFIER_CONST;
674 if (TYPE_VOLATILE (method_type))
675 quals |= GCC_CP_QUALIFIER_VOLATILE;
676 if (TYPE_RESTRICT (method_type))
677 quals |= GCC_CP_QUALIFIER_RESTRICT;
678
679 /* Not yet implemented. */
680 gcc_cp_ref_qualifiers_flags rquals = GCC_CP_REF_QUAL_NONE;
681
682 return instance->plugin ().build_method_type
683 (class_type, func_type, quals, rquals);
684 }
685
686 /* Convert a member or method pointer represented by TYPE. */
687
688 static gcc_type
689 compile_cplus_convert_memberptr (compile_cplus_instance *instance,
690 struct type *type)
691 {
692 struct type *containing_class = TYPE_SELF_TYPE (type);
693
694 if (containing_class == nullptr)
695 return GCC_TYPE_NONE;
696
697 gcc_type class_type = instance->convert_type (containing_class);
698 gcc_type member_type
699 = instance->convert_type (TYPE_TARGET_TYPE (type));
700
701 return instance->plugin ().build_pointer_to_member_type
702 (class_type, member_type);
703 }
704
705 /* Convert all methods defined in TYPE, which should be a class/struct/union
706 with gcc_type CLASS_TYPE. */
707
708 static void
709 compile_cplus_convert_struct_or_union_methods (compile_cplus_instance *instance,
710 struct type *type,
711 gcc_type class_type)
712 {
713 for (int i = 0; i < TYPE_NFN_FIELDS (type); ++i)
714 {
715 struct fn_field *methods = TYPE_FN_FIELDLIST1 (type, i);
716 gdb::unique_xmalloc_ptr<char> overloaded_name
717 = compile_cplus_instance::decl_name (TYPE_FN_FIELDLIST_NAME (type, i));
718
719 /* Loop through the fieldlist, adding decls to the compiler's
720 representation of the class. */
721 for (int j = 0; j < TYPE_FN_FIELDLIST_LENGTH (type, i); ++j)
722 {
723 /* Skip artificial methods. */
724 if (TYPE_FN_FIELD_ARTIFICIAL (methods, j))
725 continue;
726
727 gcc_cp_symbol_kind_flags sym_kind = GCC_CP_SYMBOL_FUNCTION;
728 gcc_type method_type;
729 struct block_symbol sym
730 = lookup_symbol (TYPE_FN_FIELD_PHYSNAME (methods, j),
731 instance->block (), VAR_DOMAIN, nullptr);
732
733 if (sym.symbol == nullptr)
734 {
735 if (TYPE_FN_FIELD_VIRTUAL_P (methods, j))
736 {
737 /* This is beyond hacky, and is really only a workaround for
738 detecting pure virtual methods. */
739 method_type = compile_cplus_convert_method
740 (instance, type, TYPE_FN_FIELD_TYPE (methods, j));
741
742 instance->plugin ().build_decl
743 ("pure virtual method", overloaded_name.get (),
744 (sym_kind
745 | get_method_access_flag (type, i, j)
746 | GCC_CP_FLAG_VIRTUAL_FUNCTION
747 | GCC_CP_FLAG_PURE_VIRTUAL_FUNCTION),
748 method_type, nullptr, 0, nullptr, 0);
749 continue;
750 }
751
752 /* This can happen if we have a DW_AT_declaration DIE
753 for the method, but no "definition"-type DIE (with
754 DW_AT_specification referencing the decl DIE), i.e.,
755 the compiler has probably optimized the method away.
756
757 In this case, all we can hope to do is issue a warning
758 to the user letting him know. If the user has not actually
759 requested using this method, things should still work. */
760 warning (_("Method %s appears to be optimized out.\n"
761 "All references to this method will be undefined."),
762 TYPE_FN_FIELD_PHYSNAME (methods, j));
763 continue;
764 }
765
766 const char *filename = symbol_symtab (sym.symbol)->filename;
767 unsigned int line = SYMBOL_LINE (sym.symbol);
768 CORE_ADDR address = BLOCK_START (SYMBOL_BLOCK_VALUE (sym.symbol));
769 const char *kind;
770
771 if (TYPE_FN_FIELD_STATIC_P (methods, j))
772 {
773 kind = "static method";
774 method_type = compile_cplus_convert_func
775 (instance, TYPE_FN_FIELD_TYPE (methods, j), true);
776 }
777 else
778 {
779 kind = "method";
780 method_type = (compile_cplus_convert_method
781 (instance, type, TYPE_FN_FIELD_TYPE (methods, j)));
782 }
783
784 if (TYPE_FN_FIELD_VIRTUAL_P (methods, j))
785 sym_kind |= GCC_CP_FLAG_VIRTUAL_FUNCTION;
786
787 instance->plugin ().build_decl
788 (kind, overloaded_name.get (),
789 sym_kind | get_method_access_flag (type, i, j),
790 method_type, nullptr, address, filename, line);
791 }
792 }
793 }
794
795 /* Convert a struct or union type to its gcc representation. If this type
796 was defined in another type, NESTED_ACCESS should indicate the
797 accessibility of this type. */
798
799 static gcc_type
800 compile_cplus_convert_struct_or_union (compile_cplus_instance *instance,
801 struct type *type,
802 enum gcc_cp_symbol_kind nested_access)
803 {
804 const char *filename = nullptr;
805 unsigned short line = 0;
806
807 /* Get the decl name of this type. */
808 gdb::unique_xmalloc_ptr<char> name
809 = compile_cplus_instance::decl_name (TYPE_NAME (type));
810
811 /* Create a new scope for TYPE. */
812 compile_scope scope = instance->new_scope (TYPE_NAME (type), type);
813
814 if (scope.nested_type () != GCC_TYPE_NONE)
815 {
816 /* The type requested was actually defined inside another type,
817 such as a nested class definition. Return that type. */
818 return scope.nested_type ();
819 }
820
821 /* Push all scopes. */
822 instance->enter_scope (scope);
823
824 /* First we create the resulting type and enter it into our hash
825 table. This lets recursive types work. */
826
827 gcc_decl resuld;
828 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
829 {
830 const char *what = TYPE_DECLARED_CLASS (type) ? "struct" : "class";
831
832 resuld = instance->plugin ().build_decl
833 (what, name.get (), (GCC_CP_SYMBOL_CLASS | nested_access
834 | (TYPE_DECLARED_CLASS (type)
835 ? GCC_CP_FLAG_CLASS_NOFLAG
836 : GCC_CP_FLAG_CLASS_IS_STRUCT)),
837 0, nullptr, 0, filename, line);
838 }
839 else
840 {
841 gdb_assert (TYPE_CODE (type) == TYPE_CODE_UNION);
842 resuld = instance->plugin ().build_decl
843 ("union", name.get (), GCC_CP_SYMBOL_UNION | nested_access,
844 0, nullptr, 0, filename, line);
845 }
846
847 gcc_type result;
848 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
849 {
850 struct gcc_vbase_array bases;
851 int num_baseclasses = TYPE_N_BASECLASSES (type);
852
853 memset (&bases, 0, sizeof (bases));
854
855 if (num_baseclasses > 0)
856 {
857 bases.elements = XNEWVEC (gcc_type, num_baseclasses);
858 bases.flags = XNEWVEC (enum gcc_cp_symbol_kind, num_baseclasses);
859 bases.n_elements = num_baseclasses;
860 for (int i = 0; i < num_baseclasses; ++i)
861 {
862 struct type *base_type = TYPE_BASECLASS (type, i);
863
864 bases.flags[i] = GCC_CP_SYMBOL_BASECLASS
865 | get_field_access_flag (type, i)
866 | (BASETYPE_VIA_VIRTUAL (type, i)
867 ? GCC_CP_FLAG_BASECLASS_VIRTUAL
868 : GCC_CP_FLAG_BASECLASS_NOFLAG);
869 bases.elements[i] = instance->convert_type (base_type);
870 }
871 }
872
873 result = instance->plugin ().start_class_type
874 (name.get (), resuld, &bases, filename, line);
875 xfree (bases.flags);
876 xfree (bases.elements);
877 }
878 else
879 {
880 gdb_assert (TYPE_CODE (type) == TYPE_CODE_UNION);
881 result = instance->plugin ().start_class_type
882 (name.get (), resuld, nullptr, filename, line);
883 }
884
885 instance->insert_type (type, result);
886
887 /* Add definitions. */
888 compile_cplus_convert_type_defns (instance, type);
889
890 /* Add methods. */
891 compile_cplus_convert_struct_or_union_methods (instance, type, result);
892
893 /* Add members. */
894 compile_cplus_convert_struct_or_union_members (instance, type, result);
895
896 /* All finished. */
897 instance->plugin ().finish_class_type (name.get (), TYPE_LENGTH (type));
898
899 /* Pop all scopes. */
900 instance->leave_scope ();
901 return result;
902 }
903
904 /* Convert an enum type to its gcc representation. If this type
905 was defined in another type, NESTED_ACCESS should indicate the
906 accessibility of this type.*/
907
908 static gcc_type
909 compile_cplus_convert_enum (compile_cplus_instance *instance, struct type *type,
910 enum gcc_cp_symbol_kind nested_access)
911 {
912 int scoped_enum_p = FALSE;
913
914 /* Create a new scope for this type. */
915 compile_scope scope = instance->new_scope (TYPE_NAME (type), type);
916
917 if (scope.nested_type () != GCC_TYPE_NONE)
918 {
919 /* The type requested was actually defined inside another type,
920 such as a nested class definition. Return that type. */
921 return scope.nested_type ();
922 }
923
924 gdb::unique_xmalloc_ptr<char> name
925 = compile_cplus_instance::decl_name (TYPE_NAME (type));
926
927 /* Push all scopes. */
928 instance->enter_scope (scope);
929
930 gcc_type int_type
931 = instance->plugin ().get_int_type (TYPE_UNSIGNED (type),
932 TYPE_LENGTH (type), nullptr);
933 gcc_type result
934 = instance->plugin ().start_enum_type (name.get (), int_type,
935 GCC_CP_SYMBOL_ENUM | nested_access
936 | (scoped_enum_p
937 ? GCC_CP_FLAG_ENUM_SCOPED
938 : GCC_CP_FLAG_ENUM_NOFLAG),
939 nullptr, 0);
940 for (int i = 0; i < TYPE_NFIELDS (type); ++i)
941 {
942 gdb::unique_xmalloc_ptr<char> fname
943 = compile_cplus_instance::decl_name (TYPE_FIELD_NAME (type, i));
944
945 if (TYPE_FIELD_LOC_KIND (type, i) != FIELD_LOC_KIND_ENUMVAL
946 || fname == nullptr)
947 continue;
948
949 instance->plugin ().build_enum_constant (result, fname.get (),
950 TYPE_FIELD_ENUMVAL (type, i));
951 }
952
953 /* Finish enum definition and pop scopes. */
954 instance->plugin ().finish_enum_type (result);
955 instance->leave_scope ();
956 return result;
957 }
958
959 /* Convert a function type to its gcc representation. This function does
960 not deal with function templates. */
961
962 static gcc_type
963 compile_cplus_convert_func (compile_cplus_instance *instance,
964 struct type *type, bool strip_artificial)
965 {
966 int is_varargs = TYPE_VARARGS (type);
967 struct type *target_type = TYPE_TARGET_TYPE (type);
968
969 /* Functions with no debug info have no return type. Ideally we'd
970 want to fallback to the type of the cast just before the
971 function, like GDB's built-in expression parser, but we don't
972 have access to that type here. For now, fallback to int, like
973 GDB's parser used to do. */
974 if (target_type == nullptr)
975 {
976 if (TYPE_OBJFILE_OWNED (type))
977 target_type = objfile_type (TYPE_OWNER (type).objfile)->builtin_int;
978 else
979 target_type = builtin_type (TYPE_OWNER (type).gdbarch)->builtin_int;
980 warning (_("function has unknown return type; assuming int"));
981 }
982
983 /* This approach means we can't make self-referential function
984 types. Those are impossible in C, though. */
985 gcc_type return_type = instance->convert_type (target_type);
986
987 struct gcc_type_array array =
988 { TYPE_NFIELDS (type), XNEWVEC (gcc_type, TYPE_NFIELDS (type)) };
989 int artificials = 0;
990 for (int i = 0; i < TYPE_NFIELDS (type); ++i)
991 {
992 if (strip_artificial && TYPE_FIELD_ARTIFICIAL (type, i))
993 {
994 --array.n_elements;
995 ++artificials;
996 }
997 else
998 {
999 array.elements[i - artificials]
1000 = instance->convert_type (TYPE_FIELD_TYPE (type, i));
1001 }
1002 }
1003
1004 /* We omit setting the argument types to `void' to be a little flexible
1005 with some minsyms like printf (compile-cplus.exp has examples). */
1006 gcc_type result = instance->plugin ().build_function_type
1007 (return_type, &array, is_varargs);
1008 xfree (array.elements);
1009 return result;
1010 }
1011
1012 /* Convert an integer type to its gcc representation. */
1013
1014 static gcc_type
1015 compile_cplus_convert_int (compile_cplus_instance *instance, struct type *type)
1016 {
1017 if (TYPE_NOSIGN (type))
1018 {
1019 gdb_assert (TYPE_LENGTH (type) == 1);
1020 return instance->plugin ().get_char_type ();
1021 }
1022
1023 return instance->plugin ().get_int_type
1024 (TYPE_UNSIGNED (type), TYPE_LENGTH (type), TYPE_NAME (type));
1025 }
1026
1027 /* Convert a floating-point type to its gcc representation. */
1028
1029 static gcc_type
1030 compile_cplus_convert_float (compile_cplus_instance *instance,
1031 struct type *type)
1032 {
1033 return instance->plugin ().get_float_type
1034 (TYPE_LENGTH (type), TYPE_NAME (type));
1035 }
1036
1037 /* Convert the 'void' type to its gcc representation. */
1038
1039 static gcc_type
1040 compile_cplus_convert_void (compile_cplus_instance *instance, struct type *type)
1041 {
1042 return instance->plugin ().get_void_type ();
1043 }
1044
1045 /* Convert a boolean type to its gcc representation. */
1046
1047 static gcc_type
1048 compile_cplus_convert_bool (compile_cplus_instance *instance, struct type *type)
1049 {
1050 return instance->plugin ().get_bool_type ();
1051 }
1052
1053 /* See description in compile-cplus.h. */
1054
1055 gcc_type
1056 compile_cplus_instance::convert_qualified_base (gcc_type base,
1057 gcc_cp_qualifiers_flags quals)
1058 {
1059 gcc_type result = base;
1060
1061 if (quals != GCC_CP_REF_QUAL_NONE)
1062 result = plugin ().build_qualified_type (base, quals);
1063
1064 return result;
1065 }
1066
1067 /* See description in compile-cplus.h. */
1068
1069 static gcc_type
1070 compile_cplus_convert_qualified (compile_cplus_instance *instance,
1071 struct type *type)
1072 {
1073 struct type *unqual = make_unqualified_type (type);
1074 gcc_cp_qualifiers_flags quals = (enum gcc_cp_qualifiers) 0;
1075 gcc_type unqual_converted = instance->convert_type (unqual);
1076
1077 if (TYPE_CONST (type))
1078 quals |= GCC_CP_QUALIFIER_CONST;
1079 if (TYPE_VOLATILE (type))
1080 quals |= GCC_CP_QUALIFIER_VOLATILE;
1081 if (TYPE_RESTRICT (type))
1082 quals |= GCC_CP_QUALIFIER_RESTRICT;
1083
1084 return instance->convert_qualified_base (unqual_converted, quals);
1085 }
1086
1087 /* Convert a complex type to its gcc representation. */
1088
1089 static gcc_type
1090 compile_cplus_convert_complex (compile_cplus_instance *instance,
1091 struct type *type)
1092 {
1093 gcc_type base = instance->convert_type (TYPE_TARGET_TYPE (type));
1094
1095 return instance->plugin ().build_complex_type (base);
1096 }
1097
1098 /* Convert a namespace of TYPE. */
1099
1100 static gcc_type
1101 compile_cplus_convert_namespace (compile_cplus_instance *instance,
1102 struct type *type)
1103 {
1104 compile_scope scope = instance->new_scope (TYPE_NAME (type), type);
1105 gdb::unique_xmalloc_ptr<char> name
1106 = compile_cplus_instance::decl_name (TYPE_NAME (type));
1107
1108 /* Push scope. */
1109 instance->enter_scope (scope);
1110
1111 /* Convert this namespace. */
1112 instance->plugin ().push_namespace (name.get ());
1113 instance->plugin ().pop_binding_level (name.get ());
1114
1115 /* Pop scope. */
1116 instance->leave_scope ();
1117
1118 /* Namespaces are non-cacheable types. */
1119 return GCC_TYPE_NONE;
1120 }
1121
1122 /* A helper function which knows how to convert most types from their
1123 gdb representation to the corresponding gcc form. This examines
1124 the TYPE and dispatches to the appropriate conversion function. It
1125 returns the gcc type.
1126
1127 If the type was defined in another type, NESTED_ACCESS should indicate the
1128 accessibility of this type. */
1129
1130 static gcc_type
1131 convert_type_cplus_basic (compile_cplus_instance *instance,
1132 struct type *type,
1133 enum gcc_cp_symbol_kind nested_access)
1134 {
1135 /* If we are converting a qualified type, first convert the
1136 unqualified type and then apply the qualifiers. */
1137 if ((TYPE_INSTANCE_FLAGS (type) & (TYPE_INSTANCE_FLAG_CONST
1138 | TYPE_INSTANCE_FLAG_VOLATILE
1139 | TYPE_INSTANCE_FLAG_RESTRICT)) != 0)
1140 return compile_cplus_convert_qualified (instance, type);
1141
1142 switch (TYPE_CODE (type))
1143 {
1144 case TYPE_CODE_REF:
1145 case TYPE_CODE_RVALUE_REF:
1146 return compile_cplus_convert_reference (instance, type);
1147
1148 case TYPE_CODE_PTR:
1149 return compile_cplus_convert_pointer (instance, type);
1150
1151 case TYPE_CODE_ARRAY:
1152 return compile_cplus_convert_array (instance, type);
1153
1154 case TYPE_CODE_STRUCT:
1155 case TYPE_CODE_UNION:
1156 return
1157 compile_cplus_convert_struct_or_union (instance, type, nested_access);
1158
1159 case TYPE_CODE_ENUM:
1160 return compile_cplus_convert_enum (instance, type, nested_access);
1161
1162 case TYPE_CODE_FUNC:
1163 return compile_cplus_convert_func (instance, type, false);
1164
1165 case TYPE_CODE_METHOD:
1166 return
1167 compile_cplus_convert_method (instance, TYPE_SELF_TYPE (type), type);
1168
1169 case TYPE_CODE_MEMBERPTR:
1170 case TYPE_CODE_METHODPTR:
1171 return compile_cplus_convert_memberptr (instance, type);
1172 break;
1173
1174 case TYPE_CODE_INT:
1175 return compile_cplus_convert_int (instance, type);
1176
1177 case TYPE_CODE_FLT:
1178 return compile_cplus_convert_float (instance, type);
1179
1180 case TYPE_CODE_VOID:
1181 return compile_cplus_convert_void (instance, type);
1182
1183 case TYPE_CODE_BOOL:
1184 return compile_cplus_convert_bool (instance, type);
1185
1186 case TYPE_CODE_COMPLEX:
1187 return compile_cplus_convert_complex (instance, type);
1188
1189 case TYPE_CODE_NAMESPACE:
1190 return compile_cplus_convert_namespace (instance, type);
1191
1192 case TYPE_CODE_TYPEDEF:
1193 return compile_cplus_convert_typedef (instance, type, nested_access);
1194
1195 default:
1196 break;
1197 }
1198
1199 std::string s = string_printf (_("unhandled TYPE_CODE %d"),
1200 TYPE_CODE (type));
1201
1202 return instance->plugin ().error (s.c_str ());
1203 }
1204
1205 gcc_type
1206 compile_cplus_instance::convert_type (struct type *type,
1207 enum gcc_cp_symbol_kind nested_access)
1208 {
1209 /* Check if TYPE has already been converted. */
1210 gcc_type result;
1211 if (get_cached_type (type, result))
1212 return result;
1213
1214 /* It is the first time this type has been seen -- convert it
1215 and cache it, if appropriate.. */
1216 result = convert_type_cplus_basic (this, type, nested_access);
1217 if (result != GCC_TYPE_NONE)
1218 insert_type (type, result);
1219 return result;
1220 }
1221
1222 void
1223 compile_cplus_instance::gcc_cplus_enter_scope
1224 (void *datum, struct gcc_cp_context *gcc_context)
1225 {
1226 }
1227
1228 void
1229 compile_cplus_instance::gcc_cplus_leave_scope
1230 (void *datum, struct gcc_cp_context *gcc_context)
1231 {
1232 }
1233
1234 \f
1235
1236 /* Plug-in forwards. */
1237
1238 /* C++ plug-in wrapper. */
1239
1240 /* A result printer for plug-in calls that return a gcc_type or
1241 gcc_decl. */
1242
1243 static void
1244 compile_cplus_debug_output_1 (gcc_type arg)
1245 {
1246 fprintf_unfiltered (gdb_stdlog, "%lld", arg);
1247 }
1248
1249 static void
1250 compile_cplus_debug_output_1 (const char *arg)
1251 {
1252 if (arg == nullptr)
1253 fputs_unfiltered ("NULL", gdb_stdlog);
1254 else
1255 fputs_unfiltered (arg, gdb_stdlog);
1256 }
1257
1258 static void
1259 compile_cplus_debug_output ()
1260 {
1261 }
1262
1263 template <typename T>
1264 static void
1265 compile_cplus_debug_output_1 (const T *arg)
1266 {
1267 }
1268
1269 template <typename T, typename... Targs>
1270 static void
1271 compile_cplus_debug_output (T arg, Targs... Args)
1272 {
1273 compile_cplus_debug_output_1 (arg);
1274 fputc_unfiltered (' ', gdb_stdlog);
1275 compile_cplus_debug_output (Args...);
1276 }
1277
1278 #define FORWARD(OP,...) m_context->cp_ops->OP(m_context, ##__VA_ARGS__)
1279 #define OUTPUT_DEBUG_RESULT(R) \
1280 if (debug_compile_cplus_types) \
1281 { \
1282 fputs_unfiltered (": ", gdb_stdlog); \
1283 compile_cplus_debug_output (R); \
1284 fputc_unfiltered ('\n', gdb_stdlog); \
1285 } \
1286
1287 #define GCC_METHOD0(R, N) \
1288 R gcc_cp_plugin::N () const \
1289 { \
1290 if (debug_compile_cplus_types) \
1291 compile_cplus_debug_output (STRINGIFY (N)); \
1292 auto result = FORWARD (N); \
1293 OUTPUT_DEBUG_RESULT (result); \
1294 return result; \
1295 }
1296 #define GCC_METHOD1(R, N, A) \
1297 R gcc_cp_plugin::N (A a) const \
1298 { \
1299 if (debug_compile_cplus_types) \
1300 compile_cplus_debug_output (STRINGIFY (N), a); \
1301 auto result = FORWARD (N, a); \
1302 OUTPUT_DEBUG_RESULT (result); \
1303 return result; \
1304 }
1305 #define GCC_METHOD2(R, N, A, B) \
1306 R gcc_cp_plugin::N (A a, B b) const \
1307 { \
1308 if (debug_compile_cplus_types) \
1309 compile_cplus_debug_output (STRINGIFY (N), a, b); \
1310 auto result = FORWARD (N, a, b); \
1311 OUTPUT_DEBUG_RESULT (result); \
1312 return result; \
1313 }
1314 #define GCC_METHOD3(R, N, A, B, C) \
1315 R gcc_cp_plugin::N (A a, B b, C c) const \
1316 { \
1317 if (debug_compile_cplus_types) \
1318 compile_cplus_debug_output (STRINGIFY (N), a, b, c); \
1319 auto result = FORWARD (N, a, b, c); \
1320 OUTPUT_DEBUG_RESULT (result); \
1321 return result; \
1322 }
1323 #define GCC_METHOD4(R, N, A, B, C, D) \
1324 R gcc_cp_plugin::N (A a, B b, C c, D d) const \
1325 { \
1326 if (debug_compile_cplus_types) \
1327 compile_cplus_debug_output (STRINGIFY (N), a, b, c, d); \
1328 auto result = FORWARD (N, a, b, c, d); \
1329 OUTPUT_DEBUG_RESULT (result); \
1330 return result; \
1331 }
1332 #define GCC_METHOD5(R, N, A, B, C, D, E) \
1333 R gcc_cp_plugin::N (A a, B b, C c, D d, E e) const \
1334 { \
1335 if (debug_compile_cplus_types) \
1336 compile_cplus_debug_output (STRINGIFY (N), a, b, c, d, e); \
1337 auto result = FORWARD (N, a, b, c, d, e); \
1338 OUTPUT_DEBUG_RESULT (result); \
1339 return result; \
1340 }
1341 #define GCC_METHOD7(R, N, A, B, C, D, E, F, G) \
1342 R gcc_cp_plugin::N (A a, B b, C c, D d, E e, F f, G g) const \
1343 { \
1344 if (debug_compile_cplus_types) \
1345 compile_cplus_debug_output (STRINGIFY (N), a, b, c, d, e, f, g); \
1346 auto result = FORWARD (N, a, b, c, d, e, f, g); \
1347 OUTPUT_DEBUG_RESULT (result); \
1348 return result; \
1349 }
1350
1351 #include "gcc-cp-fe.def"
1352
1353 #undef GCC_METHOD0
1354 #undef GCC_METHOD1
1355 #undef GCC_METHOD2
1356 #undef GCC_METHOD3
1357 #undef GCC_METHOD4
1358 #undef GCC_METHOD5
1359 #undef GCC_METHOD7
1360 #undef FORWARD
1361 #undef OUTPUT_DEBUG_RESULT
1362
1363 gcc_expr
1364 gcc_cp_plugin::build_decl (const char *debug_decltype, const char *name,
1365 enum gcc_cp_symbol_kind sym_kind, gcc_type sym_type,
1366 const char *substitution_name, gcc_address address,
1367 const char *filename, unsigned int line_number)
1368 {
1369 if (debug_compile_cplus_types)
1370 fprintf_unfiltered (gdb_stdlog, "<%s> ", debug_decltype);
1371
1372 return build_decl (name, sym_kind, sym_type, substitution_name,
1373 address, filename, line_number);
1374 }
1375
1376 gcc_type
1377 gcc_cp_plugin::start_class_type (const char *debug_name, gcc_decl typedecl,
1378 const struct gcc_vbase_array *base_classes,
1379 const char *filename, unsigned int line_number)
1380 {
1381 if (debug_compile_cplus_types)
1382 fprintf_unfiltered (gdb_stdlog, "<%s> ", debug_name);
1383
1384 return start_class_type (typedecl, base_classes, filename, line_number);
1385 }
1386
1387 int
1388 gcc_cp_plugin::finish_class_type (const char *debug_name,
1389 unsigned long size_in_bytes)
1390 {
1391 if (debug_compile_cplus_types)
1392 fprintf_unfiltered (gdb_stdlog, "<%s> ", debug_name);
1393
1394 return finish_class_type (size_in_bytes);
1395 }
1396
1397 int
1398 gcc_cp_plugin::pop_binding_level (const char *debug_name)
1399 {
1400 if (debug_compile_cplus_types)
1401 fprintf_unfiltered (gdb_stdlog, "<%s> ", debug_name);
1402
1403 return pop_binding_level ();
1404 }
1405
1406 void
1407 _initialize_compile_cplus_types ()
1408 {
1409 add_setshow_boolean_cmd ("compile-cplus-types", no_class,
1410 &debug_compile_cplus_types, _("\
1411 Set debugging of C++ compile type conversion."), _("\
1412 Show debugging of C++ compile type conversion."), _("\
1413 When enabled debugging messages are printed during C++ type conversion for\n\
1414 the compile commands."),
1415 nullptr,
1416 nullptr,
1417 &setdebuglist,
1418 &showdebuglist);
1419
1420 add_setshow_boolean_cmd ("compile-cplus-scopes", no_class,
1421 &debug_compile_cplus_scopes, _("\
1422 Set debugging of C++ compile scopes."), _("\
1423 Show debugging of C++ compile scopes."), _("\
1424 When enabled debugging messages are printed about definition scopes during\n\
1425 C++ type conversion for the compile commands."),
1426 nullptr,
1427 nullptr,
1428 &setdebuglist,
1429 &showdebuglist);
1430 }
This page took 0.082923 seconds and 4 git commands to generate.