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