gdb: defer commit resume until all available events are consumed
[deliverable/binutils-gdb.git] / gdb / objc-lang.c
CommitLineData
d2e6263c 1/* Objective-C language support routines for GDB, the GNU debugger.
b81654f1 2
b811d2c2 3 Copyright (C) 2002-2020 Free Software Foundation, Inc.
b81654f1 4
437666f8
AC
5 Contributed by Apple Computer, Inc.
6 Written by Michael Snyder.
b81654f1 7
437666f8 8 This file is part of GDB.
b81654f1 9
437666f8
AC
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
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
437666f8
AC
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
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
b81654f1
MS
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"
a53b64ea 29#include "varobj.h"
d2e6263c 30#include "c-lang.h"
b81654f1
MS
31#include "objc-lang.h"
32#include "complaints.h"
33#include "value.h"
34#include "symfile.h"
35#include "objfiles.h"
b81654f1
MS
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"
fe898f56 42#include "block.h"
04714b91 43#include "infcall.h"
4e45ca2e 44#include "valprint.h"
529480d0 45#include "cli/cli-utils.h"
b81654f1
MS
46
47#include <ctype.h>
9b2f8581 48#include <algorithm>
b81654f1
MS
49
50struct objc_object {
51 CORE_ADDR isa;
52};
53
54struct 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
67struct objc_super {
68 CORE_ADDR receiver;
fe978cb0 69 CORE_ADDR theclass;
b81654f1
MS
70};
71
72struct objc_method {
73 CORE_ADDR name;
74 CORE_ADDR types;
75 CORE_ADDR imp;
76};
77
4c58e337 78static const struct objfile_key<unsigned int> objc_objfile_data;
57a9e6af 79
d2e6263c
MS
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. */
b81654f1
MS
83
84struct symbol *
a121b7c1 85lookup_struct_typedef (const char *name, const struct block *block, int noerr)
b81654f1 86{
f86f5ca3 87 struct symbol *sym;
b81654f1 88
d12307c1 89 sym = lookup_symbol (name, block, STRUCT_DOMAIN, 0).symbol;
b81654f1
MS
90
91 if (sym == NULL)
92 {
93 if (noerr)
94 return 0;
95 else
8a3fe4f8 96 error (_("No struct type named %s."), name);
b81654f1 97 }
78134374 98 if (SYMBOL_TYPE (sym)->code () != TYPE_CODE_STRUCT)
b81654f1
MS
99 {
100 if (noerr)
101 return 0;
102 else
8a3fe4f8 103 error (_("This context has class, union or enum %s, not a struct."),
d2e6263c 104 name);
b81654f1
MS
105 }
106 return sym;
107}
108
109CORE_ADDR
a121b7c1 110lookup_objc_class (struct gdbarch *gdbarch, const char *classname)
b81654f1 111{
3b7538c0 112 struct type *char_type = builtin_type (gdbarch)->builtin_char;
b81654f1
MS
113 struct value * function, *classval;
114
115 if (! target_has_execution)
116 {
d2e6263c 117 /* Can't call into inferior to lookup class. */
b81654f1
MS
118 return 0;
119 }
120
3b7344d5 121 if (lookup_minimal_symbol("objc_lookUpClass", 0, 0).minsym)
3e3b026f 122 function = find_function_in_inferior("objc_lookUpClass", NULL);
3b7344d5 123 else if (lookup_minimal_symbol ("objc_lookup_class", 0, 0).minsym)
3e3b026f 124 function = find_function_in_inferior("objc_lookup_class", NULL);
b81654f1
MS
125 else
126 {
b98664d3 127 complaint (_("no way to lookup Objective-C classes"));
b81654f1
MS
128 return 0;
129 }
130
3b7538c0 131 classval = value_string (classname, strlen (classname) + 1, char_type);
b81654f1 132 classval = value_coerce_array (classval);
7022349d
PA
133 return (CORE_ADDR) value_as_long (call_function_by_hand (function,
134 NULL,
e71585ff 135 classval));
b81654f1
MS
136}
137
c253954e 138CORE_ADDR
a121b7c1 139lookup_child_selector (struct gdbarch *gdbarch, const char *selname)
b81654f1 140{
3b7538c0 141 struct type *char_type = builtin_type (gdbarch)->builtin_char;
b81654f1
MS
142 struct value * function, *selstring;
143
144 if (! target_has_execution)
145 {
d2e6263c 146 /* Can't call into inferior to lookup selector. */
b81654f1
MS
147 return 0;
148 }
149
3b7344d5 150 if (lookup_minimal_symbol("sel_getUid", 0, 0).minsym)
3e3b026f 151 function = find_function_in_inferior("sel_getUid", NULL);
3b7344d5 152 else if (lookup_minimal_symbol ("sel_get_any_uid", 0, 0).minsym)
3e3b026f 153 function = find_function_in_inferior("sel_get_any_uid", NULL);
b81654f1
MS
154 else
155 {
b98664d3 156 complaint (_("no way to lookup Objective-C selectors"));
b81654f1
MS
157 return 0;
158 }
159
d2e6263c 160 selstring = value_coerce_array (value_string (selname,
0df8b418
MS
161 strlen (selname) + 1,
162 char_type));
e71585ff 163 return value_as_long (call_function_by_hand (function, NULL, selstring));
b81654f1
MS
164}
165
166struct value *
3b7538c0 167value_nsstring (struct gdbarch *gdbarch, char *ptr, int len)
b81654f1 168{
3b7538c0 169 struct type *char_type = builtin_type (gdbarch)->builtin_char;
b81654f1
MS
170 struct value *stringValue[3];
171 struct value *function, *nsstringValue;
172 struct symbol *sym;
173 struct type *type;
174
175 if (!target_has_execution)
d2e6263c 176 return 0; /* Can't call into inferior to create NSString. */
b81654f1 177
3b7538c0 178 stringValue[2] = value_string(ptr, len, char_type);
b81654f1 179 stringValue[2] = value_coerce_array(stringValue[2]);
d2e6263c 180 /* _NSNewStringFromCString replaces "istr" after Lantern2A. */
3b7344d5 181 if (lookup_minimal_symbol("_NSNewStringFromCString", 0, 0).minsym)
b81654f1 182 {
3b7538c0 183 function = find_function_in_inferior("_NSNewStringFromCString", NULL);
e71585ff 184 nsstringValue = call_function_by_hand(function, NULL, stringValue[2]);
b81654f1 185 }
3b7344d5 186 else if (lookup_minimal_symbol("istr", 0, 0).minsym)
b81654f1 187 {
3b7538c0 188 function = find_function_in_inferior("istr", NULL);
e71585ff 189 nsstringValue = call_function_by_hand(function, NULL, stringValue[2]);
b81654f1 190 }
3b7344d5 191 else if (lookup_minimal_symbol("+[NSString stringWithCString:]", 0, 0).minsym)
b81654f1 192 {
3e3b026f 193 function
3b7538c0
UW
194 = find_function_in_inferior("+[NSString stringWithCString:]", NULL);
195 type = builtin_type (gdbarch)->builtin_long;
3e3b026f 196
b81654f1 197 stringValue[0] = value_from_longest
3b7538c0 198 (type, lookup_objc_class (gdbarch, "NSString"));
b81654f1 199 stringValue[1] = value_from_longest
3b7538c0 200 (type, lookup_child_selector (gdbarch, "stringWithCString:"));
e71585ff 201 nsstringValue = call_function_by_hand(function, NULL, stringValue);
b81654f1
MS
202 }
203 else
8a3fe4f8 204 error (_("NSString: internal error -- no way to create new NSString"));
b81654f1 205
3e3b026f
UW
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
04624583 214 deprecated_set_value_type (nsstringValue, type);
b81654f1
MS
215 return nsstringValue;
216}
217
d2e6263c 218/* Objective-C name demangling. */
b81654f1
MS
219
220char *
9a3d7dfd 221objc_demangle (const char *mangled, int options)
b81654f1
MS
222{
223 char *demangled, *cp;
224
225 if (mangled[0] == '_' &&
226 (mangled[1] == 'i' || mangled[1] == 'c') &&
227 mangled[2] == '_')
228 {
224c3ddb 229 cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
b81654f1
MS
230
231 if (mangled[1] == 'i')
232 *cp++ = '-'; /* for instance method */
233 else
234 *cp++ = '+'; /* for class method */
235
236 *cp++ = '['; /* opening left brace */
0df8b418 237 strcpy(cp, mangled+3); /* Tack on the rest of the mangled name. */
b81654f1
MS
238
239 while (*cp && *cp == '_')
0df8b418
MS
240 cp++; /* Skip any initial underbars in class
241 name. */
b81654f1 242
7248f48e 243 cp = strchr(cp, '_');
0df8b418 244 if (!cp) /* Find first non-initial underbar. */
b81654f1 245 {
7248f48e 246 xfree(demangled); /* not mangled name */
b81654f1
MS
247 return NULL;
248 }
0df8b418 249 if (cp[1] == '_') /* Easy case: no category name. */
5cc80db3 250 {
0df8b418 251 *cp++ = ' '; /* Replace two '_' with one ' '. */
5cc80db3
MS
252 strcpy(cp, mangled + (cp - demangled) + 2);
253 }
254 else
255 {
0df8b418 256 *cp++ = '('; /* Less easy case: category name. */
5cc80db3
MS
257 cp = strchr(cp, '_');
258 if (!cp)
259 {
260 xfree(demangled); /* not mangled name */
261 return NULL;
262 }
263 *cp++ = ')';
0df8b418
MS
264 *cp++ = ' '; /* Overwriting 1st char of method name... */
265 strcpy(cp, mangled + (cp - demangled)); /* Get it back. */
5cc80db3 266 }
b81654f1
MS
267
268 while (*cp && *cp == '_')
0df8b418
MS
269 cp++; /* Skip any initial underbars in
270 method name. */
b81654f1
MS
271
272 for (; *cp; cp++)
273 if (*cp == '_')
0df8b418 274 *cp = ':'; /* Replace remaining '_' with ':'. */
b81654f1
MS
275
276 *cp++ = ']'; /* closing right brace */
277 *cp++ = 0; /* string terminator */
278 return demangled;
279 }
280 else
d2e6263c 281 return NULL; /* Not an objc mangled name. */
b81654f1
MS
282}
283
b81654f1
MS
284
285/* Table mapping opcodes into strings for printing operators
286 and precedences of the operators. */
287
288static const struct op_print objc_op_print_tab[] =
289 {
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},
e8f3fcdd 319 {NULL, OP_NULL, PREC_NULL, 0}
b81654f1
MS
320};
321
56618e20
TT
322static const char *objc_extensions[] =
323{
324 ".m", NULL
325};
326
0874fd07
AB
327/* Constant data representing the Objective-C language. */
328
329extern const struct language_data objc_language_data =
330{
d2e6263c 331 "objective-c", /* Language name */
6abde28f 332 "Objective-C",
b81654f1 333 language_objc,
b81654f1 334 range_check_off,
b81654f1 335 case_sensitive_on,
7ca2d3a3 336 array_row_major,
9a044a89 337 macro_expansion_c,
56618e20 338 objc_extensions,
5f9769d1 339 &exp_descriptor_standard,
2b2d9e11 340 "self", /* name_of_this */
59cc4834 341 false, /* la_store_sym_names_in_linkage_form_p */
d2e6263c
MS
342 objc_op_print_tab, /* Expression operators for printing */
343 1, /* C-style arrays */
b81654f1 344 0, /* String lower bound */
a53b64ea 345 &default_varobj_ops,
721b08c6 346 "{...}" /* la_struct_too_deep_ellipsis */
b81654f1
MS
347};
348
0874fd07
AB
349/* Class representing the Objective-C language. */
350
351class objc_language : public language_defn
352{
353public:
354 objc_language ()
355 : language_defn (language_objc, objc_language_data)
356 { /* Nothing. */ }
1fb314aa
AB
357
358 /* See language.h. */
359 void language_arch_info (struct gdbarch *gdbarch,
360 struct language_arch_info *lai) const override
361 {
362 c_language_arch_info (gdbarch, lai);
363 }
6f827019
AB
364
365 /* See language.h. */
366 bool sniff_from_mangled_name (const char *mangled,
367 char **demangled) const override
368 {
369 *demangled = objc_demangle (mangled, 0);
370 return *demangled != NULL;
371 }
fbfb0a46
AB
372
373 /* See language.h. */
374
0a50df5d
AB
375 char *demangle (const char *mangled, int options) const override
376 {
377 return objc_demangle (mangled, options);
378 }
379
380 /* See language.h. */
381
fbfb0a46
AB
382 void print_type (struct type *type, const char *varstring,
383 struct ui_file *stream, int show, int level,
384 const struct type_print_options *flags) const override
385 {
386 c_print_type (type, varstring, stream, show, level, flags);
387 }
f6eee2d0
AB
388
389 /* See language.h. */
390
391 CORE_ADDR skip_trampoline (struct frame_info *frame,
392 CORE_ADDR stop_pc) const override
393 {
394 struct gdbarch *gdbarch = get_frame_arch (frame);
395 CORE_ADDR real_stop_pc;
396 CORE_ADDR method_stop_pc;
397
398 /* Determine if we are currently in the Objective-C dispatch function.
399 If so, get the address of the method function that the dispatcher
400 would call and use that as the function to step into instead. Also
401 skip over the trampoline for the function (if any). This is better
402 for the user since they are only interested in stepping into the
403 method function anyway. */
404
405 real_stop_pc = gdbarch_skip_trampoline_code (gdbarch, frame, stop_pc);
406
407 if (real_stop_pc != 0)
408 find_objc_msgcall (real_stop_pc, &method_stop_pc);
409 else
410 find_objc_msgcall (stop_pc, &method_stop_pc);
411
412 if (method_stop_pc)
413 {
414 real_stop_pc = gdbarch_skip_trampoline_code
415 (gdbarch, frame, method_stop_pc);
416 if (real_stop_pc == 0)
417 real_stop_pc = method_stop_pc;
418 }
419
420 return real_stop_pc;
421 }
0874fd07
AB
422};
423
424/* Single instance of the class representing the Objective-C language. */
425
426static objc_language objc_language_defn;
427
b81654f1
MS
428/*
429 * ObjC:
0df8b418 430 * Following functions help construct Objective-C message calls.
b81654f1
MS
431 */
432
d2e6263c 433struct selname /* For parsing Objective-C. */
b81654f1
MS
434 {
435 struct selname *next;
436 char *msglist_sel;
437 int msglist_len;
438 };
439
440static int msglist_len;
441static struct selname *selname_chain;
442static char *msglist_sel;
443
444void
445start_msglist(void)
446{
8d749320 447 struct selname *newobj = XNEW (struct selname);
b81654f1 448
fe978cb0
PA
449 newobj->next = selname_chain;
450 newobj->msglist_len = msglist_len;
451 newobj->msglist_sel = msglist_sel;
b81654f1
MS
452 msglist_len = 0;
453 msglist_sel = (char *)xmalloc(1);
454 *msglist_sel = 0;
fe978cb0 455 selname_chain = newobj;
b81654f1
MS
456}
457
458void
459add_msglist(struct stoken *str, int addcolon)
460{
d7561cbb
KS
461 char *s;
462 const char *p;
b81654f1
MS
463 int len, plen;
464
5cc80db3
MS
465 if (str == 0) /* Unnamed arg, or... */
466 {
467 if (addcolon == 0) /* variable number of args. */
468 {
469 msglist_len++;
470 return;
471 }
472 p = "";
473 plen = 0;
474 }
475 else
476 {
477 p = str->ptr;
478 plen = str->length;
b81654f1 479 }
b81654f1
MS
480 len = plen + strlen(msglist_sel) + 2;
481 s = (char *)xmalloc(len);
482 strcpy(s, msglist_sel);
483 strncat(s, p, plen);
7248f48e 484 xfree(msglist_sel);
b81654f1 485 msglist_sel = s;
5cc80db3
MS
486 if (addcolon)
487 {
488 s[len-2] = ':';
489 s[len-1] = 0;
490 msglist_len++;
491 }
492 else
b81654f1
MS
493 s[len-2] = '\0';
494}
495
496int
410a0ff2 497end_msglist (struct parser_state *ps)
b81654f1 498{
f86f5ca3
PH
499 int val = msglist_len;
500 struct selname *sel = selname_chain;
501 char *p = msglist_sel;
c253954e 502 CORE_ADDR selid;
b81654f1
MS
503
504 selname_chain = sel->next;
505 msglist_len = sel->msglist_len;
506 msglist_sel = sel->msglist_sel;
fa9f5be6 507 selid = lookup_child_selector (ps->gdbarch (), p);
b81654f1 508 if (!selid)
8a3fe4f8 509 error (_("Can't find selector \"%s\""), p);
410a0ff2 510 write_exp_elt_longcst (ps, selid);
7248f48e 511 xfree(p);
410a0ff2 512 write_exp_elt_longcst (ps, val); /* Number of args */
7248f48e 513 xfree(sel);
b81654f1
MS
514
515 return val;
516}
517
518/*
0d5cff50 519 * Function: specialcmp (const char *a, const char *b)
b81654f1
MS
520 *
521 * Special strcmp: treats ']' and ' ' as end-of-string.
d2e6263c 522 * Used for qsorting lists of objc methods (either by class or selector).
b81654f1
MS
523 */
524
b9362cc7 525static int
0d5cff50 526specialcmp (const char *a, const char *b)
b81654f1
MS
527{
528 while (*a && *a != ' ' && *a != ']' && *b && *b != ' ' && *b != ']')
529 {
530 if (*a != *b)
531 return *a - *b;
532 a++, b++;
533 }
534 if (*a && *a != ' ' && *a != ']')
0df8b418 535 return 1; /* a is longer therefore greater. */
b81654f1 536 if (*b && *b != ' ' && *b != ']')
0df8b418
MS
537 return -1; /* a is shorter therefore lesser. */
538 return 0; /* a and b are identical. */
b81654f1
MS
539}
540
541/*
36e53c63 542 * Function: compare_selectors (const void *, const void *)
b81654f1 543 *
d2e6263c
MS
544 * Comparison function for use with qsort. Arguments are symbols or
545 * msymbols Compares selector part of objc method name alphabetically.
b81654f1
MS
546 */
547
548static int
36e53c63 549compare_selectors (const void *a, const void *b)
b81654f1 550{
0d5cff50 551 const char *aname, *bname;
b81654f1 552
987012b8
CB
553 aname = (*(struct symbol **) a)->print_name ();
554 bname = (*(struct symbol **) b)->print_name ();
7248f48e 555 if (aname == NULL || bname == NULL)
8a3fe4f8 556 error (_("internal: compare_selectors(1)"));
b81654f1 557
7248f48e
AF
558 aname = strchr(aname, ' ');
559 bname = strchr(bname, ' ');
560 if (aname == NULL || bname == NULL)
8a3fe4f8 561 error (_("internal: compare_selectors(2)"));
b81654f1
MS
562
563 return specialcmp (aname+1, bname+1);
564}
565
566/*
567 * Function: selectors_info (regexp, from_tty)
568 *
d2e6263c
MS
569 * Implements the "Info selectors" command. Takes an optional regexp
570 * arg. Lists all objective c selectors that match the regexp. Works
571 * by grepping thru all symbols for objective c methods. Output list
572 * is sorted and uniqued.
b81654f1
MS
573 */
574
575static void
1d12d88f 576info_selectors_command (const char *regexp, int from_tty)
b81654f1 577{
0d5cff50 578 const char *name;
b81654f1
MS
579 char *val;
580 int matches = 0;
581 int maxlen = 0;
582 int ix;
583 char myregexp[2048];
584 char asel[256];
585 struct symbol **sym_arr;
586 int plusminus = 0;
587
588 if (regexp == NULL)
d2e6263c 589 strcpy(myregexp, ".*]"); /* Null input, match all objc methods. */
b81654f1
MS
590 else
591 {
d2e6263c
MS
592 if (*regexp == '+' || *regexp == '-')
593 { /* User wants only class methods or only instance methods. */
b81654f1
MS
594 plusminus = *regexp++;
595 while (*regexp == ' ' || *regexp == '\t')
596 regexp++;
597 }
598 if (*regexp == '\0')
599 strcpy(myregexp, ".*]");
600 else
601 {
a9dc8dcc 602 /* Allow a few extra bytes because of the strcat below. */
28288541 603 if (sizeof (myregexp) < strlen (regexp) + 4)
20937029
JK
604 error (_("Regexp is too long: %s"), regexp);
605 strcpy(myregexp, regexp);
b81654f1
MS
606 if (myregexp[strlen(myregexp) - 1] == '$') /* end of selector */
607 myregexp[strlen(myregexp) - 1] = ']'; /* end of method name */
608 else
609 strcat(myregexp, ".*]");
610 }
611 }
612
613 if (regexp != NULL)
5e488a7b
AC
614 {
615 val = re_comp (myregexp);
616 if (val != 0)
8a3fe4f8 617 error (_("Invalid regexp (%s): %s"), val, regexp);
5e488a7b 618 }
b81654f1 619
d2e6263c 620 /* First time thru is JUST to get max length and count. */
2030c079 621 for (objfile *objfile : current_program_space->objfiles ())
b81654f1 622 {
7932255d 623 for (minimal_symbol *msymbol : objfile->msymbols ())
b81654f1 624 {
5325b9bf 625 QUIT;
c9d95fa3 626 name = msymbol->natural_name ();
5325b9bf
TT
627 if (name
628 && (name[0] == '-' || name[0] == '+')
629 && name[1] == '[') /* Got a method name. */
50412521 630 {
5325b9bf
TT
631 /* Filter for class/instance methods. */
632 if (plusminus && name[0] != plusminus)
633 continue;
634 /* Find selector part. */
635 name = (char *) strchr (name+2, ' ');
636 if (name == NULL)
637 {
638 complaint (_("Bad method name '%s'"),
c9d95fa3 639 msymbol->natural_name ());
5325b9bf
TT
640 continue;
641 }
642 if (regexp == NULL || re_exec(++name) != 0)
643 {
644 const char *mystart = name;
645 const char *myend = strchr (mystart, ']');
b81654f1 646
5325b9bf
TT
647 if (myend && (myend - mystart > maxlen))
648 maxlen = myend - mystart; /* Get longest selector. */
649 matches++;
650 }
b81654f1
MS
651 }
652 }
653 }
654 if (matches)
655 {
a3f17187 656 printf_filtered (_("Selectors matching \"%s\":\n\n"),
b81654f1
MS
657 regexp ? regexp : "*");
658
8d749320 659 sym_arr = XALLOCAVEC (struct symbol *, matches);
b81654f1 660 matches = 0;
2030c079 661 for (objfile *objfile : current_program_space->objfiles ())
b81654f1 662 {
7932255d 663 for (minimal_symbol *msymbol : objfile->msymbols ())
b81654f1 664 {
5325b9bf 665 QUIT;
c9d95fa3 666 name = msymbol->natural_name ();
5325b9bf
TT
667 if (name &&
668 (name[0] == '-' || name[0] == '+') &&
669 name[1] == '[') /* Got a method name. */
670 {
671 /* Filter for class/instance methods. */
672 if (plusminus && name[0] != plusminus)
673 continue;
674 /* Find selector part. */
675 name = (char *) strchr(name+2, ' ');
676 if (regexp == NULL || re_exec(++name) != 0)
677 sym_arr[matches++] = (struct symbol *) msymbol;
678 }
b81654f1
MS
679 }
680 }
681
682 qsort (sym_arr, matches, sizeof (struct minimal_symbol *),
683 compare_selectors);
d2e6263c
MS
684 /* Prevent compare on first iteration. */
685 asel[0] = 0;
686 for (ix = 0; ix < matches; ix++) /* Now do the output. */
b81654f1
MS
687 {
688 char *p = asel;
689
690 QUIT;
987012b8 691 name = sym_arr[ix]->natural_name ();
b81654f1
MS
692 name = strchr (name, ' ') + 1;
693 if (p[0] && specialcmp(name, p) == 0)
d2e6263c 694 continue; /* Seen this one already (not unique). */
b81654f1 695
d2e6263c
MS
696 /* Copy selector part. */
697 while (*name && *name != ']')
b81654f1
MS
698 *p++ = *name++;
699 *p++ = '\0';
d2e6263c
MS
700 /* Print in columns. */
701 puts_filtered_tabular(asel, maxlen + 1, 0);
b81654f1
MS
702 }
703 begin_line();
704 }
705 else
0df8b418
MS
706 printf_filtered (_("No selectors matching \"%s\"\n"),
707 regexp ? regexp : "*");
b81654f1
MS
708}
709
710/*
36e53c63 711 * Function: compare_classes (const void *, const void *)
b81654f1 712 *
d2e6263c
MS
713 * Comparison function for use with qsort. Arguments are symbols or
714 * msymbols Compares class part of objc method name alphabetically.
b81654f1
MS
715 */
716
717static int
36e53c63 718compare_classes (const void *a, const void *b)
b81654f1 719{
0d5cff50 720 const char *aname, *bname;
b81654f1 721
987012b8
CB
722 aname = (*(struct symbol **) a)->print_name ();
723 bname = (*(struct symbol **) b)->print_name ();
7248f48e 724 if (aname == NULL || bname == NULL)
8a3fe4f8 725 error (_("internal: compare_classes(1)"));
b81654f1
MS
726
727 return specialcmp (aname+1, bname+1);
728}
729
730/*
731 * Function: classes_info(regexp, from_tty)
732 *
733 * Implements the "info classes" command for objective c classes.
734 * Lists all objective c classes that match the optional regexp.
d2e6263c
MS
735 * Works by grepping thru the list of objective c methods. List will
736 * be sorted and uniqued (since one class may have many methods).
737 * BUGS: will not list a class that has no methods.
b81654f1
MS
738 */
739
740static void
1d12d88f 741info_classes_command (const char *regexp, int from_tty)
b81654f1 742{
0d5cff50 743 const char *name;
b81654f1
MS
744 char *val;
745 int matches = 0;
746 int maxlen = 0;
747 int ix;
748 char myregexp[2048];
749 char aclass[256];
750 struct symbol **sym_arr;
751
752 if (regexp == NULL)
d2e6263c 753 strcpy(myregexp, ".* "); /* Null input: match all objc classes. */
b81654f1
MS
754 else
755 {
a9dc8dcc 756 /* Allow a few extra bytes because of the strcat below. */
28288541
MS
757 if (sizeof (myregexp) < strlen (regexp) + 4)
758 error (_("Regexp is too long: %s"), regexp);
b81654f1
MS
759 strcpy(myregexp, regexp);
760 if (myregexp[strlen(myregexp) - 1] == '$')
d2e6263c 761 /* In the method name, the end of the class name is marked by ' '. */
b81654f1
MS
762 myregexp[strlen(myregexp) - 1] = ' ';
763 else
764 strcat(myregexp, ".* ");
765 }
766
767 if (regexp != NULL)
5e488a7b
AC
768 {
769 val = re_comp (myregexp);
770 if (val != 0)
8a3fe4f8 771 error (_("Invalid regexp (%s): %s"), val, regexp);
5e488a7b 772 }
b81654f1 773
d2e6263c 774 /* First time thru is JUST to get max length and count. */
2030c079 775 for (objfile *objfile : current_program_space->objfiles ())
b81654f1 776 {
7932255d 777 for (minimal_symbol *msymbol : objfile->msymbols ())
5325b9bf
TT
778 {
779 QUIT;
c9d95fa3 780 name = msymbol->natural_name ();
5325b9bf
TT
781 if (name &&
782 (name[0] == '-' || name[0] == '+') &&
783 name[1] == '[') /* Got a method name. */
784 if (regexp == NULL || re_exec(name+2) != 0)
785 {
786 /* Compute length of classname part. */
787 const char *mystart = name + 2;
788 const char *myend = strchr (mystart, ' ');
b81654f1 789
5325b9bf
TT
790 if (myend && (myend - mystart > maxlen))
791 maxlen = myend - mystart;
792 matches++;
793 }
794 }
b81654f1
MS
795 }
796 if (matches)
797 {
a3f17187 798 printf_filtered (_("Classes matching \"%s\":\n\n"),
b81654f1 799 regexp ? regexp : "*");
8d749320 800 sym_arr = XALLOCAVEC (struct symbol *, matches);
b81654f1 801 matches = 0;
2030c079 802 for (objfile *objfile : current_program_space->objfiles ())
b81654f1 803 {
7932255d 804 for (minimal_symbol *msymbol : objfile->msymbols ())
5325b9bf
TT
805 {
806 QUIT;
c9d95fa3 807 name = msymbol->natural_name ();
5325b9bf
TT
808 if (name &&
809 (name[0] == '-' || name[0] == '+') &&
810 name[1] == '[') /* Got a method name. */
811 if (regexp == NULL || re_exec(name+2) != 0)
812 sym_arr[matches++] = (struct symbol *) msymbol;
813 }
b81654f1
MS
814 }
815
816 qsort (sym_arr, matches, sizeof (struct minimal_symbol *),
817 compare_classes);
d2e6263c
MS
818 /* Prevent compare on first iteration. */
819 aclass[0] = 0;
820 for (ix = 0; ix < matches; ix++) /* Now do the output. */
b81654f1
MS
821 {
822 char *p = aclass;
823
824 QUIT;
987012b8 825 name = sym_arr[ix]->natural_name ();
b81654f1
MS
826 name += 2;
827 if (p[0] && specialcmp(name, p) == 0)
d2e6263c 828 continue; /* Seen this one already (not unique). */
b81654f1 829
d2e6263c
MS
830 /* Copy class part of method name. */
831 while (*name && *name != ' ')
b81654f1
MS
832 *p++ = *name++;
833 *p++ = '\0';
d2e6263c
MS
834 /* Print in columns. */
835 puts_filtered_tabular(aclass, maxlen + 1, 0);
b81654f1
MS
836 }
837 begin_line();
838 }
839 else
a3f17187 840 printf_filtered (_("No classes matching \"%s\"\n"), regexp ? regexp : "*");
b81654f1
MS
841}
842
f8eba3c6 843static char *
b81654f1
MS
844parse_selector (char *method, char **selector)
845{
846 char *s1 = NULL;
847 char *s2 = NULL;
848 int found_quote = 0;
849
850 char *nselector = NULL;
851
e8f3fcdd 852 gdb_assert (selector != NULL);
b81654f1
MS
853
854 s1 = method;
855
529480d0 856 s1 = skip_spaces (s1);
b81654f1
MS
857 if (*s1 == '\'')
858 {
859 found_quote = 1;
860 s1++;
861 }
529480d0 862 s1 = skip_spaces (s1);
b81654f1
MS
863
864 nselector = s1;
865 s2 = s1;
866
5cc80db3
MS
867 for (;;)
868 {
869 if (isalnum (*s2) || (*s2 == '_') || (*s2 == ':'))
870 *s1++ = *s2;
871 else if (isspace (*s2))
872 ;
873 else if ((*s2 == '\0') || (*s2 == '\''))
874 break;
875 else
876 return NULL;
877 s2++;
878 }
b81654f1
MS
879 *s1++ = '\0';
880
529480d0 881 s2 = skip_spaces (s2);
b81654f1
MS
882 if (found_quote)
883 {
884 if (*s2 == '\'')
885 s2++;
529480d0 886 s2 = skip_spaces (s2);
b81654f1
MS
887 }
888
889 if (selector != NULL)
890 *selector = nselector;
891
892 return s2;
893}
894
f8eba3c6 895static char *
fe978cb0 896parse_method (char *method, char *type, char **theclass,
d2e6263c 897 char **category, char **selector)
b81654f1
MS
898{
899 char *s1 = NULL;
900 char *s2 = NULL;
901 int found_quote = 0;
902
903 char ntype = '\0';
904 char *nclass = NULL;
905 char *ncategory = NULL;
906 char *nselector = NULL;
907
e8f3fcdd 908 gdb_assert (type != NULL);
fe978cb0 909 gdb_assert (theclass != NULL);
e8f3fcdd
AC
910 gdb_assert (category != NULL);
911 gdb_assert (selector != NULL);
b81654f1
MS
912
913 s1 = method;
914
529480d0 915 s1 = skip_spaces (s1);
b81654f1
MS
916 if (*s1 == '\'')
917 {
918 found_quote = 1;
919 s1++;
920 }
529480d0 921 s1 = skip_spaces (s1);
b81654f1
MS
922
923 if ((s1[0] == '+') || (s1[0] == '-'))
924 ntype = *s1++;
925
529480d0 926 s1 = skip_spaces (s1);
b81654f1
MS
927
928 if (*s1 != '[')
929 return NULL;
930 s1++;
931
932 nclass = s1;
933 while (isalnum (*s1) || (*s1 == '_'))
934 s1++;
935
936 s2 = s1;
529480d0 937 s2 = skip_spaces (s2);
b81654f1
MS
938
939 if (*s2 == '(')
940 {
941 s2++;
529480d0 942 s2 = skip_spaces (s2);
b81654f1
MS
943 ncategory = s2;
944 while (isalnum (*s2) || (*s2 == '_'))
945 s2++;
946 *s2++ = '\0';
947 }
948
d2e6263c 949 /* Truncate the class name now that we're not using the open paren. */
b81654f1
MS
950 *s1++ = '\0';
951
952 nselector = s2;
953 s1 = s2;
954
5cc80db3
MS
955 for (;;)
956 {
957 if (isalnum (*s2) || (*s2 == '_') || (*s2 == ':'))
958 *s1++ = *s2;
959 else if (isspace (*s2))
960 ;
961 else if (*s2 == ']')
962 break;
963 else
964 return NULL;
965 s2++;
966 }
b81654f1
MS
967 *s1++ = '\0';
968 s2++;
969
529480d0 970 s2 = skip_spaces (s2);
b81654f1
MS
971 if (found_quote)
972 {
973 if (*s2 != '\'')
974 return NULL;
975 s2++;
529480d0 976 s2 = skip_spaces (s2);
b81654f1
MS
977 }
978
979 if (type != NULL)
980 *type = ntype;
fe978cb0
PA
981 if (theclass != NULL)
982 *theclass = nclass;
b81654f1
MS
983 if (category != NULL)
984 *category = ncategory;
985 if (selector != NULL)
986 *selector = nselector;
987
988 return s2;
989}
990
2f9a90b4 991static void
fe978cb0 992find_methods (char type, const char *theclass, const char *category,
f8eba3c6 993 const char *selector,
9b2f8581 994 std::vector<const char *> *symbol_names)
b81654f1 995{
0d5cff50 996 const char *symname = NULL;
b81654f1
MS
997
998 char ntype = '\0';
999 char *nclass = NULL;
1000 char *ncategory = NULL;
1001 char *nselector = NULL;
1002
b81654f1
MS
1003 static char *tmp = NULL;
1004 static unsigned int tmplen = 0;
1005
f8eba3c6 1006 gdb_assert (symbol_names != NULL);
b81654f1 1007
2030c079 1008 for (objfile *objfile : current_program_space->objfiles ())
b81654f1 1009 {
57a9e6af 1010 unsigned int *objc_csym;
b81654f1 1011
57a9e6af
PP
1012 /* The objfile_csym variable counts the number of ObjC methods
1013 that this objfile defines. We save that count as a private
1014 objfile data. If we have already determined that this objfile
1015 provides no ObjC methods, we can skip it entirely. */
b81654f1 1016
57a9e6af 1017 unsigned int objfile_csym = 0;
b81654f1 1018
4c58e337 1019 objc_csym = objc_objfile_data.get (objfile);
57a9e6af
PP
1020 if (objc_csym != NULL && *objc_csym == 0)
1021 /* There are no ObjC symbols in this objfile. Skip it entirely. */
b81654f1
MS
1022 continue;
1023
7932255d 1024 for (minimal_symbol *msymbol : objfile->msymbols ())
b81654f1 1025 {
57a9e6af 1026 QUIT;
b81654f1 1027
0c4b2e63
MF
1028 /* Check the symbol name first as this can be done entirely without
1029 sending any query to the target. */
c9d95fa3 1030 symname = msymbol->natural_name ();
0c4b2e63
MF
1031 if (symname == NULL)
1032 continue;
1033
1034 if ((symname[0] != '-' && symname[0] != '+') || (symname[1] != '['))
1035 /* Not a method name. */
1036 continue;
1037
8dfd1e6d
KS
1038 objfile_csym++;
1039
0c4b2e63 1040 /* Now that thinks are a bit sane, clean up the symname. */
57a9e6af
PP
1041 while ((strlen (symname) + 1) >= tmplen)
1042 {
1043 tmplen = (tmplen == 0) ? 1024 : tmplen * 2;
224c3ddb 1044 tmp = (char *) xrealloc (tmp, tmplen);
57a9e6af
PP
1045 }
1046 strcpy (tmp, symname);
b81654f1 1047
0df8b418
MS
1048 if (parse_method (tmp, &ntype, &nclass,
1049 &ncategory, &nselector) == NULL)
57a9e6af 1050 continue;
b81654f1 1051
57a9e6af
PP
1052 if ((type != '\0') && (ntype != type))
1053 continue;
b81654f1 1054
fe978cb0
PA
1055 if ((theclass != NULL)
1056 && ((nclass == NULL) || (strcmp (theclass, nclass) != 0)))
57a9e6af
PP
1057 continue;
1058
1059 if ((category != NULL) &&
1060 ((ncategory == NULL) || (strcmp (category, ncategory) != 0)))
1061 continue;
b81654f1 1062
57a9e6af
PP
1063 if ((selector != NULL) &&
1064 ((nselector == NULL) || (strcmp (selector, nselector) != 0)))
1065 continue;
1066
9b2f8581 1067 symbol_names->push_back (symname);
57a9e6af 1068 }
f8eba3c6 1069
57a9e6af 1070 if (objc_csym == NULL)
4c58e337 1071 objc_csym = objc_objfile_data.emplace (objfile, objfile_csym);
57a9e6af
PP
1072 else
1073 /* Count of ObjC methods in this objfile should be constant. */
1074 gdb_assert (*objc_csym == objfile_csym);
b81654f1 1075 }
f8eba3c6 1076}
b81654f1 1077
791b7405 1078/* Uniquify a vector of strings. */
f8eba3c6
TT
1079
1080static void
9b2f8581 1081uniquify_strings (std::vector<const char *> *strings)
f8eba3c6 1082{
9b2f8581 1083 if (strings->empty ())
ee7615e1
AA
1084 return;
1085
9b2f8581
TT
1086 std::sort (strings->begin (), strings->end (), compare_cstrings);
1087 strings->erase (std::unique (strings->begin (), strings->end (), streq),
1088 strings->end ());
b81654f1
MS
1089}
1090
f8eba3c6 1091/*
d7561cbb 1092 * Function: find_imps (const char *selector, struct symbol **sym_arr)
f8eba3c6
TT
1093 *
1094 * Input: a string representing a selector
1095 * a pointer to an array of symbol pointers
1096 * possibly a pointer to a symbol found by the caller.
1097 *
1098 * Output: number of methods that implement that selector. Side
1099 * effects: The array of symbol pointers is filled with matching syms.
1100 *
1101 * By analogy with function "find_methods" (symtab.c), builds a list
1102 * of symbols matching the ambiguous input, so that "decode_line_2"
1103 * (symtab.c) can list them and ask the user to choose one or more.
1104 * In this case the matches are objective c methods
1105 * ("implementations") matching an objective c selector.
1106 *
1107 * Note that it is possible for a normal (c-style) function to have
1108 * the same name as an objective c selector. To prevent the selector
1109 * from eclipsing the function, we allow the caller (decode_line_1) to
1110 * search for such a function first, and if it finds one, pass it in
1111 * to us. We will then integrate it into the list. We also search
1112 * for one here, among the minsyms.
1113 *
1114 * NOTE: if NUM_DEBUGGABLE is non-zero, the sym_arr will be divided
1115 * into two parts: debuggable (struct symbol) syms, and
1116 * non_debuggable (struct minimal_symbol) syms. The debuggable
1117 * ones will come first, before NUM_DEBUGGABLE (which will thus
1118 * be the index of the first non-debuggable one).
1119 */
1120
d7561cbb 1121const char *
9b2f8581 1122find_imps (const char *method, std::vector<const char *> *symbol_names)
b81654f1
MS
1123{
1124 char type = '\0';
fe978cb0 1125 char *theclass = NULL;
b81654f1
MS
1126 char *category = NULL;
1127 char *selector = NULL;
1128
b81654f1
MS
1129 char *buf = NULL;
1130 char *tmp = NULL;
1131
f8eba3c6 1132 int selector_case = 0;
b81654f1 1133
f8eba3c6 1134 gdb_assert (symbol_names != NULL);
b81654f1
MS
1135
1136 buf = (char *) alloca (strlen (method) + 1);
1137 strcpy (buf, method);
fe978cb0 1138 tmp = parse_method (buf, &type, &theclass, &category, &selector);
b81654f1 1139
5cc80db3
MS
1140 if (tmp == NULL)
1141 {
5cc80db3
MS
1142 strcpy (buf, method);
1143 tmp = parse_selector (buf, &selector);
b81654f1 1144
5cc80db3
MS
1145 if (tmp == NULL)
1146 return NULL;
1147
f8eba3c6 1148 selector_case = 1;
5cc80db3 1149 }
b81654f1 1150
fe978cb0 1151 find_methods (type, theclass, category, selector, symbol_names);
b81654f1 1152
f8eba3c6
TT
1153 /* If we hit the "selector" case, and we found some methods, then
1154 add the selector itself as a symbol, if it exists. */
9b2f8581 1155 if (selector_case && !symbol_names->empty ())
b81654f1 1156 {
d12307c1
PMR
1157 struct symbol *sym = lookup_symbol (selector, NULL, VAR_DOMAIN,
1158 0).symbol;
f8eba3c6
TT
1159
1160 if (sym != NULL)
987012b8 1161 symbol_names->push_back (sym->natural_name ());
f8eba3c6 1162 else
b81654f1 1163 {
3b7344d5
TT
1164 struct bound_minimal_symbol msym
1165 = lookup_minimal_symbol (selector, 0, 0);
f8eba3c6 1166
3b7344d5 1167 if (msym.minsym != NULL)
c9d95fa3 1168 symbol_names->push_back (msym.minsym->natural_name ());
b81654f1
MS
1169 }
1170 }
1171
f8eba3c6 1172 uniquify_strings (symbol_names);
b81654f1
MS
1173
1174 return method + (tmp - buf);
1175}
1176
b9362cc7 1177static void
0b39b52e 1178print_object_command (const char *args, int from_tty)
b81654f1
MS
1179{
1180 struct value *object, *function, *description;
36e53c63 1181 CORE_ADDR string_addr, object_addr;
b81654f1 1182 int i = 0;
22a44745 1183 gdb_byte c = 0;
b81654f1
MS
1184
1185 if (!args || !*args)
d2e6263c
MS
1186 error (
1187"The 'print-object' command requires an argument (an Objective-C object)");
b81654f1
MS
1188
1189 {
4d01a485 1190 expression_up expr = parse_expression (args);
b81654f1
MS
1191 int pc = 0;
1192
4b27a620 1193 object = evaluate_subexp (builtin_type (expr->gdbarch)->builtin_data_ptr,
4d01a485 1194 expr.get (), &pc, EVAL_NORMAL);
b81654f1
MS
1195 }
1196
36e53c63
AF
1197 /* Validate the address for sanity. */
1198 object_addr = value_as_long (object);
1199 read_memory (object_addr, &c, 1);
1200
3e3b026f 1201 function = find_function_in_inferior ("_NSPrintForDebugger", NULL);
36e53c63 1202 if (function == NULL)
8a3fe4f8 1203 error (_("Unable to locate _NSPrintForDebugger in child process"));
b81654f1 1204
e71585ff 1205 description = call_function_by_hand (function, NULL, object);
b81654f1 1206
7248f48e
AF
1207 string_addr = value_as_long (description);
1208 if (string_addr == 0)
8a3fe4f8 1209 error (_("object returns null description"));
b81654f1
MS
1210
1211 read_memory (string_addr + i++, &c, 1);
22a44745 1212 if (c != 0)
b81654f1 1213 do
d2e6263c 1214 { /* Read and print characters up to EOS. */
b81654f1
MS
1215 QUIT;
1216 printf_filtered ("%c", c);
1217 read_memory (string_addr + i++, &c, 1);
1218 } while (c != 0);
1219 else
a3f17187 1220 printf_filtered(_("<object returns empty description>"));
b81654f1
MS
1221 printf_filtered ("\n");
1222}
1223
d2e6263c
MS
1224/* The data structure 'methcalls' is used to detect method calls (thru
1225 * ObjC runtime lib functions objc_msgSend, objc_msgSendSuper, etc.),
0df8b418 1226 * and ultimately find the method being called.
b81654f1
MS
1227 */
1228
1229struct objc_methcall {
a121b7c1 1230 const char *name;
d2e6263c 1231 /* Return instance method to be called. */
36e53c63 1232 int (*stop_at) (CORE_ADDR, CORE_ADDR *);
d2e6263c
MS
1233 /* Start of pc range corresponding to method invocation. */
1234 CORE_ADDR begin;
1235 /* End of pc range corresponding to method invocation. */
1236 CORE_ADDR end;
b81654f1
MS
1237};
1238
d2e6263c
MS
1239static int resolve_msgsend (CORE_ADDR pc, CORE_ADDR *new_pc);
1240static int resolve_msgsend_stret (CORE_ADDR pc, CORE_ADDR *new_pc);
1241static int resolve_msgsend_super (CORE_ADDR pc, CORE_ADDR *new_pc);
1242static int resolve_msgsend_super_stret (CORE_ADDR pc, CORE_ADDR *new_pc);
b81654f1
MS
1243
1244static struct objc_methcall methcalls[] = {
1245 { "_objc_msgSend", resolve_msgsend, 0, 0},
1246 { "_objc_msgSend_stret", resolve_msgsend_stret, 0, 0},
1247 { "_objc_msgSendSuper", resolve_msgsend_super, 0, 0},
1248 { "_objc_msgSendSuper_stret", resolve_msgsend_super_stret, 0, 0},
1249 { "_objc_getClass", NULL, 0, 0},
1250 { "_objc_getMetaClass", NULL, 0, 0}
1251};
1252
1253#define nmethcalls (sizeof (methcalls) / sizeof (methcalls[0]))
1254
d2e6263c
MS
1255/* The following function, "find_objc_msgsend", fills in the data
1256 * structure "objc_msgs" by finding the addresses of each of the
1257 * (currently four) functions that it holds (of which objc_msgSend is
1258 * the first). This must be called each time symbols are loaded, in
0df8b418 1259 * case the functions have moved for some reason.
b81654f1
MS
1260 */
1261
b9362cc7 1262static void
b81654f1
MS
1263find_objc_msgsend (void)
1264{
1265 unsigned int i;
b81654f1 1266
5cc80db3
MS
1267 for (i = 0; i < nmethcalls; i++)
1268 {
50e65b17 1269 struct bound_minimal_symbol func;
b81654f1 1270
5cc80db3 1271 /* Try both with and without underscore. */
50e65b17
TT
1272 func = lookup_bound_minimal_symbol (methcalls[i].name);
1273 if ((func.minsym == NULL) && (methcalls[i].name[0] == '_'))
5cc80db3 1274 {
50e65b17 1275 func = lookup_bound_minimal_symbol (methcalls[i].name + 1);
5cc80db3 1276 }
50e65b17 1277 if (func.minsym == NULL)
5cc80db3
MS
1278 {
1279 methcalls[i].begin = 0;
1280 methcalls[i].end = 0;
1281 continue;
1282 }
1283
77e371c0 1284 methcalls[i].begin = BMSYMBOL_VALUE_ADDRESS (func);
50e65b17 1285 methcalls[i].end = minimal_symbol_upper_bound (func);
b81654f1 1286 }
b81654f1
MS
1287}
1288
1289/* find_objc_msgcall (replaces pc_off_limits)
1290 *
d2e6263c
MS
1291 * ALL that this function now does is to determine whether the input
1292 * address ("pc") is the address of one of the Objective-C message
b81654f1
MS
1293 * dispatch functions (mainly objc_msgSend or objc_msgSendSuper), and
1294 * if so, it returns the address of the method that will be called.
1295 *
1296 * The old function "pc_off_limits" used to do a lot of other things
d2e6263c 1297 * in addition, such as detecting shared library jump stubs and
b81654f1 1298 * returning the address of the shlib function that would be called.
e76f05fa 1299 * That functionality has been moved into the gdbarch_skip_trampoline_code and
d2e6263c 1300 * IN_SOLIB_TRAMPOLINE macros, which are resolved in the target-
0df8b418 1301 * dependent modules.
b81654f1
MS
1302 */
1303
b9362cc7 1304static int
36e53c63 1305find_objc_msgcall_submethod (int (*f) (CORE_ADDR, CORE_ADDR *),
d2e6263c
MS
1306 CORE_ADDR pc,
1307 CORE_ADDR *new_pc)
b81654f1 1308{
a70b8144 1309 try
bf469271
PA
1310 {
1311 if (f (pc, new_pc) == 0)
1312 return 1;
1313 }
230d2906 1314 catch (const gdb_exception &ex)
bf469271
PA
1315 {
1316 exception_fprintf (gdb_stderr, ex,
1317 "Unable to determine target of "
1318 "Objective-C method call (ignoring):\n");
1319 }
bf469271
PA
1320
1321 return 0;
b81654f1
MS
1322}
1323
1324int
1325find_objc_msgcall (CORE_ADDR pc, CORE_ADDR *new_pc)
1326{
1327 unsigned int i;
1328
1329 find_objc_msgsend ();
5e488a7b
AC
1330 if (new_pc != NULL)
1331 {
1332 *new_pc = 0;
1333 }
b81654f1 1334
d2e6263c
MS
1335 for (i = 0; i < nmethcalls; i++)
1336 if ((pc >= methcalls[i].begin) && (pc < methcalls[i].end))
1337 {
1338 if (methcalls[i].stop_at != NULL)
1339 return find_objc_msgcall_submethod (methcalls[i].stop_at,
1340 pc, new_pc);
1341 else
1342 return 0;
b81654f1 1343 }
d2e6263c 1344
b81654f1
MS
1345 return 0;
1346}
1347
6c265988 1348void _initialize_objc_language ();
b81654f1 1349void
6c265988 1350_initialize_objc_language ()
b81654f1 1351{
11db9430 1352 add_info ("selectors", info_selectors_command,
1bedd215 1353 _("All Objective-C selectors, or those matching REGEXP."));
11db9430 1354 add_info ("classes", info_classes_command,
1bedd215 1355 _("All Objective-C classes, or those matching REGEXP."));
b81654f1 1356 add_com ("print-object", class_vars, print_object_command,
1bedd215 1357 _("Ask an Objective-C object to print itself."));
b81654f1
MS
1358 add_com_alias ("po", "print-object", class_vars, 1);
1359}
1360
b81654f1 1361static void
e17a4113
UW
1362read_objc_method (struct gdbarch *gdbarch, CORE_ADDR addr,
1363 struct objc_method *method)
b81654f1 1364{
e17a4113 1365 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5cc80db3 1366
e17a4113
UW
1367 method->name = read_memory_unsigned_integer (addr + 0, 4, byte_order);
1368 method->types = read_memory_unsigned_integer (addr + 4, 4, byte_order);
1369 method->imp = read_memory_unsigned_integer (addr + 8, 4, byte_order);
b81654f1
MS
1370}
1371
e17a4113
UW
1372static unsigned long
1373read_objc_methlist_nmethods (struct gdbarch *gdbarch, CORE_ADDR addr)
b81654f1 1374{
e17a4113 1375 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5cc80db3 1376
e17a4113 1377 return read_memory_unsigned_integer (addr + 4, 4, byte_order);
b81654f1
MS
1378}
1379
1380static void
e17a4113
UW
1381read_objc_methlist_method (struct gdbarch *gdbarch, CORE_ADDR addr,
1382 unsigned long num, struct objc_method *method)
b81654f1 1383{
e17a4113
UW
1384 gdb_assert (num < read_objc_methlist_nmethods (gdbarch, addr));
1385 read_objc_method (gdbarch, addr + 8 + (12 * num), method);
b81654f1
MS
1386}
1387
1388static void
e17a4113
UW
1389read_objc_object (struct gdbarch *gdbarch, CORE_ADDR addr,
1390 struct objc_object *object)
b81654f1 1391{
e17a4113 1392 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5cc80db3 1393
e17a4113 1394 object->isa = read_memory_unsigned_integer (addr, 4, byte_order);
b81654f1
MS
1395}
1396
1397static void
e17a4113
UW
1398read_objc_super (struct gdbarch *gdbarch, CORE_ADDR addr,
1399 struct objc_super *super)
b81654f1 1400{
e17a4113 1401 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5cc80db3 1402
e17a4113 1403 super->receiver = read_memory_unsigned_integer (addr, 4, byte_order);
fe978cb0 1404 super->theclass = read_memory_unsigned_integer (addr + 4, 4, byte_order);
b81654f1
MS
1405};
1406
1407static void
e17a4113 1408read_objc_class (struct gdbarch *gdbarch, CORE_ADDR addr,
fe978cb0 1409 struct objc_class *theclass)
b81654f1 1410{
e17a4113 1411 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5cc80db3 1412
fe978cb0
PA
1413 theclass->isa = read_memory_unsigned_integer (addr, 4, byte_order);
1414 theclass->super_class = read_memory_unsigned_integer (addr + 4, 4, byte_order);
1415 theclass->name = read_memory_unsigned_integer (addr + 8, 4, byte_order);
1416 theclass->version = read_memory_unsigned_integer (addr + 12, 4, byte_order);
1417 theclass->info = read_memory_unsigned_integer (addr + 16, 4, byte_order);
1418 theclass->instance_size = read_memory_unsigned_integer (addr + 18, 4,
0df8b418 1419 byte_order);
fe978cb0
PA
1420 theclass->ivars = read_memory_unsigned_integer (addr + 24, 4, byte_order);
1421 theclass->methods = read_memory_unsigned_integer (addr + 28, 4, byte_order);
1422 theclass->cache = read_memory_unsigned_integer (addr + 32, 4, byte_order);
1423 theclass->protocols = read_memory_unsigned_integer (addr + 36, 4, byte_order);
b81654f1
MS
1424}
1425
b9362cc7 1426static CORE_ADDR
e17a4113 1427find_implementation_from_class (struct gdbarch *gdbarch,
fe978cb0 1428 CORE_ADDR theclass, CORE_ADDR sel)
b81654f1 1429{
e17a4113 1430 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
fe978cb0 1431 CORE_ADDR subclass = theclass;
b81654f1 1432
d2e6263c
MS
1433 while (subclass != 0)
1434 {
b81654f1 1435
d2e6263c
MS
1436 struct objc_class class_str;
1437 unsigned mlistnum = 0;
b81654f1 1438
e17a4113 1439 read_objc_class (gdbarch, subclass, &class_str);
b81654f1 1440
d2e6263c
MS
1441 for (;;)
1442 {
1443 CORE_ADDR mlist;
1444 unsigned long nmethods;
1445 unsigned long i;
b81654f1 1446
d2e6263c 1447 mlist = read_memory_unsigned_integer (class_str.methods +
e17a4113
UW
1448 (4 * mlistnum),
1449 4, byte_order);
d2e6263c
MS
1450 if (mlist == 0)
1451 break;
b81654f1 1452
e17a4113 1453 nmethods = read_objc_methlist_nmethods (gdbarch, mlist);
b81654f1 1454
d2e6263c
MS
1455 for (i = 0; i < nmethods; i++)
1456 {
1457 struct objc_method meth_str;
b81654f1 1458
5cc80db3 1459 read_objc_methlist_method (gdbarch, mlist, i, &meth_str);
b81654f1 1460
d2e6263c 1461 if (meth_str.name == sel)
1abf022c 1462 /* FIXME: hppa arch was doing a pointer dereference
0df8b418 1463 here. There needs to be a better way to do that. */
1abf022c 1464 return meth_str.imp;
d2e6263c
MS
1465 }
1466 mlistnum++;
b81654f1 1467 }
d2e6263c 1468 subclass = class_str.super_class;
b81654f1 1469 }
b81654f1
MS
1470
1471 return 0;
1472}
1473
b9362cc7 1474static CORE_ADDR
e17a4113
UW
1475find_implementation (struct gdbarch *gdbarch,
1476 CORE_ADDR object, CORE_ADDR sel)
b81654f1
MS
1477{
1478 struct objc_object ostr;
1479
d2e6263c
MS
1480 if (object == 0)
1481 return 0;
e17a4113 1482 read_objc_object (gdbarch, object, &ostr);
d2e6263c
MS
1483 if (ostr.isa == 0)
1484 return 0;
b81654f1 1485
e17a4113 1486 return find_implementation_from_class (gdbarch, ostr.isa, sel);
b81654f1
MS
1487}
1488
1489static int
1490resolve_msgsend (CORE_ADDR pc, CORE_ADDR *new_pc)
1491{
5ed92fa8
UW
1492 struct frame_info *frame = get_current_frame ();
1493 struct gdbarch *gdbarch = get_frame_arch (frame);
1494 struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
1495
b81654f1
MS
1496 CORE_ADDR object;
1497 CORE_ADDR sel;
1498 CORE_ADDR res;
1499
5ed92fa8
UW
1500 object = gdbarch_fetch_pointer_argument (gdbarch, frame, 0, ptr_type);
1501 sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
b81654f1 1502
e17a4113 1503 res = find_implementation (gdbarch, object, sel);
d2e6263c
MS
1504 if (new_pc != 0)
1505 *new_pc = res;
1506 if (res == 0)
1507 return 1;
b81654f1
MS
1508 return 0;
1509}
1510
1511static int
1512resolve_msgsend_stret (CORE_ADDR pc, CORE_ADDR *new_pc)
1513{
5ed92fa8
UW
1514 struct frame_info *frame = get_current_frame ();
1515 struct gdbarch *gdbarch = get_frame_arch (frame);
1516 struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
1517
b81654f1
MS
1518 CORE_ADDR object;
1519 CORE_ADDR sel;
1520 CORE_ADDR res;
1521
5ed92fa8
UW
1522 object = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1523 sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 2, ptr_type);
b81654f1 1524
e17a4113 1525 res = find_implementation (gdbarch, object, sel);
d2e6263c
MS
1526 if (new_pc != 0)
1527 *new_pc = res;
1528 if (res == 0)
1529 return 1;
b81654f1
MS
1530 return 0;
1531}
1532
1533static int
1534resolve_msgsend_super (CORE_ADDR pc, CORE_ADDR *new_pc)
1535{
5ed92fa8
UW
1536 struct frame_info *frame = get_current_frame ();
1537 struct gdbarch *gdbarch = get_frame_arch (frame);
1538 struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
1539
b81654f1
MS
1540 struct objc_super sstr;
1541
1542 CORE_ADDR super;
1543 CORE_ADDR sel;
1544 CORE_ADDR res;
1545
5ed92fa8
UW
1546 super = gdbarch_fetch_pointer_argument (gdbarch, frame, 0, ptr_type);
1547 sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
b81654f1 1548
e17a4113 1549 read_objc_super (gdbarch, super, &sstr);
fe978cb0 1550 if (sstr.theclass == 0)
d2e6263c 1551 return 0;
b81654f1 1552
fe978cb0 1553 res = find_implementation_from_class (gdbarch, sstr.theclass, sel);
d2e6263c
MS
1554 if (new_pc != 0)
1555 *new_pc = res;
1556 if (res == 0)
1557 return 1;
b81654f1
MS
1558 return 0;
1559}
1560
1561static int
1562resolve_msgsend_super_stret (CORE_ADDR pc, CORE_ADDR *new_pc)
1563{
5ed92fa8
UW
1564 struct frame_info *frame = get_current_frame ();
1565 struct gdbarch *gdbarch = get_frame_arch (frame);
1566 struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
1567
b81654f1
MS
1568 struct objc_super sstr;
1569
1570 CORE_ADDR super;
1571 CORE_ADDR sel;
1572 CORE_ADDR res;
1573
5ed92fa8
UW
1574 super = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1575 sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 2, ptr_type);
b81654f1 1576
e17a4113 1577 read_objc_super (gdbarch, super, &sstr);
fe978cb0 1578 if (sstr.theclass == 0)
d2e6263c 1579 return 0;
b81654f1 1580
fe978cb0 1581 res = find_implementation_from_class (gdbarch, sstr.theclass, sel);
d2e6263c
MS
1582 if (new_pc != 0)
1583 *new_pc = res;
1584 if (res == 0)
1585 return 1;
b81654f1
MS
1586 return 0;
1587}
This page took 1.796683 seconds and 4 git commands to generate.