xref: /dflybsd-src/contrib/gdb-7/gdb/objc-lang.c (revision c0d274d062fd959993bf623f25f7cb6a8a676c4e)
1 /* Objective-C language support routines for GDB, the GNU debugger.
2 
3    Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
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 	{
249 	  *cp++ = ' ';		/* replace two '_' with one ' '    */
250 	  strcpy(cp, mangled + (cp - demangled) + 2);
251 	}
252       else
253 	{
254 	  *cp++ = '(';		/* less easy case: category name */
255 	  cp = strchr(cp, '_');
256 	  if (!cp)
257 	    {
258 	      xfree(demangled);	/* not mangled name */
259 	      return NULL;
260 	    }
261 	  *cp++ = ')';
262 	  *cp++ = ' ';		/* overwriting 1st char of method name...  */
263 	  strcpy(cp, mangled + (cp - demangled));	/* get it back */
264 	}
265 
266       while (*cp && *cp == '_')
267 	cp++;			/* skip any initial underbars in method name */
268 
269       for (; *cp; cp++)
270 	if (*cp == '_')
271 	  *cp = ':';		/* replace remaining '_' with ':' */
272 
273       *cp++ = ']';		/* closing right brace */
274       *cp++ = 0;		/* string terminator */
275       return demangled;
276     }
277   else
278     return NULL;	/* Not an objc mangled name.  */
279 }
280 
281 /* Print the character C on STREAM as part of the contents of a
282    literal string whose delimiter is QUOTER.  Note that that format
283    for printing characters and strings is language specific.  */
284 
285 static void
286 objc_emit_char (int c, struct type *type, struct ui_file *stream, int quoter)
287 {
288   c &= 0xFF;			/* Avoid sign bit follies.  */
289 
290   if (PRINT_LITERAL_FORM (c))
291     {
292       if (c == '\\' || c == quoter)
293 	{
294 	  fputs_filtered ("\\", stream);
295 	}
296       fprintf_filtered (stream, "%c", c);
297     }
298   else
299     {
300       switch (c)
301 	{
302 	case '\n':
303 	  fputs_filtered ("\\n", stream);
304 	  break;
305 	case '\b':
306 	  fputs_filtered ("\\b", stream);
307 	  break;
308 	case '\t':
309 	  fputs_filtered ("\\t", stream);
310 	  break;
311 	case '\f':
312 	  fputs_filtered ("\\f", stream);
313 	  break;
314 	case '\r':
315 	  fputs_filtered ("\\r", stream);
316 	  break;
317 	case '\033':
318 	  fputs_filtered ("\\e", stream);
319 	  break;
320 	case '\007':
321 	  fputs_filtered ("\\a", stream);
322 	  break;
323 	default:
324 	  fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
325 	  break;
326 	}
327     }
328 }
329 
330 static void
331 objc_printchar (int c, struct type *type, struct ui_file *stream)
332 {
333   fputs_filtered ("'", stream);
334   objc_emit_char (c, type, stream, '\'');
335   fputs_filtered ("'", stream);
336 }
337 
338 /* Print the character string STRING, printing at most LENGTH
339    characters.  Printing stops early if the number hits print_max;
340    repeat counts are printed as appropriate.  Print ellipses at the
341    end if we had to stop before printing LENGTH characters, or if
342    FORCE_ELLIPSES.  */
343 
344 static void
345 objc_printstr (struct ui_file *stream, struct type *type,
346 	       const gdb_byte *string, unsigned int length,
347 	       const char *encoding, int force_ellipses,
348 	       const struct value_print_options *options)
349 {
350   unsigned int i;
351   unsigned int things_printed = 0;
352   int in_quotes = 0;
353   int need_comma = 0;
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     {
580       if (addcolon == 0)	/* variable number of args.  */
581 	{
582 	  msglist_len++;
583 	  return;
584 	}
585       p = "";
586       plen = 0;
587     }
588   else
589     {
590       p = str->ptr;
591       plen = str->length;
592     }
593   len = plen + strlen(msglist_sel) + 2;
594   s = (char *)xmalloc(len);
595   strcpy(s, msglist_sel);
596   strncat(s, p, plen);
597   xfree(msglist_sel);
598   msglist_sel = s;
599   if (addcolon)
600     {
601       s[len-2] = ':';
602       s[len-1] = 0;
603       msglist_len++;
604     }
605   else
606     s[len-2] = '\0';
607 }
608 
609 int
610 end_msglist(void)
611 {
612   int val = msglist_len;
613   struct selname *sel = selname_chain;
614   char *p = msglist_sel;
615   CORE_ADDR selid;
616 
617   selname_chain = sel->next;
618   msglist_len = sel->msglist_len;
619   msglist_sel = sel->msglist_sel;
620   selid = lookup_child_selector (parse_gdbarch, p);
621   if (!selid)
622     error (_("Can't find selector \"%s\""), p);
623   write_exp_elt_longcst (selid);
624   xfree(p);
625   write_exp_elt_longcst (val);	/* Number of args */
626   xfree(sel);
627 
628   return val;
629 }
630 
631 /*
632  * Function: specialcmp (char *a, char *b)
633  *
634  * Special strcmp: treats ']' and ' ' as end-of-string.
635  * Used for qsorting lists of objc methods (either by class or selector).
636  */
637 
638 static int
639 specialcmp (char *a, char *b)
640 {
641   while (*a && *a != ' ' && *a != ']' && *b && *b != ' ' && *b != ']')
642     {
643       if (*a != *b)
644 	return *a - *b;
645       a++, b++;
646     }
647   if (*a && *a != ' ' && *a != ']')
648     return  1;		/* a is longer therefore greater */
649   if (*b && *b != ' ' && *b != ']')
650     return -1;		/* a is shorter therefore lesser */
651   return    0;		/* a and b are identical */
652 }
653 
654 /*
655  * Function: compare_selectors (const void *, const void *)
656  *
657  * Comparison function for use with qsort.  Arguments are symbols or
658  * msymbols Compares selector part of objc method name alphabetically.
659  */
660 
661 static int
662 compare_selectors (const void *a, const void *b)
663 {
664   char *aname, *bname;
665 
666   aname = SYMBOL_PRINT_NAME (*(struct symbol **) a);
667   bname = SYMBOL_PRINT_NAME (*(struct symbol **) b);
668   if (aname == NULL || bname == NULL)
669     error (_("internal: compare_selectors(1)"));
670 
671   aname = strchr(aname, ' ');
672   bname = strchr(bname, ' ');
673   if (aname == NULL || bname == NULL)
674     error (_("internal: compare_selectors(2)"));
675 
676   return specialcmp (aname+1, bname+1);
677 }
678 
679 /*
680  * Function: selectors_info (regexp, from_tty)
681  *
682  * Implements the "Info selectors" command.  Takes an optional regexp
683  * arg.  Lists all objective c selectors that match the regexp.  Works
684  * by grepping thru all symbols for objective c methods.  Output list
685  * is sorted and uniqued.
686  */
687 
688 static void
689 selectors_info (char *regexp, int from_tty)
690 {
691   struct objfile	*objfile;
692   struct minimal_symbol *msymbol;
693   char                  *name;
694   char                  *val;
695   int                    matches = 0;
696   int                    maxlen  = 0;
697   int                    ix;
698   char                   myregexp[2048];
699   char                   asel[256];
700   struct symbol        **sym_arr;
701   int                    plusminus = 0;
702 
703   if (regexp == NULL)
704     strcpy(myregexp, ".*]");	/* Null input, match all objc methods.  */
705   else
706     {
707       if (*regexp == '+' || *regexp == '-')
708 	{ /* User wants only class methods or only instance methods.  */
709 	  plusminus = *regexp++;
710 	  while (*regexp == ' ' || *regexp == '\t')
711 	    regexp++;
712 	}
713       if (*regexp == '\0')
714 	strcpy(myregexp, ".*]");
715       else
716 	{
717 	  strcpy(myregexp, regexp);
718 	  if (myregexp[strlen(myregexp) - 1] == '$') /* end of selector */
719 	    myregexp[strlen(myregexp) - 1] = ']';    /* end of method name */
720 	  else
721 	    strcat(myregexp, ".*]");
722 	}
723     }
724 
725   if (regexp != NULL)
726     {
727       val = re_comp (myregexp);
728       if (val != 0)
729 	error (_("Invalid regexp (%s): %s"), val, regexp);
730     }
731 
732   /* First time thru is JUST to get max length and count.  */
733   ALL_MSYMBOLS (objfile, msymbol)
734     {
735       QUIT;
736       name = SYMBOL_NATURAL_NAME (msymbol);
737       if (name &&
738 	 (name[0] == '-' || name[0] == '+') &&
739 	  name[1] == '[')		/* Got a method name.  */
740 	{
741 	  /* Filter for class/instance methods.  */
742 	  if (plusminus && name[0] != plusminus)
743 	    continue;
744 	  /* Find selector part.  */
745 	  name = (char *) strchr(name+2, ' ');
746 	  if (regexp == NULL || re_exec(++name) != 0)
747 	    {
748 	      char *mystart = name;
749 	      char *myend   = (char *) strchr(mystart, ']');
750 
751 	      if (myend && (myend - mystart > maxlen))
752 		maxlen = myend - mystart;	/* Get longest selector.  */
753 	      matches++;
754 	    }
755 	}
756     }
757   if (matches)
758     {
759       printf_filtered (_("Selectors matching \"%s\":\n\n"),
760 		       regexp ? regexp : "*");
761 
762       sym_arr = alloca (matches * sizeof (struct symbol *));
763       matches = 0;
764       ALL_MSYMBOLS (objfile, msymbol)
765 	{
766 	  QUIT;
767 	  name = SYMBOL_NATURAL_NAME (msymbol);
768 	  if (name &&
769 	     (name[0] == '-' || name[0] == '+') &&
770 	      name[1] == '[')		/* Got a method name.  */
771 	    {
772 	      /* Filter for class/instance methods.  */
773 	      if (plusminus && name[0] != plusminus)
774 		continue;
775 	      /* Find selector part.  */
776 	      name = (char *) strchr(name+2, ' ');
777 	      if (regexp == NULL || re_exec(++name) != 0)
778 		sym_arr[matches++] = (struct symbol *) msymbol;
779 	    }
780 	}
781 
782       qsort (sym_arr, matches, sizeof (struct minimal_symbol *),
783 	     compare_selectors);
784       /* Prevent compare on first iteration.  */
785       asel[0] = 0;
786       for (ix = 0; ix < matches; ix++)	/* Now do the output.  */
787 	{
788 	  char *p = asel;
789 
790 	  QUIT;
791 	  name = SYMBOL_NATURAL_NAME (sym_arr[ix]);
792 	  name = strchr (name, ' ') + 1;
793 	  if (p[0] && specialcmp(name, p) == 0)
794 	    continue;		/* Seen this one already (not unique).  */
795 
796 	  /* Copy selector part.  */
797 	  while (*name && *name != ']')
798 	    *p++ = *name++;
799 	  *p++ = '\0';
800 	  /* Print in columns.  */
801 	  puts_filtered_tabular(asel, maxlen + 1, 0);
802 	}
803       begin_line();
804     }
805   else
806     printf_filtered (_("No selectors matching \"%s\"\n"), regexp ? regexp : "*");
807 }
808 
809 /*
810  * Function: compare_classes (const void *, const void *)
811  *
812  * Comparison function for use with qsort.  Arguments are symbols or
813  * msymbols Compares class part of objc method name alphabetically.
814  */
815 
816 static int
817 compare_classes (const void *a, const void *b)
818 {
819   char *aname, *bname;
820 
821   aname = SYMBOL_PRINT_NAME (*(struct symbol **) a);
822   bname = SYMBOL_PRINT_NAME (*(struct symbol **) b);
823   if (aname == NULL || bname == NULL)
824     error (_("internal: compare_classes(1)"));
825 
826   return specialcmp (aname+1, bname+1);
827 }
828 
829 /*
830  * Function: classes_info(regexp, from_tty)
831  *
832  * Implements the "info classes" command for objective c classes.
833  * Lists all objective c classes that match the optional regexp.
834  * Works by grepping thru the list of objective c methods.  List will
835  * be sorted and uniqued (since one class may have many methods).
836  * BUGS: will not list a class that has no methods.
837  */
838 
839 static void
840 classes_info (char *regexp, int from_tty)
841 {
842   struct objfile	*objfile;
843   struct minimal_symbol *msymbol;
844   char                  *name;
845   char                  *val;
846   int                    matches = 0;
847   int                    maxlen  = 0;
848   int                    ix;
849   char                   myregexp[2048];
850   char                   aclass[256];
851   struct symbol        **sym_arr;
852 
853   if (regexp == NULL)
854     strcpy(myregexp, ".* ");	/* Null input: match all objc classes.  */
855   else
856     {
857       strcpy(myregexp, regexp);
858       if (myregexp[strlen(myregexp) - 1] == '$')
859 	/* In the method name, the end of the class name is marked by ' '.  */
860 	myregexp[strlen(myregexp) - 1] = ' ';
861       else
862 	strcat(myregexp, ".* ");
863     }
864 
865   if (regexp != NULL)
866     {
867       val = re_comp (myregexp);
868       if (val != 0)
869 	error (_("Invalid regexp (%s): %s"), val, regexp);
870     }
871 
872   /* First time thru is JUST to get max length and count.  */
873   ALL_MSYMBOLS (objfile, msymbol)
874     {
875       QUIT;
876       name = SYMBOL_NATURAL_NAME (msymbol);
877       if (name &&
878 	 (name[0] == '-' || name[0] == '+') &&
879 	  name[1] == '[')			/* Got a method name.  */
880 	if (regexp == NULL || re_exec(name+2) != 0)
881 	  {
882 	    /* Compute length of classname part.  */
883 	    char *mystart = name + 2;
884 	    char *myend   = (char *) strchr(mystart, ' ');
885 
886 	    if (myend && (myend - mystart > maxlen))
887 	      maxlen = myend - mystart;
888 	    matches++;
889 	  }
890     }
891   if (matches)
892     {
893       printf_filtered (_("Classes matching \"%s\":\n\n"),
894 		       regexp ? regexp : "*");
895       sym_arr = alloca (matches * sizeof (struct symbol *));
896       matches = 0;
897       ALL_MSYMBOLS (objfile, msymbol)
898 	{
899 	  QUIT;
900 	  name = SYMBOL_NATURAL_NAME (msymbol);
901 	  if (name &&
902 	     (name[0] == '-' || name[0] == '+') &&
903 	      name[1] == '[')			/* Got a method name.  */
904 	    if (regexp == NULL || re_exec(name+2) != 0)
905 		sym_arr[matches++] = (struct symbol *) msymbol;
906 	}
907 
908       qsort (sym_arr, matches, sizeof (struct minimal_symbol *),
909 	     compare_classes);
910       /* Prevent compare on first iteration.  */
911       aclass[0] = 0;
912       for (ix = 0; ix < matches; ix++)	/* Now do the output.  */
913 	{
914 	  char *p = aclass;
915 
916 	  QUIT;
917 	  name = SYMBOL_NATURAL_NAME (sym_arr[ix]);
918 	  name += 2;
919 	  if (p[0] && specialcmp(name, p) == 0)
920 	    continue;	/* Seen this one already (not unique).  */
921 
922 	  /* Copy class part of method name.  */
923 	  while (*name && *name != ' ')
924 	    *p++ = *name++;
925 	  *p++ = '\0';
926 	  /* Print in columns.  */
927 	  puts_filtered_tabular(aclass, maxlen + 1, 0);
928 	}
929       begin_line();
930     }
931   else
932     printf_filtered (_("No classes matching \"%s\"\n"), regexp ? regexp : "*");
933 }
934 
935 /*
936  * Function: find_imps (char *selector, struct symbol **sym_arr)
937  *
938  * Input:  a string representing a selector
939  *         a pointer to an array of symbol pointers
940  *         possibly a pointer to a symbol found by the caller.
941  *
942  * Output: number of methods that implement that selector.  Side
943  * effects: The array of symbol pointers is filled with matching syms.
944  *
945  * By analogy with function "find_methods" (symtab.c), builds a list
946  * of symbols matching the ambiguous input, so that "decode_line_2"
947  * (symtab.c) can list them and ask the user to choose one or more.
948  * In this case the matches are objective c methods
949  * ("implementations") matching an objective c selector.
950  *
951  * Note that it is possible for a normal (c-style) function to have
952  * the same name as an objective c selector.  To prevent the selector
953  * from eclipsing the function, we allow the caller (decode_line_1) to
954  * search for such a function first, and if it finds one, pass it in
955  * to us.  We will then integrate it into the list.  We also search
956  * for one here, among the minsyms.
957  *
958  * NOTE: if NUM_DEBUGGABLE is non-zero, the sym_arr will be divided
959  *       into two parts: debuggable (struct symbol) syms, and
960  *       non_debuggable (struct minimal_symbol) syms.  The debuggable
961  *       ones will come first, before NUM_DEBUGGABLE (which will thus
962  *       be the index of the first non-debuggable one).
963  */
964 
965 /*
966  * Function: total_number_of_imps (char *selector);
967  *
968  * Input:  a string representing a selector
969  * Output: number of methods that implement that selector.
970  *
971  * By analogy with function "total_number_of_methods", this allows
972  * decode_line_1 (symtab.c) to detect if there are objective c methods
973  * matching the input, and to allocate an array of pointers to them
974  * which can be manipulated by "decode_line_2" (also in symtab.c).
975  */
976 
977 char *
978 parse_selector (char *method, char **selector)
979 {
980   char *s1 = NULL;
981   char *s2 = NULL;
982   int found_quote = 0;
983 
984   char *nselector = NULL;
985 
986   gdb_assert (selector != NULL);
987 
988   s1 = method;
989 
990   while (isspace (*s1))
991     s1++;
992   if (*s1 == '\'')
993     {
994       found_quote = 1;
995       s1++;
996     }
997   while (isspace (*s1))
998     s1++;
999 
1000   nselector = s1;
1001   s2 = s1;
1002 
1003   for (;;)
1004     {
1005       if (isalnum (*s2) || (*s2 == '_') || (*s2 == ':'))
1006 	*s1++ = *s2;
1007       else if (isspace (*s2))
1008 	;
1009       else if ((*s2 == '\0') || (*s2 == '\''))
1010 	break;
1011       else
1012 	return NULL;
1013       s2++;
1014     }
1015   *s1++ = '\0';
1016 
1017   while (isspace (*s2))
1018     s2++;
1019   if (found_quote)
1020     {
1021       if (*s2 == '\'')
1022 	s2++;
1023       while (isspace (*s2))
1024 	s2++;
1025     }
1026 
1027   if (selector != NULL)
1028     *selector = nselector;
1029 
1030   return s2;
1031 }
1032 
1033 char *
1034 parse_method (char *method, char *type, char **class,
1035 	      char **category, char **selector)
1036 {
1037   char *s1 = NULL;
1038   char *s2 = NULL;
1039   int found_quote = 0;
1040 
1041   char ntype = '\0';
1042   char *nclass = NULL;
1043   char *ncategory = NULL;
1044   char *nselector = NULL;
1045 
1046   gdb_assert (type != NULL);
1047   gdb_assert (class != NULL);
1048   gdb_assert (category != NULL);
1049   gdb_assert (selector != NULL);
1050 
1051   s1 = method;
1052 
1053   while (isspace (*s1))
1054     s1++;
1055   if (*s1 == '\'')
1056     {
1057       found_quote = 1;
1058       s1++;
1059     }
1060   while (isspace (*s1))
1061     s1++;
1062 
1063   if ((s1[0] == '+') || (s1[0] == '-'))
1064     ntype = *s1++;
1065 
1066   while (isspace (*s1))
1067     s1++;
1068 
1069   if (*s1 != '[')
1070     return NULL;
1071   s1++;
1072 
1073   nclass = s1;
1074   while (isalnum (*s1) || (*s1 == '_'))
1075     s1++;
1076 
1077   s2 = s1;
1078   while (isspace (*s2))
1079     s2++;
1080 
1081   if (*s2 == '(')
1082     {
1083       s2++;
1084       while (isspace (*s2))
1085 	s2++;
1086       ncategory = s2;
1087       while (isalnum (*s2) || (*s2 == '_'))
1088 	s2++;
1089       *s2++ = '\0';
1090     }
1091 
1092   /* Truncate the class name now that we're not using the open paren.  */
1093   *s1++ = '\0';
1094 
1095   nselector = s2;
1096   s1 = s2;
1097 
1098   for (;;)
1099     {
1100       if (isalnum (*s2) || (*s2 == '_') || (*s2 == ':'))
1101 	*s1++ = *s2;
1102       else if (isspace (*s2))
1103 	;
1104       else if (*s2 == ']')
1105 	break;
1106       else
1107 	return NULL;
1108       s2++;
1109     }
1110   *s1++ = '\0';
1111   s2++;
1112 
1113   while (isspace (*s2))
1114     s2++;
1115   if (found_quote)
1116     {
1117       if (*s2 != '\'')
1118 	return NULL;
1119       s2++;
1120       while (isspace (*s2))
1121 	s2++;
1122     }
1123 
1124   if (type != NULL)
1125     *type = ntype;
1126   if (class != NULL)
1127     *class = nclass;
1128   if (category != NULL)
1129     *category = ncategory;
1130   if (selector != NULL)
1131     *selector = nselector;
1132 
1133   return s2;
1134 }
1135 
1136 static void
1137 find_methods (struct symtab *symtab, char type,
1138 	      const char *class, const char *category,
1139 	      const char *selector, struct symbol **syms,
1140 	      unsigned int *nsym, unsigned int *ndebug)
1141 {
1142   struct objfile *objfile = NULL;
1143   struct minimal_symbol *msymbol = NULL;
1144   struct block *block = NULL;
1145   struct symbol *sym = NULL;
1146 
1147   char *symname = NULL;
1148 
1149   char ntype = '\0';
1150   char *nclass = NULL;
1151   char *ncategory = NULL;
1152   char *nselector = NULL;
1153 
1154   unsigned int csym = 0;
1155   unsigned int cdebug = 0;
1156 
1157   static char *tmp = NULL;
1158   static unsigned int tmplen = 0;
1159 
1160   gdb_assert (nsym != NULL);
1161   gdb_assert (ndebug != NULL);
1162 
1163   if (symtab)
1164     block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (symtab), STATIC_BLOCK);
1165 
1166   ALL_OBJFILES (objfile)
1167     {
1168       unsigned int *objc_csym;
1169 
1170       /* The objfile_csym variable counts the number of ObjC methods
1171 	 that this objfile defines.  We save that count as a private
1172 	 objfile data.	If we have already determined that this objfile
1173 	 provides no ObjC methods, we can skip it entirely.  */
1174 
1175       unsigned int objfile_csym = 0;
1176 
1177       objc_csym = objfile_data (objfile, objc_objfile_data);
1178       if (objc_csym != NULL && *objc_csym == 0)
1179 	/* There are no ObjC symbols in this objfile.  Skip it entirely.  */
1180 	continue;
1181 
1182       ALL_OBJFILE_MSYMBOLS (objfile, msymbol)
1183 	{
1184 	  struct gdbarch *gdbarch = get_objfile_arch (objfile);
1185 	  CORE_ADDR pc = SYMBOL_VALUE_ADDRESS (msymbol);
1186 
1187 	  QUIT;
1188 
1189 	  /* Check the symbol name first as this can be done entirely without
1190 	     sending any query to the target.  */
1191 	  symname = SYMBOL_NATURAL_NAME (msymbol);
1192 	  if (symname == NULL)
1193 	    continue;
1194 
1195 	  if ((symname[0] != '-' && symname[0] != '+') || (symname[1] != '['))
1196 	    /* Not a method name.  */
1197 	    continue;
1198 
1199 	  /* The minimal symbol might point to a function descriptor;
1200 	     resolve it to the actual code address instead.  */
1201 	  pc = gdbarch_convert_from_func_ptr_addr (gdbarch, pc,
1202 						   &current_target);
1203 
1204 	  if (symtab)
1205 	    if (pc < BLOCK_START (block) || pc >= BLOCK_END (block))
1206 	      /* Not in the specified symtab.  */
1207 	      continue;
1208 
1209 	  /* Now that thinks are a bit sane, clean up the symname.  */
1210 	  while ((strlen (symname) + 1) >= tmplen)
1211 	    {
1212 	      tmplen = (tmplen == 0) ? 1024 : tmplen * 2;
1213 	      tmp = xrealloc (tmp, tmplen);
1214 	    }
1215 	  strcpy (tmp, symname);
1216 
1217 	  if (parse_method (tmp, &ntype, &nclass, &ncategory, &nselector) == NULL)
1218 	    continue;
1219 
1220 	  objfile_csym++;
1221 
1222 	  if ((type != '\0') && (ntype != type))
1223 	    continue;
1224 
1225 	  if ((class != NULL)
1226 	      && ((nclass == NULL) || (strcmp (class, nclass) != 0)))
1227 	    continue;
1228 
1229 	  if ((category != NULL) &&
1230 	      ((ncategory == NULL) || (strcmp (category, ncategory) != 0)))
1231 	    continue;
1232 
1233 	  if ((selector != NULL) &&
1234 	      ((nselector == NULL) || (strcmp (selector, nselector) != 0)))
1235 	    continue;
1236 
1237 	  sym = find_pc_function (pc);
1238 	  if (sym != NULL)
1239 	    {
1240 	      const char *newsymname = SYMBOL_NATURAL_NAME (sym);
1241 
1242 	      if (strcmp (symname, newsymname) == 0)
1243 		{
1244 		  /* Found a high-level method sym: swap it into the
1245 		     lower part of sym_arr (below num_debuggable).  */
1246 		  if (syms != NULL)
1247 		    {
1248 		      syms[csym] = syms[cdebug];
1249 		      syms[cdebug] = sym;
1250 		    }
1251 		  csym++;
1252 		  cdebug++;
1253 		}
1254 	      else
1255 		{
1256 		  warning (
1257 "debugging symbol \"%s\" does not match minimal symbol (\"%s\"); ignoring",
1258                            newsymname, symname);
1259 		  if (syms != NULL)
1260 		    syms[csym] = (struct symbol *) msymbol;
1261 		  csym++;
1262 		}
1263 	    }
1264 	  else
1265 	    {
1266 	      /* Found a non-debuggable method symbol.  */
1267 	      if (syms != NULL)
1268 		syms[csym] = (struct symbol *) msymbol;
1269 	      csym++;
1270 	    }
1271 	}
1272       if (objc_csym == NULL)
1273 	{
1274 	  objc_csym = obstack_alloc (&objfile->objfile_obstack,
1275 				     sizeof (*objc_csym));
1276 	  *objc_csym = objfile_csym;
1277 	  set_objfile_data (objfile, objc_objfile_data, objc_csym);
1278 	}
1279       else
1280 	/* Count of ObjC methods in this objfile should be constant.  */
1281 	gdb_assert (*objc_csym == objfile_csym);
1282     }
1283 
1284   if (nsym != NULL)
1285     *nsym = csym;
1286   if (ndebug != NULL)
1287     *ndebug = cdebug;
1288 }
1289 
1290 char *find_imps (struct symtab *symtab, struct block *block,
1291 		 char *method, struct symbol **syms,
1292 		 unsigned int *nsym, unsigned int *ndebug)
1293 {
1294   char type = '\0';
1295   char *class = NULL;
1296   char *category = NULL;
1297   char *selector = NULL;
1298 
1299   unsigned int csym = 0;
1300   unsigned int cdebug = 0;
1301 
1302   unsigned int ncsym = 0;
1303   unsigned int ncdebug = 0;
1304 
1305   char *buf = NULL;
1306   char *tmp = NULL;
1307 
1308   gdb_assert (nsym != NULL);
1309   gdb_assert (ndebug != NULL);
1310 
1311   if (nsym != NULL)
1312     *nsym = 0;
1313   if (ndebug != NULL)
1314     *ndebug = 0;
1315 
1316   buf = (char *) alloca (strlen (method) + 1);
1317   strcpy (buf, method);
1318   tmp = parse_method (buf, &type, &class, &category, &selector);
1319 
1320   if (tmp == NULL)
1321     {
1322       struct symbol *sym = NULL;
1323       struct minimal_symbol *msym = NULL;
1324 
1325       strcpy (buf, method);
1326       tmp = parse_selector (buf, &selector);
1327 
1328       if (tmp == NULL)
1329 	return NULL;
1330 
1331       sym = lookup_symbol (selector, block, VAR_DOMAIN, 0);
1332       if (sym != NULL)
1333 	{
1334 	  if (syms)
1335 	    syms[csym] = sym;
1336 	  csym++;
1337 	  cdebug++;
1338 	}
1339 
1340       if (sym == NULL)
1341 	msym = lookup_minimal_symbol (selector, 0, 0);
1342 
1343       if (msym != NULL)
1344 	{
1345 	  if (syms)
1346 	    syms[csym] = (struct symbol *)msym;
1347 	  csym++;
1348 	}
1349     }
1350 
1351   if (syms != NULL)
1352     find_methods (symtab, type, class, category, selector,
1353 		  syms + csym, &ncsym, &ncdebug);
1354   else
1355     find_methods (symtab, type, class, category, selector,
1356 		  NULL, &ncsym, &ncdebug);
1357 
1358   /* If we didn't find any methods, just return.  */
1359   if (ncsym == 0 && ncdebug == 0)
1360     return method;
1361 
1362   /* Take debug symbols from the second batch of symbols and swap them
1363    * with debug symbols from the first batch.  Repeat until either the
1364    * second section is out of debug symbols or the first section is
1365    * full of debug symbols.  Either way we have all debug symbols
1366    * packed to the beginning of the buffer.
1367    */
1368 
1369   if (syms != NULL)
1370     {
1371       while ((cdebug < csym) && (ncdebug > 0))
1372 	{
1373 	  struct symbol *s = NULL;
1374 	  /* First non-debugging symbol.  */
1375 	  unsigned int i = cdebug;
1376 	  /* Last of second batch of debug symbols.  */
1377 	  unsigned int j = csym + ncdebug - 1;
1378 
1379 	  s = syms[j];
1380 	  syms[j] = syms[i];
1381 	  syms[i] = s;
1382 
1383 	  /* We've moved a symbol from the second debug section to the
1384              first one.  */
1385 	  cdebug++;
1386 	  ncdebug--;
1387 	}
1388     }
1389 
1390   csym += ncsym;
1391   cdebug += ncdebug;
1392 
1393   if (nsym != NULL)
1394     *nsym = csym;
1395   if (ndebug != NULL)
1396     *ndebug = cdebug;
1397 
1398   if (syms == NULL)
1399     return method + (tmp - buf);
1400 
1401   if (csym > 1)
1402     {
1403       /* Sort debuggable symbols.  */
1404       if (cdebug > 1)
1405 	qsort (syms, cdebug, sizeof (struct minimal_symbol *),
1406 	       compare_classes);
1407 
1408       /* Sort minimal_symbols.  */
1409       if ((csym - cdebug) > 1)
1410 	qsort (&syms[cdebug], csym - cdebug,
1411 	       sizeof (struct minimal_symbol *), compare_classes);
1412     }
1413   /* Terminate the sym_arr list.  */
1414   syms[csym] = 0;
1415 
1416   return method + (tmp - buf);
1417 }
1418 
1419 static void
1420 print_object_command (char *args, int from_tty)
1421 {
1422   struct value *object, *function, *description;
1423   CORE_ADDR string_addr, object_addr;
1424   int i = 0;
1425   gdb_byte c = 0;
1426 
1427   if (!args || !*args)
1428     error (
1429 "The 'print-object' command requires an argument (an Objective-C object)");
1430 
1431   {
1432     struct expression *expr = parse_expression (args);
1433     struct cleanup *old_chain =
1434       make_cleanup (free_current_contents, &expr);
1435     int pc = 0;
1436 
1437     object = evaluate_subexp (builtin_type (expr->gdbarch)->builtin_data_ptr,
1438 			      expr, &pc, EVAL_NORMAL);
1439     do_cleanups (old_chain);
1440   }
1441 
1442   /* Validate the address for sanity.  */
1443   object_addr = value_as_long (object);
1444   read_memory (object_addr, &c, 1);
1445 
1446   function = find_function_in_inferior ("_NSPrintForDebugger", NULL);
1447   if (function == NULL)
1448     error (_("Unable to locate _NSPrintForDebugger in child process"));
1449 
1450   description = call_function_by_hand (function, 1, &object);
1451 
1452   string_addr = value_as_long (description);
1453   if (string_addr == 0)
1454     error (_("object returns null description"));
1455 
1456   read_memory (string_addr + i++, &c, 1);
1457   if (c != 0)
1458     do
1459       { /* Read and print characters up to EOS.  */
1460 	QUIT;
1461 	printf_filtered ("%c", c);
1462 	read_memory (string_addr + i++, &c, 1);
1463       } while (c != 0);
1464   else
1465     printf_filtered(_("<object returns empty description>"));
1466   printf_filtered ("\n");
1467 }
1468 
1469 /* The data structure 'methcalls' is used to detect method calls (thru
1470  * ObjC runtime lib functions objc_msgSend, objc_msgSendSuper, etc.),
1471  * and ultimately find the method being called.
1472  */
1473 
1474 struct objc_methcall {
1475   char *name;
1476  /* Return instance method to be called.  */
1477   int (*stop_at) (CORE_ADDR, CORE_ADDR *);
1478   /* Start of pc range corresponding to method invocation.  */
1479   CORE_ADDR begin;
1480   /* End of pc range corresponding to method invocation.  */
1481   CORE_ADDR end;
1482 };
1483 
1484 static int resolve_msgsend (CORE_ADDR pc, CORE_ADDR *new_pc);
1485 static int resolve_msgsend_stret (CORE_ADDR pc, CORE_ADDR *new_pc);
1486 static int resolve_msgsend_super (CORE_ADDR pc, CORE_ADDR *new_pc);
1487 static int resolve_msgsend_super_stret (CORE_ADDR pc, CORE_ADDR *new_pc);
1488 
1489 static struct objc_methcall methcalls[] = {
1490   { "_objc_msgSend", resolve_msgsend, 0, 0},
1491   { "_objc_msgSend_stret", resolve_msgsend_stret, 0, 0},
1492   { "_objc_msgSendSuper", resolve_msgsend_super, 0, 0},
1493   { "_objc_msgSendSuper_stret", resolve_msgsend_super_stret, 0, 0},
1494   { "_objc_getClass", NULL, 0, 0},
1495   { "_objc_getMetaClass", NULL, 0, 0}
1496 };
1497 
1498 #define nmethcalls (sizeof (methcalls) / sizeof (methcalls[0]))
1499 
1500 /* The following function, "find_objc_msgsend", fills in the data
1501  * structure "objc_msgs" by finding the addresses of each of the
1502  * (currently four) functions that it holds (of which objc_msgSend is
1503  * the first).  This must be called each time symbols are loaded, in
1504  * case the functions have moved for some reason.
1505  */
1506 
1507 static void
1508 find_objc_msgsend (void)
1509 {
1510   unsigned int i;
1511 
1512   for (i = 0; i < nmethcalls; i++)
1513     {
1514       struct minimal_symbol *func;
1515 
1516       /* Try both with and without underscore.  */
1517       func = lookup_minimal_symbol (methcalls[i].name, NULL, NULL);
1518       if ((func == NULL) && (methcalls[i].name[0] == '_'))
1519 	{
1520 	  func = lookup_minimal_symbol (methcalls[i].name + 1, NULL, NULL);
1521 	}
1522       if (func == NULL)
1523 	{
1524 	  methcalls[i].begin = 0;
1525 	  methcalls[i].end = 0;
1526 	  continue;
1527 	}
1528 
1529       methcalls[i].begin = SYMBOL_VALUE_ADDRESS (func);
1530       do {
1531 	methcalls[i].end = SYMBOL_VALUE_ADDRESS (++func);
1532       } while (methcalls[i].begin == methcalls[i].end);
1533     }
1534 }
1535 
1536 /* find_objc_msgcall (replaces pc_off_limits)
1537  *
1538  * ALL that this function now does is to determine whether the input
1539  * address ("pc") is the address of one of the Objective-C message
1540  * dispatch functions (mainly objc_msgSend or objc_msgSendSuper), and
1541  * if so, it returns the address of the method that will be called.
1542  *
1543  * The old function "pc_off_limits" used to do a lot of other things
1544  * in addition, such as detecting shared library jump stubs and
1545  * returning the address of the shlib function that would be called.
1546  * That functionality has been moved into the gdbarch_skip_trampoline_code and
1547  * IN_SOLIB_TRAMPOLINE macros, which are resolved in the target-
1548  * dependent modules.
1549  */
1550 
1551 struct objc_submethod_helper_data {
1552   int (*f) (CORE_ADDR, CORE_ADDR *);
1553   CORE_ADDR pc;
1554   CORE_ADDR *new_pc;
1555 };
1556 
1557 static int
1558 find_objc_msgcall_submethod_helper (void * arg)
1559 {
1560   struct objc_submethod_helper_data *s =
1561     (struct objc_submethod_helper_data *) arg;
1562 
1563   if (s->f (s->pc, s->new_pc) == 0)
1564     return 1;
1565   else
1566     return 0;
1567 }
1568 
1569 static int
1570 find_objc_msgcall_submethod (int (*f) (CORE_ADDR, CORE_ADDR *),
1571 			     CORE_ADDR pc,
1572 			     CORE_ADDR *new_pc)
1573 {
1574   struct objc_submethod_helper_data s;
1575 
1576   s.f = f;
1577   s.pc = pc;
1578   s.new_pc = new_pc;
1579 
1580   if (catch_errors (find_objc_msgcall_submethod_helper,
1581 		    (void *) &s,
1582 		    "Unable to determine target of Objective-C method call (ignoring):\n",
1583 		    RETURN_MASK_ALL) == 0)
1584     return 1;
1585   else
1586     return 0;
1587 }
1588 
1589 int
1590 find_objc_msgcall (CORE_ADDR pc, CORE_ADDR *new_pc)
1591 {
1592   unsigned int i;
1593 
1594   find_objc_msgsend ();
1595   if (new_pc != NULL)
1596     {
1597       *new_pc = 0;
1598     }
1599 
1600   for (i = 0; i < nmethcalls; i++)
1601     if ((pc >= methcalls[i].begin) && (pc < methcalls[i].end))
1602       {
1603 	if (methcalls[i].stop_at != NULL)
1604 	  return find_objc_msgcall_submethod (methcalls[i].stop_at,
1605 					      pc, new_pc);
1606 	else
1607 	  return 0;
1608       }
1609 
1610   return 0;
1611 }
1612 
1613 extern initialize_file_ftype _initialize_objc_language; /* -Wmissing-prototypes */
1614 
1615 void
1616 _initialize_objc_language (void)
1617 {
1618   add_language (&objc_language_defn);
1619   add_info ("selectors", selectors_info,    /* INFO SELECTORS command.  */
1620 	    _("All Objective-C selectors, or those matching REGEXP."));
1621   add_info ("classes", classes_info, 	    /* INFO CLASSES   command.  */
1622 	    _("All Objective-C classes, or those matching REGEXP."));
1623   add_com ("print-object", class_vars, print_object_command,
1624 	   _("Ask an Objective-C object to print itself."));
1625   add_com_alias ("po", "print-object", class_vars, 1);
1626 }
1627 
1628 static void
1629 read_objc_method (struct gdbarch *gdbarch, CORE_ADDR addr,
1630 		  struct objc_method *method)
1631 {
1632   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1633 
1634   method->name  = read_memory_unsigned_integer (addr + 0, 4, byte_order);
1635   method->types = read_memory_unsigned_integer (addr + 4, 4, byte_order);
1636   method->imp   = read_memory_unsigned_integer (addr + 8, 4, byte_order);
1637 }
1638 
1639 static unsigned long
1640 read_objc_methlist_nmethods (struct gdbarch *gdbarch, CORE_ADDR addr)
1641 {
1642   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1643 
1644   return read_memory_unsigned_integer (addr + 4, 4, byte_order);
1645 }
1646 
1647 static void
1648 read_objc_methlist_method (struct gdbarch *gdbarch, CORE_ADDR addr,
1649 			   unsigned long num, struct objc_method *method)
1650 {
1651   gdb_assert (num < read_objc_methlist_nmethods (gdbarch, addr));
1652   read_objc_method (gdbarch, addr + 8 + (12 * num), method);
1653 }
1654 
1655 static void
1656 read_objc_object (struct gdbarch *gdbarch, CORE_ADDR addr,
1657 		  struct objc_object *object)
1658 {
1659   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1660 
1661   object->isa = read_memory_unsigned_integer (addr, 4, byte_order);
1662 }
1663 
1664 static void
1665 read_objc_super (struct gdbarch *gdbarch, CORE_ADDR addr,
1666 		 struct objc_super *super)
1667 {
1668   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1669 
1670   super->receiver = read_memory_unsigned_integer (addr, 4, byte_order);
1671   super->class = read_memory_unsigned_integer (addr + 4, 4, byte_order);
1672 };
1673 
1674 static void
1675 read_objc_class (struct gdbarch *gdbarch, CORE_ADDR addr,
1676 		 struct objc_class *class)
1677 {
1678   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1679 
1680   class->isa = read_memory_unsigned_integer (addr, 4, byte_order);
1681   class->super_class = read_memory_unsigned_integer (addr + 4, 4, byte_order);
1682   class->name = read_memory_unsigned_integer (addr + 8, 4, byte_order);
1683   class->version = read_memory_unsigned_integer (addr + 12, 4, byte_order);
1684   class->info = read_memory_unsigned_integer (addr + 16, 4, byte_order);
1685   class->instance_size = read_memory_unsigned_integer (addr + 18, 4, byte_order);
1686   class->ivars = read_memory_unsigned_integer (addr + 24, 4, byte_order);
1687   class->methods = read_memory_unsigned_integer (addr + 28, 4, byte_order);
1688   class->cache = read_memory_unsigned_integer (addr + 32, 4, byte_order);
1689   class->protocols = read_memory_unsigned_integer (addr + 36, 4, byte_order);
1690 }
1691 
1692 static CORE_ADDR
1693 find_implementation_from_class (struct gdbarch *gdbarch,
1694 				CORE_ADDR class, CORE_ADDR sel)
1695 {
1696   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1697   CORE_ADDR subclass = class;
1698 
1699   while (subclass != 0)
1700     {
1701 
1702       struct objc_class class_str;
1703       unsigned mlistnum = 0;
1704 
1705       read_objc_class (gdbarch, subclass, &class_str);
1706 
1707       for (;;)
1708 	{
1709 	  CORE_ADDR mlist;
1710 	  unsigned long nmethods;
1711 	  unsigned long i;
1712 
1713 	  mlist = read_memory_unsigned_integer (class_str.methods +
1714 						(4 * mlistnum),
1715 						4, byte_order);
1716 	  if (mlist == 0)
1717 	    break;
1718 
1719 	  nmethods = read_objc_methlist_nmethods (gdbarch, mlist);
1720 
1721 	  for (i = 0; i < nmethods; i++)
1722 	    {
1723 	      struct objc_method meth_str;
1724 
1725 	      read_objc_methlist_method (gdbarch, mlist, i, &meth_str);
1726 #if 0
1727 	      fprintf (stderr,
1728 		       "checking method 0x%lx against selector 0x%lx\n",
1729 		       meth_str.name, sel);
1730 #endif
1731 
1732 	      if (meth_str.name == sel)
1733 		/* FIXME: hppa arch was doing a pointer dereference
1734 		   here. There needs to be a better way to do that.  */
1735 		return meth_str.imp;
1736 	    }
1737 	  mlistnum++;
1738 	}
1739       subclass = class_str.super_class;
1740     }
1741 
1742   return 0;
1743 }
1744 
1745 static CORE_ADDR
1746 find_implementation (struct gdbarch *gdbarch,
1747 		     CORE_ADDR object, CORE_ADDR sel)
1748 {
1749   struct objc_object ostr;
1750 
1751   if (object == 0)
1752     return 0;
1753   read_objc_object (gdbarch, object, &ostr);
1754   if (ostr.isa == 0)
1755     return 0;
1756 
1757   return find_implementation_from_class (gdbarch, ostr.isa, sel);
1758 }
1759 
1760 static int
1761 resolve_msgsend (CORE_ADDR pc, CORE_ADDR *new_pc)
1762 {
1763   struct frame_info *frame = get_current_frame ();
1764   struct gdbarch *gdbarch = get_frame_arch (frame);
1765   struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
1766 
1767   CORE_ADDR object;
1768   CORE_ADDR sel;
1769   CORE_ADDR res;
1770 
1771   object = gdbarch_fetch_pointer_argument (gdbarch, frame, 0, ptr_type);
1772   sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1773 
1774   res = find_implementation (gdbarch, object, sel);
1775   if (new_pc != 0)
1776     *new_pc = res;
1777   if (res == 0)
1778     return 1;
1779   return 0;
1780 }
1781 
1782 static int
1783 resolve_msgsend_stret (CORE_ADDR pc, CORE_ADDR *new_pc)
1784 {
1785   struct frame_info *frame = get_current_frame ();
1786   struct gdbarch *gdbarch = get_frame_arch (frame);
1787   struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
1788 
1789   CORE_ADDR object;
1790   CORE_ADDR sel;
1791   CORE_ADDR res;
1792 
1793   object = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1794   sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 2, ptr_type);
1795 
1796   res = find_implementation (gdbarch, object, sel);
1797   if (new_pc != 0)
1798     *new_pc = res;
1799   if (res == 0)
1800     return 1;
1801   return 0;
1802 }
1803 
1804 static int
1805 resolve_msgsend_super (CORE_ADDR pc, CORE_ADDR *new_pc)
1806 {
1807   struct frame_info *frame = get_current_frame ();
1808   struct gdbarch *gdbarch = get_frame_arch (frame);
1809   struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
1810 
1811   struct objc_super sstr;
1812 
1813   CORE_ADDR super;
1814   CORE_ADDR sel;
1815   CORE_ADDR res;
1816 
1817   super = gdbarch_fetch_pointer_argument (gdbarch, frame, 0, ptr_type);
1818   sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1819 
1820   read_objc_super (gdbarch, super, &sstr);
1821   if (sstr.class == 0)
1822     return 0;
1823 
1824   res = find_implementation_from_class (gdbarch, sstr.class, sel);
1825   if (new_pc != 0)
1826     *new_pc = res;
1827   if (res == 0)
1828     return 1;
1829   return 0;
1830 }
1831 
1832 static int
1833 resolve_msgsend_super_stret (CORE_ADDR pc, CORE_ADDR *new_pc)
1834 {
1835   struct frame_info *frame = get_current_frame ();
1836   struct gdbarch *gdbarch = get_frame_arch (frame);
1837   struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
1838 
1839   struct objc_super sstr;
1840 
1841   CORE_ADDR super;
1842   CORE_ADDR sel;
1843   CORE_ADDR res;
1844 
1845   super = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
1846   sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 2, ptr_type);
1847 
1848   read_objc_super (gdbarch, super, &sstr);
1849   if (sstr.class == 0)
1850     return 0;
1851 
1852   res = find_implementation_from_class (gdbarch, sstr.class, sel);
1853   if (new_pc != 0)
1854     *new_pc = res;
1855   if (res == 0)
1856     return 1;
1857   return 0;
1858 }
1859 
1860 void
1861 _initialize_objc_lang (void)
1862 {
1863   objc_objfile_data = register_objfile_data ();
1864 }
1865