Fix breakpoint condition that use member variables.
[deliverable/binutils-gdb.git] / gdb / objc-lang.c
1 /* Objective-C language support routines for GDB, the GNU debugger.
2
3 Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008
4 Free Software Foundation, Inc.
5
6 Contributed by Apple Computer, Inc.
7 Written by Michael Snyder.
8
9 This file is part of GDB.
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23
24 #include "defs.h"
25 #include "symtab.h"
26 #include "gdbtypes.h"
27 #include "expression.h"
28 #include "parser-defs.h"
29 #include "language.h"
30 #include "c-lang.h"
31 #include "objc-lang.h"
32 #include "exceptions.h"
33 #include "complaints.h"
34 #include "value.h"
35 #include "symfile.h"
36 #include "objfiles.h"
37 #include "gdb_string.h" /* for strchr */
38 #include "target.h" /* for target_has_execution */
39 #include "gdbcore.h"
40 #include "gdbcmd.h"
41 #include "frame.h"
42 #include "gdb_regex.h"
43 #include "regcache.h"
44 #include "block.h"
45 #include "infcall.h"
46 #include "valprint.h"
47 #include "gdb_assert.h"
48
49 #include <ctype.h>
50
51 struct objc_object {
52 CORE_ADDR isa;
53 };
54
55 struct objc_class {
56 CORE_ADDR isa;
57 CORE_ADDR super_class;
58 CORE_ADDR name;
59 long version;
60 long info;
61 long instance_size;
62 CORE_ADDR ivars;
63 CORE_ADDR methods;
64 CORE_ADDR cache;
65 CORE_ADDR protocols;
66 };
67
68 struct objc_super {
69 CORE_ADDR receiver;
70 CORE_ADDR class;
71 };
72
73 struct objc_method {
74 CORE_ADDR name;
75 CORE_ADDR types;
76 CORE_ADDR imp;
77 };
78
79 /* Lookup a structure type named "struct NAME", visible in lexical
80 block BLOCK. If NOERR is nonzero, return zero if NAME is not
81 suitably defined. */
82
83 struct symbol *
84 lookup_struct_typedef (char *name, struct block *block, int noerr)
85 {
86 struct symbol *sym;
87
88 sym = lookup_symbol (name, block, STRUCT_DOMAIN, 0,
89 (struct symtab **) NULL);
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 (TYPE_CODE (SYMBOL_TYPE (sym)) != 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 (char *classname)
111 {
112 struct value * function, *classval;
113
114 if (! target_has_execution)
115 {
116 /* Can't call into inferior to lookup class. */
117 return 0;
118 }
119
120 if (lookup_minimal_symbol("objc_lookUpClass", 0, 0))
121 function = find_function_in_inferior("objc_lookUpClass");
122 else if (lookup_minimal_symbol ("objc_lookup_class", 0, 0))
123 function = find_function_in_inferior("objc_lookup_class");
124 else
125 {
126 complaint (&symfile_complaints, _("no way to lookup Objective-C classes"));
127 return 0;
128 }
129
130 classval = value_string (classname, strlen (classname) + 1);
131 classval = value_coerce_array (classval);
132 return (CORE_ADDR) value_as_long (call_function_by_hand (function,
133 1, &classval));
134 }
135
136 CORE_ADDR
137 lookup_child_selector (char *selname)
138 {
139 struct value * function, *selstring;
140
141 if (! target_has_execution)
142 {
143 /* Can't call into inferior to lookup selector. */
144 return 0;
145 }
146
147 if (lookup_minimal_symbol("sel_getUid", 0, 0))
148 function = find_function_in_inferior("sel_getUid");
149 else if (lookup_minimal_symbol ("sel_get_any_uid", 0, 0))
150 function = find_function_in_inferior("sel_get_any_uid");
151 else
152 {
153 complaint (&symfile_complaints, _("no way to lookup Objective-C selectors"));
154 return 0;
155 }
156
157 selstring = value_coerce_array (value_string (selname,
158 strlen (selname) + 1));
159 return value_as_long (call_function_by_hand (function, 1, &selstring));
160 }
161
162 struct value *
163 value_nsstring (char *ptr, int len)
164 {
165 struct value *stringValue[3];
166 struct value *function, *nsstringValue;
167 struct symbol *sym;
168 struct type *type;
169
170 if (!target_has_execution)
171 return 0; /* Can't call into inferior to create NSString. */
172
173 sym = lookup_struct_typedef("NSString", 0, 1);
174 if (sym == NULL)
175 sym = lookup_struct_typedef("NXString", 0, 1);
176 if (sym == NULL)
177 type = lookup_pointer_type(builtin_type_void);
178 else
179 type = lookup_pointer_type(SYMBOL_TYPE (sym));
180
181 stringValue[2] = value_string(ptr, len);
182 stringValue[2] = value_coerce_array(stringValue[2]);
183 /* _NSNewStringFromCString replaces "istr" after Lantern2A. */
184 if (lookup_minimal_symbol("_NSNewStringFromCString", 0, 0))
185 {
186 function = find_function_in_inferior("_NSNewStringFromCString");
187 nsstringValue = call_function_by_hand(function, 1, &stringValue[2]);
188 }
189 else if (lookup_minimal_symbol("istr", 0, 0))
190 {
191 function = find_function_in_inferior("istr");
192 nsstringValue = call_function_by_hand(function, 1, &stringValue[2]);
193 }
194 else if (lookup_minimal_symbol("+[NSString stringWithCString:]", 0, 0))
195 {
196 function = find_function_in_inferior("+[NSString stringWithCString:]");
197 stringValue[0] = value_from_longest
198 (builtin_type_long, lookup_objc_class ("NSString"));
199 stringValue[1] = value_from_longest
200 (builtin_type_long, lookup_child_selector ("stringWithCString:"));
201 nsstringValue = call_function_by_hand(function, 3, &stringValue[0]);
202 }
203 else
204 error (_("NSString: internal error -- no way to create new NSString"));
205
206 deprecated_set_value_type (nsstringValue, type);
207 return nsstringValue;
208 }
209
210 /* Objective-C name demangling. */
211
212 char *
213 objc_demangle (const char *mangled, int options)
214 {
215 char *demangled, *cp;
216
217 if (mangled[0] == '_' &&
218 (mangled[1] == 'i' || mangled[1] == 'c') &&
219 mangled[2] == '_')
220 {
221 cp = demangled = xmalloc(strlen(mangled) + 2);
222
223 if (mangled[1] == 'i')
224 *cp++ = '-'; /* for instance method */
225 else
226 *cp++ = '+'; /* for class method */
227
228 *cp++ = '['; /* opening left brace */
229 strcpy(cp, mangled+3); /* tack on the rest of the mangled name */
230
231 while (*cp && *cp == '_')
232 cp++; /* skip any initial underbars in class name */
233
234 cp = strchr(cp, '_');
235 if (!cp) /* find first non-initial underbar */
236 {
237 xfree(demangled); /* not mangled name */
238 return NULL;
239 }
240 if (cp[1] == '_') { /* easy case: no category name */
241 *cp++ = ' '; /* replace two '_' with one ' ' */
242 strcpy(cp, mangled + (cp - demangled) + 2);
243 }
244 else {
245 *cp++ = '('; /* less easy case: category name */
246 cp = strchr(cp, '_');
247 if (!cp)
248 {
249 xfree(demangled); /* not mangled name */
250 return NULL;
251 }
252 *cp++ = ')';
253 *cp++ = ' '; /* overwriting 1st char of method name... */
254 strcpy(cp, mangled + (cp - demangled)); /* get it back */
255 }
256
257 while (*cp && *cp == '_')
258 cp++; /* skip any initial underbars in method name */
259
260 for (; *cp; cp++)
261 if (*cp == '_')
262 *cp = ':'; /* replace remaining '_' with ':' */
263
264 *cp++ = ']'; /* closing right brace */
265 *cp++ = 0; /* string terminator */
266 return demangled;
267 }
268 else
269 return NULL; /* Not an objc mangled name. */
270 }
271
272 /* Print the character C on STREAM as part of the contents of a
273 literal string whose delimiter is QUOTER. Note that that format
274 for printing characters and strings is language specific. */
275
276 static void
277 objc_emit_char (int c, struct ui_file *stream, int quoter)
278 {
279
280 c &= 0xFF; /* Avoid sign bit follies. */
281
282 if (PRINT_LITERAL_FORM (c))
283 {
284 if (c == '\\' || c == quoter)
285 {
286 fputs_filtered ("\\", stream);
287 }
288 fprintf_filtered (stream, "%c", c);
289 }
290 else
291 {
292 switch (c)
293 {
294 case '\n':
295 fputs_filtered ("\\n", stream);
296 break;
297 case '\b':
298 fputs_filtered ("\\b", stream);
299 break;
300 case '\t':
301 fputs_filtered ("\\t", stream);
302 break;
303 case '\f':
304 fputs_filtered ("\\f", stream);
305 break;
306 case '\r':
307 fputs_filtered ("\\r", stream);
308 break;
309 case '\033':
310 fputs_filtered ("\\e", stream);
311 break;
312 case '\007':
313 fputs_filtered ("\\a", stream);
314 break;
315 default:
316 fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
317 break;
318 }
319 }
320 }
321
322 static void
323 objc_printchar (int c, struct ui_file *stream)
324 {
325 fputs_filtered ("'", stream);
326 objc_emit_char (c, stream, '\'');
327 fputs_filtered ("'", stream);
328 }
329
330 /* Print the character string STRING, printing at most LENGTH
331 characters. Printing stops early if the number hits print_max;
332 repeat counts are printed as appropriate. Print ellipses at the
333 end if we had to stop before printing LENGTH characters, or if
334 FORCE_ELLIPSES. */
335
336 static void
337 objc_printstr (struct ui_file *stream, const gdb_byte *string,
338 unsigned int length, int width, int force_ellipses)
339 {
340 unsigned int i;
341 unsigned int things_printed = 0;
342 int in_quotes = 0;
343 int need_comma = 0;
344
345 /* If the string was not truncated due to `set print elements', and
346 the last byte of it is a null, we don't print that, in
347 traditional C style. */
348 if ((!force_ellipses) && length > 0 && string[length-1] == '\0')
349 length--;
350
351 if (length == 0)
352 {
353 fputs_filtered ("\"\"", stream);
354 return;
355 }
356
357 for (i = 0; i < length && things_printed < print_max; ++i)
358 {
359 /* Position of the character we are examining to see whether it
360 is repeated. */
361 unsigned int rep1;
362 /* Number of repetitions we have detected so far. */
363 unsigned int reps;
364
365 QUIT;
366
367 if (need_comma)
368 {
369 fputs_filtered (", ", stream);
370 need_comma = 0;
371 }
372
373 rep1 = i + 1;
374 reps = 1;
375 while (rep1 < length && string[rep1] == string[i])
376 {
377 ++rep1;
378 ++reps;
379 }
380
381 if (reps > repeat_count_threshold)
382 {
383 if (in_quotes)
384 {
385 if (inspect_it)
386 fputs_filtered ("\\\", ", stream);
387 else
388 fputs_filtered ("\", ", stream);
389 in_quotes = 0;
390 }
391 objc_printchar (string[i], stream);
392 fprintf_filtered (stream, " <repeats %u times>", reps);
393 i = rep1 - 1;
394 things_printed += repeat_count_threshold;
395 need_comma = 1;
396 }
397 else
398 {
399 if (!in_quotes)
400 {
401 if (inspect_it)
402 fputs_filtered ("\\\"", stream);
403 else
404 fputs_filtered ("\"", stream);
405 in_quotes = 1;
406 }
407 objc_emit_char (string[i], stream, '"');
408 ++things_printed;
409 }
410 }
411
412 /* Terminate the quotes if necessary. */
413 if (in_quotes)
414 {
415 if (inspect_it)
416 fputs_filtered ("\\\"", stream);
417 else
418 fputs_filtered ("\"", stream);
419 }
420
421 if (force_ellipses || i < length)
422 fputs_filtered ("...", stream);
423 }
424
425 /* Determine if we are currently in the Objective-C dispatch function.
426 If so, get the address of the method function that the dispatcher
427 would call and use that as the function to step into instead. Also
428 skip over the trampoline for the function (if any). This is better
429 for the user since they are only interested in stepping into the
430 method function anyway. */
431 static CORE_ADDR
432 objc_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
433 {
434 CORE_ADDR real_stop_pc;
435 CORE_ADDR method_stop_pc;
436
437 real_stop_pc = gdbarch_skip_trampoline_code
438 (current_gdbarch, frame, stop_pc);
439
440 if (real_stop_pc != 0)
441 find_objc_msgcall (real_stop_pc, &method_stop_pc);
442 else
443 find_objc_msgcall (stop_pc, &method_stop_pc);
444
445 if (method_stop_pc)
446 {
447 real_stop_pc = gdbarch_skip_trampoline_code
448 (current_gdbarch, frame, method_stop_pc);
449 if (real_stop_pc == 0)
450 real_stop_pc = method_stop_pc;
451 }
452
453 return real_stop_pc;
454 }
455
456
457 /* Table mapping opcodes into strings for printing operators
458 and precedences of the operators. */
459
460 static const struct op_print objc_op_print_tab[] =
461 {
462 {",", BINOP_COMMA, PREC_COMMA, 0},
463 {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
464 {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
465 {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
466 {"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
467 {"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
468 {"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
469 {"==", BINOP_EQUAL, PREC_EQUAL, 0},
470 {"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
471 {"<=", BINOP_LEQ, PREC_ORDER, 0},
472 {">=", BINOP_GEQ, PREC_ORDER, 0},
473 {">", BINOP_GTR, PREC_ORDER, 0},
474 {"<", BINOP_LESS, PREC_ORDER, 0},
475 {">>", BINOP_RSH, PREC_SHIFT, 0},
476 {"<<", BINOP_LSH, PREC_SHIFT, 0},
477 {"+", BINOP_ADD, PREC_ADD, 0},
478 {"-", BINOP_SUB, PREC_ADD, 0},
479 {"*", BINOP_MUL, PREC_MUL, 0},
480 {"/", BINOP_DIV, PREC_MUL, 0},
481 {"%", BINOP_REM, PREC_MUL, 0},
482 {"@", BINOP_REPEAT, PREC_REPEAT, 0},
483 {"-", UNOP_NEG, PREC_PREFIX, 0},
484 {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
485 {"~", UNOP_COMPLEMENT, PREC_PREFIX, 0},
486 {"*", UNOP_IND, PREC_PREFIX, 0},
487 {"&", UNOP_ADDR, PREC_PREFIX, 0},
488 {"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
489 {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
490 {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
491 {NULL, OP_NULL, PREC_NULL, 0}
492 };
493
494 const struct language_defn objc_language_defn = {
495 "objective-c", /* Language name */
496 language_objc,
497 range_check_off,
498 type_check_off,
499 case_sensitive_on,
500 array_row_major,
501 &exp_descriptor_standard,
502 objc_parse,
503 objc_error,
504 null_post_parser,
505 objc_printchar, /* Print a character constant */
506 objc_printstr, /* Function to print string constant */
507 objc_emit_char,
508 c_print_type, /* Print a type using appropriate syntax */
509 c_val_print, /* Print a value using appropriate syntax */
510 c_value_print, /* Print a top-level value */
511 objc_skip_trampoline, /* Language specific skip_trampoline */
512 "self", /* name_of_this */
513 basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
514 basic_lookup_transparent_type,/* lookup_transparent_type */
515 objc_demangle, /* Language specific symbol demangler */
516 NULL, /* Language specific class_name_from_physname */
517 objc_op_print_tab, /* Expression operators for printing */
518 1, /* C-style arrays */
519 0, /* String lower bound */
520 default_word_break_characters,
521 default_make_symbol_completion_list,
522 c_language_arch_info,
523 default_print_array_index,
524 default_pass_by_reference,
525 LANG_MAGIC
526 };
527
528 /*
529 * ObjC:
530 * Following functions help construct Objective-C message calls
531 */
532
533 struct selname /* For parsing Objective-C. */
534 {
535 struct selname *next;
536 char *msglist_sel;
537 int msglist_len;
538 };
539
540 static int msglist_len;
541 static struct selname *selname_chain;
542 static char *msglist_sel;
543
544 void
545 start_msglist(void)
546 {
547 struct selname *new =
548 (struct selname *) xmalloc (sizeof (struct selname));
549
550 new->next = selname_chain;
551 new->msglist_len = msglist_len;
552 new->msglist_sel = msglist_sel;
553 msglist_len = 0;
554 msglist_sel = (char *)xmalloc(1);
555 *msglist_sel = 0;
556 selname_chain = new;
557 }
558
559 void
560 add_msglist(struct stoken *str, int addcolon)
561 {
562 char *s, *p;
563 int len, plen;
564
565 if (str == 0) { /* Unnamed arg, or... */
566 if (addcolon == 0) { /* variable number of args. */
567 msglist_len++;
568 return;
569 }
570 p = "";
571 plen = 0;
572 } else {
573 p = str->ptr;
574 plen = str->length;
575 }
576 len = plen + strlen(msglist_sel) + 2;
577 s = (char *)xmalloc(len);
578 strcpy(s, msglist_sel);
579 strncat(s, p, plen);
580 xfree(msglist_sel);
581 msglist_sel = s;
582 if (addcolon) {
583 s[len-2] = ':';
584 s[len-1] = 0;
585 msglist_len++;
586 } else
587 s[len-2] = '\0';
588 }
589
590 int
591 end_msglist(void)
592 {
593 int val = msglist_len;
594 struct selname *sel = selname_chain;
595 char *p = msglist_sel;
596 CORE_ADDR selid;
597
598 selname_chain = sel->next;
599 msglist_len = sel->msglist_len;
600 msglist_sel = sel->msglist_sel;
601 selid = lookup_child_selector(p);
602 if (!selid)
603 error (_("Can't find selector \"%s\""), p);
604 write_exp_elt_longcst (selid);
605 xfree(p);
606 write_exp_elt_longcst (val); /* Number of args */
607 xfree(sel);
608
609 return val;
610 }
611
612 /*
613 * Function: specialcmp (char *a, char *b)
614 *
615 * Special strcmp: treats ']' and ' ' as end-of-string.
616 * Used for qsorting lists of objc methods (either by class or selector).
617 */
618
619 static int
620 specialcmp (char *a, char *b)
621 {
622 while (*a && *a != ' ' && *a != ']' && *b && *b != ' ' && *b != ']')
623 {
624 if (*a != *b)
625 return *a - *b;
626 a++, b++;
627 }
628 if (*a && *a != ' ' && *a != ']')
629 return 1; /* a is longer therefore greater */
630 if (*b && *b != ' ' && *b != ']')
631 return -1; /* a is shorter therefore lesser */
632 return 0; /* a and b are identical */
633 }
634
635 /*
636 * Function: compare_selectors (const void *, const void *)
637 *
638 * Comparison function for use with qsort. Arguments are symbols or
639 * msymbols Compares selector part of objc method name alphabetically.
640 */
641
642 static int
643 compare_selectors (const void *a, const void *b)
644 {
645 char *aname, *bname;
646
647 aname = SYMBOL_PRINT_NAME (*(struct symbol **) a);
648 bname = SYMBOL_PRINT_NAME (*(struct symbol **) b);
649 if (aname == NULL || bname == NULL)
650 error (_("internal: compare_selectors(1)"));
651
652 aname = strchr(aname, ' ');
653 bname = strchr(bname, ' ');
654 if (aname == NULL || bname == NULL)
655 error (_("internal: compare_selectors(2)"));
656
657 return specialcmp (aname+1, bname+1);
658 }
659
660 /*
661 * Function: selectors_info (regexp, from_tty)
662 *
663 * Implements the "Info selectors" command. Takes an optional regexp
664 * arg. Lists all objective c selectors that match the regexp. Works
665 * by grepping thru all symbols for objective c methods. Output list
666 * is sorted and uniqued.
667 */
668
669 static void
670 selectors_info (char *regexp, int from_tty)
671 {
672 struct objfile *objfile;
673 struct minimal_symbol *msymbol;
674 char *name;
675 char *val;
676 int matches = 0;
677 int maxlen = 0;
678 int ix;
679 char myregexp[2048];
680 char asel[256];
681 struct symbol **sym_arr;
682 int plusminus = 0;
683
684 if (regexp == NULL)
685 strcpy(myregexp, ".*]"); /* Null input, match all objc methods. */
686 else
687 {
688 if (*regexp == '+' || *regexp == '-')
689 { /* User wants only class methods or only instance methods. */
690 plusminus = *regexp++;
691 while (*regexp == ' ' || *regexp == '\t')
692 regexp++;
693 }
694 if (*regexp == '\0')
695 strcpy(myregexp, ".*]");
696 else
697 {
698 strcpy(myregexp, regexp);
699 if (myregexp[strlen(myregexp) - 1] == '$') /* end of selector */
700 myregexp[strlen(myregexp) - 1] = ']'; /* end of method name */
701 else
702 strcat(myregexp, ".*]");
703 }
704 }
705
706 if (regexp != NULL)
707 {
708 val = re_comp (myregexp);
709 if (val != 0)
710 error (_("Invalid regexp (%s): %s"), val, regexp);
711 }
712
713 /* First time thru is JUST to get max length and count. */
714 ALL_MSYMBOLS (objfile, msymbol)
715 {
716 QUIT;
717 name = SYMBOL_NATURAL_NAME (msymbol);
718 if (name &&
719 (name[0] == '-' || name[0] == '+') &&
720 name[1] == '[') /* Got a method name. */
721 {
722 /* Filter for class/instance methods. */
723 if (plusminus && name[0] != plusminus)
724 continue;
725 /* Find selector part. */
726 name = (char *) strchr(name+2, ' ');
727 if (regexp == NULL || re_exec(++name) != 0)
728 {
729 char *mystart = name;
730 char *myend = (char *) strchr(mystart, ']');
731
732 if (myend && (myend - mystart > maxlen))
733 maxlen = myend - mystart; /* Get longest selector. */
734 matches++;
735 }
736 }
737 }
738 if (matches)
739 {
740 printf_filtered (_("Selectors matching \"%s\":\n\n"),
741 regexp ? regexp : "*");
742
743 sym_arr = alloca (matches * sizeof (struct symbol *));
744 matches = 0;
745 ALL_MSYMBOLS (objfile, msymbol)
746 {
747 QUIT;
748 name = SYMBOL_NATURAL_NAME (msymbol);
749 if (name &&
750 (name[0] == '-' || name[0] == '+') &&
751 name[1] == '[') /* Got a method name. */
752 {
753 /* Filter for class/instance methods. */
754 if (plusminus && name[0] != plusminus)
755 continue;
756 /* Find selector part. */
757 name = (char *) strchr(name+2, ' ');
758 if (regexp == NULL || re_exec(++name) != 0)
759 sym_arr[matches++] = (struct symbol *) msymbol;
760 }
761 }
762
763 qsort (sym_arr, matches, sizeof (struct minimal_symbol *),
764 compare_selectors);
765 /* Prevent compare on first iteration. */
766 asel[0] = 0;
767 for (ix = 0; ix < matches; ix++) /* Now do the output. */
768 {
769 char *p = asel;
770
771 QUIT;
772 name = SYMBOL_NATURAL_NAME (sym_arr[ix]);
773 name = strchr (name, ' ') + 1;
774 if (p[0] && specialcmp(name, p) == 0)
775 continue; /* Seen this one already (not unique). */
776
777 /* Copy selector part. */
778 while (*name && *name != ']')
779 *p++ = *name++;
780 *p++ = '\0';
781 /* Print in columns. */
782 puts_filtered_tabular(asel, maxlen + 1, 0);
783 }
784 begin_line();
785 }
786 else
787 printf_filtered (_("No selectors matching \"%s\"\n"), regexp ? regexp : "*");
788 }
789
790 /*
791 * Function: compare_classes (const void *, const void *)
792 *
793 * Comparison function for use with qsort. Arguments are symbols or
794 * msymbols Compares class part of objc method name alphabetically.
795 */
796
797 static int
798 compare_classes (const void *a, const void *b)
799 {
800 char *aname, *bname;
801
802 aname = SYMBOL_PRINT_NAME (*(struct symbol **) a);
803 bname = SYMBOL_PRINT_NAME (*(struct symbol **) b);
804 if (aname == NULL || bname == NULL)
805 error (_("internal: compare_classes(1)"));
806
807 return specialcmp (aname+1, bname+1);
808 }
809
810 /*
811 * Function: classes_info(regexp, from_tty)
812 *
813 * Implements the "info classes" command for objective c classes.
814 * Lists all objective c classes that match the optional regexp.
815 * Works by grepping thru the list of objective c methods. List will
816 * be sorted and uniqued (since one class may have many methods).
817 * BUGS: will not list a class that has no methods.
818 */
819
820 static void
821 classes_info (char *regexp, int from_tty)
822 {
823 struct objfile *objfile;
824 struct minimal_symbol *msymbol;
825 char *name;
826 char *val;
827 int matches = 0;
828 int maxlen = 0;
829 int ix;
830 char myregexp[2048];
831 char aclass[256];
832 struct symbol **sym_arr;
833
834 if (regexp == NULL)
835 strcpy(myregexp, ".* "); /* Null input: match all objc classes. */
836 else
837 {
838 strcpy(myregexp, regexp);
839 if (myregexp[strlen(myregexp) - 1] == '$')
840 /* In the method name, the end of the class name is marked by ' '. */
841 myregexp[strlen(myregexp) - 1] = ' ';
842 else
843 strcat(myregexp, ".* ");
844 }
845
846 if (regexp != NULL)
847 {
848 val = re_comp (myregexp);
849 if (val != 0)
850 error (_("Invalid regexp (%s): %s"), val, regexp);
851 }
852
853 /* First time thru is JUST to get max length and count. */
854 ALL_MSYMBOLS (objfile, msymbol)
855 {
856 QUIT;
857 name = SYMBOL_NATURAL_NAME (msymbol);
858 if (name &&
859 (name[0] == '-' || name[0] == '+') &&
860 name[1] == '[') /* Got a method name. */
861 if (regexp == NULL || re_exec(name+2) != 0)
862 {
863 /* Compute length of classname part. */
864 char *mystart = name + 2;
865 char *myend = (char *) strchr(mystart, ' ');
866
867 if (myend && (myend - mystart > maxlen))
868 maxlen = myend - mystart;
869 matches++;
870 }
871 }
872 if (matches)
873 {
874 printf_filtered (_("Classes matching \"%s\":\n\n"),
875 regexp ? regexp : "*");
876 sym_arr = alloca (matches * sizeof (struct symbol *));
877 matches = 0;
878 ALL_MSYMBOLS (objfile, msymbol)
879 {
880 QUIT;
881 name = SYMBOL_NATURAL_NAME (msymbol);
882 if (name &&
883 (name[0] == '-' || name[0] == '+') &&
884 name[1] == '[') /* Got a method name. */
885 if (regexp == NULL || re_exec(name+2) != 0)
886 sym_arr[matches++] = (struct symbol *) msymbol;
887 }
888
889 qsort (sym_arr, matches, sizeof (struct minimal_symbol *),
890 compare_classes);
891 /* Prevent compare on first iteration. */
892 aclass[0] = 0;
893 for (ix = 0; ix < matches; ix++) /* Now do the output. */
894 {
895 char *p = aclass;
896
897 QUIT;
898 name = SYMBOL_NATURAL_NAME (sym_arr[ix]);
899 name += 2;
900 if (p[0] && specialcmp(name, p) == 0)
901 continue; /* Seen this one already (not unique). */
902
903 /* Copy class part of method name. */
904 while (*name && *name != ' ')
905 *p++ = *name++;
906 *p++ = '\0';
907 /* Print in columns. */
908 puts_filtered_tabular(aclass, maxlen + 1, 0);
909 }
910 begin_line();
911 }
912 else
913 printf_filtered (_("No classes matching \"%s\"\n"), regexp ? regexp : "*");
914 }
915
916 /*
917 * Function: find_imps (char *selector, struct symbol **sym_arr)
918 *
919 * Input: a string representing a selector
920 * a pointer to an array of symbol pointers
921 * possibly a pointer to a symbol found by the caller.
922 *
923 * Output: number of methods that implement that selector. Side
924 * effects: The array of symbol pointers is filled with matching syms.
925 *
926 * By analogy with function "find_methods" (symtab.c), builds a list
927 * of symbols matching the ambiguous input, so that "decode_line_2"
928 * (symtab.c) can list them and ask the user to choose one or more.
929 * In this case the matches are objective c methods
930 * ("implementations") matching an objective c selector.
931 *
932 * Note that it is possible for a normal (c-style) function to have
933 * the same name as an objective c selector. To prevent the selector
934 * from eclipsing the function, we allow the caller (decode_line_1) to
935 * search for such a function first, and if it finds one, pass it in
936 * to us. We will then integrate it into the list. We also search
937 * for one here, among the minsyms.
938 *
939 * NOTE: if NUM_DEBUGGABLE is non-zero, the sym_arr will be divided
940 * into two parts: debuggable (struct symbol) syms, and
941 * non_debuggable (struct minimal_symbol) syms. The debuggable
942 * ones will come first, before NUM_DEBUGGABLE (which will thus
943 * be the index of the first non-debuggable one).
944 */
945
946 /*
947 * Function: total_number_of_imps (char *selector);
948 *
949 * Input: a string representing a selector
950 * Output: number of methods that implement that selector.
951 *
952 * By analogy with function "total_number_of_methods", this allows
953 * decode_line_1 (symtab.c) to detect if there are objective c methods
954 * matching the input, and to allocate an array of pointers to them
955 * which can be manipulated by "decode_line_2" (also in symtab.c).
956 */
957
958 char *
959 parse_selector (char *method, char **selector)
960 {
961 char *s1 = NULL;
962 char *s2 = NULL;
963 int found_quote = 0;
964
965 char *nselector = NULL;
966
967 gdb_assert (selector != NULL);
968
969 s1 = method;
970
971 while (isspace (*s1))
972 s1++;
973 if (*s1 == '\'')
974 {
975 found_quote = 1;
976 s1++;
977 }
978 while (isspace (*s1))
979 s1++;
980
981 nselector = s1;
982 s2 = s1;
983
984 for (;;) {
985 if (isalnum (*s2) || (*s2 == '_') || (*s2 == ':'))
986 *s1++ = *s2;
987 else if (isspace (*s2))
988 ;
989 else if ((*s2 == '\0') || (*s2 == '\''))
990 break;
991 else
992 return NULL;
993 s2++;
994 }
995 *s1++ = '\0';
996
997 while (isspace (*s2))
998 s2++;
999 if (found_quote)
1000 {
1001 if (*s2 == '\'')
1002 s2++;
1003 while (isspace (*s2))
1004 s2++;
1005 }
1006
1007 if (selector != NULL)
1008 *selector = nselector;
1009
1010 return s2;
1011 }
1012
1013 char *
1014 parse_method (char *method, char *type, char **class,
1015 char **category, char **selector)
1016 {
1017 char *s1 = NULL;
1018 char *s2 = NULL;
1019 int found_quote = 0;
1020
1021 char ntype = '\0';
1022 char *nclass = NULL;
1023 char *ncategory = NULL;
1024 char *nselector = NULL;
1025
1026 gdb_assert (type != NULL);
1027 gdb_assert (class != NULL);
1028 gdb_assert (category != NULL);
1029 gdb_assert (selector != NULL);
1030
1031 s1 = method;
1032
1033 while (isspace (*s1))
1034 s1++;
1035 if (*s1 == '\'')
1036 {
1037 found_quote = 1;
1038 s1++;
1039 }
1040 while (isspace (*s1))
1041 s1++;
1042
1043 if ((s1[0] == '+') || (s1[0] == '-'))
1044 ntype = *s1++;
1045
1046 while (isspace (*s1))
1047 s1++;
1048
1049 if (*s1 != '[')
1050 return NULL;
1051 s1++;
1052
1053 nclass = s1;
1054 while (isalnum (*s1) || (*s1 == '_'))
1055 s1++;
1056
1057 s2 = s1;
1058 while (isspace (*s2))
1059 s2++;
1060
1061 if (*s2 == '(')
1062 {
1063 s2++;
1064 while (isspace (*s2))
1065 s2++;
1066 ncategory = s2;
1067 while (isalnum (*s2) || (*s2 == '_'))
1068 s2++;
1069 *s2++ = '\0';
1070 }
1071
1072 /* Truncate the class name now that we're not using the open paren. */
1073 *s1++ = '\0';
1074
1075 nselector = s2;
1076 s1 = s2;
1077
1078 for (;;) {
1079 if (isalnum (*s2) || (*s2 == '_') || (*s2 == ':'))
1080 *s1++ = *s2;
1081 else if (isspace (*s2))
1082 ;
1083 else if (*s2 == ']')
1084 break;
1085 else
1086 return NULL;
1087 s2++;
1088 }
1089 *s1++ = '\0';
1090 s2++;
1091
1092 while (isspace (*s2))
1093 s2++;
1094 if (found_quote)
1095 {
1096 if (*s2 != '\'')
1097 return NULL;
1098 s2++;
1099 while (isspace (*s2))
1100 s2++;
1101 }
1102
1103 if (type != NULL)
1104 *type = ntype;
1105 if (class != NULL)
1106 *class = nclass;
1107 if (category != NULL)
1108 *category = ncategory;
1109 if (selector != NULL)
1110 *selector = nselector;
1111
1112 return s2;
1113 }
1114
1115 static void
1116 find_methods (struct symtab *symtab, char type,
1117 const char *class, const char *category,
1118 const char *selector, struct symbol **syms,
1119 unsigned int *nsym, unsigned int *ndebug)
1120 {
1121 struct objfile *objfile = NULL;
1122 struct minimal_symbol *msymbol = NULL;
1123 struct block *block = NULL;
1124 struct symbol *sym = NULL;
1125
1126 char *symname = NULL;
1127
1128 char ntype = '\0';
1129 char *nclass = NULL;
1130 char *ncategory = NULL;
1131 char *nselector = NULL;
1132
1133 unsigned int csym = 0;
1134 unsigned int cdebug = 0;
1135
1136 static char *tmp = NULL;
1137 static unsigned int tmplen = 0;
1138
1139 gdb_assert (nsym != NULL);
1140 gdb_assert (ndebug != NULL);
1141
1142 if (symtab)
1143 block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (symtab), STATIC_BLOCK);
1144
1145 ALL_MSYMBOLS (objfile, msymbol)
1146 {
1147 QUIT;
1148
1149 if ((msymbol->type != mst_text) && (msymbol->type != mst_file_text))
1150 /* Not a function or method. */
1151 continue;
1152
1153 if (symtab)
1154 if ((SYMBOL_VALUE_ADDRESS (msymbol) < BLOCK_START (block)) ||
1155 (SYMBOL_VALUE_ADDRESS (msymbol) >= BLOCK_END (block)))
1156 /* Not in the specified symtab. */
1157 continue;
1158
1159 symname = SYMBOL_NATURAL_NAME (msymbol);
1160 if (symname == NULL)
1161 continue;
1162
1163 if ((symname[0] != '-' && symname[0] != '+') || (symname[1] != '['))
1164 /* Not a method name. */
1165 continue;
1166
1167 while ((strlen (symname) + 1) >= tmplen)
1168 {
1169 tmplen = (tmplen == 0) ? 1024 : tmplen * 2;
1170 tmp = xrealloc (tmp, tmplen);
1171 }
1172 strcpy (tmp, symname);
1173
1174 if (parse_method (tmp, &ntype, &nclass, &ncategory, &nselector) == NULL)
1175 continue;
1176
1177 if ((type != '\0') && (ntype != type))
1178 continue;
1179
1180 if ((class != NULL)
1181 && ((nclass == NULL) || (strcmp (class, nclass) != 0)))
1182 continue;
1183
1184 if ((category != NULL) &&
1185 ((ncategory == NULL) || (strcmp (category, ncategory) != 0)))
1186 continue;
1187
1188 if ((selector != NULL) &&
1189 ((nselector == NULL) || (strcmp (selector, nselector) != 0)))
1190 continue;
1191
1192 sym = find_pc_function (SYMBOL_VALUE_ADDRESS (msymbol));
1193 if (sym != NULL)
1194 {
1195 const char *newsymname = SYMBOL_NATURAL_NAME (sym);
1196
1197 if (strcmp (symname, newsymname) == 0)
1198 {
1199 /* Found a high-level method sym: swap it into the
1200 lower part of sym_arr (below num_debuggable). */
1201 if (syms != NULL)
1202 {
1203 syms[csym] = syms[cdebug];
1204 syms[cdebug] = sym;
1205 }
1206 csym++;
1207 cdebug++;
1208 }
1209 else
1210 {
1211 warning (
1212 "debugging symbol \"%s\" does not match minimal symbol (\"%s\"); ignoring",
1213 newsymname, symname);
1214 if (syms != NULL)
1215 syms[csym] = (struct symbol *) msymbol;
1216 csym++;
1217 }
1218 }
1219 else
1220 {
1221 /* Found a non-debuggable method symbol. */
1222 if (syms != NULL)
1223 syms[csym] = (struct symbol *) msymbol;
1224 csym++;
1225 }
1226 }
1227
1228 if (nsym != NULL)
1229 *nsym = csym;
1230 if (ndebug != NULL)
1231 *ndebug = cdebug;
1232 }
1233
1234 char *find_imps (struct symtab *symtab, struct block *block,
1235 char *method, struct symbol **syms,
1236 unsigned int *nsym, unsigned int *ndebug)
1237 {
1238 char type = '\0';
1239 char *class = NULL;
1240 char *category = NULL;
1241 char *selector = NULL;
1242
1243 unsigned int csym = 0;
1244 unsigned int cdebug = 0;
1245
1246 unsigned int ncsym = 0;
1247 unsigned int ncdebug = 0;
1248
1249 char *buf = NULL;
1250 char *tmp = NULL;
1251
1252 gdb_assert (nsym != NULL);
1253 gdb_assert (ndebug != NULL);
1254
1255 if (nsym != NULL)
1256 *nsym = 0;
1257 if (ndebug != NULL)
1258 *ndebug = 0;
1259
1260 buf = (char *) alloca (strlen (method) + 1);
1261 strcpy (buf, method);
1262 tmp = parse_method (buf, &type, &class, &category, &selector);
1263
1264 if (tmp == NULL) {
1265
1266 struct symbol *sym = NULL;
1267 struct minimal_symbol *msym = NULL;
1268
1269 strcpy (buf, method);
1270 tmp = parse_selector (buf, &selector);
1271
1272 if (tmp == NULL)
1273 return NULL;
1274
1275 sym = lookup_symbol (selector, block, VAR_DOMAIN, 0, NULL);
1276 if (sym != NULL)
1277 {
1278 if (syms)
1279 syms[csym] = sym;
1280 csym++;
1281 cdebug++;
1282 }
1283
1284 if (sym == NULL)
1285 msym = lookup_minimal_symbol (selector, 0, 0);
1286
1287 if (msym != NULL)
1288 {
1289 if (syms)
1290 syms[csym] = (struct symbol *)msym;
1291 csym++;
1292 }
1293 }
1294
1295 if (syms != NULL)
1296 find_methods (symtab, type, class, category, selector,
1297 syms + csym, &ncsym, &ncdebug);
1298 else
1299 find_methods (symtab, type, class, category, selector,
1300 NULL, &ncsym, &ncdebug);
1301
1302 /* If we didn't find any methods, just return. */
1303 if (ncsym == 0 && ncdebug == 0)
1304 return method;
1305
1306 /* Take debug symbols from the second batch of symbols and swap them
1307 * with debug symbols from the first batch. Repeat until either the
1308 * second section is out of debug symbols or the first section is
1309 * full of debug symbols. Either way we have all debug symbols
1310 * packed to the beginning of the buffer.
1311 */
1312
1313 if (syms != NULL)
1314 {
1315 while ((cdebug < csym) && (ncdebug > 0))
1316 {
1317 struct symbol *s = NULL;
1318 /* First non-debugging symbol. */
1319 unsigned int i = cdebug;
1320 /* Last of second batch of debug symbols. */
1321 unsigned int j = csym + ncdebug - 1;
1322
1323 s = syms[j];
1324 syms[j] = syms[i];
1325 syms[i] = s;
1326
1327 /* We've moved a symbol from the second debug section to the
1328 first one. */
1329 cdebug++;
1330 ncdebug--;
1331 }
1332 }
1333
1334 csym += ncsym;
1335 cdebug += ncdebug;
1336
1337 if (nsym != NULL)
1338 *nsym = csym;
1339 if (ndebug != NULL)
1340 *ndebug = cdebug;
1341
1342 if (syms == NULL)
1343 return method + (tmp - buf);
1344
1345 if (csym > 1)
1346 {
1347 /* Sort debuggable symbols. */
1348 if (cdebug > 1)
1349 qsort (syms, cdebug, sizeof (struct minimal_symbol *),
1350 compare_classes);
1351
1352 /* Sort minimal_symbols. */
1353 if ((csym - cdebug) > 1)
1354 qsort (&syms[cdebug], csym - cdebug,
1355 sizeof (struct minimal_symbol *), compare_classes);
1356 }
1357 /* Terminate the sym_arr list. */
1358 syms[csym] = 0;
1359
1360 return method + (tmp - buf);
1361 }
1362
1363 static void
1364 print_object_command (char *args, int from_tty)
1365 {
1366 struct value *object, *function, *description;
1367 CORE_ADDR string_addr, object_addr;
1368 int i = 0;
1369 gdb_byte c = 0;
1370
1371 if (!args || !*args)
1372 error (
1373 "The 'print-object' command requires an argument (an Objective-C object)");
1374
1375 {
1376 struct expression *expr = parse_expression (args);
1377 struct cleanup *old_chain =
1378 make_cleanup (free_current_contents, &expr);
1379 int pc = 0;
1380
1381 object = expr->language_defn->la_exp_desc->evaluate_exp
1382 (builtin_type_void_data_ptr, expr, &pc, EVAL_NORMAL);
1383 do_cleanups (old_chain);
1384 }
1385
1386 /* Validate the address for sanity. */
1387 object_addr = value_as_long (object);
1388 read_memory (object_addr, &c, 1);
1389
1390 function = find_function_in_inferior ("_NSPrintForDebugger");
1391 if (function == NULL)
1392 error (_("Unable to locate _NSPrintForDebugger in child process"));
1393
1394 description = call_function_by_hand (function, 1, &object);
1395
1396 string_addr = value_as_long (description);
1397 if (string_addr == 0)
1398 error (_("object returns null description"));
1399
1400 read_memory (string_addr + i++, &c, 1);
1401 if (c != 0)
1402 do
1403 { /* Read and print characters up to EOS. */
1404 QUIT;
1405 printf_filtered ("%c", c);
1406 read_memory (string_addr + i++, &c, 1);
1407 } while (c != 0);
1408 else
1409 printf_filtered(_("<object returns empty description>"));
1410 printf_filtered ("\n");
1411 }
1412
1413 /* The data structure 'methcalls' is used to detect method calls (thru
1414 * ObjC runtime lib functions objc_msgSend, objc_msgSendSuper, etc.),
1415 * and ultimately find the method being called.
1416 */
1417
1418 struct objc_methcall {
1419 char *name;
1420 /* Return instance method to be called. */
1421 int (*stop_at) (CORE_ADDR, CORE_ADDR *);
1422 /* Start of pc range corresponding to method invocation. */
1423 CORE_ADDR begin;
1424 /* End of pc range corresponding to method invocation. */
1425 CORE_ADDR end;
1426 };
1427
1428 static int resolve_msgsend (CORE_ADDR pc, CORE_ADDR *new_pc);
1429 static int resolve_msgsend_stret (CORE_ADDR pc, CORE_ADDR *new_pc);
1430 static int resolve_msgsend_super (CORE_ADDR pc, CORE_ADDR *new_pc);
1431 static int resolve_msgsend_super_stret (CORE_ADDR pc, CORE_ADDR *new_pc);
1432
1433 static struct objc_methcall methcalls[] = {
1434 { "_objc_msgSend", resolve_msgsend, 0, 0},
1435 { "_objc_msgSend_stret", resolve_msgsend_stret, 0, 0},
1436 { "_objc_msgSendSuper", resolve_msgsend_super, 0, 0},
1437 { "_objc_msgSendSuper_stret", resolve_msgsend_super_stret, 0, 0},
1438 { "_objc_getClass", NULL, 0, 0},
1439 { "_objc_getMetaClass", NULL, 0, 0}
1440 };
1441
1442 #define nmethcalls (sizeof (methcalls) / sizeof (methcalls[0]))
1443
1444 /* The following function, "find_objc_msgsend", fills in the data
1445 * structure "objc_msgs" by finding the addresses of each of the
1446 * (currently four) functions that it holds (of which objc_msgSend is
1447 * the first). This must be called each time symbols are loaded, in
1448 * case the functions have moved for some reason.
1449 */
1450
1451 static void
1452 find_objc_msgsend (void)
1453 {
1454 unsigned int i;
1455 for (i = 0; i < nmethcalls; i++) {
1456
1457 struct minimal_symbol *func;
1458
1459 /* Try both with and without underscore. */
1460 func = lookup_minimal_symbol (methcalls[i].name, NULL, NULL);
1461 if ((func == NULL) && (methcalls[i].name[0] == '_')) {
1462 func = lookup_minimal_symbol (methcalls[i].name + 1, NULL, NULL);
1463 }
1464 if (func == NULL) {
1465 methcalls[i].begin = 0;
1466 methcalls[i].end = 0;
1467 continue;
1468 }
1469
1470 methcalls[i].begin = SYMBOL_VALUE_ADDRESS (func);
1471 do {
1472 methcalls[i].end = SYMBOL_VALUE_ADDRESS (++func);
1473 } while (methcalls[i].begin == methcalls[i].end);
1474 }
1475 }
1476
1477 /* find_objc_msgcall (replaces pc_off_limits)
1478 *
1479 * ALL that this function now does is to determine whether the input
1480 * address ("pc") is the address of one of the Objective-C message
1481 * dispatch functions (mainly objc_msgSend or objc_msgSendSuper), and
1482 * if so, it returns the address of the method that will be called.
1483 *
1484 * The old function "pc_off_limits" used to do a lot of other things
1485 * in addition, such as detecting shared library jump stubs and
1486 * returning the address of the shlib function that would be called.
1487 * That functionality has been moved into the gdbarch_skip_trampoline_code and
1488 * IN_SOLIB_TRAMPOLINE macros, which are resolved in the target-
1489 * dependent modules.
1490 */
1491
1492 struct objc_submethod_helper_data {
1493 int (*f) (CORE_ADDR, CORE_ADDR *);
1494 CORE_ADDR pc;
1495 CORE_ADDR *new_pc;
1496 };
1497
1498 static int
1499 find_objc_msgcall_submethod_helper (void * arg)
1500 {
1501 struct objc_submethod_helper_data *s =
1502 (struct objc_submethod_helper_data *) arg;
1503
1504 if (s->f (s->pc, s->new_pc) == 0)
1505 return 1;
1506 else
1507 return 0;
1508 }
1509
1510 static int
1511 find_objc_msgcall_submethod (int (*f) (CORE_ADDR, CORE_ADDR *),
1512 CORE_ADDR pc,
1513 CORE_ADDR *new_pc)
1514 {
1515 struct objc_submethod_helper_data s;
1516
1517 s.f = f;
1518 s.pc = pc;
1519 s.new_pc = new_pc;
1520
1521 if (catch_errors (find_objc_msgcall_submethod_helper,
1522 (void *) &s,
1523 "Unable to determine target of Objective-C method call (ignoring):\n",
1524 RETURN_MASK_ALL) == 0)
1525 return 1;
1526 else
1527 return 0;
1528 }
1529
1530 int
1531 find_objc_msgcall (CORE_ADDR pc, CORE_ADDR *new_pc)
1532 {
1533 unsigned int i;
1534
1535 find_objc_msgsend ();
1536 if (new_pc != NULL)
1537 {
1538 *new_pc = 0;
1539 }
1540
1541 for (i = 0; i < nmethcalls; i++)
1542 if ((pc >= methcalls[i].begin) && (pc < methcalls[i].end))
1543 {
1544 if (methcalls[i].stop_at != NULL)
1545 return find_objc_msgcall_submethod (methcalls[i].stop_at,
1546 pc, new_pc);
1547 else
1548 return 0;
1549 }
1550
1551 return 0;
1552 }
1553
1554 extern initialize_file_ftype _initialize_objc_language; /* -Wmissing-prototypes */
1555
1556 void
1557 _initialize_objc_language (void)
1558 {
1559 add_language (&objc_language_defn);
1560 add_info ("selectors", selectors_info, /* INFO SELECTORS command. */
1561 _("All Objective-C selectors, or those matching REGEXP."));
1562 add_info ("classes", classes_info, /* INFO CLASSES command. */
1563 _("All Objective-C classes, or those matching REGEXP."));
1564 add_com ("print-object", class_vars, print_object_command,
1565 _("Ask an Objective-C object to print itself."));
1566 add_com_alias ("po", "print-object", class_vars, 1);
1567 }
1568
1569 static void
1570 read_objc_method (CORE_ADDR addr, struct objc_method *method)
1571 {
1572 method->name = read_memory_unsigned_integer (addr + 0, 4);
1573 method->types = read_memory_unsigned_integer (addr + 4, 4);
1574 method->imp = read_memory_unsigned_integer (addr + 8, 4);
1575 }
1576
1577 static
1578 unsigned long read_objc_methlist_nmethods (CORE_ADDR addr)
1579 {
1580 return read_memory_unsigned_integer (addr + 4, 4);
1581 }
1582
1583 static void
1584 read_objc_methlist_method (CORE_ADDR addr, unsigned long num,
1585 struct objc_method *method)
1586 {
1587 gdb_assert (num < read_objc_methlist_nmethods (addr));
1588 read_objc_method (addr + 8 + (12 * num), method);
1589 }
1590
1591 static void
1592 read_objc_object (CORE_ADDR addr, struct objc_object *object)
1593 {
1594 object->isa = read_memory_unsigned_integer (addr, 4);
1595 }
1596
1597 static void
1598 read_objc_super (CORE_ADDR addr, struct objc_super *super)
1599 {
1600 super->receiver = read_memory_unsigned_integer (addr, 4);
1601 super->class = read_memory_unsigned_integer (addr + 4, 4);
1602 };
1603
1604 static void
1605 read_objc_class (CORE_ADDR addr, struct objc_class *class)
1606 {
1607 class->isa = read_memory_unsigned_integer (addr, 4);
1608 class->super_class = read_memory_unsigned_integer (addr + 4, 4);
1609 class->name = read_memory_unsigned_integer (addr + 8, 4);
1610 class->version = read_memory_unsigned_integer (addr + 12, 4);
1611 class->info = read_memory_unsigned_integer (addr + 16, 4);
1612 class->instance_size = read_memory_unsigned_integer (addr + 18, 4);
1613 class->ivars = read_memory_unsigned_integer (addr + 24, 4);
1614 class->methods = read_memory_unsigned_integer (addr + 28, 4);
1615 class->cache = read_memory_unsigned_integer (addr + 32, 4);
1616 class->protocols = read_memory_unsigned_integer (addr + 36, 4);
1617 }
1618
1619 static CORE_ADDR
1620 find_implementation_from_class (CORE_ADDR class, CORE_ADDR sel)
1621 {
1622 CORE_ADDR subclass = class;
1623
1624 while (subclass != 0)
1625 {
1626
1627 struct objc_class class_str;
1628 unsigned mlistnum = 0;
1629
1630 read_objc_class (subclass, &class_str);
1631
1632 for (;;)
1633 {
1634 CORE_ADDR mlist;
1635 unsigned long nmethods;
1636 unsigned long i;
1637
1638 mlist = read_memory_unsigned_integer (class_str.methods +
1639 (4 * mlistnum), 4);
1640 if (mlist == 0)
1641 break;
1642
1643 nmethods = read_objc_methlist_nmethods (mlist);
1644
1645 for (i = 0; i < nmethods; i++)
1646 {
1647 struct objc_method meth_str;
1648 read_objc_methlist_method (mlist, i, &meth_str);
1649
1650 #if 0
1651 fprintf (stderr,
1652 "checking method 0x%lx against selector 0x%lx\n",
1653 meth_str.name, sel);
1654 #endif
1655
1656 if (meth_str.name == sel)
1657 /* FIXME: hppa arch was doing a pointer dereference
1658 here. There needs to be a better way to do that. */
1659 return meth_str.imp;
1660 }
1661 mlistnum++;
1662 }
1663 subclass = class_str.super_class;
1664 }
1665
1666 return 0;
1667 }
1668
1669 static CORE_ADDR
1670 find_implementation (CORE_ADDR object, CORE_ADDR sel)
1671 {
1672 struct objc_object ostr;
1673
1674 if (object == 0)
1675 return 0;
1676 read_objc_object (object, &ostr);
1677 if (ostr.isa == 0)
1678 return 0;
1679
1680 return find_implementation_from_class (ostr.isa, sel);
1681 }
1682
1683 #define OBJC_FETCH_POINTER_ARGUMENT(argi) \
1684 gdbarch_fetch_pointer_argument (current_gdbarch, get_current_frame (), \
1685 argi, builtin_type_void_func_ptr)
1686
1687 static int
1688 resolve_msgsend (CORE_ADDR pc, CORE_ADDR *new_pc)
1689 {
1690 CORE_ADDR object;
1691 CORE_ADDR sel;
1692 CORE_ADDR res;
1693
1694 object = OBJC_FETCH_POINTER_ARGUMENT (0);
1695 sel = OBJC_FETCH_POINTER_ARGUMENT (1);
1696
1697 res = find_implementation (object, sel);
1698 if (new_pc != 0)
1699 *new_pc = res;
1700 if (res == 0)
1701 return 1;
1702 return 0;
1703 }
1704
1705 static int
1706 resolve_msgsend_stret (CORE_ADDR pc, CORE_ADDR *new_pc)
1707 {
1708 CORE_ADDR object;
1709 CORE_ADDR sel;
1710 CORE_ADDR res;
1711
1712 object = OBJC_FETCH_POINTER_ARGUMENT (1);
1713 sel = OBJC_FETCH_POINTER_ARGUMENT (2);
1714
1715 res = find_implementation (object, sel);
1716 if (new_pc != 0)
1717 *new_pc = res;
1718 if (res == 0)
1719 return 1;
1720 return 0;
1721 }
1722
1723 static int
1724 resolve_msgsend_super (CORE_ADDR pc, CORE_ADDR *new_pc)
1725 {
1726 struct objc_super sstr;
1727
1728 CORE_ADDR super;
1729 CORE_ADDR sel;
1730 CORE_ADDR res;
1731
1732 super = OBJC_FETCH_POINTER_ARGUMENT (0);
1733 sel = OBJC_FETCH_POINTER_ARGUMENT (1);
1734
1735 read_objc_super (super, &sstr);
1736 if (sstr.class == 0)
1737 return 0;
1738
1739 res = find_implementation_from_class (sstr.class, sel);
1740 if (new_pc != 0)
1741 *new_pc = res;
1742 if (res == 0)
1743 return 1;
1744 return 0;
1745 }
1746
1747 static int
1748 resolve_msgsend_super_stret (CORE_ADDR pc, CORE_ADDR *new_pc)
1749 {
1750 struct objc_super sstr;
1751
1752 CORE_ADDR super;
1753 CORE_ADDR sel;
1754 CORE_ADDR res;
1755
1756 super = OBJC_FETCH_POINTER_ARGUMENT (1);
1757 sel = OBJC_FETCH_POINTER_ARGUMENT (2);
1758
1759 read_objc_super (super, &sstr);
1760 if (sstr.class == 0)
1761 return 0;
1762
1763 res = find_implementation_from_class (sstr.class, sel);
1764 if (new_pc != 0)
1765 *new_pc = res;
1766 if (res == 0)
1767 return 1;
1768 return 0;
1769 }
This page took 0.112142 seconds and 5 git commands to generate.