1 /* Objective-C language support routines for GDB, the GNU debugger.
3 Copyright (C) 2002-2023 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"
40 #include "gdbsupport/gdb_regex.h"
45 #include "cli/cli-utils.h"
57 CORE_ADDR super_class
;
79 static const registry
<objfile
>::key
<unsigned int> objc_objfile_data
;
81 /* Lookup a structure type named "struct NAME", visible in lexical
82 block BLOCK. If NOERR is nonzero, return zero if NAME is not
86 lookup_struct_typedef (const char *name
, const struct block
*block
, int noerr
)
90 sym
= lookup_symbol (name
, block
, STRUCT_DOMAIN
, 0).symbol
;
97 error (_("No struct type named %s."), name
);
99 if (sym
->type ()->code () != TYPE_CODE_STRUCT
)
104 error (_("This context has class, union or enum %s, not a struct."),
111 lookup_objc_class (struct gdbarch
*gdbarch
, const char *classname
)
113 struct type
*char_type
= builtin_type (gdbarch
)->builtin_char
;
114 struct value
* function
, *classval
;
116 if (! target_has_execution ())
118 /* Can't call into inferior to lookup class. */
122 if (lookup_minimal_symbol("objc_lookUpClass", 0, 0).minsym
)
123 function
= find_function_in_inferior("objc_lookUpClass", NULL
);
124 else if (lookup_minimal_symbol ("objc_lookup_class", 0, 0).minsym
)
125 function
= find_function_in_inferior("objc_lookup_class", NULL
);
128 complaint (_("no way to lookup Objective-C classes"));
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
,
140 lookup_child_selector (struct gdbarch
*gdbarch
, const char *selname
)
142 struct type
*char_type
= builtin_type (gdbarch
)->builtin_char
;
143 struct value
* function
, *selstring
;
145 if (! target_has_execution ())
147 /* Can't call into inferior to lookup selector. */
151 if (lookup_minimal_symbol("sel_getUid", 0, 0).minsym
)
152 function
= find_function_in_inferior("sel_getUid", NULL
);
153 else if (lookup_minimal_symbol ("sel_get_any_uid", 0, 0).minsym
)
154 function
= find_function_in_inferior("sel_get_any_uid", NULL
);
157 complaint (_("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
, selstring
));
168 value_nsstring (struct gdbarch
*gdbarch
, const 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
, NULL
, stringValue
[2]);
187 else if (lookup_minimal_symbol("istr", 0, 0).minsym
)
189 function
= find_function_in_inferior("istr", NULL
);
190 nsstringValue
= call_function_by_hand(function
, NULL
, stringValue
[2]);
192 else if (lookup_minimal_symbol("+[NSString stringWithCString:]", 0, 0).minsym
)
195 = find_function_in_inferior("+[NSString stringWithCString:]", NULL
);
196 type
= builtin_type (gdbarch
)->builtin_long
;
198 stringValue
[0] = value_from_longest
199 (type
, lookup_objc_class (gdbarch
, "NSString"));
200 stringValue
[1] = value_from_longest
201 (type
, lookup_child_selector (gdbarch
, "stringWithCString:"));
202 nsstringValue
= call_function_by_hand(function
, NULL
, stringValue
);
205 error (_("NSString: internal error -- no way to create new NSString"));
207 sym
= lookup_struct_typedef("NSString", 0, 1);
209 sym
= lookup_struct_typedef("NXString", 0, 1);
211 type
= builtin_type (gdbarch
)->builtin_data_ptr
;
213 type
= lookup_pointer_type(sym
->type ());
215 deprecated_set_value_type (nsstringValue
, type
);
216 return nsstringValue
;
219 /* Class representing the Objective-C language. */
221 class objc_language
: public language_defn
225 : language_defn (language_objc
)
228 /* See language.h. */
230 const char *name () const override
231 { return "objective-c"; }
233 /* See language.h. */
235 const char *natural_name () const override
236 { return "Objective-C"; }
238 /* See language.h. */
240 const std::vector
<const char *> &filename_extensions () const override
242 static const std::vector
<const char *> extensions
= { ".m" };
246 /* See language.h. */
247 void language_arch_info (struct gdbarch
*gdbarch
,
248 struct language_arch_info
*lai
) const override
250 c_language_arch_info (gdbarch
, lai
);
253 /* See language.h. */
254 bool sniff_from_mangled_name
255 (const char *mangled
, gdb::unique_xmalloc_ptr
<char> *demangled
)
258 *demangled
= demangle_symbol (mangled
, 0);
259 return *demangled
!= NULL
;
262 /* See language.h. */
264 gdb::unique_xmalloc_ptr
<char> demangle_symbol (const char *mangled
,
265 int options
) const override
;
267 /* See language.h. */
269 bool can_print_type_offsets () const override
274 /* See language.h. */
276 void print_type (struct type
*type
, const char *varstring
,
277 struct ui_file
*stream
, int show
, int level
,
278 const struct type_print_options
*flags
) const override
280 c_print_type (type
, varstring
, stream
, show
, level
, la_language
, flags
);
283 /* See language.h. */
285 CORE_ADDR
skip_trampoline (frame_info_ptr frame
,
286 CORE_ADDR stop_pc
) const override
288 struct gdbarch
*gdbarch
= get_frame_arch (frame
);
289 CORE_ADDR real_stop_pc
;
290 CORE_ADDR method_stop_pc
;
292 /* Determine if we are currently in the Objective-C dispatch function.
293 If so, get the address of the method function that the dispatcher
294 would call and use that as the function to step into instead. Also
295 skip over the trampoline for the function (if any). This is better
296 for the user since they are only interested in stepping into the
297 method function anyway. */
299 real_stop_pc
= gdbarch_skip_trampoline_code (gdbarch
, frame
, stop_pc
);
301 if (real_stop_pc
!= 0)
302 find_objc_msgcall (real_stop_pc
, &method_stop_pc
);
304 find_objc_msgcall (stop_pc
, &method_stop_pc
);
308 real_stop_pc
= gdbarch_skip_trampoline_code
309 (gdbarch
, frame
, method_stop_pc
);
310 if (real_stop_pc
== 0)
311 real_stop_pc
= method_stop_pc
;
317 /* See language.h. */
319 const char *name_of_this () const override
322 /* See language.h. */
324 enum macro_expansion
macro_expansion () const override
325 { return macro_expansion_c
; }
328 /* See declaration of objc_language::demangle_symbol above. */
330 gdb::unique_xmalloc_ptr
<char>
331 objc_language::demangle_symbol (const char *mangled
, int options
) const
333 char *demangled
, *cp
;
335 if (mangled
[0] == '_'
336 && (mangled
[1] == 'i' || mangled
[1] == 'c')
337 && mangled
[2] == '_')
339 cp
= demangled
= (char *) xmalloc (strlen (mangled
) + 2);
341 if (mangled
[1] == 'i')
342 *cp
++ = '-'; /* for instance method */
344 *cp
++ = '+'; /* for class method */
346 *cp
++ = '['; /* opening left brace */
347 strcpy(cp
, mangled
+3); /* Tack on the rest of the mangled name. */
349 while (*cp
!= '\0' && *cp
== '_')
350 cp
++; /* Skip any initial underbars in class
353 cp
= strchr(cp
, '_');
354 if (cp
== nullptr) /* Find first non-initial underbar. */
356 xfree(demangled
); /* not mangled name */
359 if (cp
[1] == '_') /* Easy case: no category name. */
361 *cp
++ = ' '; /* Replace two '_' with one ' '. */
362 strcpy(cp
, mangled
+ (cp
- demangled
) + 2);
366 *cp
++ = '('; /* Less easy case: category name. */
367 cp
= strchr(cp
, '_');
370 xfree(demangled
); /* not mangled name */
374 *cp
++ = ' '; /* Overwriting 1st char of method name... */
375 strcpy(cp
, mangled
+ (cp
- demangled
)); /* Get it back. */
378 while (*cp
!= '\0' && *cp
== '_')
379 cp
++; /* Skip any initial underbars in
382 for (; *cp
!= '\0'; cp
++)
384 *cp
= ':'; /* Replace remaining '_' with ':'. */
386 *cp
++ = ']'; /* closing right brace */
387 *cp
++ = 0; /* string terminator */
388 return gdb::unique_xmalloc_ptr
<char> (demangled
);
391 return nullptr; /* Not an objc mangled name. */
394 /* Single instance of the class representing the Objective-C language. */
396 static objc_language objc_language_defn
;
400 * Following functions help construct Objective-C message calls.
403 struct selname
/* For parsing Objective-C. */
405 struct selname
*next
;
410 static int msglist_len
;
411 static struct selname
*selname_chain
;
412 static char *msglist_sel
;
417 struct selname
*newobj
= XNEW (struct selname
);
419 newobj
->next
= selname_chain
;
420 newobj
->msglist_len
= msglist_len
;
421 newobj
->msglist_sel
= msglist_sel
;
423 msglist_sel
= (char *)xmalloc(1);
425 selname_chain
= newobj
;
429 add_msglist(struct stoken
*str
, int addcolon
)
435 if (str
== 0) /* Unnamed arg, or... */
437 if (addcolon
== 0) /* variable number of args. */
450 len
= plen
+ strlen(msglist_sel
) + 2;
451 s
= (char *)xmalloc(len
);
452 strcpy(s
, msglist_sel
);
467 end_msglist (struct parser_state
*ps
)
469 int val
= msglist_len
;
470 struct selname
*sel
= selname_chain
;
471 char *p
= msglist_sel
;
474 std::vector
<expr::operation_up
> args
= ps
->pop_vector (val
);
475 expr::operation_up target
= ps
->pop ();
477 selname_chain
= sel
->next
;
478 msglist_len
= sel
->msglist_len
;
479 msglist_sel
= sel
->msglist_sel
;
480 selid
= lookup_child_selector (ps
->gdbarch (), p
);
482 error (_("Can't find selector \"%s\""), p
);
484 ps
->push_new
<expr::objc_msgcall_operation
> (selid
, std::move (target
),
494 * Function: specialcmp (const char *a, const char *b)
496 * Special strcmp: treats ']' and ' ' as end-of-string.
497 * Used for qsorting lists of objc methods (either by class or selector).
501 specialcmp (const char *a
, const char *b
)
503 while (*a
&& *a
!= ' ' && *a
!= ']' && *b
&& *b
!= ' ' && *b
!= ']')
509 if (*a
&& *a
!= ' ' && *a
!= ']')
510 return 1; /* a is longer therefore greater. */
511 if (*b
&& *b
!= ' ' && *b
!= ']')
512 return -1; /* a is shorter therefore lesser. */
513 return 0; /* a and b are identical. */
517 * Function: compare_selectors (const void *, const void *)
519 * Comparison function for use with qsort. Arguments are symbols or
520 * msymbols Compares selector part of objc method name alphabetically.
524 compare_selectors (const void *a
, const void *b
)
526 const char *aname
, *bname
;
528 aname
= (*(struct symbol
**) a
)->print_name ();
529 bname
= (*(struct symbol
**) b
)->print_name ();
530 if (aname
== NULL
|| bname
== NULL
)
531 error (_("internal: compare_selectors(1)"));
533 aname
= strchr(aname
, ' ');
534 bname
= strchr(bname
, ' ');
535 if (aname
== NULL
|| bname
== NULL
)
536 error (_("internal: compare_selectors(2)"));
538 return specialcmp (aname
+1, bname
+1);
542 * Function: selectors_info (regexp, from_tty)
544 * Implements the "Info selectors" command. Takes an optional regexp
545 * arg. Lists all objective c selectors that match the regexp. Works
546 * by grepping thru all symbols for objective c methods. Output list
547 * is sorted and uniqued.
551 info_selectors_command (const char *regexp
, int from_tty
)
560 struct symbol
**sym_arr
;
564 strcpy(myregexp
, ".*]"); /* Null input, match all objc methods. */
567 if (*regexp
== '+' || *regexp
== '-')
568 { /* User wants only class methods or only instance methods. */
569 plusminus
= *regexp
++;
570 while (*regexp
== ' ' || *regexp
== '\t')
574 strcpy(myregexp
, ".*]");
577 /* Allow a few extra bytes because of the strcat below. */
578 if (sizeof (myregexp
) < strlen (regexp
) + 4)
579 error (_("Regexp is too long: %s"), regexp
);
580 strcpy(myregexp
, regexp
);
581 if (myregexp
[strlen(myregexp
) - 1] == '$') /* end of selector */
582 myregexp
[strlen(myregexp
) - 1] = ']'; /* end of method name */
584 strcat(myregexp
, ".*]");
590 val
= re_comp (myregexp
);
592 error (_("Invalid regexp (%s): %s"), val
, regexp
);
595 /* First time thru is JUST to get max length and count. */
596 for (objfile
*objfile
: current_program_space
->objfiles ())
598 for (minimal_symbol
*msymbol
: objfile
->msymbols ())
601 name
= msymbol
->natural_name ();
603 && (name
[0] == '-' || name
[0] == '+')
604 && name
[1] == '[') /* Got a method name. */
606 /* Filter for class/instance methods. */
607 if (plusminus
&& name
[0] != plusminus
)
609 /* Find selector part. */
610 name
= (char *) strchr (name
+2, ' ');
613 complaint (_("Bad method name '%s'"),
614 msymbol
->natural_name ());
617 if (regexp
== NULL
|| re_exec(++name
) != 0)
619 const char *mystart
= name
;
620 const char *myend
= strchr (mystart
, ']');
622 if (myend
&& (myend
- mystart
> maxlen
))
623 maxlen
= myend
- mystart
; /* Get longest selector. */
631 gdb_printf (_("Selectors matching \"%s\":\n\n"),
632 regexp
? regexp
: "*");
634 sym_arr
= XALLOCAVEC (struct symbol
*, matches
);
636 for (objfile
*objfile
: current_program_space
->objfiles ())
638 for (minimal_symbol
*msymbol
: objfile
->msymbols ())
641 name
= msymbol
->natural_name ();
643 (name
[0] == '-' || name
[0] == '+') &&
644 name
[1] == '[') /* Got a method name. */
646 /* Filter for class/instance methods. */
647 if (plusminus
&& name
[0] != plusminus
)
649 /* Find selector part. */
650 name
= (char *) strchr(name
+2, ' ');
651 if (regexp
== NULL
|| re_exec(++name
) != 0)
652 sym_arr
[matches
++] = (struct symbol
*) msymbol
;
657 qsort (sym_arr
, matches
, sizeof (struct minimal_symbol
*),
659 /* Prevent compare on first iteration. */
661 for (ix
= 0; ix
< matches
; ix
++) /* Now do the output. */
666 name
= sym_arr
[ix
]->natural_name ();
667 name
= strchr (name
, ' ') + 1;
668 if (p
[0] && specialcmp(name
, p
) == 0)
669 continue; /* Seen this one already (not unique). */
671 /* Copy selector part. */
672 while (*name
&& *name
!= ']')
675 /* Print in columns. */
676 puts_tabular(asel
, maxlen
+ 1, 0);
681 gdb_printf (_("No selectors matching \"%s\"\n"),
682 regexp
? regexp
: "*");
686 * Function: compare_classes (const void *, const void *)
688 * Comparison function for use with qsort. Arguments are symbols or
689 * msymbols Compares class part of objc method name alphabetically.
693 compare_classes (const void *a
, const void *b
)
695 const char *aname
, *bname
;
697 aname
= (*(struct symbol
**) a
)->print_name ();
698 bname
= (*(struct symbol
**) b
)->print_name ();
699 if (aname
== NULL
|| bname
== NULL
)
700 error (_("internal: compare_classes(1)"));
702 return specialcmp (aname
+1, bname
+1);
706 * Function: classes_info(regexp, from_tty)
708 * Implements the "info classes" command for objective c classes.
709 * Lists all objective c classes that match the optional regexp.
710 * Works by grepping thru the list of objective c methods. List will
711 * be sorted and uniqued (since one class may have many methods).
712 * BUGS: will not list a class that has no methods.
716 info_classes_command (const char *regexp
, int from_tty
)
725 struct symbol
**sym_arr
;
728 strcpy(myregexp
, ".* "); /* Null input: match all objc classes. */
731 /* Allow a few extra bytes because of the strcat below. */
732 if (sizeof (myregexp
) < strlen (regexp
) + 4)
733 error (_("Regexp is too long: %s"), regexp
);
734 strcpy(myregexp
, regexp
);
735 if (myregexp
[strlen(myregexp
) - 1] == '$')
736 /* In the method name, the end of the class name is marked by ' '. */
737 myregexp
[strlen(myregexp
) - 1] = ' ';
739 strcat(myregexp
, ".* ");
744 val
= re_comp (myregexp
);
746 error (_("Invalid regexp (%s): %s"), val
, regexp
);
749 /* First time thru is JUST to get max length and count. */
750 for (objfile
*objfile
: current_program_space
->objfiles ())
752 for (minimal_symbol
*msymbol
: objfile
->msymbols ())
755 name
= msymbol
->natural_name ();
757 (name
[0] == '-' || name
[0] == '+') &&
758 name
[1] == '[') /* Got a method name. */
759 if (regexp
== NULL
|| re_exec(name
+2) != 0)
761 /* Compute length of classname part. */
762 const char *mystart
= name
+ 2;
763 const char *myend
= strchr (mystart
, ' ');
765 if (myend
&& (myend
- mystart
> maxlen
))
766 maxlen
= myend
- mystart
;
773 gdb_printf (_("Classes matching \"%s\":\n\n"),
774 regexp
? regexp
: "*");
775 sym_arr
= XALLOCAVEC (struct symbol
*, matches
);
777 for (objfile
*objfile
: current_program_space
->objfiles ())
779 for (minimal_symbol
*msymbol
: objfile
->msymbols ())
782 name
= msymbol
->natural_name ();
784 (name
[0] == '-' || name
[0] == '+') &&
785 name
[1] == '[') /* Got a method name. */
786 if (regexp
== NULL
|| re_exec(name
+2) != 0)
787 sym_arr
[matches
++] = (struct symbol
*) msymbol
;
791 qsort (sym_arr
, matches
, sizeof (struct minimal_symbol
*),
793 /* Prevent compare on first iteration. */
795 for (ix
= 0; ix
< matches
; ix
++) /* Now do the output. */
800 name
= sym_arr
[ix
]->natural_name ();
802 if (p
[0] && specialcmp(name
, p
) == 0)
803 continue; /* Seen this one already (not unique). */
805 /* Copy class part of method name. */
806 while (*name
&& *name
!= ' ')
809 /* Print in columns. */
810 puts_tabular(aclass
, maxlen
+ 1, 0);
815 gdb_printf (_("No classes matching \"%s\"\n"), regexp
? regexp
: "*");
819 parse_selector (char *method
, char **selector
)
825 char *nselector
= NULL
;
827 gdb_assert (selector
!= NULL
);
831 s1
= skip_spaces (s1
);
837 s1
= skip_spaces (s1
);
844 if (isalnum (*s2
) || (*s2
== '_') || (*s2
== ':'))
846 else if (isspace (*s2
))
848 else if ((*s2
== '\0') || (*s2
== '\''))
856 s2
= skip_spaces (s2
);
861 s2
= skip_spaces (s2
);
864 if (selector
!= NULL
)
865 *selector
= nselector
;
871 parse_method (char *method
, char *type
, char **theclass
,
872 char **category
, char **selector
)
880 char *ncategory
= NULL
;
881 char *nselector
= NULL
;
883 gdb_assert (type
!= NULL
);
884 gdb_assert (theclass
!= NULL
);
885 gdb_assert (category
!= NULL
);
886 gdb_assert (selector
!= NULL
);
890 s1
= skip_spaces (s1
);
896 s1
= skip_spaces (s1
);
898 if ((s1
[0] == '+') || (s1
[0] == '-'))
901 s1
= skip_spaces (s1
);
908 while (isalnum (*s1
) || (*s1
== '_'))
912 s2
= skip_spaces (s2
);
917 s2
= skip_spaces (s2
);
919 while (isalnum (*s2
) || (*s2
== '_'))
924 /* Truncate the class name now that we're not using the open paren. */
932 if (isalnum (*s2
) || (*s2
== '_') || (*s2
== ':'))
934 else if (isspace (*s2
))
945 s2
= skip_spaces (s2
);
951 s2
= skip_spaces (s2
);
956 if (theclass
!= NULL
)
958 if (category
!= NULL
)
959 *category
= ncategory
;
960 if (selector
!= NULL
)
961 *selector
= nselector
;
967 find_methods (char type
, const char *theclass
, const char *category
,
968 const char *selector
,
969 std::vector
<const char *> *symbol_names
)
971 const char *symname
= NULL
;
975 char *ncategory
= NULL
;
976 char *nselector
= NULL
;
978 static char *tmp
= NULL
;
979 static unsigned int tmplen
= 0;
981 gdb_assert (symbol_names
!= NULL
);
983 for (objfile
*objfile
: current_program_space
->objfiles ())
985 unsigned int *objc_csym
;
987 /* The objfile_csym variable counts the number of ObjC methods
988 that this objfile defines. We save that count as a private
989 objfile data. If we have already determined that this objfile
990 provides no ObjC methods, we can skip it entirely. */
992 unsigned int objfile_csym
= 0;
994 objc_csym
= objc_objfile_data
.get (objfile
);
995 if (objc_csym
!= NULL
&& *objc_csym
== 0)
996 /* There are no ObjC symbols in this objfile. Skip it entirely. */
999 for (minimal_symbol
*msymbol
: objfile
->msymbols ())
1003 /* Check the symbol name first as this can be done entirely without
1004 sending any query to the target. */
1005 symname
= msymbol
->natural_name ();
1006 if (symname
== NULL
)
1009 if ((symname
[0] != '-' && symname
[0] != '+') || (symname
[1] != '['))
1010 /* Not a method name. */
1015 /* Now that thinks are a bit sane, clean up the symname. */
1016 while ((strlen (symname
) + 1) >= tmplen
)
1018 tmplen
= (tmplen
== 0) ? 1024 : tmplen
* 2;
1019 tmp
= (char *) xrealloc (tmp
, tmplen
);
1021 strcpy (tmp
, symname
);
1023 if (parse_method (tmp
, &ntype
, &nclass
,
1024 &ncategory
, &nselector
) == NULL
)
1027 if ((type
!= '\0') && (ntype
!= type
))
1030 if ((theclass
!= NULL
)
1031 && ((nclass
== NULL
) || (strcmp (theclass
, nclass
) != 0)))
1034 if ((category
!= NULL
) &&
1035 ((ncategory
== NULL
) || (strcmp (category
, ncategory
) != 0)))
1038 if ((selector
!= NULL
) &&
1039 ((nselector
== NULL
) || (strcmp (selector
, nselector
) != 0)))
1042 symbol_names
->push_back (symname
);
1045 if (objc_csym
== NULL
)
1046 objc_csym
= objc_objfile_data
.emplace (objfile
, objfile_csym
);
1048 /* Count of ObjC methods in this objfile should be constant. */
1049 gdb_assert (*objc_csym
== objfile_csym
);
1053 /* Uniquify a vector of strings. */
1056 uniquify_strings (std::vector
<const char *> *strings
)
1058 if (strings
->empty ())
1061 std::sort (strings
->begin (), strings
->end (), compare_cstrings
);
1062 strings
->erase (std::unique (strings
->begin (), strings
->end (), streq
),
1067 * Function: find_imps (const char *selector, struct symbol **sym_arr)
1069 * Input: a string representing a selector
1070 * a pointer to an array of symbol pointers
1071 * possibly a pointer to a symbol found by the caller.
1073 * Output: number of methods that implement that selector. Side
1074 * effects: The array of symbol pointers is filled with matching syms.
1076 * By analogy with function "find_methods" (symtab.c), builds a list
1077 * of symbols matching the ambiguous input, so that "decode_line_2"
1078 * (symtab.c) can list them and ask the user to choose one or more.
1079 * In this case the matches are objective c methods
1080 * ("implementations") matching an objective c selector.
1082 * Note that it is possible for a normal (c-style) function to have
1083 * the same name as an objective c selector. To prevent the selector
1084 * from eclipsing the function, we allow the caller (decode_line_1) to
1085 * search for such a function first, and if it finds one, pass it in
1086 * to us. We will then integrate it into the list. We also search
1087 * for one here, among the minsyms.
1089 * NOTE: if NUM_DEBUGGABLE is non-zero, the sym_arr will be divided
1090 * into two parts: debuggable (struct symbol) syms, and
1091 * non_debuggable (struct minimal_symbol) syms. The debuggable
1092 * ones will come first, before NUM_DEBUGGABLE (which will thus
1093 * be the index of the first non-debuggable one).
1097 find_imps (const char *method
, std::vector
<const char *> *symbol_names
)
1100 char *theclass
= NULL
;
1101 char *category
= NULL
;
1102 char *selector
= NULL
;
1107 int selector_case
= 0;
1109 gdb_assert (symbol_names
!= NULL
);
1111 buf
= (char *) alloca (strlen (method
) + 1);
1112 strcpy (buf
, method
);
1113 tmp
= parse_method (buf
, &type
, &theclass
, &category
, &selector
);
1117 strcpy (buf
, method
);
1118 tmp
= parse_selector (buf
, &selector
);
1126 find_methods (type
, theclass
, category
, selector
, symbol_names
);
1128 /* If we hit the "selector" case, and we found some methods, then
1129 add the selector itself as a symbol, if it exists. */
1130 if (selector_case
&& !symbol_names
->empty ())
1132 struct symbol
*sym
= lookup_symbol (selector
, NULL
, VAR_DOMAIN
,
1136 symbol_names
->push_back (sym
->natural_name ());
1139 struct bound_minimal_symbol msym
1140 = lookup_minimal_symbol (selector
, 0, 0);
1142 if (msym
.minsym
!= NULL
)
1143 symbol_names
->push_back (msym
.minsym
->natural_name ());
1147 uniquify_strings (symbol_names
);
1149 return method
+ (tmp
- buf
);
1153 print_object_command (const char *args
, int from_tty
)
1155 struct value
*object
, *function
, *description
;
1156 CORE_ADDR string_addr
, object_addr
;
1160 if (!args
|| !*args
)
1162 "The 'print-object' command requires an argument (an Objective-C object)");
1165 expression_up expr
= parse_expression (args
);
1168 = evaluate_expression (expr
.get (),
1169 builtin_type (expr
->gdbarch
)->builtin_data_ptr
);
1172 /* Validate the address for sanity. */
1173 object_addr
= value_as_long (object
);
1174 read_memory (object_addr
, &c
, 1);
1176 function
= find_function_in_inferior ("_NSPrintForDebugger", NULL
);
1177 if (function
== NULL
)
1178 error (_("Unable to locate _NSPrintForDebugger in child process"));
1180 description
= call_function_by_hand (function
, NULL
, object
);
1182 string_addr
= value_as_long (description
);
1183 if (string_addr
== 0)
1184 error (_("object returns null description"));
1186 read_memory (string_addr
+ i
++, &c
, 1);
1189 { /* Read and print characters up to EOS. */
1191 gdb_printf ("%c", c
);
1192 read_memory (string_addr
+ i
++, &c
, 1);
1195 gdb_printf(_("<object returns empty description>"));
1199 /* The data structure 'methcalls' is used to detect method calls (thru
1200 * ObjC runtime lib functions objc_msgSend, objc_msgSendSuper, etc.),
1201 * and ultimately find the method being called.
1204 struct objc_methcall
{
1206 /* Return instance method to be called. */
1207 int (*stop_at
) (CORE_ADDR
, CORE_ADDR
*);
1208 /* Start of pc range corresponding to method invocation. */
1210 /* End of pc range corresponding to method invocation. */
1214 static int resolve_msgsend (CORE_ADDR pc
, CORE_ADDR
*new_pc
);
1215 static int resolve_msgsend_stret (CORE_ADDR pc
, CORE_ADDR
*new_pc
);
1216 static int resolve_msgsend_super (CORE_ADDR pc
, CORE_ADDR
*new_pc
);
1217 static int resolve_msgsend_super_stret (CORE_ADDR pc
, CORE_ADDR
*new_pc
);
1219 static struct objc_methcall methcalls
[] = {
1220 { "_objc_msgSend", resolve_msgsend
, 0, 0},
1221 { "_objc_msgSend_stret", resolve_msgsend_stret
, 0, 0},
1222 { "_objc_msgSendSuper", resolve_msgsend_super
, 0, 0},
1223 { "_objc_msgSendSuper_stret", resolve_msgsend_super_stret
, 0, 0},
1224 { "_objc_getClass", NULL
, 0, 0},
1225 { "_objc_getMetaClass", NULL
, 0, 0}
1228 #define nmethcalls (sizeof (methcalls) / sizeof (methcalls[0]))
1230 /* The following function, "find_objc_msgsend", fills in the data
1231 * structure "objc_msgs" by finding the addresses of each of the
1232 * (currently four) functions that it holds (of which objc_msgSend is
1233 * the first). This must be called each time symbols are loaded, in
1234 * case the functions have moved for some reason.
1238 find_objc_msgsend (void)
1242 for (i
= 0; i
< nmethcalls
; i
++)
1244 struct bound_minimal_symbol func
;
1246 /* Try both with and without underscore. */
1247 func
= lookup_bound_minimal_symbol (methcalls
[i
].name
);
1248 if ((func
.minsym
== NULL
) && (methcalls
[i
].name
[0] == '_'))
1250 func
= lookup_bound_minimal_symbol (methcalls
[i
].name
+ 1);
1252 if (func
.minsym
== NULL
)
1254 methcalls
[i
].begin
= 0;
1255 methcalls
[i
].end
= 0;
1259 methcalls
[i
].begin
= func
.value_address ();
1260 methcalls
[i
].end
= minimal_symbol_upper_bound (func
);
1264 /* find_objc_msgcall (replaces pc_off_limits)
1266 * ALL that this function now does is to determine whether the input
1267 * address ("pc") is the address of one of the Objective-C message
1268 * dispatch functions (mainly objc_msgSend or objc_msgSendSuper), and
1269 * if so, it returns the address of the method that will be called.
1271 * The old function "pc_off_limits" used to do a lot of other things
1272 * in addition, such as detecting shared library jump stubs and
1273 * returning the address of the shlib function that would be called.
1274 * That functionality has been moved into the gdbarch_skip_trampoline_code and
1275 * IN_SOLIB_TRAMPOLINE macros, which are resolved in the target-
1276 * dependent modules.
1280 find_objc_msgcall_submethod (int (*f
) (CORE_ADDR
, CORE_ADDR
*),
1286 if (f (pc
, new_pc
) == 0)
1289 catch (const gdb_exception
&ex
)
1291 exception_fprintf (gdb_stderr
, ex
,
1292 "Unable to determine target of "
1293 "Objective-C method call (ignoring):\n");
1300 find_objc_msgcall (CORE_ADDR pc
, CORE_ADDR
*new_pc
)
1304 find_objc_msgsend ();
1310 for (i
= 0; i
< nmethcalls
; i
++)
1311 if ((pc
>= methcalls
[i
].begin
) && (pc
< methcalls
[i
].end
))
1313 if (methcalls
[i
].stop_at
!= NULL
)
1314 return find_objc_msgcall_submethod (methcalls
[i
].stop_at
,
1323 void _initialize_objc_language ();
1325 _initialize_objc_language ()
1327 add_info ("selectors", info_selectors_command
,
1328 _("All Objective-C selectors, or those matching REGEXP."));
1329 add_info ("classes", info_classes_command
,
1330 _("All Objective-C classes, or those matching REGEXP."));
1331 cmd_list_element
*print_object_cmd
1332 = add_com ("print-object", class_vars
, print_object_command
,
1333 _("Ask an Objective-C object to print itself."));
1334 add_com_alias ("po", print_object_cmd
, class_vars
, 1);
1338 read_objc_method (struct gdbarch
*gdbarch
, CORE_ADDR addr
,
1339 struct objc_method
*method
)
1341 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1343 method
->name
= read_memory_unsigned_integer (addr
+ 0, 4, byte_order
);
1344 method
->types
= read_memory_unsigned_integer (addr
+ 4, 4, byte_order
);
1345 method
->imp
= read_memory_unsigned_integer (addr
+ 8, 4, byte_order
);
1348 static unsigned long
1349 read_objc_methlist_nmethods (struct gdbarch
*gdbarch
, CORE_ADDR addr
)
1351 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1353 return read_memory_unsigned_integer (addr
+ 4, 4, byte_order
);
1357 read_objc_methlist_method (struct gdbarch
*gdbarch
, CORE_ADDR addr
,
1358 unsigned long num
, struct objc_method
*method
)
1360 gdb_assert (num
< read_objc_methlist_nmethods (gdbarch
, addr
));
1361 read_objc_method (gdbarch
, addr
+ 8 + (12 * num
), method
);
1365 read_objc_object (struct gdbarch
*gdbarch
, CORE_ADDR addr
,
1366 struct objc_object
*object
)
1368 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1370 object
->isa
= read_memory_unsigned_integer (addr
, 4, byte_order
);
1374 read_objc_super (struct gdbarch
*gdbarch
, CORE_ADDR addr
,
1375 struct objc_super
*super
)
1377 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1379 super
->receiver
= read_memory_unsigned_integer (addr
, 4, byte_order
);
1380 super
->theclass
= read_memory_unsigned_integer (addr
+ 4, 4, byte_order
);
1384 read_objc_class (struct gdbarch
*gdbarch
, CORE_ADDR addr
,
1385 struct objc_class
*theclass
)
1387 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1389 theclass
->isa
= read_memory_unsigned_integer (addr
, 4, byte_order
);
1390 theclass
->super_class
= read_memory_unsigned_integer (addr
+ 4, 4, byte_order
);
1391 theclass
->name
= read_memory_unsigned_integer (addr
+ 8, 4, byte_order
);
1392 theclass
->version
= read_memory_unsigned_integer (addr
+ 12, 4, byte_order
);
1393 theclass
->info
= read_memory_unsigned_integer (addr
+ 16, 4, byte_order
);
1394 theclass
->instance_size
= read_memory_unsigned_integer (addr
+ 18, 4,
1396 theclass
->ivars
= read_memory_unsigned_integer (addr
+ 24, 4, byte_order
);
1397 theclass
->methods
= read_memory_unsigned_integer (addr
+ 28, 4, byte_order
);
1398 theclass
->cache
= read_memory_unsigned_integer (addr
+ 32, 4, byte_order
);
1399 theclass
->protocols
= read_memory_unsigned_integer (addr
+ 36, 4, byte_order
);
1403 find_implementation_from_class (struct gdbarch
*gdbarch
,
1404 CORE_ADDR theclass
, CORE_ADDR sel
)
1406 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1407 CORE_ADDR subclass
= theclass
;
1409 while (subclass
!= 0)
1412 struct objc_class class_str
;
1413 unsigned mlistnum
= 0;
1415 read_objc_class (gdbarch
, subclass
, &class_str
);
1420 unsigned long nmethods
;
1423 mlist
= read_memory_unsigned_integer (class_str
.methods
+
1429 nmethods
= read_objc_methlist_nmethods (gdbarch
, mlist
);
1431 for (i
= 0; i
< nmethods
; i
++)
1433 struct objc_method meth_str
;
1435 read_objc_methlist_method (gdbarch
, mlist
, i
, &meth_str
);
1437 if (meth_str
.name
== sel
)
1438 /* FIXME: hppa arch was doing a pointer dereference
1439 here. There needs to be a better way to do that. */
1440 return meth_str
.imp
;
1444 subclass
= class_str
.super_class
;
1451 find_implementation (struct gdbarch
*gdbarch
,
1452 CORE_ADDR object
, CORE_ADDR sel
)
1454 struct objc_object ostr
;
1458 read_objc_object (gdbarch
, object
, &ostr
);
1462 return find_implementation_from_class (gdbarch
, ostr
.isa
, sel
);
1466 resolve_msgsend (CORE_ADDR pc
, CORE_ADDR
*new_pc
)
1468 frame_info_ptr frame
= get_current_frame ();
1469 struct gdbarch
*gdbarch
= get_frame_arch (frame
);
1470 struct type
*ptr_type
= builtin_type (gdbarch
)->builtin_func_ptr
;
1476 object
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 0, ptr_type
);
1477 sel
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 1, ptr_type
);
1479 res
= find_implementation (gdbarch
, object
, sel
);
1488 resolve_msgsend_stret (CORE_ADDR pc
, CORE_ADDR
*new_pc
)
1490 frame_info_ptr frame
= get_current_frame ();
1491 struct gdbarch
*gdbarch
= get_frame_arch (frame
);
1492 struct type
*ptr_type
= builtin_type (gdbarch
)->builtin_func_ptr
;
1498 object
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 1, ptr_type
);
1499 sel
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 2, ptr_type
);
1501 res
= find_implementation (gdbarch
, object
, sel
);
1510 resolve_msgsend_super (CORE_ADDR pc
, CORE_ADDR
*new_pc
)
1512 frame_info_ptr frame
= get_current_frame ();
1513 struct gdbarch
*gdbarch
= get_frame_arch (frame
);
1514 struct type
*ptr_type
= builtin_type (gdbarch
)->builtin_func_ptr
;
1516 struct objc_super sstr
;
1522 super
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 0, ptr_type
);
1523 sel
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 1, ptr_type
);
1525 read_objc_super (gdbarch
, super
, &sstr
);
1526 if (sstr
.theclass
== 0)
1529 res
= find_implementation_from_class (gdbarch
, sstr
.theclass
, sel
);
1538 resolve_msgsend_super_stret (CORE_ADDR pc
, CORE_ADDR
*new_pc
)
1540 frame_info_ptr frame
= get_current_frame ();
1541 struct gdbarch
*gdbarch
= get_frame_arch (frame
);
1542 struct type
*ptr_type
= builtin_type (gdbarch
)->builtin_func_ptr
;
1544 struct objc_super sstr
;
1550 super
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 1, ptr_type
);
1551 sel
= gdbarch_fetch_pointer_argument (gdbarch
, frame
, 2, ptr_type
);
1553 read_objc_super (gdbarch
, super
, &sstr
);
1554 if (sstr
.theclass
== 0)
1557 res
= find_implementation_from_class (gdbarch
, sstr
.theclass
, sel
);