Fix TARGET_CHAR_BIT/HOST_CHAR_BIT confusion in gmp-utils.c
[binutils-gdb.git] / gdb / objc-lang.c
blob4cd853249aa8e70697640feb47352f6db2c3726c
1 /* Objective-C language support routines for GDB, the GNU debugger.
3 Copyright (C) 2002-2020 Free Software Foundation, Inc.
5 Contributed by Apple Computer, Inc.
6 Written by Michael Snyder.
8 This file is part of GDB.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 #include "defs.h"
24 #include "symtab.h"
25 #include "gdbtypes.h"
26 #include "expression.h"
27 #include "parser-defs.h"
28 #include "language.h"
29 #include "varobj.h"
30 #include "c-lang.h"
31 #include "objc-lang.h"
32 #include "complaints.h"
33 #include "value.h"
34 #include "symfile.h"
35 #include "objfiles.h"
36 #include "target.h"
37 #include "gdbcore.h"
38 #include "gdbcmd.h"
39 #include "frame.h"
40 #include "gdb_regex.h"
41 #include "regcache.h"
42 #include "block.h"
43 #include "infcall.h"
44 #include "valprint.h"
45 #include "cli/cli-utils.h"
47 #include <ctype.h>
48 #include <algorithm>
50 struct objc_object {
51 CORE_ADDR isa;
54 struct objc_class {
55 CORE_ADDR isa;
56 CORE_ADDR super_class;
57 CORE_ADDR name;
58 long version;
59 long info;
60 long instance_size;
61 CORE_ADDR ivars;
62 CORE_ADDR methods;
63 CORE_ADDR cache;
64 CORE_ADDR protocols;
67 struct objc_super {
68 CORE_ADDR receiver;
69 CORE_ADDR theclass;
72 struct objc_method {
73 CORE_ADDR name;
74 CORE_ADDR types;
75 CORE_ADDR imp;
78 static const struct objfile_key<unsigned int> objc_objfile_data;
80 /* Lookup a structure type named "struct NAME", visible in lexical
81 block BLOCK. If NOERR is nonzero, return zero if NAME is not
82 suitably defined. */
84 struct symbol *
85 lookup_struct_typedef (const char *name, const struct block *block, int noerr)
87 struct symbol *sym;
89 sym = lookup_symbol (name, block, STRUCT_DOMAIN, 0).symbol;
91 if (sym == NULL)
93 if (noerr)
94 return 0;
95 else
96 error (_("No struct type named %s."), name);
98 if (SYMBOL_TYPE (sym)->code () != TYPE_CODE_STRUCT)
100 if (noerr)
101 return 0;
102 else
103 error (_("This context has class, union or enum %s, not a struct."),
104 name);
106 return sym;
109 CORE_ADDR
110 lookup_objc_class (struct gdbarch *gdbarch, const char *classname)
112 struct type *char_type = builtin_type (gdbarch)->builtin_char;
113 struct value * function, *classval;
115 if (! target_has_execution ())
117 /* Can't call into inferior to lookup class. */
118 return 0;
121 if (lookup_minimal_symbol("objc_lookUpClass", 0, 0).minsym)
122 function = find_function_in_inferior("objc_lookUpClass", NULL);
123 else if (lookup_minimal_symbol ("objc_lookup_class", 0, 0).minsym)
124 function = find_function_in_inferior("objc_lookup_class", NULL);
125 else
127 complaint (_("no way to lookup Objective-C classes"));
128 return 0;
131 classval = value_string (classname, strlen (classname) + 1, char_type);
132 classval = value_coerce_array (classval);
133 return (CORE_ADDR) value_as_long (call_function_by_hand (function,
134 NULL,
135 classval));
138 CORE_ADDR
139 lookup_child_selector (struct gdbarch *gdbarch, const char *selname)
141 struct type *char_type = builtin_type (gdbarch)->builtin_char;
142 struct value * function, *selstring;
144 if (! target_has_execution ())
146 /* Can't call into inferior to lookup selector. */
147 return 0;
150 if (lookup_minimal_symbol("sel_getUid", 0, 0).minsym)
151 function = find_function_in_inferior("sel_getUid", NULL);
152 else if (lookup_minimal_symbol ("sel_get_any_uid", 0, 0).minsym)
153 function = find_function_in_inferior("sel_get_any_uid", NULL);
154 else
156 complaint (_("no way to lookup Objective-C selectors"));
157 return 0;
160 selstring = value_coerce_array (value_string (selname,
161 strlen (selname) + 1,
162 char_type));
163 return value_as_long (call_function_by_hand (function, NULL, selstring));
166 struct value *
167 value_nsstring (struct gdbarch *gdbarch, const char *ptr, int len)
169 struct type *char_type = builtin_type (gdbarch)->builtin_char;
170 struct value *stringValue[3];
171 struct value *function, *nsstringValue;
172 struct symbol *sym;
173 struct type *type;
175 if (!target_has_execution ())
176 return 0; /* Can't call into inferior to create NSString. */
178 stringValue[2] = value_string(ptr, len, char_type);
179 stringValue[2] = value_coerce_array(stringValue[2]);
180 /* _NSNewStringFromCString replaces "istr" after Lantern2A. */
181 if (lookup_minimal_symbol("_NSNewStringFromCString", 0, 0).minsym)
183 function = find_function_in_inferior("_NSNewStringFromCString", NULL);
184 nsstringValue = call_function_by_hand(function, NULL, stringValue[2]);
186 else if (lookup_minimal_symbol("istr", 0, 0).minsym)
188 function = find_function_in_inferior("istr", NULL);
189 nsstringValue = call_function_by_hand(function, NULL, stringValue[2]);
191 else if (lookup_minimal_symbol("+[NSString stringWithCString:]", 0, 0).minsym)
193 function
194 = find_function_in_inferior("+[NSString stringWithCString:]", NULL);
195 type = builtin_type (gdbarch)->builtin_long;
197 stringValue[0] = value_from_longest
198 (type, lookup_objc_class (gdbarch, "NSString"));
199 stringValue[1] = value_from_longest
200 (type, lookup_child_selector (gdbarch, "stringWithCString:"));
201 nsstringValue = call_function_by_hand(function, NULL, stringValue);
203 else
204 error (_("NSString: internal error -- no way to create new NSString"));
206 sym = lookup_struct_typedef("NSString", 0, 1);
207 if (sym == NULL)
208 sym = lookup_struct_typedef("NXString", 0, 1);
209 if (sym == NULL)
210 type = builtin_type (gdbarch)->builtin_data_ptr;
211 else
212 type = lookup_pointer_type(SYMBOL_TYPE (sym));
214 deprecated_set_value_type (nsstringValue, type);
215 return nsstringValue;
218 /* Objective-C name demangling. */
220 char *
221 objc_demangle (const char *mangled, int options)
223 char *demangled, *cp;
225 if (mangled[0] == '_' &&
226 (mangled[1] == 'i' || mangled[1] == 'c') &&
227 mangled[2] == '_')
229 cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
231 if (mangled[1] == 'i')
232 *cp++ = '-'; /* for instance method */
233 else
234 *cp++ = '+'; /* for class method */
236 *cp++ = '['; /* opening left brace */
237 strcpy(cp, mangled+3); /* Tack on the rest of the mangled name. */
239 while (*cp && *cp == '_')
240 cp++; /* Skip any initial underbars in class
241 name. */
243 cp = strchr(cp, '_');
244 if (!cp) /* Find first non-initial underbar. */
246 xfree(demangled); /* not mangled name */
247 return NULL;
249 if (cp[1] == '_') /* Easy case: no category name. */
251 *cp++ = ' '; /* Replace two '_' with one ' '. */
252 strcpy(cp, mangled + (cp - demangled) + 2);
254 else
256 *cp++ = '('; /* Less easy case: category name. */
257 cp = strchr(cp, '_');
258 if (!cp)
260 xfree(demangled); /* not mangled name */
261 return NULL;
263 *cp++ = ')';
264 *cp++ = ' '; /* Overwriting 1st char of method name... */
265 strcpy(cp, mangled + (cp - demangled)); /* Get it back. */
268 while (*cp && *cp == '_')
269 cp++; /* Skip any initial underbars in
270 method name. */
272 for (; *cp; cp++)
273 if (*cp == '_')
274 *cp = ':'; /* Replace remaining '_' with ':'. */
276 *cp++ = ']'; /* closing right brace */
277 *cp++ = 0; /* string terminator */
278 return demangled;
280 else
281 return NULL; /* Not an objc mangled name. */
285 /* Table mapping opcodes into strings for printing operators
286 and precedences of the operators. */
288 static const struct op_print objc_op_print_tab[] =
290 {",", BINOP_COMMA, PREC_COMMA, 0},
291 {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
292 {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
293 {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
294 {"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
295 {"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
296 {"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
297 {"==", BINOP_EQUAL, PREC_EQUAL, 0},
298 {"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
299 {"<=", BINOP_LEQ, PREC_ORDER, 0},
300 {">=", BINOP_GEQ, PREC_ORDER, 0},
301 {">", BINOP_GTR, PREC_ORDER, 0},
302 {"<", BINOP_LESS, PREC_ORDER, 0},
303 {">>", BINOP_RSH, PREC_SHIFT, 0},
304 {"<<", BINOP_LSH, PREC_SHIFT, 0},
305 {"+", BINOP_ADD, PREC_ADD, 0},
306 {"-", BINOP_SUB, PREC_ADD, 0},
307 {"*", BINOP_MUL, PREC_MUL, 0},
308 {"/", BINOP_DIV, PREC_MUL, 0},
309 {"%", BINOP_REM, PREC_MUL, 0},
310 {"@", BINOP_REPEAT, PREC_REPEAT, 0},
311 {"-", UNOP_NEG, PREC_PREFIX, 0},
312 {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
313 {"~", UNOP_COMPLEMENT, PREC_PREFIX, 0},
314 {"*", UNOP_IND, PREC_PREFIX, 0},
315 {"&", UNOP_ADDR, PREC_PREFIX, 0},
316 {"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
317 {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
318 {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
319 {NULL, OP_NULL, PREC_NULL, 0}
322 /* Class representing the Objective-C language. */
324 class objc_language : public language_defn
326 public:
327 objc_language ()
328 : language_defn (language_objc)
329 { /* Nothing. */ }
331 /* See language.h. */
333 const char *name () const override
334 { return "objective-c"; }
336 /* See language.h. */
338 const char *natural_name () const override
339 { return "Objective-C"; }
341 /* See language.h. */
343 const std::vector<const char *> &filename_extensions () const override
345 static const std::vector<const char *> extensions = { ".m" };
346 return extensions;
349 /* See language.h. */
350 void language_arch_info (struct gdbarch *gdbarch,
351 struct language_arch_info *lai) const override
353 c_language_arch_info (gdbarch, lai);
356 /* See language.h. */
357 bool sniff_from_mangled_name (const char *mangled,
358 char **demangled) const override
360 *demangled = objc_demangle (mangled, 0);
361 return *demangled != NULL;
364 /* See language.h. */
366 char *demangle_symbol (const char *mangled, int options) const override
368 return objc_demangle (mangled, options);
371 /* See language.h. */
373 void print_type (struct type *type, const char *varstring,
374 struct ui_file *stream, int show, int level,
375 const struct type_print_options *flags) const override
377 c_print_type (type, varstring, stream, show, level, flags);
380 /* See language.h. */
382 CORE_ADDR skip_trampoline (struct frame_info *frame,
383 CORE_ADDR stop_pc) const override
385 struct gdbarch *gdbarch = get_frame_arch (frame);
386 CORE_ADDR real_stop_pc;
387 CORE_ADDR method_stop_pc;
389 /* Determine if we are currently in the Objective-C dispatch function.
390 If so, get the address of the method function that the dispatcher
391 would call and use that as the function to step into instead. Also
392 skip over the trampoline for the function (if any). This is better
393 for the user since they are only interested in stepping into the
394 method function anyway. */
396 real_stop_pc = gdbarch_skip_trampoline_code (gdbarch, frame, stop_pc);
398 if (real_stop_pc != 0)
399 find_objc_msgcall (real_stop_pc, &method_stop_pc);
400 else
401 find_objc_msgcall (stop_pc, &method_stop_pc);
403 if (method_stop_pc)
405 real_stop_pc = gdbarch_skip_trampoline_code
406 (gdbarch, frame, method_stop_pc);
407 if (real_stop_pc == 0)
408 real_stop_pc = method_stop_pc;
411 return real_stop_pc;
414 /* See language.h. */
416 const char *name_of_this () const override
417 { return "self"; }
419 /* See language.h. */
421 enum macro_expansion macro_expansion () const override
422 { return macro_expansion_c; }
424 /* See language.h. */
426 const struct op_print *opcode_print_table () const override
427 { return c_op_print_tab; }
430 /* Single instance of the class representing the Objective-C language. */
432 static objc_language objc_language_defn;
435 * ObjC:
436 * Following functions help construct Objective-C message calls.
439 struct selname /* For parsing Objective-C. */
441 struct selname *next;
442 char *msglist_sel;
443 int msglist_len;
446 static int msglist_len;
447 static struct selname *selname_chain;
448 static char *msglist_sel;
450 void
451 start_msglist(void)
453 struct selname *newobj = XNEW (struct selname);
455 newobj->next = selname_chain;
456 newobj->msglist_len = msglist_len;
457 newobj->msglist_sel = msglist_sel;
458 msglist_len = 0;
459 msglist_sel = (char *)xmalloc(1);
460 *msglist_sel = 0;
461 selname_chain = newobj;
464 void
465 add_msglist(struct stoken *str, int addcolon)
467 char *s;
468 const char *p;
469 int len, plen;
471 if (str == 0) /* Unnamed arg, or... */
473 if (addcolon == 0) /* variable number of args. */
475 msglist_len++;
476 return;
478 p = "";
479 plen = 0;
481 else
483 p = str->ptr;
484 plen = str->length;
486 len = plen + strlen(msglist_sel) + 2;
487 s = (char *)xmalloc(len);
488 strcpy(s, msglist_sel);
489 strncat(s, p, plen);
490 xfree(msglist_sel);
491 msglist_sel = s;
492 if (addcolon)
494 s[len-2] = ':';
495 s[len-1] = 0;
496 msglist_len++;
498 else
499 s[len-2] = '\0';
503 end_msglist (struct parser_state *ps)
505 int val = msglist_len;
506 struct selname *sel = selname_chain;
507 char *p = msglist_sel;
508 CORE_ADDR selid;
510 selname_chain = sel->next;
511 msglist_len = sel->msglist_len;
512 msglist_sel = sel->msglist_sel;
513 selid = lookup_child_selector (ps->gdbarch (), p);
514 if (!selid)
515 error (_("Can't find selector \"%s\""), p);
516 write_exp_elt_longcst (ps, selid);
517 xfree(p);
518 write_exp_elt_longcst (ps, val); /* Number of args */
519 xfree(sel);
521 return val;
525 * Function: specialcmp (const char *a, const char *b)
527 * Special strcmp: treats ']' and ' ' as end-of-string.
528 * Used for qsorting lists of objc methods (either by class or selector).
531 static int
532 specialcmp (const char *a, const char *b)
534 while (*a && *a != ' ' && *a != ']' && *b && *b != ' ' && *b != ']')
536 if (*a != *b)
537 return *a - *b;
538 a++, b++;
540 if (*a && *a != ' ' && *a != ']')
541 return 1; /* a is longer therefore greater. */
542 if (*b && *b != ' ' && *b != ']')
543 return -1; /* a is shorter therefore lesser. */
544 return 0; /* a and b are identical. */
548 * Function: compare_selectors (const void *, const void *)
550 * Comparison function for use with qsort. Arguments are symbols or
551 * msymbols Compares selector part of objc method name alphabetically.
554 static int
555 compare_selectors (const void *a, const void *b)
557 const char *aname, *bname;
559 aname = (*(struct symbol **) a)->print_name ();
560 bname = (*(struct symbol **) b)->print_name ();
561 if (aname == NULL || bname == NULL)
562 error (_("internal: compare_selectors(1)"));
564 aname = strchr(aname, ' ');
565 bname = strchr(bname, ' ');
566 if (aname == NULL || bname == NULL)
567 error (_("internal: compare_selectors(2)"));
569 return specialcmp (aname+1, bname+1);
573 * Function: selectors_info (regexp, from_tty)
575 * Implements the "Info selectors" command. Takes an optional regexp
576 * arg. Lists all objective c selectors that match the regexp. Works
577 * by grepping thru all symbols for objective c methods. Output list
578 * is sorted and uniqued.
581 static void
582 info_selectors_command (const char *regexp, int from_tty)
584 const char *name;
585 char *val;
586 int matches = 0;
587 int maxlen = 0;
588 int ix;
589 char myregexp[2048];
590 char asel[256];
591 struct symbol **sym_arr;
592 int plusminus = 0;
594 if (regexp == NULL)
595 strcpy(myregexp, ".*]"); /* Null input, match all objc methods. */
596 else
598 if (*regexp == '+' || *regexp == '-')
599 { /* User wants only class methods or only instance methods. */
600 plusminus = *regexp++;
601 while (*regexp == ' ' || *regexp == '\t')
602 regexp++;
604 if (*regexp == '\0')
605 strcpy(myregexp, ".*]");
606 else
608 /* Allow a few extra bytes because of the strcat below. */
609 if (sizeof (myregexp) < strlen (regexp) + 4)
610 error (_("Regexp is too long: %s"), regexp);
611 strcpy(myregexp, regexp);
612 if (myregexp[strlen(myregexp) - 1] == '$') /* end of selector */
613 myregexp[strlen(myregexp) - 1] = ']'; /* end of method name */
614 else
615 strcat(myregexp, ".*]");
619 if (regexp != NULL)
621 val = re_comp (myregexp);
622 if (val != 0)
623 error (_("Invalid regexp (%s): %s"), val, regexp);
626 /* First time thru is JUST to get max length and count. */
627 for (objfile *objfile : current_program_space->objfiles ())
629 for (minimal_symbol *msymbol : objfile->msymbols ())
631 QUIT;
632 name = msymbol->natural_name ();
633 if (name
634 && (name[0] == '-' || name[0] == '+')
635 && name[1] == '[') /* Got a method name. */
637 /* Filter for class/instance methods. */
638 if (plusminus && name[0] != plusminus)
639 continue;
640 /* Find selector part. */
641 name = (char *) strchr (name+2, ' ');
642 if (name == NULL)
644 complaint (_("Bad method name '%s'"),
645 msymbol->natural_name ());
646 continue;
648 if (regexp == NULL || re_exec(++name) != 0)
650 const char *mystart = name;
651 const char *myend = strchr (mystart, ']');
653 if (myend && (myend - mystart > maxlen))
654 maxlen = myend - mystart; /* Get longest selector. */
655 matches++;
660 if (matches)
662 printf_filtered (_("Selectors matching \"%s\":\n\n"),
663 regexp ? regexp : "*");
665 sym_arr = XALLOCAVEC (struct symbol *, matches);
666 matches = 0;
667 for (objfile *objfile : current_program_space->objfiles ())
669 for (minimal_symbol *msymbol : objfile->msymbols ())
671 QUIT;
672 name = msymbol->natural_name ();
673 if (name &&
674 (name[0] == '-' || name[0] == '+') &&
675 name[1] == '[') /* Got a method name. */
677 /* Filter for class/instance methods. */
678 if (plusminus && name[0] != plusminus)
679 continue;
680 /* Find selector part. */
681 name = (char *) strchr(name+2, ' ');
682 if (regexp == NULL || re_exec(++name) != 0)
683 sym_arr[matches++] = (struct symbol *) msymbol;
688 qsort (sym_arr, matches, sizeof (struct minimal_symbol *),
689 compare_selectors);
690 /* Prevent compare on first iteration. */
691 asel[0] = 0;
692 for (ix = 0; ix < matches; ix++) /* Now do the output. */
694 char *p = asel;
696 QUIT;
697 name = sym_arr[ix]->natural_name ();
698 name = strchr (name, ' ') + 1;
699 if (p[0] && specialcmp(name, p) == 0)
700 continue; /* Seen this one already (not unique). */
702 /* Copy selector part. */
703 while (*name && *name != ']')
704 *p++ = *name++;
705 *p++ = '\0';
706 /* Print in columns. */
707 puts_filtered_tabular(asel, maxlen + 1, 0);
709 begin_line();
711 else
712 printf_filtered (_("No selectors matching \"%s\"\n"),
713 regexp ? regexp : "*");
717 * Function: compare_classes (const void *, const void *)
719 * Comparison function for use with qsort. Arguments are symbols or
720 * msymbols Compares class part of objc method name alphabetically.
723 static int
724 compare_classes (const void *a, const void *b)
726 const char *aname, *bname;
728 aname = (*(struct symbol **) a)->print_name ();
729 bname = (*(struct symbol **) b)->print_name ();
730 if (aname == NULL || bname == NULL)
731 error (_("internal: compare_classes(1)"));
733 return specialcmp (aname+1, bname+1);
737 * Function: classes_info(regexp, from_tty)
739 * Implements the "info classes" command for objective c classes.
740 * Lists all objective c classes that match the optional regexp.
741 * Works by grepping thru the list of objective c methods. List will
742 * be sorted and uniqued (since one class may have many methods).
743 * BUGS: will not list a class that has no methods.
746 static void
747 info_classes_command (const char *regexp, int from_tty)
749 const char *name;
750 char *val;
751 int matches = 0;
752 int maxlen = 0;
753 int ix;
754 char myregexp[2048];
755 char aclass[256];
756 struct symbol **sym_arr;
758 if (regexp == NULL)
759 strcpy(myregexp, ".* "); /* Null input: match all objc classes. */
760 else
762 /* Allow a few extra bytes because of the strcat below. */
763 if (sizeof (myregexp) < strlen (regexp) + 4)
764 error (_("Regexp is too long: %s"), regexp);
765 strcpy(myregexp, regexp);
766 if (myregexp[strlen(myregexp) - 1] == '$')
767 /* In the method name, the end of the class name is marked by ' '. */
768 myregexp[strlen(myregexp) - 1] = ' ';
769 else
770 strcat(myregexp, ".* ");
773 if (regexp != NULL)
775 val = re_comp (myregexp);
776 if (val != 0)
777 error (_("Invalid regexp (%s): %s"), val, regexp);
780 /* First time thru is JUST to get max length and count. */
781 for (objfile *objfile : current_program_space->objfiles ())
783 for (minimal_symbol *msymbol : objfile->msymbols ())
785 QUIT;
786 name = msymbol->natural_name ();
787 if (name &&
788 (name[0] == '-' || name[0] == '+') &&
789 name[1] == '[') /* Got a method name. */
790 if (regexp == NULL || re_exec(name+2) != 0)
792 /* Compute length of classname part. */
793 const char *mystart = name + 2;
794 const char *myend = strchr (mystart, ' ');
796 if (myend && (myend - mystart > maxlen))
797 maxlen = myend - mystart;
798 matches++;
802 if (matches)
804 printf_filtered (_("Classes matching \"%s\":\n\n"),
805 regexp ? regexp : "*");
806 sym_arr = XALLOCAVEC (struct symbol *, matches);
807 matches = 0;
808 for (objfile *objfile : current_program_space->objfiles ())
810 for (minimal_symbol *msymbol : objfile->msymbols ())
812 QUIT;
813 name = msymbol->natural_name ();
814 if (name &&
815 (name[0] == '-' || name[0] == '+') &&
816 name[1] == '[') /* Got a method name. */
817 if (regexp == NULL || re_exec(name+2) != 0)
818 sym_arr[matches++] = (struct symbol *) msymbol;
822 qsort (sym_arr, matches, sizeof (struct minimal_symbol *),
823 compare_classes);
824 /* Prevent compare on first iteration. */
825 aclass[0] = 0;
826 for (ix = 0; ix < matches; ix++) /* Now do the output. */
828 char *p = aclass;
830 QUIT;
831 name = sym_arr[ix]->natural_name ();
832 name += 2;
833 if (p[0] && specialcmp(name, p) == 0)
834 continue; /* Seen this one already (not unique). */
836 /* Copy class part of method name. */
837 while (*name && *name != ' ')
838 *p++ = *name++;
839 *p++ = '\0';
840 /* Print in columns. */
841 puts_filtered_tabular(aclass, maxlen + 1, 0);
843 begin_line();
845 else
846 printf_filtered (_("No classes matching \"%s\"\n"), regexp ? regexp : "*");
849 static char *
850 parse_selector (char *method, char **selector)
852 char *s1 = NULL;
853 char *s2 = NULL;
854 int found_quote = 0;
856 char *nselector = NULL;
858 gdb_assert (selector != NULL);
860 s1 = method;
862 s1 = skip_spaces (s1);
863 if (*s1 == '\'')
865 found_quote = 1;
866 s1++;
868 s1 = skip_spaces (s1);
870 nselector = s1;
871 s2 = s1;
873 for (;;)
875 if (isalnum (*s2) || (*s2 == '_') || (*s2 == ':'))
876 *s1++ = *s2;
877 else if (isspace (*s2))
879 else if ((*s2 == '\0') || (*s2 == '\''))
880 break;
881 else
882 return NULL;
883 s2++;
885 *s1++ = '\0';
887 s2 = skip_spaces (s2);
888 if (found_quote)
890 if (*s2 == '\'')
891 s2++;
892 s2 = skip_spaces (s2);
895 if (selector != NULL)
896 *selector = nselector;
898 return s2;
901 static char *
902 parse_method (char *method, char *type, char **theclass,
903 char **category, char **selector)
905 char *s1 = NULL;
906 char *s2 = NULL;
907 int found_quote = 0;
909 char ntype = '\0';
910 char *nclass = NULL;
911 char *ncategory = NULL;
912 char *nselector = NULL;
914 gdb_assert (type != NULL);
915 gdb_assert (theclass != NULL);
916 gdb_assert (category != NULL);
917 gdb_assert (selector != NULL);
919 s1 = method;
921 s1 = skip_spaces (s1);
922 if (*s1 == '\'')
924 found_quote = 1;
925 s1++;
927 s1 = skip_spaces (s1);
929 if ((s1[0] == '+') || (s1[0] == '-'))
930 ntype = *s1++;
932 s1 = skip_spaces (s1);
934 if (*s1 != '[')
935 return NULL;
936 s1++;
938 nclass = s1;
939 while (isalnum (*s1) || (*s1 == '_'))
940 s1++;
942 s2 = s1;
943 s2 = skip_spaces (s2);
945 if (*s2 == '(')
947 s2++;
948 s2 = skip_spaces (s2);
949 ncategory = s2;
950 while (isalnum (*s2) || (*s2 == '_'))
951 s2++;
952 *s2++ = '\0';
955 /* Truncate the class name now that we're not using the open paren. */
956 *s1++ = '\0';
958 nselector = s2;
959 s1 = s2;
961 for (;;)
963 if (isalnum (*s2) || (*s2 == '_') || (*s2 == ':'))
964 *s1++ = *s2;
965 else if (isspace (*s2))
967 else if (*s2 == ']')
968 break;
969 else
970 return NULL;
971 s2++;
973 *s1++ = '\0';
974 s2++;
976 s2 = skip_spaces (s2);
977 if (found_quote)
979 if (*s2 != '\'')
980 return NULL;
981 s2++;
982 s2 = skip_spaces (s2);
985 if (type != NULL)
986 *type = ntype;
987 if (theclass != NULL)
988 *theclass = nclass;
989 if (category != NULL)
990 *category = ncategory;
991 if (selector != NULL)
992 *selector = nselector;
994 return s2;
997 static void
998 find_methods (char type, const char *theclass, const char *category,
999 const char *selector,
1000 std::vector<const char *> *symbol_names)
1002 const char *symname = NULL;
1004 char ntype = '\0';
1005 char *nclass = NULL;
1006 char *ncategory = NULL;
1007 char *nselector = NULL;
1009 static char *tmp = NULL;
1010 static unsigned int tmplen = 0;
1012 gdb_assert (symbol_names != NULL);
1014 for (objfile *objfile : current_program_space->objfiles ())
1016 unsigned int *objc_csym;
1018 /* The objfile_csym variable counts the number of ObjC methods
1019 that this objfile defines. We save that count as a private
1020 objfile data. If we have already determined that this objfile
1021 provides no ObjC methods, we can skip it entirely. */
1023 unsigned int objfile_csym = 0;
1025 objc_csym = objc_objfile_data.get (objfile);
1026 if (objc_csym != NULL && *objc_csym == 0)
1027 /* There are no ObjC symbols in this objfile. Skip it entirely. */
1028 continue;
1030 for (minimal_symbol *msymbol : objfile->msymbols ())
1032 QUIT;
1034 /* Check the symbol name first as this can be done entirely without
1035 sending any query to the target. */
1036 symname = msymbol->natural_name ();
1037 if (symname == NULL)
1038 continue;
1040 if ((symname[0] != '-' && symname[0] != '+') || (symname[1] != '['))
1041 /* Not a method name. */
1042 continue;
1044 objfile_csym++;
1046 /* Now that thinks are a bit sane, clean up the symname. */
1047 while ((strlen (symname) + 1) >= tmplen)
1049 tmplen = (tmplen == 0) ? 1024 : tmplen * 2;
1050 tmp = (char *) xrealloc (tmp, tmplen);
1052 strcpy (tmp, symname);
1054 if (parse_method (tmp, &ntype, &nclass,
1055 &ncategory, &nselector) == NULL)
1056 continue;
1058 if ((type != '\0') && (ntype != type))
1059 continue;
1061 if ((theclass != NULL)
1062 && ((nclass == NULL) || (strcmp (theclass, nclass) != 0)))
1063 continue;
1065 if ((category != NULL) &&
1066 ((ncategory == NULL) || (strcmp (category, ncategory) != 0)))
1067 continue;
1069 if ((selector != NULL) &&
1070 ((nselector == NULL) || (strcmp (selector, nselector) != 0)))
1071 continue;
1073 symbol_names->push_back (symname);
1076 if (objc_csym == NULL)
1077 objc_csym = objc_objfile_data.emplace (objfile, objfile_csym);
1078 else
1079 /* Count of ObjC methods in this objfile should be constant. */
1080 gdb_assert (*objc_csym == objfile_csym);
1084 /* Uniquify a vector of strings. */
1086 static void
1087 uniquify_strings (std::vector<const char *> *strings)
1089 if (strings->empty ())
1090 return;
1092 std::sort (strings->begin (), strings->end (), compare_cstrings);
1093 strings->erase (std::unique (strings->begin (), strings->end (), streq),
1094 strings->end ());
1098 * Function: find_imps (const char *selector, struct symbol **sym_arr)
1100 * Input: a string representing a selector
1101 * a pointer to an array of symbol pointers
1102 * possibly a pointer to a symbol found by the caller.
1104 * Output: number of methods that implement that selector. Side
1105 * effects: The array of symbol pointers is filled with matching syms.
1107 * By analogy with function "find_methods" (symtab.c), builds a list
1108 * of symbols matching the ambiguous input, so that "decode_line_2"
1109 * (symtab.c) can list them and ask the user to choose one or more.
1110 * In this case the matches are objective c methods
1111 * ("implementations") matching an objective c selector.
1113 * Note that it is possible for a normal (c-style) function to have
1114 * the same name as an objective c selector. To prevent the selector
1115 * from eclipsing the function, we allow the caller (decode_line_1) to
1116 * search for such a function first, and if it finds one, pass it in
1117 * to us. We will then integrate it into the list. We also search
1118 * for one here, among the minsyms.
1120 * NOTE: if NUM_DEBUGGABLE is non-zero, the sym_arr will be divided
1121 * into two parts: debuggable (struct symbol) syms, and
1122 * non_debuggable (struct minimal_symbol) syms. The debuggable
1123 * ones will come first, before NUM_DEBUGGABLE (which will thus
1124 * be the index of the first non-debuggable one).
1127 const char *
1128 find_imps (const char *method, std::vector<const char *> *symbol_names)
1130 char type = '\0';
1131 char *theclass = NULL;
1132 char *category = NULL;
1133 char *selector = NULL;
1135 char *buf = NULL;
1136 char *tmp = NULL;
1138 int selector_case = 0;
1140 gdb_assert (symbol_names != NULL);
1142 buf = (char *) alloca (strlen (method) + 1);
1143 strcpy (buf, method);
1144 tmp = parse_method (buf, &type, &theclass, &category, &selector);
1146 if (tmp == NULL)
1148 strcpy (buf, method);
1149 tmp = parse_selector (buf, &selector);
1151 if (tmp == NULL)
1152 return NULL;
1154 selector_case = 1;
1157 find_methods (type, theclass, category, selector, symbol_names);
1159 /* If we hit the "selector" case, and we found some methods, then
1160 add the selector itself as a symbol, if it exists. */
1161 if (selector_case && !symbol_names->empty ())
1163 struct symbol *sym = lookup_symbol (selector, NULL, VAR_DOMAIN,
1164 0).symbol;
1166 if (sym != NULL)
1167 symbol_names->push_back (sym->natural_name ());
1168 else
1170 struct bound_minimal_symbol msym
1171 = lookup_minimal_symbol (selector, 0, 0);
1173 if (msym.minsym != NULL)
1174 symbol_names->push_back (msym.minsym->natural_name ());
1178 uniquify_strings (symbol_names);
1180 return method + (tmp - buf);
1183 static void
1184 print_object_command (const char *args, int from_tty)
1186 struct value *object, *function, *description;
1187 CORE_ADDR string_addr, object_addr;
1188 int i = 0;
1189 gdb_byte c = 0;
1191 if (!args || !*args)
1192 error (
1193 "The 'print-object' command requires an argument (an Objective-C object)");
1196 expression_up expr = parse_expression (args);
1197 int pc = 0;
1199 object = evaluate_subexp (builtin_type (expr->gdbarch)->builtin_data_ptr,
1200 expr.get (), &pc, EVAL_NORMAL);
1203 /* Validate the address for sanity. */
1204 object_addr = value_as_long (object);
1205 read_memory (object_addr, &c, 1);
1207 function = find_function_in_inferior ("_NSPrintForDebugger", NULL);
1208 if (function == NULL)
1209 error (_("Unable to locate _NSPrintForDebugger in child process"));
1211 description = call_function_by_hand (function, NULL, object);
1213 string_addr = value_as_long (description);
1214 if (string_addr == 0)
1215 error (_("object returns null description"));
1217 read_memory (string_addr + i++, &c, 1);
1218 if (c != 0)
1220 { /* Read and print characters up to EOS. */
1221 QUIT;
1222 printf_filtered ("%c", c);
1223 read_memory (string_addr + i++, &c, 1);
1224 } while (c != 0);
1225 else
1226 printf_filtered(_("<object returns empty description>"));
1227 printf_filtered ("\n");
1230 /* The data structure 'methcalls' is used to detect method calls (thru
1231 * ObjC runtime lib functions objc_msgSend, objc_msgSendSuper, etc.),
1232 * and ultimately find the method being called.
1235 struct objc_methcall {
1236 const char *name;
1237 /* Return instance method to be called. */
1238 int (*stop_at) (CORE_ADDR, CORE_ADDR *);
1239 /* Start of pc range corresponding to method invocation. */
1240 CORE_ADDR begin;
1241 /* End of pc range corresponding to method invocation. */
1242 CORE_ADDR end;
1245 static int resolve_msgsend (CORE_ADDR pc, CORE_ADDR *new_pc);
1246 static int resolve_msgsend_stret (CORE_ADDR pc, CORE_ADDR *new_pc);
1247 static int resolve_msgsend_super (CORE_ADDR pc, CORE_ADDR *new_pc);
1248 static int resolve_msgsend_super_stret (CORE_ADDR pc, CORE_ADDR *new_pc);
1250 static struct objc_methcall methcalls[] = {
1251 { "_objc_msgSend", resolve_msgsend, 0, 0},
1252 { "_objc_msgSend_stret", resolve_msgsend_stret, 0, 0},
1253 { "_objc_msgSendSuper", resolve_msgsend_super, 0, 0},
1254 { "_objc_msgSendSuper_stret", resolve_msgsend_super_stret, 0, 0},
1255 { "_objc_getClass", NULL, 0, 0},
1256 { "_objc_getMetaClass", NULL, 0, 0}
1259 #define nmethcalls (sizeof (methcalls) / sizeof (methcalls[0]))
1261 /* The following function, "find_objc_msgsend", fills in the data
1262 * structure "objc_msgs" by finding the addresses of each of the
1263 * (currently four) functions that it holds (of which objc_msgSend is
1264 * the first). This must be called each time symbols are loaded, in
1265 * case the functions have moved for some reason.
1268 static void
1269 find_objc_msgsend (void)
1271 unsigned int i;
1273 for (i = 0; i < nmethcalls; i++)
1275 struct bound_minimal_symbol func;
1277 /* Try both with and without underscore. */
1278 func = lookup_bound_minimal_symbol (methcalls[i].name);
1279 if ((func.minsym == NULL) && (methcalls[i].name[0] == '_'))
1281 func = lookup_bound_minimal_symbol (methcalls[i].name + 1);
1283 if (func.minsym == NULL)
1285 methcalls[i].begin = 0;
1286 methcalls[i].end = 0;
1287 continue;
1290 methcalls[i].begin = BMSYMBOL_VALUE_ADDRESS (func);
1291 methcalls[i].end = minimal_symbol_upper_bound (func);
1295 /* find_objc_msgcall (replaces pc_off_limits)
1297 * ALL that this function now does is to determine whether the input
1298 * address ("pc") is the address of one of the Objective-C message
1299 * dispatch functions (mainly objc_msgSend or objc_msgSendSuper), and
1300 * if so, it returns the address of the method that will be called.
1302 * The old function "pc_off_limits" used to do a lot of other things
1303 * in addition, such as detecting shared library jump stubs and
1304 * returning the address of the shlib function that would be called.
1305 * That functionality has been moved into the gdbarch_skip_trampoline_code and
1306 * IN_SOLIB_TRAMPOLINE macros, which are resolved in the target-
1307 * dependent modules.
1310 static int
1311 find_objc_msgcall_submethod (int (*f) (CORE_ADDR, CORE_ADDR *),
1312 CORE_ADDR pc,
1313 CORE_ADDR *new_pc)
1317 if (f (pc, new_pc) == 0)
1318 return 1;
1320 catch (const gdb_exception &ex)
1322 exception_fprintf (gdb_stderr, ex,
1323 "Unable to determine target of "
1324 "Objective-C method call (ignoring):\n");
1327 return 0;
1330 int
1331 find_objc_msgcall (CORE_ADDR pc, CORE_ADDR *new_pc)
1333 unsigned int i;
1335 find_objc_msgsend ();
1336 if (new_pc != NULL)
1338 *new_pc = 0;
1341 for (i = 0; i < nmethcalls; i++)
1342 if ((pc >= methcalls[i].begin) && (pc < methcalls[i].end))
1344 if (methcalls[i].stop_at != NULL)
1345 return find_objc_msgcall_submethod (methcalls[i].stop_at,
1346 pc, new_pc);
1347 else
1348 return 0;
1351 return 0;
1354 void _initialize_objc_language ();
1355 void
1356 _initialize_objc_language ()
1358 add_info ("selectors", info_selectors_command,
1359 _("All Objective-C selectors, or those matching REGEXP."));
1360 add_info ("classes", info_classes_command,
1361 _("All Objective-C classes, or those matching REGEXP."));
1362 add_com ("print-object", class_vars, print_object_command,
1363 _("Ask an Objective-C object to print itself."));
1364 add_com_alias ("po", "print-object", class_vars, 1);
1367 static void
1368 read_objc_method (struct gdbarch *gdbarch, CORE_ADDR addr,
1369 struct objc_method *method)
1371 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1373 method->name = read_memory_unsigned_integer (addr + 0, 4, byte_order);
1374 method->types = read_memory_unsigned_integer (addr + 4, 4, byte_order);
1375 method->imp = read_memory_unsigned_integer (addr + 8, 4, byte_order);
1378 static unsigned long
1379 read_objc_methlist_nmethods (struct gdbarch *gdbarch, CORE_ADDR addr)
1381 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1383 return read_memory_unsigned_integer (addr + 4, 4, byte_order);
1386 static void
1387 read_objc_methlist_method (struct gdbarch *gdbarch, CORE_ADDR addr,
1388 unsigned long num, struct objc_method *method)
1390 gdb_assert (num < read_objc_methlist_nmethods (gdbarch, addr));
1391 read_objc_method (gdbarch, addr + 8 + (12 * num), method);
1394 static void
1395 read_objc_object (struct gdbarch *gdbarch, CORE_ADDR addr,
1396 struct objc_object *object)
1398 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1400 object->isa = read_memory_unsigned_integer (addr, 4, byte_order);
1403 static void
1404 read_objc_super (struct gdbarch *gdbarch, CORE_ADDR addr,
1405 struct objc_super *super)
1407 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1409 super->receiver = read_memory_unsigned_integer (addr, 4, byte_order);
1410 super->theclass = read_memory_unsigned_integer (addr + 4, 4, byte_order);
1413 static void
1414 read_objc_class (struct gdbarch *gdbarch, CORE_ADDR addr,
1415 struct objc_class *theclass)
1417 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1419 theclass->isa = read_memory_unsigned_integer (addr, 4, byte_order);
1420 theclass->super_class = read_memory_unsigned_integer (addr + 4, 4, byte_order);
1421 theclass->name = read_memory_unsigned_integer (addr + 8, 4, byte_order);
1422 theclass->version = read_memory_unsigned_integer (addr + 12, 4, byte_order);
1423 theclass->info = read_memory_unsigned_integer (addr + 16, 4, byte_order);
1424 theclass->instance_size = read_memory_unsigned_integer (addr + 18, 4,
1425 byte_order);
1426 theclass->ivars = read_memory_unsigned_integer (addr + 24, 4, byte_order);
1427 theclass->methods = read_memory_unsigned_integer (addr + 28, 4, byte_order);
1428 theclass->cache = read_memory_unsigned_integer (addr + 32, 4, byte_order);
1429 theclass->protocols = read_memory_unsigned_integer (addr + 36, 4, byte_order);
1432 static CORE_ADDR
1433 find_implementation_from_class (struct gdbarch *gdbarch,
1434 CORE_ADDR theclass, CORE_ADDR sel)
1436 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1437 CORE_ADDR subclass = theclass;
1439 while (subclass != 0)
1442 struct objc_class class_str;
1443 unsigned mlistnum = 0;
1445 read_objc_class (gdbarch, subclass, &class_str);
1447 for (;;)
1449 CORE_ADDR mlist;
1450 unsigned long nmethods;
1451 unsigned long i;
1453 mlist = read_memory_unsigned_integer (class_str.methods +
1454 (4 * mlistnum),
1455 4, byte_order);
1456 if (mlist == 0)
1457 break;
1459 nmethods = read_objc_methlist_nmethods (gdbarch, mlist);
1461 for (i = 0; i < nmethods; i++)
1463 struct objc_method meth_str;
1465 read_objc_methlist_method (gdbarch, mlist, i, &meth_str);
1467 if (meth_str.name == sel)
1468 /* FIXME: hppa arch was doing a pointer dereference
1469 here. There needs to be a better way to do that. */
1470 return meth_str.imp;
1472 mlistnum++;
1474 subclass = class_str.super_class;
1477 return 0;
1480 static CORE_ADDR
1481 find_implementation (struct gdbarch *gdbarch,
1482 CORE_ADDR object, CORE_ADDR sel)
1484 struct objc_object ostr;
1486 if (object == 0)
1487 return 0;
1488 read_objc_object (gdbarch, object, &ostr);
1489 if (ostr.isa == 0)
1490 return 0;
1492 return find_implementation_from_class (gdbarch, ostr.isa, sel);
1495 static int
1496 resolve_msgsend (CORE_ADDR pc, CORE_ADDR *new_pc)
1498 struct frame_info *frame = get_current_frame ();
1499 struct gdbarch *gdbarch = get_frame_arch (frame);
1500 struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
1502 CORE_ADDR object;
1503 CORE_ADDR sel;
1504 CORE_ADDR res;
1506 object = gdbarch_fetch_pointer_argument (gdbarch, frame, 0, ptr_type);
1507 sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1509 res = find_implementation (gdbarch, object, sel);
1510 if (new_pc != 0)
1511 *new_pc = res;
1512 if (res == 0)
1513 return 1;
1514 return 0;
1517 static int
1518 resolve_msgsend_stret (CORE_ADDR pc, CORE_ADDR *new_pc)
1520 struct frame_info *frame = get_current_frame ();
1521 struct gdbarch *gdbarch = get_frame_arch (frame);
1522 struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
1524 CORE_ADDR object;
1525 CORE_ADDR sel;
1526 CORE_ADDR res;
1528 object = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1529 sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 2, ptr_type);
1531 res = find_implementation (gdbarch, object, sel);
1532 if (new_pc != 0)
1533 *new_pc = res;
1534 if (res == 0)
1535 return 1;
1536 return 0;
1539 static int
1540 resolve_msgsend_super (CORE_ADDR pc, CORE_ADDR *new_pc)
1542 struct frame_info *frame = get_current_frame ();
1543 struct gdbarch *gdbarch = get_frame_arch (frame);
1544 struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
1546 struct objc_super sstr;
1548 CORE_ADDR super;
1549 CORE_ADDR sel;
1550 CORE_ADDR res;
1552 super = gdbarch_fetch_pointer_argument (gdbarch, frame, 0, ptr_type);
1553 sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1555 read_objc_super (gdbarch, super, &sstr);
1556 if (sstr.theclass == 0)
1557 return 0;
1559 res = find_implementation_from_class (gdbarch, sstr.theclass, sel);
1560 if (new_pc != 0)
1561 *new_pc = res;
1562 if (res == 0)
1563 return 1;
1564 return 0;
1567 static int
1568 resolve_msgsend_super_stret (CORE_ADDR pc, CORE_ADDR *new_pc)
1570 struct frame_info *frame = get_current_frame ();
1571 struct gdbarch *gdbarch = get_frame_arch (frame);
1572 struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
1574 struct objc_super sstr;
1576 CORE_ADDR super;
1577 CORE_ADDR sel;
1578 CORE_ADDR res;
1580 super = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1581 sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 2, ptr_type);
1583 read_objc_super (gdbarch, super, &sstr);
1584 if (sstr.theclass == 0)
1585 return 0;
1587 res = find_implementation_from_class (gdbarch, sstr.theclass, sel);
1588 if (new_pc != 0)
1589 *new_pc = res;
1590 if (res == 0)
1591 return 1;
1592 return 0;