1 /* Objective-C language support routines for GDB, the GNU debugger.
3 Copyright (C) 2002-2018 Free Software Foundation, Inc.
5 Contributed by Apple Computer, Inc.
6 Written by Michael Snyder.
8 This file is part of GDB.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
26 #include "expression.h"
27 #include "parser-defs.h"
31 #include "objc-lang.h"
32 #include "complaints.h"
36 #include "target.h" /* for target_has_execution */
40 #include "gdb_regex.h"
45 #include "cli/cli-utils.h"
55 CORE_ADDR super_class
;
77 static const struct objfile_data
*objc_objfile_data
;
79 /* Lookup a structure type named "struct NAME", visible in lexical
80 block BLOCK. If NOERR is nonzero, return zero if NAME is not
84 lookup_struct_typedef (const char *name
, const struct block
*block
, int noerr
)
88 sym
= lookup_symbol (name
, block
, STRUCT_DOMAIN
, 0).symbol
;
95 error (_("No struct type named %s."), name
);
97 if (TYPE_CODE (SYMBOL_TYPE (sym
)) != TYPE_CODE_STRUCT
)
102 error (_("This context has class, union or enum %s, not a struct."),
109 lookup_objc_class (struct gdbarch
*gdbarch
, const char *classname
)
111 struct type
*char_type
= builtin_type (gdbarch
)->builtin_char
;
112 struct value
* function
, *classval
;
114 if (! target_has_execution
)
116 /* Can't call into inferior to lookup class. */
120 if (lookup_minimal_symbol("objc_lookUpClass", 0, 0).minsym
)
121 function
= find_function_in_inferior("objc_lookUpClass", NULL
);
122 else if (lookup_minimal_symbol ("objc_lookup_class", 0, 0).minsym
)
123 function
= find_function_in_inferior("objc_lookup_class", NULL
);
126 complaint (&symfile_complaints
,
127 _("no way to lookup Objective-C classes"));
131 classval
= value_string (classname
, strlen (classname
) + 1, char_type
);
132 classval
= value_coerce_array (classval
);
133 return (CORE_ADDR
) value_as_long (call_function_by_hand (function
,
139 lookup_child_selector (struct gdbarch
*gdbarch
, const char *selname
)
141 struct type
*char_type
= builtin_type (gdbarch
)->builtin_char
;
142 struct value
* function
, *selstring
;
144 if (! target_has_execution
)
146 /* Can't call into inferior to lookup selector. */
150 if (lookup_minimal_symbol("sel_getUid", 0, 0).minsym
)
151 function
= find_function_in_inferior("sel_getUid", NULL
);
152 else if (lookup_minimal_symbol ("sel_get_any_uid", 0, 0).minsym
)
153 function
= find_function_in_inferior("sel_get_any_uid", NULL
);
156 complaint (&symfile_complaints
,
157 _("no way to lookup Objective-C selectors"));
161 selstring
= value_coerce_array (value_string (selname
,
162 strlen (selname
) + 1,
164 return value_as_long (call_function_by_hand (function
, NULL
, 1, &selstring
));
168 value_nsstring (struct gdbarch
*gdbarch
, char *ptr
, int len
)
170 struct type
*char_type
= builtin_type (gdbarch
)->builtin_char
;
171 struct value
*stringValue
[3];
172 struct value
*function
, *nsstringValue
;
176 if (!target_has_execution
)
177 return 0; /* Can't call into inferior to create NSString. */
179 stringValue
[2] = value_string(ptr
, len
, char_type
);
180 stringValue
[2] = value_coerce_array(stringValue
[2]);
181 /* _NSNewStringFromCString replaces "istr" after Lantern2A. */
182 if (lookup_minimal_symbol("_NSNewStringFromCString", 0, 0).minsym
)
184 function
= find_function_in_inferior("_NSNewStringFromCString", NULL
);
185 nsstringValue
= call_function_by_hand(function
,
186 NULL
, 1, &stringValue
[2]);
188 else if (lookup_minimal_symbol("istr", 0, 0).minsym
)
190 function
= find_function_in_inferior("istr", NULL
);
191 nsstringValue
= call_function_by_hand(function
, NULL
, 1, &stringValue
[2]);
193 else if (lookup_minimal_symbol("+[NSString stringWithCString:]", 0, 0).minsym
)
196 = find_function_in_inferior("+[NSString stringWithCString:]", NULL
);
197 type
= builtin_type (gdbarch
)->builtin_long
;
199 stringValue
[0] = value_from_longest
200 (type
, lookup_objc_class (gdbarch
, "NSString"));
201 stringValue
[1] = value_from_longest
202 (type
, lookup_child_selector (gdbarch
, "stringWithCString:"));
203 nsstringValue
= call_function_by_hand(function
, NULL
, 3, &stringValue
[0]);
206 error (_("NSString: internal error -- no way to create new NSString"));
208 sym
= lookup_struct_typedef("NSString", 0, 1);
210 sym
= lookup_struct_typedef("NXString", 0, 1);
212 type
= builtin_type (gdbarch
)->builtin_data_ptr
;
214 type
= lookup_pointer_type(SYMBOL_TYPE (sym
));
216 deprecated_set_value_type (nsstringValue
, type
);
217 return nsstringValue
;
220 /* Objective-C name demangling. */
223 objc_demangle (const char *mangled
, int options
)
225 char *demangled
, *cp
;
227 if (mangled
[0] == '_' &&
228 (mangled
[1] == 'i' || mangled
[1] == 'c') &&
231 cp
= demangled
= (char *) xmalloc (strlen (mangled
) + 2);
233 if (mangled
[1] == 'i')
234 *cp
++ = '-'; /* for instance method */
236 *cp
++ = '+'; /* for class method */
238 *cp
++ = '['; /* opening left brace */
239 strcpy(cp
, mangled
+3); /* Tack on the rest of the mangled name. */
241 while (*cp
&& *cp
== '_')
242 cp
++; /* Skip any initial underbars in class
245 cp
= strchr(cp
, '_');
246 if (!cp
) /* Find first non-initial underbar. */
248 xfree(demangled
); /* not mangled name */
251 if (cp
[1] == '_') /* Easy case: no category name. */
253 *cp
++ = ' '; /* Replace two '_' with one ' '. */
254 strcpy(cp
, mangled
+ (cp
- demangled
) + 2);
258 *cp
++ = '('; /* Less easy case: category name. */
259 cp
= strchr(cp
, '_');
262 xfree(demangled
); /* not mangled name */
266 *cp
++ = ' '; /* Overwriting 1st char of method name... */
267 strcpy(cp
, mangled
+ (cp
- demangled
)); /* Get it back. */
270 while (*cp
&& *cp
== '_')
271 cp
++; /* Skip any initial underbars in
276 *cp
= ':'; /* Replace remaining '_' with ':'. */
278 *cp
++ = ']'; /* closing right brace */
279 *cp
++ = 0; /* string terminator */
283 return NULL
; /* Not an objc mangled name. */
286 /* la_sniff_from_mangled_name for ObjC. */
289 objc_sniff_from_mangled_name (const char *mangled
, char **demangled
)
291 *demangled
= objc_demangle (mangled
, 0);
292 return *demangled
!= NULL
;
295 /* Determine if we are currently in the Objective-C dispatch function.
296 If so, get the address of the method function that the dispatcher
297 would call and use that as the function to step into instead. Also
298 skip over the trampoline for the function (if any). This is better
299 for the user since they are only interested in stepping into the
300 method function anyway. */
302 objc_skip_trampoline (struct frame_info
*frame
, CORE_ADDR stop_pc
)
304 struct gdbarch
*gdbarch
= get_frame_arch (frame
);
305 CORE_ADDR real_stop_pc
;
306 CORE_ADDR method_stop_pc
;
308 real_stop_pc
= gdbarch_skip_trampoline_code (gdbarch
, frame
, stop_pc
);
310 if (real_stop_pc
!= 0)
311 find_objc_msgcall (real_stop_pc
, &method_stop_pc
);
313 find_objc_msgcall (stop_pc
, &method_stop_pc
);
317 real_stop_pc
= gdbarch_skip_trampoline_code
318 (gdbarch
, frame
, method_stop_pc
);
319 if (real_stop_pc
== 0)
320 real_stop_pc
= method_stop_pc
;
327 /* Table mapping opcodes into strings for printing operators
328 and precedences of the operators. */
330 static const struct op_print objc_op_print_tab
[] =
332 {",", BINOP_COMMA
, PREC_COMMA
, 0},
333 {"=", BINOP_ASSIGN
, PREC_ASSIGN
, 1},
334 {"||", BINOP_LOGICAL_OR
, PREC_LOGICAL_OR
, 0},
335 {"&&", BINOP_LOGICAL_AND
, PREC_LOGICAL_AND
, 0},
336 {"|", BINOP_BITWISE_IOR
, PREC_BITWISE_IOR
, 0},
337 {"^", BINOP_BITWISE_XOR
, PREC_BITWISE_XOR
, 0},
338 {"&", BINOP_BITWISE_AND
, PREC_BITWISE_AND
, 0},
339 {"==", BINOP_EQUAL
, PREC_EQUAL
, 0},
340 {"!=", BINOP_NOTEQUAL
, PREC_EQUAL
, 0},
341 {"<=", BINOP_LEQ
, PREC_ORDER
, 0},
342 {">=", BINOP_GEQ
, PREC_ORDER
, 0},
343 {">", BINOP_GTR
, PREC_ORDER
, 0},
344 {"<", BINOP_LESS
, PREC_ORDER
, 0},
345 {">>", BINOP_RSH
, PREC_SHIFT
, 0},
346 {"<<", BINOP_LSH
, PREC_SHIFT
, 0},
347 {"+", BINOP_ADD
, PREC_ADD
, 0},
348 {"-", BINOP_SUB
, PREC_ADD
, 0},
349 {"*", BINOP_MUL
, PREC_MUL
, 0},
350 {"/", BINOP_DIV
, PREC_MUL
, 0},
351 {"%", BINOP_REM
, PREC_MUL
, 0},
352 {"@", BINOP_REPEAT
, PREC_REPEAT
, 0},
353 {"-", UNOP_NEG
, PREC_PREFIX
, 0},
354 {"!", UNOP_LOGICAL_NOT
, PREC_PREFIX
, 0},
355 {"~", UNOP_COMPLEMENT
, PREC_PREFIX
, 0},
356 {"*", UNOP_IND
, PREC_PREFIX
, 0},
357 {"&", UNOP_ADDR
, PREC_PREFIX
, 0},
358 {"sizeof ", UNOP_SIZEOF
, PREC_PREFIX
, 0},
359 {"++", UNOP_PREINCREMENT
, PREC_PREFIX
, 0},
360 {"--", UNOP_PREDECREMENT
, PREC_PREFIX
, 0},
361 {NULL
, OP_NULL
, PREC_NULL
, 0}
364 static const char *objc_extensions
[] =
369 extern const struct language_defn objc_language_defn
= {
370 "objective-c", /* Language name */
378 &exp_descriptor_standard
,
382 c_printchar
, /* Print a character constant */
383 c_printstr
, /* Function to print string constant */
385 c_print_type
, /* Print a type using appropriate syntax */
386 c_print_typedef
, /* Print a typedef using appropriate syntax */
387 c_val_print
, /* Print a value using appropriate syntax */
388 c_value_print
, /* Print a top-level value */
389 default_read_var_value
, /* la_read_var_value */
390 objc_skip_trampoline
, /* Language specific skip_trampoline */
391 "self", /* name_of_this */
392 false, /* la_store_sym_names_in_linkage_form_p */
393 basic_lookup_symbol_nonlocal
, /* lookup_symbol_nonlocal */
394 basic_lookup_transparent_type
,/* lookup_transparent_type */
395 objc_demangle
, /* Language specific symbol demangler */
396 objc_sniff_from_mangled_name
,
397 NULL
, /* Language specific
398 class_name_from_physname */
399 objc_op_print_tab
, /* Expression operators for printing */
400 1, /* C-style arrays */
401 0, /* String lower bound */
402 default_word_break_characters
,
403 default_collect_symbol_completion_matches
,
404 c_language_arch_info
,
405 default_print_array_index
,
406 default_pass_by_reference
,
408 c_watch_location_expression
,
409 NULL
, /* la_get_symbol_name_matcher */
410 iterate_over_symbols
,
411 default_search_name_hash
,
420 * Following functions help construct Objective-C message calls.
423 struct selname
/* For parsing Objective-C. */
425 struct selname
*next
;
430 static int msglist_len
;
431 static struct selname
*selname_chain
;
432 static char *msglist_sel
;
437 struct selname
*newobj
= XNEW (struct selname
);
439 newobj
->next
= selname_chain
;
440 newobj
->msglist_len
= msglist_len
;
441 newobj
->msglist_sel
= msglist_sel
;
443 msglist_sel
= (char *)xmalloc(1);
445 selname_chain
= newobj
;
449 add_msglist(struct stoken
*str
, int addcolon
)
455 if (str
== 0) /* Unnamed arg, or... */
457 if (addcolon
== 0) /* variable number of args. */
470 len
= plen
+ strlen(msglist_sel
) + 2;
471 s
= (char *)xmalloc(len
);
472 strcpy(s
, msglist_sel
);
487 end_msglist (struct parser_state
*ps
)
489 int val
= msglist_len
;
490 struct selname
*sel
= selname_chain
;
491 char *p
= msglist_sel
;
494 selname_chain
= sel
->next
;
495 msglist_len
= sel
->msglist_len
;
496 msglist_sel
= sel
->msglist_sel
;
497 selid
= lookup_child_selector (parse_gdbarch (ps
), p
);
499 error (_("Can't find selector \"%s\""), p
);
500 write_exp_elt_longcst (ps
, selid
);
502 write_exp_elt_longcst (ps
, val
); /* Number of args */
509 * Function: specialcmp (const char *a, const char *b)
511 * Special strcmp: treats ']' and ' ' as end-of-string.
512 * Used for qsorting lists of objc methods (either by class or selector).
516 specialcmp (const char *a
, const char *b
)
518 while (*a
&& *a
!= ' ' && *a
!= ']' && *b
&& *b
!= ' ' && *b
!= ']')
524 if (*a
&& *a
!= ' ' && *a
!= ']')
525 return 1; /* a is longer therefore greater. */
526 if (*b
&& *b
!= ' ' && *b
!= ']')
527 return -1; /* a is shorter therefore lesser. */
528 return 0; /* a and b are identical. */
532 * Function: compare_selectors (const void *, const void *)
534 * Comparison function for use with qsort. Arguments are symbols or
535 * msymbols Compares selector part of objc method name alphabetically.
539 compare_selectors (const void *a
, const void *b
)
541 const char *aname
, *bname
;
543 aname
= SYMBOL_PRINT_NAME (*(struct symbol
**) a
);
544 bname
= SYMBOL_PRINT_NAME (*(struct symbol
**) b
);
545 if (aname
== NULL
|| bname
== NULL
)
546 error (_("internal: compare_selectors(1)"));
548 aname
= strchr(aname
, ' ');
549 bname
= strchr(bname
, ' ');
550 if (aname
== NULL
|| bname
== NULL
)
551 error (_("internal: compare_selectors(2)"));
553 return specialcmp (aname
+1, bname
+1);
557 * Function: selectors_info (regexp, from_tty)
559 * Implements the "Info selectors" command. Takes an optional regexp
560 * arg. Lists all objective c selectors that match the regexp. Works
561 * by grepping thru all symbols for objective c methods. Output list
562 * is sorted and uniqued.
566 info_selectors_command (const char *regexp
, int from_tty
)
568 struct objfile
*objfile
;
569 struct minimal_symbol
*msymbol
;
577 struct symbol
**sym_arr
;
581 strcpy(myregexp
, ".*]"); /* Null input, match all objc methods. */
584 if (*regexp
== '+' || *regexp
== '-')
585 { /* User wants only class methods or only instance methods. */
586 plusminus
= *regexp
++;
587 while (*regexp
== ' ' || *regexp
== '\t')
591 strcpy(myregexp
, ".*]");
594 /* Allow a few extra bytes because of the strcat below. */
595 if (sizeof (myregexp
) < strlen (regexp
) + 4)
596 error (_("Regexp is too long: %s"), regexp
);
597 strcpy(myregexp
, regexp
);
598 if (myregexp
[strlen(myregexp
) - 1] == '$') /* end of selector */
599 myregexp
[strlen(myregexp
) - 1] = ']'; /* end of method name */
601 strcat(myregexp
, ".*]");
607 val
= re_comp (myregexp
);
609 error (_("Invalid regexp (%s): %s"), val
, regexp
);
612 /* First time thru is JUST to get max length and count. */
613 ALL_MSYMBOLS (objfile
, msymbol
)
616 name
= MSYMBOL_NATURAL_NAME (msymbol
);
618 && (name
[0] == '-' || name
[0] == '+')
619 && name
[1] == '[') /* Got a method name. */
621 /* Filter for class/instance methods. */
622 if (plusminus
&& name
[0] != plusminus
)
624 /* Find selector part. */
625 name
= (char *) strchr (name
+2, ' ');
628 complaint (&symfile_complaints
,
629 _("Bad method name '%s'"),
630 MSYMBOL_NATURAL_NAME (msymbol
));
633 if (regexp
== NULL
|| re_exec(++name
) != 0)
635 const char *mystart
= name
;
636 const char *myend
= strchr (mystart
, ']');
638 if (myend
&& (myend
- mystart
> maxlen
))
639 maxlen
= myend
- mystart
; /* Get longest selector. */
646 printf_filtered (_("Selectors matching \"%s\":\n\n"),
647 regexp
? regexp
: "*");
649 sym_arr
= XALLOCAVEC (struct symbol
*, matches
);
651 ALL_MSYMBOLS (objfile
, msymbol
)
654 name
= MSYMBOL_NATURAL_NAME (msymbol
);
656 (name
[0] == '-' || name
[0] == '+') &&
657 name
[1] == '[') /* Got a method name. */
659 /* Filter for class/instance methods. */
660 if (plusminus
&& name
[0] != plusminus
)
662 /* Find selector part. */
663 name
= (char *) strchr(name
+2, ' ');
664 if (regexp
== NULL
|| re_exec(++name
) != 0)
665 sym_arr
[matches
++] = (struct symbol
*) msymbol
;
669 qsort (sym_arr
, matches
, sizeof (struct minimal_symbol
*),
671 /* Prevent compare on first iteration. */
673 for (ix
= 0; ix
< matches
; ix
++) /* Now do the output. */
678 name
= SYMBOL_NATURAL_NAME (sym_arr
[ix
]);
679 name
= strchr (name
, ' ') + 1;
680 if (p
[0] && specialcmp(name
, p
) == 0)
681 continue; /* Seen this one already (not unique). */
683 /* Copy selector part. */
684 while (*name
&& *name
!= ']')
687 /* Print in columns. */
688 puts_filtered_tabular(asel
, maxlen
+ 1, 0);
693 printf_filtered (_("No selectors matching \"%s\"\n"),
694 regexp
? regexp
: "*");
698 * Function: compare_classes (const void *, const void *)
700 * Comparison function for use with qsort. Arguments are symbols or
701 * msymbols Compares class part of objc method name alphabetically.
705 compare_classes (const void *a
, const void *b
)
707 const char *aname
, *bname
;
709 aname
= SYMBOL_PRINT_NAME (*(struct symbol
**) a
);
710 bname
= SYMBOL_PRINT_NAME (*(struct symbol
**) b
);
711 if (aname
== NULL
|| bname
== NULL
)
712 error (_("internal: compare_classes(1)"));
714 return specialcmp (aname
+1, bname
+1);
718 * Function: classes_info(regexp, from_tty)
720 * Implements the "info classes" command for objective c classes.
721 * Lists all objective c classes that match the optional regexp.
722 * Works by grepping thru the list of objective c methods. List will
723 * be sorted and uniqued (since one class may have many methods).
724 * BUGS: will not list a class that has no methods.
728 info_classes_command (const char *regexp
, int from_tty
)
730 struct objfile
*objfile
;
731 struct minimal_symbol
*msymbol
;
739 struct symbol
**sym_arr
;
742 strcpy(myregexp
, ".* "); /* Null input: match all objc classes. */
745 /* Allow a few extra bytes because of the strcat below. */
746 if (sizeof (myregexp
) < strlen (regexp
) + 4)
747 error (_("Regexp is too long: %s"), regexp
);
748 strcpy(myregexp
, regexp
);
749 if (myregexp
[strlen(myregexp
) - 1] == '$')
750 /* In the method name, the end of the class name is marked by ' '. */
751 myregexp
[strlen(myregexp
) - 1] = ' ';
753 strcat(myregexp
, ".* ");
758 val
= re_comp (myregexp
);
760 error (_("Invalid regexp (%s): %s"), val
, regexp
);
763 /* First time thru is JUST to get max length and count. */
764 ALL_MSYMBOLS (objfile
, msymbol
)
767 name
= MSYMBOL_NATURAL_NAME (msymbol
);
769 (name
[0] == '-' || name
[0] == '+') &&
770 name
[1] == '[') /* Got a method name. */
771 if (regexp
== NULL
|| re_exec(name
+2) != 0)
773 /* Compute length of classname part. */
774 const char *mystart
= name
+ 2;
775 const char *myend
= strchr (mystart
, ' ');
777 if (myend
&& (myend
- mystart
> maxlen
))
778 maxlen
= myend
- mystart
;
784 printf_filtered (_("Classes matching \"%s\":\n\n"),
785 regexp
? regexp
: "*");
786 sym_arr
= XALLOCAVEC (struct symbol
*, matches
);
788 ALL_MSYMBOLS (objfile
, msymbol
)
791 name
= MSYMBOL_NATURAL_NAME (msymbol
);
793 (name
[0] == '-' || name
[0] == '+') &&
794 name
[1] == '[') /* Got a method name. */
795 if (regexp
== NULL
|| re_exec(name
+2) != 0)
796 sym_arr
[matches
++] = (struct symbol
*) msymbol
;
799 qsort (sym_arr
, matches
, sizeof (struct minimal_symbol
*),
801 /* Prevent compare on first iteration. */
803 for (ix
= 0; ix
< matches
; ix
++) /* Now do the output. */
808 name
= SYMBOL_NATURAL_NAME (sym_arr
[ix
]);
810 if (p
[0] && specialcmp(name
, p
) == 0)
811 continue; /* Seen this one already (not unique). */
813 /* Copy class part of method name. */
814 while (*name
&& *name
!= ' ')
817 /* Print in columns. */
818 puts_filtered_tabular(aclass
, maxlen
+ 1, 0);
823 printf_filtered (_("No classes matching \"%s\"\n"), regexp
? regexp
: "*");
827 parse_selector (char *method
, char **selector
)
833 char *nselector
= NULL
;
835 gdb_assert (selector
!= NULL
);
839 s1
= skip_spaces (s1
);
845 s1
= skip_spaces (s1
);
852 if (isalnum (*s2
) || (*s2
== '_') || (*s2
== ':'))
854 else if (isspace (*s2
))
856 else if ((*s2
== '\0') || (*s2
== '\''))
864 s2
= skip_spaces (s2
);
869 s2
= skip_spaces (s2
);
872 if (selector
!= NULL
)
873 *selector
= nselector
;
879 parse_method (char *method
, char *type
, char **theclass
,
880 char **category
, char **selector
)
888 char *ncategory
= NULL
;
889 char *nselector
= NULL
;
891 gdb_assert (type
!= NULL
);
892 gdb_assert (theclass
!= NULL
);
893 gdb_assert (category
!= NULL
);
894 gdb_assert (selector
!= NULL
);
898 s1
= skip_spaces (s1
);
904 s1
= skip_spaces (s1
);
906 if ((s1
[0] == '+') || (s1
[0] == '-'))
909 s1
= skip_spaces (s1
);
916 while (isalnum (*s1
) || (*s1
== '_'))
920 s2
= skip_spaces (s2
);
925 s2
= skip_spaces (s2
);
927 while (isalnum (*s2
) || (*s2
== '_'))
932 /* Truncate the class name now that we're not using the open paren. */
940 if (isalnum (*s2
) || (*s2
== '_') || (*s2
== ':'))
942 else if (isspace (*s2
))
953 s2
= skip_spaces (s2
);
959 s2
= skip_spaces (s2
);
964 if (theclass
!= NULL
)
966 if (category
!= NULL
)
967 *category
= ncategory
;
968 if (selector
!= NULL
)
969 *selector
= nselector
;
975 find_methods (char type
, const char *theclass
, const char *category
,
976 const char *selector
,
977 VEC (const_char_ptr
) **symbol_names
)
979 struct objfile
*objfile
= NULL
;
981 const char *symname
= NULL
;
985 char *ncategory
= NULL
;
986 char *nselector
= NULL
;
988 static char *tmp
= NULL
;
989 static unsigned int tmplen
= 0;
991 gdb_assert (symbol_names
!= NULL
);
993 ALL_OBJFILES (objfile
)
995 unsigned int *objc_csym
;
996 struct minimal_symbol
*msymbol
= NULL
;
998 /* The objfile_csym variable counts the number of ObjC methods
999 that this objfile defines. We save that count as a private
1000 objfile data. If we have already determined that this objfile
1001 provides no ObjC methods, we can skip it entirely. */
1003 unsigned int objfile_csym
= 0;
1005 objc_csym
= (unsigned int *) objfile_data (objfile
, objc_objfile_data
);
1006 if (objc_csym
!= NULL
&& *objc_csym
== 0)
1007 /* There are no ObjC symbols in this objfile. Skip it entirely. */
1010 ALL_OBJFILE_MSYMBOLS (objfile
, msymbol
)
1014 /* Check the symbol name first as this can be done entirely without
1015 sending any query to the target. */
1016 symname
= MSYMBOL_NATURAL_NAME (msymbol
);
1017 if (symname
== NULL
)
1020 if ((symname
[0] != '-' && symname
[0] != '+') || (symname
[1] != '['))
1021 /* Not a method name. */
1026 /* Now that thinks are a bit sane, clean up the symname. */
1027 while ((strlen (symname
) + 1) >= tmplen
)
1029 tmplen
= (tmplen
== 0) ? 1024 : tmplen
* 2;
1030 tmp
= (char *) xrealloc (tmp
, tmplen
);
1032 strcpy (tmp
, symname
);
1034 if (parse_method (tmp
, &ntype
, &nclass
,
1035 &ncategory
, &nselector
) == NULL
)
1038 if ((type
!= '\0') && (ntype
!= type
))
1041 if ((theclass
!= NULL
)
1042 && ((nclass
== NULL
) || (strcmp (theclass
, nclass
) != 0)))
1045 if ((category
!= NULL
) &&
1046 ((ncategory
== NULL
) || (strcmp (category
, ncategory
) != 0)))
1049 if ((selector
!= NULL
) &&
1050 ((nselector
== NULL
) || (strcmp (selector
, nselector
) != 0)))
1053 VEC_safe_push (const_char_ptr
, *symbol_names
, symname
);
1056 if (objc_csym
== NULL
)
1058 objc_csym
= XOBNEW (&objfile
->objfile_obstack
, unsigned int);
1059 *objc_csym
= objfile_csym
;
1060 set_objfile_data (objfile
, objc_objfile_data
, objc_csym
);
1063 /* Count of ObjC methods in this objfile should be constant. */
1064 gdb_assert (*objc_csym
== objfile_csym
);
1068 /* Uniquify a VEC of strings. */
1071 uniquify_strings (VEC (const_char_ptr
) **strings
)
1074 const char *elem
, *last
= NULL
;
1077 /* If the vector is empty, there's nothing to do. This explicit
1078 check is needed to avoid invoking qsort with NULL. */
1079 if (VEC_empty (const_char_ptr
, *strings
))
1082 qsort (VEC_address (const_char_ptr
, *strings
),
1083 VEC_length (const_char_ptr
, *strings
),
1084 sizeof (const_char_ptr
),
1087 for (ix
= 0; VEC_iterate (const_char_ptr
, *strings
, ix
, elem
); ++ix
)
1089 if (last
== NULL
|| strcmp (last
, elem
) != 0)
1092 VEC_replace (const_char_ptr
, *strings
, out
, elem
);
1097 VEC_truncate (const_char_ptr
, *strings
, out
);
1101 * Function: find_imps (const char *selector, struct symbol **sym_arr)
1103 * Input: a string representing a selector
1104 * a pointer to an array of symbol pointers
1105 * possibly a pointer to a symbol found by the caller.
1107 * Output: number of methods that implement that selector. Side
1108 * effects: The array of symbol pointers is filled with matching syms.
1110 * By analogy with function "find_methods" (symtab.c), builds a list
1111 * of symbols matching the ambiguous input, so that "decode_line_2"
1112 * (symtab.c) can list them and ask the user to choose one or more.
1113 * In this case the matches are objective c methods
1114 * ("implementations") matching an objective c selector.
1116 * Note that it is possible for a normal (c-style) function to have
1117 * the same name as an objective c selector. To prevent the selector
1118 * from eclipsing the function, we allow the caller (decode_line_1) to
1119 * search for such a function first, and if it finds one, pass it in
1120 * to us. We will then integrate it into the list. We also search
1121 * for one here, among the minsyms.
1123 * NOTE: if NUM_DEBUGGABLE is non-zero, the sym_arr will be divided
1124 * into two parts: debuggable (struct symbol) syms, and
1125 * non_debuggable (struct minimal_symbol) syms. The debuggable
1126 * ones will come first, before NUM_DEBUGGABLE (which will thus
1127 * be the index of the first non-debuggable one).
1131 find_imps (const char *method
, VEC (const_char_ptr
) **symbol_names
)
1134 char *theclass
= NULL
;
1135 char *category
= NULL
;
1136 char *selector
= NULL
;
1141 int selector_case
= 0;
1143 gdb_assert (symbol_names
!= NULL
);
1145 buf
= (char *) alloca (strlen (method
) + 1);
1146 strcpy (buf
, method
);
1147 tmp
= parse_method (buf
, &type
, &theclass
, &category
, &selector
);
1151 strcpy (buf
, method
);
1152 tmp
= parse_selector (buf
, &selector
);
1160 find_methods (type
, theclass
, category
, selector
, symbol_names
);
1162 /* If we hit the "selector" case, and we found some methods, then
1163 add the selector itself as a symbol, if it exists. */
1164 if (selector_case
&& !VEC_empty (const_char_ptr
, *symbol_names
))
1166 struct symbol
*sym
= lookup_symbol (selector
, NULL
, VAR_DOMAIN
,
1170 VEC_safe_push (const_char_ptr
, *symbol_names
,
1171 SYMBOL_NATURAL_NAME (sym
));
1174 struct bound_minimal_symbol msym
1175 = lookup_minimal_symbol (selector
, 0, 0);
1177 if (msym
.minsym
!= NULL
)
1178 VEC_safe_push (const_char_ptr
, *symbol_names
,
1179 MSYMBOL_NATURAL_NAME (msym
.minsym
));
1183 uniquify_strings (symbol_names
);
1185 return method
+ (tmp
- buf
);
1189 print_object_command (const char *args
, int from_tty
)
1191 struct value
*object
, *function
, *description
;
1192 CORE_ADDR string_addr
, object_addr
;
1196 if (!args
|| !*args
)
1198 "The 'print-object' command requires an argument (an Objective-C object)");
1201 expression_up expr
= parse_expression (args
);
1204 object
= evaluate_subexp (builtin_type (expr
->gdbarch
)->builtin_data_ptr
,
1205 expr
.get (), &pc
, EVAL_NORMAL
);
1208 /* Validate the address for sanity. */
1209 object_addr
= value_as_long (object
);
1210 read_memory (object_addr
, &c
, 1);
1212 function
= find_function_in_inferior ("_NSPrintForDebugger", NULL
);
1213 if (function
== NULL
)
1214 error (_("Unable to locate _NSPrintForDebugger in child process"));
1216 description
= call_function_by_hand (function
, NULL
, 1, &object
);
1218 string_addr
= value_as_long (description
);
1219 if (string_addr
== 0)
1220 error (_("object returns null description"));
1222 read_memory (string_addr
+ i
++, &c
, 1);
1225 { /* Read and print characters up to EOS. */
1227 printf_filtered ("%c", c
);
1228 read_memory (string_addr
+ i
++, &c
, 1);
1231 printf_filtered(_("<object returns empty description>"));
1232 printf_filtered ("\n");
1235 /* The data structure 'methcalls' is used to detect method calls (thru
1236 * ObjC runtime lib functions objc_msgSend, objc_msgSendSuper, etc.),
1237 * and ultimately find the method being called.
1240 struct objc_methcall
{
1242 /* Return instance method to be called. */
1243 int (*stop_at
) (CORE_ADDR
, CORE_ADDR
*);
1244 /* Start of pc range corresponding to method invocation. */
1246 /* End of pc range corresponding to method invocation. */
1250 static int resolve_msgsend (CORE_ADDR pc
, CORE_ADDR
*new_pc
);
1251 static int resolve_msgsend_stret (CORE_ADDR pc
, CORE_ADDR
*new_pc
);
1252 static int resolve_msgsend_super (CORE_ADDR pc
, CORE_ADDR
*new_pc
);
1253 static int resolve_msgsend_super_stret (CORE_ADDR pc
, CORE_ADDR
*new_pc
);
1255 static struct objc_methcall methcalls
[] = {
1256 { "_objc_msgSend", resolve_msgsend
, 0, 0},
1257 { "_objc_msgSend_stret", resolve_msgsend_stret
, 0, 0},
1258 { "_objc_msgSendSuper", resolve_msgsend_super
, 0, 0},
1259 { "_objc_msgSendSuper_stret", resolve_msgsend_super_stret
, 0, 0},
1260 { "_objc_getClass", NULL
, 0, 0},
1261 { "_objc_getMetaClass", NULL
, 0, 0}
1264 #define nmethcalls (sizeof (methcalls) / sizeof (methcalls[0]))
1266 /* The following function, "find_objc_msgsend", fills in the data
1267 * structure "objc_msgs" by finding the addresses of each of the
1268 * (currently four) functions that it holds (of which objc_msgSend is
1269 * the first). This must be called each time symbols are loaded, in
1270 * case the functions have moved for some reason.
1274 find_objc_msgsend (void)
1278 for (i
= 0; i
< nmethcalls
; i
++)
1280 struct bound_minimal_symbol func
;
1282 /* Try both with and without underscore. */
1283 func
= lookup_bound_minimal_symbol (methcalls
[i
].name
);
1284 if ((func
.minsym
== NULL
) && (methcalls
[i
].name
[0] == '_'))
1286 func
= lookup_bound_minimal_symbol (methcalls
[i
].name
+ 1);
1288 if (func
.minsym
== NULL
)
1290 methcalls
[i
].begin
= 0;
1291 methcalls
[i
].end
= 0;
1295 methcalls
[i
].begin
= BMSYMBOL_VALUE_ADDRESS (func
);
1296 methcalls
[i
].end
= minimal_symbol_upper_bound (func
);
1300 /* find_objc_msgcall (replaces pc_off_limits)
1302 * ALL that this function now does is to determine whether the input
1303 * address ("pc") is the address of one of the Objective-C message
1304 * dispatch functions (mainly objc_msgSend or objc_msgSendSuper), and
1305 * if so, it returns the address of the method that will be called.
1307 * The old function "pc_off_limits" used to do a lot of other things
1308 * in addition, such as detecting shared library jump stubs and
1309 * returning the address of the shlib function that would be called.
1310 * That functionality has been moved into the gdbarch_skip_trampoline_code and
1311 * IN_SOLIB_TRAMPOLINE macros, which are resolved in the target-
1312 * dependent modules.
1316 find_objc_msgcall_submethod (int (*f
) (CORE_ADDR
, CORE_ADDR
*),
1322 if (f (pc
, new_pc
) == 0)
1325 CATCH (ex
, RETURN_MASK_ALL
)
1327 exception_fprintf (gdb_stderr
, ex
,
1328 "Unable to determine target of "
1329 "Objective-C method call (ignoring):\n");
1337 find_objc_msgcall (CORE_ADDR pc
, CORE_ADDR
*new_pc
)
1341 find_objc_msgsend ();
1347 for (i
= 0; i
< nmethcalls
; i
++)
1348 if ((pc
>= methcalls
[i
].begin
) && (pc
< methcalls
[i
].end
))
1350 if (methcalls
[i
].stop_at
!= NULL
)
1351 return find_objc_msgcall_submethod (methcalls
[i
].stop_at
,
1361 _initialize_objc_language (void)
1363 add_info ("selectors", info_selectors_command
,
1364 _("All Objective-C selectors, or those matching REGEXP."));
1365 add_info ("classes", info_classes_command
,
1366 _("All Objective-C classes, or those matching REGEXP."));
1367 add_com ("print-object", class_vars
, print_object_command
,
1368 _("Ask an Objective-C object to print itself."));
1369 add_com_alias ("po", "print-object", class_vars
, 1);
1373 read_objc_method (struct gdbarch
*gdbarch
, CORE_ADDR addr
,
1374 struct objc_method
*method
)
1376 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1378 method
->name
= read_memory_unsigned_integer (addr
+ 0, 4, byte_order
);
1379 method
->types
= read_memory_unsigned_integer (addr
+ 4, 4, byte_order
);
1380 method
->imp
= read_memory_unsigned_integer (addr
+ 8, 4, byte_order
);
1383 static unsigned long
1384 read_objc_methlist_nmethods (struct gdbarch
*gdbarch
, CORE_ADDR addr
)
1386 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1388 return read_memory_unsigned_integer (addr
+ 4, 4, byte_order
);
1392 read_objc_methlist_method (struct gdbarch
*gdbarch
, CORE_ADDR addr
,
1393 unsigned long num
, struct objc_method
*method
)
1395 gdb_assert (num
< read_objc_methlist_nmethods (gdbarch
, addr
));
1396 read_objc_method (gdbarch
, addr
+ 8 + (12 * num
), method
);
1400 read_objc_object (struct gdbarch
*gdbarch
, CORE_ADDR addr
,
1401 struct objc_object
*object
)
1403 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1405 object
->isa
= read_memory_unsigned_integer (addr
, 4, byte_order
);
1409 read_objc_super (struct gdbarch
*gdbarch
, CORE_ADDR addr
,
1410 struct objc_super
*super
)
1412 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1414 super
->receiver
= read_memory_unsigned_integer (addr
, 4, byte_order
);
1415 super
->theclass
= read_memory_unsigned_integer (addr
+ 4, 4, byte_order
);
1419 read_objc_class (struct gdbarch
*gdbarch
, CORE_ADDR addr
,
1420 struct objc_class
*theclass
)
1422 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1424 theclass
->isa
= read_memory_unsigned_integer (addr
, 4, byte_order
);
1425 theclass
->super_class
= read_memory_unsigned_integer (addr
+ 4, 4, byte_order
);
1426 theclass
->name
= read_memory_unsigned_integer (addr
+ 8, 4, byte_order
);
1427 theclass
->version
= read_memory_unsigned_integer (addr
+ 12, 4, byte_order
);
1428 theclass
->info
= read_memory_unsigned_integer (addr
+ 16, 4, byte_order
);
1429 theclass
->instance_size
= read_memory_unsigned_integer (addr
+ 18, 4,
1431 theclass
->ivars
= read_memory_unsigned_integer (addr
+ 24, 4, byte_order
);
1432 theclass
->methods
= read_memory_unsigned_integer (addr
+ 28, 4, byte_order
);
1433 theclass
->cache
= read_memory_unsigned_integer (addr
+ 32, 4, byte_order
);
1434 theclass
->protocols
= read_memory_unsigned_integer (addr
+ 36, 4, byte_order
);
1438 find_implementation_from_class (struct gdbarch
*gdbarch
,
1439 CORE_ADDR theclass
, CORE_ADDR sel
)
1441 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1442 CORE_ADDR subclass
= theclass
;
1444 while (subclass
!= 0)
1447 struct objc_class class_str
;
1448 unsigned mlistnum
= 0;
1450 read_objc_class (gdbarch
, subclass
, &class_str
);
1455 unsigned long nmethods
;
1458 mlist
= read_memory_unsigned_integer (class_str
.methods
+
1464 nmethods
= read_objc_methlist_nmethods (gdbarch
, mlist
);
1466 for (i
= 0; i
< nmethods
; i
++)
1468 struct objc_method meth_str
;
1470 read_objc_methlist_method (gdbarch
, mlist
, i
, &meth_str
);
1472 if (meth_str
.name
== sel
)
1473 /* FIXME: hppa arch was doing a pointer dereference
1474 here. There needs to be a better way to do that. */
1475 return meth_str
.imp
;
1479 subclass
= class_str
.super_class
;
1486 find_implementation (struct gdbarch
*gdbarch
,
1487 CORE_ADDR object
, CORE_ADDR sel
)
1489 struct objc_object ostr
;
1493 read_objc_object (gdbarch
, object
, &ostr
);
1497 return find_implementation_from_class (gdbarch
, ostr
.isa
, sel
);
1501 resolve_msgsend (CORE_ADDR pc
, CORE_ADDR
*new_pc
)
1503 struct frame_info
*frame
= get_current_frame ();
1504 struct gdbarch
*gdbarch
= get_frame_arch (frame
);
1505 struct type
*ptr_type
= builtin_type (gdbarch
)->builtin_func_ptr
;
1511 object
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 0, ptr_type
);
1512 sel
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 1, ptr_type
);
1514 res
= find_implementation (gdbarch
, object
, sel
);
1523 resolve_msgsend_stret (CORE_ADDR pc
, CORE_ADDR
*new_pc
)
1525 struct frame_info
*frame
= get_current_frame ();
1526 struct gdbarch
*gdbarch
= get_frame_arch (frame
);
1527 struct type
*ptr_type
= builtin_type (gdbarch
)->builtin_func_ptr
;
1533 object
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 1, ptr_type
);
1534 sel
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 2, ptr_type
);
1536 res
= find_implementation (gdbarch
, object
, sel
);
1545 resolve_msgsend_super (CORE_ADDR pc
, CORE_ADDR
*new_pc
)
1547 struct frame_info
*frame
= get_current_frame ();
1548 struct gdbarch
*gdbarch
= get_frame_arch (frame
);
1549 struct type
*ptr_type
= builtin_type (gdbarch
)->builtin_func_ptr
;
1551 struct objc_super sstr
;
1557 super
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 0, ptr_type
);
1558 sel
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 1, ptr_type
);
1560 read_objc_super (gdbarch
, super
, &sstr
);
1561 if (sstr
.theclass
== 0)
1564 res
= find_implementation_from_class (gdbarch
, sstr
.theclass
, sel
);
1573 resolve_msgsend_super_stret (CORE_ADDR pc
, CORE_ADDR
*new_pc
)
1575 struct frame_info
*frame
= get_current_frame ();
1576 struct gdbarch
*gdbarch
= get_frame_arch (frame
);
1577 struct type
*ptr_type
= builtin_type (gdbarch
)->builtin_func_ptr
;
1579 struct objc_super sstr
;
1585 super
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 1, ptr_type
);
1586 sel
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 2, ptr_type
);
1588 read_objc_super (gdbarch
, super
, &sstr
);
1589 if (sstr
.theclass
== 0)
1592 res
= find_implementation_from_class (gdbarch
, sstr
.theclass
, sel
);
1601 _initialize_objc_lang (void)
1603 objc_objfile_data
= register_objfile_data ();