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