gdb: Convert language la_lookup_transparent_type field to a method
[deliverable/binutils-gdb.git] / gdb / objc-lang.c
1 /* Objective-C language support routines for GDB, the GNU debugger.
2
3 Copyright (C) 2002-2020 Free Software Foundation, Inc.
4
5 Contributed by Apple Computer, Inc.
6 Written by Michael Snyder.
7
8 This file is part of GDB.
9
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.
14
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.
19
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/>. */
22
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" /* for target_has_execution */
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"
46
47 #include <ctype.h>
48 #include <algorithm>
49
50 struct objc_object {
51 CORE_ADDR isa;
52 };
53
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;
65 };
66
67 struct objc_super {
68 CORE_ADDR receiver;
69 CORE_ADDR theclass;
70 };
71
72 struct objc_method {
73 CORE_ADDR name;
74 CORE_ADDR types;
75 CORE_ADDR imp;
76 };
77
78 static const struct objfile_key<unsigned int> objc_objfile_data;
79
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. */
83
84 struct symbol *
85 lookup_struct_typedef (const char *name, const struct block *block, int noerr)
86 {
87 struct symbol *sym;
88
89 sym = lookup_symbol (name, block, STRUCT_DOMAIN, 0).symbol;
90
91 if (sym == NULL)
92 {
93 if (noerr)
94 return 0;
95 else
96 error (_("No struct type named %s."), name);
97 }
98 if (SYMBOL_TYPE (sym)->code () != TYPE_CODE_STRUCT)
99 {
100 if (noerr)
101 return 0;
102 else
103 error (_("This context has class, union or enum %s, not a struct."),
104 name);
105 }
106 return sym;
107 }
108
109 CORE_ADDR
110 lookup_objc_class (struct gdbarch *gdbarch, const char *classname)
111 {
112 struct type *char_type = builtin_type (gdbarch)->builtin_char;
113 struct value * function, *classval;
114
115 if (! target_has_execution)
116 {
117 /* Can't call into inferior to lookup class. */
118 return 0;
119 }
120
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
126 {
127 complaint (_("no way to lookup Objective-C classes"));
128 return 0;
129 }
130
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));
136 }
137
138 CORE_ADDR
139 lookup_child_selector (struct gdbarch *gdbarch, const char *selname)
140 {
141 struct type *char_type = builtin_type (gdbarch)->builtin_char;
142 struct value * function, *selstring;
143
144 if (! target_has_execution)
145 {
146 /* Can't call into inferior to lookup selector. */
147 return 0;
148 }
149
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
155 {
156 complaint (_("no way to lookup Objective-C selectors"));
157 return 0;
158 }
159
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));
164 }
165
166 struct value *
167 value_nsstring (struct gdbarch *gdbarch, char *ptr, int len)
168 {
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;
174
175 if (!target_has_execution)
176 return 0; /* Can't call into inferior to create NSString. */
177
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)
182 {
183 function = find_function_in_inferior("_NSNewStringFromCString", NULL);
184 nsstringValue = call_function_by_hand(function, NULL, stringValue[2]);
185 }
186 else if (lookup_minimal_symbol("istr", 0, 0).minsym)
187 {
188 function = find_function_in_inferior("istr", NULL);
189 nsstringValue = call_function_by_hand(function, NULL, stringValue[2]);
190 }
191 else if (lookup_minimal_symbol("+[NSString stringWithCString:]", 0, 0).minsym)
192 {
193 function
194 = find_function_in_inferior("+[NSString stringWithCString:]", NULL);
195 type = builtin_type (gdbarch)->builtin_long;
196
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);
202 }
203 else
204 error (_("NSString: internal error -- no way to create new NSString"));
205
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));
213
214 deprecated_set_value_type (nsstringValue, type);
215 return nsstringValue;
216 }
217
218 /* Objective-C name demangling. */
219
220 char *
221 objc_demangle (const char *mangled, int options)
222 {
223 char *demangled, *cp;
224
225 if (mangled[0] == '_' &&
226 (mangled[1] == 'i' || mangled[1] == 'c') &&
227 mangled[2] == '_')
228 {
229 cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
230
231 if (mangled[1] == 'i')
232 *cp++ = '-'; /* for instance method */
233 else
234 *cp++ = '+'; /* for class method */
235
236 *cp++ = '['; /* opening left brace */
237 strcpy(cp, mangled+3); /* Tack on the rest of the mangled name. */
238
239 while (*cp && *cp == '_')
240 cp++; /* Skip any initial underbars in class
241 name. */
242
243 cp = strchr(cp, '_');
244 if (!cp) /* Find first non-initial underbar. */
245 {
246 xfree(demangled); /* not mangled name */
247 return NULL;
248 }
249 if (cp[1] == '_') /* Easy case: no category name. */
250 {
251 *cp++ = ' '; /* Replace two '_' with one ' '. */
252 strcpy(cp, mangled + (cp - demangled) + 2);
253 }
254 else
255 {
256 *cp++ = '('; /* Less easy case: category name. */
257 cp = strchr(cp, '_');
258 if (!cp)
259 {
260 xfree(demangled); /* not mangled name */
261 return NULL;
262 }
263 *cp++ = ')';
264 *cp++ = ' '; /* Overwriting 1st char of method name... */
265 strcpy(cp, mangled + (cp - demangled)); /* Get it back. */
266 }
267
268 while (*cp && *cp == '_')
269 cp++; /* Skip any initial underbars in
270 method name. */
271
272 for (; *cp; cp++)
273 if (*cp == '_')
274 *cp = ':'; /* Replace remaining '_' with ':'. */
275
276 *cp++ = ']'; /* closing right brace */
277 *cp++ = 0; /* string terminator */
278 return demangled;
279 }
280 else
281 return NULL; /* Not an objc mangled name. */
282 }
283
284 /* la_sniff_from_mangled_name for ObjC. */
285
286 static int
287 objc_sniff_from_mangled_name (const char *mangled, char **demangled)
288 {
289 *demangled = objc_demangle (mangled, 0);
290 return *demangled != NULL;
291 }
292
293 /* Determine if we are currently in the Objective-C dispatch function.
294 If so, get the address of the method function that the dispatcher
295 would call and use that as the function to step into instead. Also
296 skip over the trampoline for the function (if any). This is better
297 for the user since they are only interested in stepping into the
298 method function anyway. */
299 static CORE_ADDR
300 objc_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
301 {
302 struct gdbarch *gdbarch = get_frame_arch (frame);
303 CORE_ADDR real_stop_pc;
304 CORE_ADDR method_stop_pc;
305
306 real_stop_pc = gdbarch_skip_trampoline_code (gdbarch, frame, stop_pc);
307
308 if (real_stop_pc != 0)
309 find_objc_msgcall (real_stop_pc, &method_stop_pc);
310 else
311 find_objc_msgcall (stop_pc, &method_stop_pc);
312
313 if (method_stop_pc)
314 {
315 real_stop_pc = gdbarch_skip_trampoline_code
316 (gdbarch, frame, method_stop_pc);
317 if (real_stop_pc == 0)
318 real_stop_pc = method_stop_pc;
319 }
320
321 return real_stop_pc;
322 }
323
324
325 /* Table mapping opcodes into strings for printing operators
326 and precedences of the operators. */
327
328 static const struct op_print objc_op_print_tab[] =
329 {
330 {",", BINOP_COMMA, PREC_COMMA, 0},
331 {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
332 {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
333 {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
334 {"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
335 {"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
336 {"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
337 {"==", BINOP_EQUAL, PREC_EQUAL, 0},
338 {"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
339 {"<=", BINOP_LEQ, PREC_ORDER, 0},
340 {">=", BINOP_GEQ, PREC_ORDER, 0},
341 {">", BINOP_GTR, PREC_ORDER, 0},
342 {"<", BINOP_LESS, PREC_ORDER, 0},
343 {">>", BINOP_RSH, PREC_SHIFT, 0},
344 {"<<", BINOP_LSH, PREC_SHIFT, 0},
345 {"+", BINOP_ADD, PREC_ADD, 0},
346 {"-", BINOP_SUB, PREC_ADD, 0},
347 {"*", BINOP_MUL, PREC_MUL, 0},
348 {"/", BINOP_DIV, PREC_MUL, 0},
349 {"%", BINOP_REM, PREC_MUL, 0},
350 {"@", BINOP_REPEAT, PREC_REPEAT, 0},
351 {"-", UNOP_NEG, PREC_PREFIX, 0},
352 {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
353 {"~", UNOP_COMPLEMENT, PREC_PREFIX, 0},
354 {"*", UNOP_IND, PREC_PREFIX, 0},
355 {"&", UNOP_ADDR, PREC_PREFIX, 0},
356 {"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
357 {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
358 {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
359 {NULL, OP_NULL, PREC_NULL, 0}
360 };
361
362 static const char *objc_extensions[] =
363 {
364 ".m", NULL
365 };
366
367 /* Constant data representing the Objective-C language. */
368
369 extern const struct language_data objc_language_data =
370 {
371 "objective-c", /* Language name */
372 "Objective-C",
373 language_objc,
374 range_check_off,
375 case_sensitive_on,
376 array_row_major,
377 macro_expansion_c,
378 objc_extensions,
379 &exp_descriptor_standard,
380 c_parse,
381 null_post_parser,
382 c_printchar, /* Print a character constant */
383 c_printstr, /* Function to print string constant */
384 c_emit_char,
385 c_print_type, /* Print a type using appropriate syntax */
386 c_print_typedef, /* Print a typedef using appropriate syntax */
387 c_value_print_inner, /* la_value_print_inner */
388 c_value_print, /* Print a top-level value */
389 objc_skip_trampoline, /* Language specific skip_trampoline */
390 "self", /* name_of_this */
391 false, /* la_store_sym_names_in_linkage_form_p */
392 basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
393 objc_demangle, /* Language specific symbol demangler */
394 objc_sniff_from_mangled_name,
395 NULL, /* Language specific
396 class_name_from_physname */
397 objc_op_print_tab, /* Expression operators for printing */
398 1, /* C-style arrays */
399 0, /* String lower bound */
400 default_word_break_characters,
401 default_collect_symbol_completion_matches,
402 c_watch_location_expression,
403 NULL, /* la_get_symbol_name_matcher */
404 iterate_over_symbols,
405 default_search_name_hash,
406 &default_varobj_ops,
407 NULL,
408 NULL,
409 c_is_string_type_p,
410 "{...}" /* la_struct_too_deep_ellipsis */
411 };
412
413 /* Class representing the Objective-C language. */
414
415 class objc_language : public language_defn
416 {
417 public:
418 objc_language ()
419 : language_defn (language_objc, objc_language_data)
420 { /* Nothing. */ }
421
422 /* See language.h. */
423 void language_arch_info (struct gdbarch *gdbarch,
424 struct language_arch_info *lai) const override
425 {
426 c_language_arch_info (gdbarch, lai);
427 }
428 };
429
430 /* Single instance of the class representing the Objective-C language. */
431
432 static objc_language objc_language_defn;
433
434 /*
435 * ObjC:
436 * Following functions help construct Objective-C message calls.
437 */
438
439 struct selname /* For parsing Objective-C. */
440 {
441 struct selname *next;
442 char *msglist_sel;
443 int msglist_len;
444 };
445
446 static int msglist_len;
447 static struct selname *selname_chain;
448 static char *msglist_sel;
449
450 void
451 start_msglist(void)
452 {
453 struct selname *newobj = XNEW (struct selname);
454
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;
462 }
463
464 void
465 add_msglist(struct stoken *str, int addcolon)
466 {
467 char *s;
468 const char *p;
469 int len, plen;
470
471 if (str == 0) /* Unnamed arg, or... */
472 {
473 if (addcolon == 0) /* variable number of args. */
474 {
475 msglist_len++;
476 return;
477 }
478 p = "";
479 plen = 0;
480 }
481 else
482 {
483 p = str->ptr;
484 plen = str->length;
485 }
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)
493 {
494 s[len-2] = ':';
495 s[len-1] = 0;
496 msglist_len++;
497 }
498 else
499 s[len-2] = '\0';
500 }
501
502 int
503 end_msglist (struct parser_state *ps)
504 {
505 int val = msglist_len;
506 struct selname *sel = selname_chain;
507 char *p = msglist_sel;
508 CORE_ADDR selid;
509
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);
520
521 return val;
522 }
523
524 /*
525 * Function: specialcmp (const char *a, const char *b)
526 *
527 * Special strcmp: treats ']' and ' ' as end-of-string.
528 * Used for qsorting lists of objc methods (either by class or selector).
529 */
530
531 static int
532 specialcmp (const char *a, const char *b)
533 {
534 while (*a && *a != ' ' && *a != ']' && *b && *b != ' ' && *b != ']')
535 {
536 if (*a != *b)
537 return *a - *b;
538 a++, b++;
539 }
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. */
545 }
546
547 /*
548 * Function: compare_selectors (const void *, const void *)
549 *
550 * Comparison function for use with qsort. Arguments are symbols or
551 * msymbols Compares selector part of objc method name alphabetically.
552 */
553
554 static int
555 compare_selectors (const void *a, const void *b)
556 {
557 const char *aname, *bname;
558
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)"));
563
564 aname = strchr(aname, ' ');
565 bname = strchr(bname, ' ');
566 if (aname == NULL || bname == NULL)
567 error (_("internal: compare_selectors(2)"));
568
569 return specialcmp (aname+1, bname+1);
570 }
571
572 /*
573 * Function: selectors_info (regexp, from_tty)
574 *
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.
579 */
580
581 static void
582 info_selectors_command (const char *regexp, int from_tty)
583 {
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;
593
594 if (regexp == NULL)
595 strcpy(myregexp, ".*]"); /* Null input, match all objc methods. */
596 else
597 {
598 if (*regexp == '+' || *regexp == '-')
599 { /* User wants only class methods or only instance methods. */
600 plusminus = *regexp++;
601 while (*regexp == ' ' || *regexp == '\t')
602 regexp++;
603 }
604 if (*regexp == '\0')
605 strcpy(myregexp, ".*]");
606 else
607 {
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, ".*]");
616 }
617 }
618
619 if (regexp != NULL)
620 {
621 val = re_comp (myregexp);
622 if (val != 0)
623 error (_("Invalid regexp (%s): %s"), val, regexp);
624 }
625
626 /* First time thru is JUST to get max length and count. */
627 for (objfile *objfile : current_program_space->objfiles ())
628 {
629 for (minimal_symbol *msymbol : objfile->msymbols ())
630 {
631 QUIT;
632 name = msymbol->natural_name ();
633 if (name
634 && (name[0] == '-' || name[0] == '+')
635 && name[1] == '[') /* Got a method name. */
636 {
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)
643 {
644 complaint (_("Bad method name '%s'"),
645 msymbol->natural_name ());
646 continue;
647 }
648 if (regexp == NULL || re_exec(++name) != 0)
649 {
650 const char *mystart = name;
651 const char *myend = strchr (mystart, ']');
652
653 if (myend && (myend - mystart > maxlen))
654 maxlen = myend - mystart; /* Get longest selector. */
655 matches++;
656 }
657 }
658 }
659 }
660 if (matches)
661 {
662 printf_filtered (_("Selectors matching \"%s\":\n\n"),
663 regexp ? regexp : "*");
664
665 sym_arr = XALLOCAVEC (struct symbol *, matches);
666 matches = 0;
667 for (objfile *objfile : current_program_space->objfiles ())
668 {
669 for (minimal_symbol *msymbol : objfile->msymbols ())
670 {
671 QUIT;
672 name = msymbol->natural_name ();
673 if (name &&
674 (name[0] == '-' || name[0] == '+') &&
675 name[1] == '[') /* Got a method name. */
676 {
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;
684 }
685 }
686 }
687
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. */
693 {
694 char *p = asel;
695
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). */
701
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);
708 }
709 begin_line();
710 }
711 else
712 printf_filtered (_("No selectors matching \"%s\"\n"),
713 regexp ? regexp : "*");
714 }
715
716 /*
717 * Function: compare_classes (const void *, const void *)
718 *
719 * Comparison function for use with qsort. Arguments are symbols or
720 * msymbols Compares class part of objc method name alphabetically.
721 */
722
723 static int
724 compare_classes (const void *a, const void *b)
725 {
726 const char *aname, *bname;
727
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)"));
732
733 return specialcmp (aname+1, bname+1);
734 }
735
736 /*
737 * Function: classes_info(regexp, from_tty)
738 *
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.
744 */
745
746 static void
747 info_classes_command (const char *regexp, int from_tty)
748 {
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;
757
758 if (regexp == NULL)
759 strcpy(myregexp, ".* "); /* Null input: match all objc classes. */
760 else
761 {
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, ".* ");
771 }
772
773 if (regexp != NULL)
774 {
775 val = re_comp (myregexp);
776 if (val != 0)
777 error (_("Invalid regexp (%s): %s"), val, regexp);
778 }
779
780 /* First time thru is JUST to get max length and count. */
781 for (objfile *objfile : current_program_space->objfiles ())
782 {
783 for (minimal_symbol *msymbol : objfile->msymbols ())
784 {
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)
791 {
792 /* Compute length of classname part. */
793 const char *mystart = name + 2;
794 const char *myend = strchr (mystart, ' ');
795
796 if (myend && (myend - mystart > maxlen))
797 maxlen = myend - mystart;
798 matches++;
799 }
800 }
801 }
802 if (matches)
803 {
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 ())
809 {
810 for (minimal_symbol *msymbol : objfile->msymbols ())
811 {
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;
819 }
820 }
821
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. */
827 {
828 char *p = aclass;
829
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). */
835
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);
842 }
843 begin_line();
844 }
845 else
846 printf_filtered (_("No classes matching \"%s\"\n"), regexp ? regexp : "*");
847 }
848
849 static char *
850 parse_selector (char *method, char **selector)
851 {
852 char *s1 = NULL;
853 char *s2 = NULL;
854 int found_quote = 0;
855
856 char *nselector = NULL;
857
858 gdb_assert (selector != NULL);
859
860 s1 = method;
861
862 s1 = skip_spaces (s1);
863 if (*s1 == '\'')
864 {
865 found_quote = 1;
866 s1++;
867 }
868 s1 = skip_spaces (s1);
869
870 nselector = s1;
871 s2 = s1;
872
873 for (;;)
874 {
875 if (isalnum (*s2) || (*s2 == '_') || (*s2 == ':'))
876 *s1++ = *s2;
877 else if (isspace (*s2))
878 ;
879 else if ((*s2 == '\0') || (*s2 == '\''))
880 break;
881 else
882 return NULL;
883 s2++;
884 }
885 *s1++ = '\0';
886
887 s2 = skip_spaces (s2);
888 if (found_quote)
889 {
890 if (*s2 == '\'')
891 s2++;
892 s2 = skip_spaces (s2);
893 }
894
895 if (selector != NULL)
896 *selector = nselector;
897
898 return s2;
899 }
900
901 static char *
902 parse_method (char *method, char *type, char **theclass,
903 char **category, char **selector)
904 {
905 char *s1 = NULL;
906 char *s2 = NULL;
907 int found_quote = 0;
908
909 char ntype = '\0';
910 char *nclass = NULL;
911 char *ncategory = NULL;
912 char *nselector = NULL;
913
914 gdb_assert (type != NULL);
915 gdb_assert (theclass != NULL);
916 gdb_assert (category != NULL);
917 gdb_assert (selector != NULL);
918
919 s1 = method;
920
921 s1 = skip_spaces (s1);
922 if (*s1 == '\'')
923 {
924 found_quote = 1;
925 s1++;
926 }
927 s1 = skip_spaces (s1);
928
929 if ((s1[0] == '+') || (s1[0] == '-'))
930 ntype = *s1++;
931
932 s1 = skip_spaces (s1);
933
934 if (*s1 != '[')
935 return NULL;
936 s1++;
937
938 nclass = s1;
939 while (isalnum (*s1) || (*s1 == '_'))
940 s1++;
941
942 s2 = s1;
943 s2 = skip_spaces (s2);
944
945 if (*s2 == '(')
946 {
947 s2++;
948 s2 = skip_spaces (s2);
949 ncategory = s2;
950 while (isalnum (*s2) || (*s2 == '_'))
951 s2++;
952 *s2++ = '\0';
953 }
954
955 /* Truncate the class name now that we're not using the open paren. */
956 *s1++ = '\0';
957
958 nselector = s2;
959 s1 = s2;
960
961 for (;;)
962 {
963 if (isalnum (*s2) || (*s2 == '_') || (*s2 == ':'))
964 *s1++ = *s2;
965 else if (isspace (*s2))
966 ;
967 else if (*s2 == ']')
968 break;
969 else
970 return NULL;
971 s2++;
972 }
973 *s1++ = '\0';
974 s2++;
975
976 s2 = skip_spaces (s2);
977 if (found_quote)
978 {
979 if (*s2 != '\'')
980 return NULL;
981 s2++;
982 s2 = skip_spaces (s2);
983 }
984
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;
993
994 return s2;
995 }
996
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)
1001 {
1002 const char *symname = NULL;
1003
1004 char ntype = '\0';
1005 char *nclass = NULL;
1006 char *ncategory = NULL;
1007 char *nselector = NULL;
1008
1009 static char *tmp = NULL;
1010 static unsigned int tmplen = 0;
1011
1012 gdb_assert (symbol_names != NULL);
1013
1014 for (objfile *objfile : current_program_space->objfiles ())
1015 {
1016 unsigned int *objc_csym;
1017
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. */
1022
1023 unsigned int objfile_csym = 0;
1024
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;
1029
1030 for (minimal_symbol *msymbol : objfile->msymbols ())
1031 {
1032 QUIT;
1033
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;
1039
1040 if ((symname[0] != '-' && symname[0] != '+') || (symname[1] != '['))
1041 /* Not a method name. */
1042 continue;
1043
1044 objfile_csym++;
1045
1046 /* Now that thinks are a bit sane, clean up the symname. */
1047 while ((strlen (symname) + 1) >= tmplen)
1048 {
1049 tmplen = (tmplen == 0) ? 1024 : tmplen * 2;
1050 tmp = (char *) xrealloc (tmp, tmplen);
1051 }
1052 strcpy (tmp, symname);
1053
1054 if (parse_method (tmp, &ntype, &nclass,
1055 &ncategory, &nselector) == NULL)
1056 continue;
1057
1058 if ((type != '\0') && (ntype != type))
1059 continue;
1060
1061 if ((theclass != NULL)
1062 && ((nclass == NULL) || (strcmp (theclass, nclass) != 0)))
1063 continue;
1064
1065 if ((category != NULL) &&
1066 ((ncategory == NULL) || (strcmp (category, ncategory) != 0)))
1067 continue;
1068
1069 if ((selector != NULL) &&
1070 ((nselector == NULL) || (strcmp (selector, nselector) != 0)))
1071 continue;
1072
1073 symbol_names->push_back (symname);
1074 }
1075
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);
1081 }
1082 }
1083
1084 /* Uniquify a vector of strings. */
1085
1086 static void
1087 uniquify_strings (std::vector<const char *> *strings)
1088 {
1089 if (strings->empty ())
1090 return;
1091
1092 std::sort (strings->begin (), strings->end (), compare_cstrings);
1093 strings->erase (std::unique (strings->begin (), strings->end (), streq),
1094 strings->end ());
1095 }
1096
1097 /*
1098 * Function: find_imps (const char *selector, struct symbol **sym_arr)
1099 *
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.
1103 *
1104 * Output: number of methods that implement that selector. Side
1105 * effects: The array of symbol pointers is filled with matching syms.
1106 *
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.
1112 *
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.
1119 *
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).
1125 */
1126
1127 const char *
1128 find_imps (const char *method, std::vector<const char *> *symbol_names)
1129 {
1130 char type = '\0';
1131 char *theclass = NULL;
1132 char *category = NULL;
1133 char *selector = NULL;
1134
1135 char *buf = NULL;
1136 char *tmp = NULL;
1137
1138 int selector_case = 0;
1139
1140 gdb_assert (symbol_names != NULL);
1141
1142 buf = (char *) alloca (strlen (method) + 1);
1143 strcpy (buf, method);
1144 tmp = parse_method (buf, &type, &theclass, &category, &selector);
1145
1146 if (tmp == NULL)
1147 {
1148 strcpy (buf, method);
1149 tmp = parse_selector (buf, &selector);
1150
1151 if (tmp == NULL)
1152 return NULL;
1153
1154 selector_case = 1;
1155 }
1156
1157 find_methods (type, theclass, category, selector, symbol_names);
1158
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 ())
1162 {
1163 struct symbol *sym = lookup_symbol (selector, NULL, VAR_DOMAIN,
1164 0).symbol;
1165
1166 if (sym != NULL)
1167 symbol_names->push_back (sym->natural_name ());
1168 else
1169 {
1170 struct bound_minimal_symbol msym
1171 = lookup_minimal_symbol (selector, 0, 0);
1172
1173 if (msym.minsym != NULL)
1174 symbol_names->push_back (msym.minsym->natural_name ());
1175 }
1176 }
1177
1178 uniquify_strings (symbol_names);
1179
1180 return method + (tmp - buf);
1181 }
1182
1183 static void
1184 print_object_command (const char *args, int from_tty)
1185 {
1186 struct value *object, *function, *description;
1187 CORE_ADDR string_addr, object_addr;
1188 int i = 0;
1189 gdb_byte c = 0;
1190
1191 if (!args || !*args)
1192 error (
1193 "The 'print-object' command requires an argument (an Objective-C object)");
1194
1195 {
1196 expression_up expr = parse_expression (args);
1197 int pc = 0;
1198
1199 object = evaluate_subexp (builtin_type (expr->gdbarch)->builtin_data_ptr,
1200 expr.get (), &pc, EVAL_NORMAL);
1201 }
1202
1203 /* Validate the address for sanity. */
1204 object_addr = value_as_long (object);
1205 read_memory (object_addr, &c, 1);
1206
1207 function = find_function_in_inferior ("_NSPrintForDebugger", NULL);
1208 if (function == NULL)
1209 error (_("Unable to locate _NSPrintForDebugger in child process"));
1210
1211 description = call_function_by_hand (function, NULL, object);
1212
1213 string_addr = value_as_long (description);
1214 if (string_addr == 0)
1215 error (_("object returns null description"));
1216
1217 read_memory (string_addr + i++, &c, 1);
1218 if (c != 0)
1219 do
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");
1228 }
1229
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.
1233 */
1234
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;
1243 };
1244
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);
1249
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}
1257 };
1258
1259 #define nmethcalls (sizeof (methcalls) / sizeof (methcalls[0]))
1260
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.
1266 */
1267
1268 static void
1269 find_objc_msgsend (void)
1270 {
1271 unsigned int i;
1272
1273 for (i = 0; i < nmethcalls; i++)
1274 {
1275 struct bound_minimal_symbol func;
1276
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] == '_'))
1280 {
1281 func = lookup_bound_minimal_symbol (methcalls[i].name + 1);
1282 }
1283 if (func.minsym == NULL)
1284 {
1285 methcalls[i].begin = 0;
1286 methcalls[i].end = 0;
1287 continue;
1288 }
1289
1290 methcalls[i].begin = BMSYMBOL_VALUE_ADDRESS (func);
1291 methcalls[i].end = minimal_symbol_upper_bound (func);
1292 }
1293 }
1294
1295 /* find_objc_msgcall (replaces pc_off_limits)
1296 *
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.
1301 *
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.
1308 */
1309
1310 static int
1311 find_objc_msgcall_submethod (int (*f) (CORE_ADDR, CORE_ADDR *),
1312 CORE_ADDR pc,
1313 CORE_ADDR *new_pc)
1314 {
1315 try
1316 {
1317 if (f (pc, new_pc) == 0)
1318 return 1;
1319 }
1320 catch (const gdb_exception &ex)
1321 {
1322 exception_fprintf (gdb_stderr, ex,
1323 "Unable to determine target of "
1324 "Objective-C method call (ignoring):\n");
1325 }
1326
1327 return 0;
1328 }
1329
1330 int
1331 find_objc_msgcall (CORE_ADDR pc, CORE_ADDR *new_pc)
1332 {
1333 unsigned int i;
1334
1335 find_objc_msgsend ();
1336 if (new_pc != NULL)
1337 {
1338 *new_pc = 0;
1339 }
1340
1341 for (i = 0; i < nmethcalls; i++)
1342 if ((pc >= methcalls[i].begin) && (pc < methcalls[i].end))
1343 {
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;
1349 }
1350
1351 return 0;
1352 }
1353
1354 void _initialize_objc_language ();
1355 void
1356 _initialize_objc_language ()
1357 {
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);
1365 }
1366
1367 static void
1368 read_objc_method (struct gdbarch *gdbarch, CORE_ADDR addr,
1369 struct objc_method *method)
1370 {
1371 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1372
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);
1376 }
1377
1378 static unsigned long
1379 read_objc_methlist_nmethods (struct gdbarch *gdbarch, CORE_ADDR addr)
1380 {
1381 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1382
1383 return read_memory_unsigned_integer (addr + 4, 4, byte_order);
1384 }
1385
1386 static void
1387 read_objc_methlist_method (struct gdbarch *gdbarch, CORE_ADDR addr,
1388 unsigned long num, struct objc_method *method)
1389 {
1390 gdb_assert (num < read_objc_methlist_nmethods (gdbarch, addr));
1391 read_objc_method (gdbarch, addr + 8 + (12 * num), method);
1392 }
1393
1394 static void
1395 read_objc_object (struct gdbarch *gdbarch, CORE_ADDR addr,
1396 struct objc_object *object)
1397 {
1398 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1399
1400 object->isa = read_memory_unsigned_integer (addr, 4, byte_order);
1401 }
1402
1403 static void
1404 read_objc_super (struct gdbarch *gdbarch, CORE_ADDR addr,
1405 struct objc_super *super)
1406 {
1407 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1408
1409 super->receiver = read_memory_unsigned_integer (addr, 4, byte_order);
1410 super->theclass = read_memory_unsigned_integer (addr + 4, 4, byte_order);
1411 };
1412
1413 static void
1414 read_objc_class (struct gdbarch *gdbarch, CORE_ADDR addr,
1415 struct objc_class *theclass)
1416 {
1417 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1418
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);
1430 }
1431
1432 static CORE_ADDR
1433 find_implementation_from_class (struct gdbarch *gdbarch,
1434 CORE_ADDR theclass, CORE_ADDR sel)
1435 {
1436 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1437 CORE_ADDR subclass = theclass;
1438
1439 while (subclass != 0)
1440 {
1441
1442 struct objc_class class_str;
1443 unsigned mlistnum = 0;
1444
1445 read_objc_class (gdbarch, subclass, &class_str);
1446
1447 for (;;)
1448 {
1449 CORE_ADDR mlist;
1450 unsigned long nmethods;
1451 unsigned long i;
1452
1453 mlist = read_memory_unsigned_integer (class_str.methods +
1454 (4 * mlistnum),
1455 4, byte_order);
1456 if (mlist == 0)
1457 break;
1458
1459 nmethods = read_objc_methlist_nmethods (gdbarch, mlist);
1460
1461 for (i = 0; i < nmethods; i++)
1462 {
1463 struct objc_method meth_str;
1464
1465 read_objc_methlist_method (gdbarch, mlist, i, &meth_str);
1466
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;
1471 }
1472 mlistnum++;
1473 }
1474 subclass = class_str.super_class;
1475 }
1476
1477 return 0;
1478 }
1479
1480 static CORE_ADDR
1481 find_implementation (struct gdbarch *gdbarch,
1482 CORE_ADDR object, CORE_ADDR sel)
1483 {
1484 struct objc_object ostr;
1485
1486 if (object == 0)
1487 return 0;
1488 read_objc_object (gdbarch, object, &ostr);
1489 if (ostr.isa == 0)
1490 return 0;
1491
1492 return find_implementation_from_class (gdbarch, ostr.isa, sel);
1493 }
1494
1495 static int
1496 resolve_msgsend (CORE_ADDR pc, CORE_ADDR *new_pc)
1497 {
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;
1501
1502 CORE_ADDR object;
1503 CORE_ADDR sel;
1504 CORE_ADDR res;
1505
1506 object = gdbarch_fetch_pointer_argument (gdbarch, frame, 0, ptr_type);
1507 sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1508
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;
1515 }
1516
1517 static int
1518 resolve_msgsend_stret (CORE_ADDR pc, CORE_ADDR *new_pc)
1519 {
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;
1523
1524 CORE_ADDR object;
1525 CORE_ADDR sel;
1526 CORE_ADDR res;
1527
1528 object = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1529 sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 2, ptr_type);
1530
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;
1537 }
1538
1539 static int
1540 resolve_msgsend_super (CORE_ADDR pc, CORE_ADDR *new_pc)
1541 {
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;
1545
1546 struct objc_super sstr;
1547
1548 CORE_ADDR super;
1549 CORE_ADDR sel;
1550 CORE_ADDR res;
1551
1552 super = gdbarch_fetch_pointer_argument (gdbarch, frame, 0, ptr_type);
1553 sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1554
1555 read_objc_super (gdbarch, super, &sstr);
1556 if (sstr.theclass == 0)
1557 return 0;
1558
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;
1565 }
1566
1567 static int
1568 resolve_msgsend_super_stret (CORE_ADDR pc, CORE_ADDR *new_pc)
1569 {
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;
1573
1574 struct objc_super sstr;
1575
1576 CORE_ADDR super;
1577 CORE_ADDR sel;
1578 CORE_ADDR res;
1579
1580 super = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1581 sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 2, ptr_type);
1582
1583 read_objc_super (gdbarch, super, &sstr);
1584 if (sstr.theclass == 0)
1585 return 0;
1586
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;
1593 }
This page took 0.072729 seconds and 4 git commands to generate.