X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fobjc-lang.c;h=e2a6e800b55e8bcf01f2ebd649a919b7a8dba87b;hb=d0801dd8f22a3e739c6a7d126d45829df981794d;hp=624310e3b0119b530a7a60e63e1453b997b802fd;hpb=7022349d5c86bae74b49225515f42d2e221bd368;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index 624310e3b0..e2a6e800b5 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -1,6 +1,6 @@ /* Objective-C language support routines for GDB, the GNU debugger. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2019 Free Software Foundation, Inc. Contributed by Apple Computer, Inc. Written by Michael Snyder. @@ -45,6 +45,7 @@ #include "cli/cli-utils.h" #include +#include struct objc_object { CORE_ADDR isa; @@ -74,7 +75,7 @@ struct objc_method { CORE_ADDR imp; }; -static const struct objfile_data *objc_objfile_data; +static const struct objfile_key objc_objfile_data; /* Lookup a structure type named "struct NAME", visible in lexical block BLOCK. If NOERR is nonzero, return zero if NAME is not @@ -123,8 +124,7 @@ lookup_objc_class (struct gdbarch *gdbarch, const char *classname) function = find_function_in_inferior("objc_lookup_class", NULL); else { - complaint (&symfile_complaints, - _("no way to lookup Objective-C classes")); + complaint (_("no way to lookup Objective-C classes")); return 0; } @@ -132,7 +132,7 @@ lookup_objc_class (struct gdbarch *gdbarch, const char *classname) classval = value_coerce_array (classval); return (CORE_ADDR) value_as_long (call_function_by_hand (function, NULL, - 1, &classval)); + classval)); } CORE_ADDR @@ -153,15 +153,14 @@ lookup_child_selector (struct gdbarch *gdbarch, const char *selname) function = find_function_in_inferior("sel_get_any_uid", NULL); else { - complaint (&symfile_complaints, - _("no way to lookup Objective-C selectors")); + complaint (_("no way to lookup Objective-C selectors")); return 0; } selstring = value_coerce_array (value_string (selname, strlen (selname) + 1, char_type)); - return value_as_long (call_function_by_hand (function, NULL, 1, &selstring)); + return value_as_long (call_function_by_hand (function, NULL, selstring)); } struct value * @@ -182,13 +181,12 @@ value_nsstring (struct gdbarch *gdbarch, char *ptr, int len) if (lookup_minimal_symbol("_NSNewStringFromCString", 0, 0).minsym) { function = find_function_in_inferior("_NSNewStringFromCString", NULL); - nsstringValue = call_function_by_hand(function, - NULL, 1, &stringValue[2]); + nsstringValue = call_function_by_hand(function, NULL, stringValue[2]); } else if (lookup_minimal_symbol("istr", 0, 0).minsym) { function = find_function_in_inferior("istr", NULL); - nsstringValue = call_function_by_hand(function, NULL, 1, &stringValue[2]); + nsstringValue = call_function_by_hand(function, NULL, stringValue[2]); } else if (lookup_minimal_symbol("+[NSString stringWithCString:]", 0, 0).minsym) { @@ -200,7 +198,7 @@ value_nsstring (struct gdbarch *gdbarch, char *ptr, int len) (type, lookup_objc_class (gdbarch, "NSString")); stringValue[1] = value_from_longest (type, lookup_child_selector (gdbarch, "stringWithCString:")); - nsstringValue = call_function_by_hand(function, NULL, 3, &stringValue[0]); + nsstringValue = call_function_by_hand(function, NULL, stringValue); } else error (_("NSString: internal error -- no way to create new NSString")); @@ -377,7 +375,6 @@ extern const struct language_defn objc_language_defn = { objc_extensions, &exp_descriptor_standard, c_parse, - c_yyerror, null_post_parser, c_printchar, /* Print a character constant */ c_printstr, /* Function to print string constant */ @@ -389,6 +386,7 @@ extern const struct language_defn objc_language_defn = { default_read_var_value, /* la_read_var_value */ objc_skip_trampoline, /* Language specific skip_trampoline */ "self", /* name_of_this */ + false, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ objc_demangle, /* Language specific symbol demangler */ @@ -403,14 +401,15 @@ extern const struct language_defn objc_language_defn = { c_language_arch_info, default_print_array_index, default_pass_by_reference, - default_get_string, c_watch_location_expression, - NULL, /* la_get_symbol_name_cmp */ + NULL, /* la_get_symbol_name_matcher */ iterate_over_symbols, + default_search_name_hash, &default_varobj_ops, NULL, NULL, - LANG_MAGIC + c_is_string_type_p, + "{...}" /* la_struct_too_deep_ellipsis */ }; /* @@ -492,7 +491,7 @@ end_msglist (struct parser_state *ps) selname_chain = sel->next; msglist_len = sel->msglist_len; msglist_sel = sel->msglist_sel; - selid = lookup_child_selector (parse_gdbarch (ps), p); + selid = lookup_child_selector (ps->gdbarch (), p); if (!selid) error (_("Can't find selector \"%s\""), p); write_exp_elt_longcst (ps, selid); @@ -538,8 +537,8 @@ compare_selectors (const void *a, const void *b) { const char *aname, *bname; - aname = SYMBOL_PRINT_NAME (*(struct symbol **) a); - bname = SYMBOL_PRINT_NAME (*(struct symbol **) b); + aname = (*(struct symbol **) a)->print_name (); + bname = (*(struct symbol **) b)->print_name (); if (aname == NULL || bname == NULL) error (_("internal: compare_selectors(1)")); @@ -561,10 +560,8 @@ compare_selectors (const void *a, const void *b) */ static void -info_selectors_command (char *regexp, int from_tty) +info_selectors_command (const char *regexp, int from_tty) { - struct objfile *objfile; - struct minimal_symbol *msymbol; const char *name; char *val; int matches = 0; @@ -608,34 +605,36 @@ info_selectors_command (char *regexp, int from_tty) } /* First time thru is JUST to get max length and count. */ - ALL_MSYMBOLS (objfile, msymbol) + for (objfile *objfile : current_program_space->objfiles ()) { - QUIT; - name = MSYMBOL_NATURAL_NAME (msymbol); - if (name - && (name[0] == '-' || name[0] == '+') - && name[1] == '[') /* Got a method name. */ + for (minimal_symbol *msymbol : objfile->msymbols ()) { - /* Filter for class/instance methods. */ - if (plusminus && name[0] != plusminus) - continue; - /* Find selector part. */ - name = (char *) strchr (name+2, ' '); - if (name == NULL) + QUIT; + name = msymbol->natural_name (); + if (name + && (name[0] == '-' || name[0] == '+') + && name[1] == '[') /* Got a method name. */ { - complaint (&symfile_complaints, - _("Bad method name '%s'"), - MSYMBOL_NATURAL_NAME (msymbol)); - continue; - } - if (regexp == NULL || re_exec(++name) != 0) - { - const char *mystart = name; - const char *myend = strchr (mystart, ']'); + /* Filter for class/instance methods. */ + if (plusminus && name[0] != plusminus) + continue; + /* Find selector part. */ + name = (char *) strchr (name+2, ' '); + if (name == NULL) + { + complaint (_("Bad method name '%s'"), + msymbol->natural_name ()); + continue; + } + if (regexp == NULL || re_exec(++name) != 0) + { + const char *mystart = name; + const char *myend = strchr (mystart, ']'); - if (myend && (myend - mystart > maxlen)) - maxlen = myend - mystart; /* Get longest selector. */ - matches++; + if (myend && (myend - mystart > maxlen)) + maxlen = myend - mystart; /* Get longest selector. */ + matches++; + } } } } @@ -646,21 +645,24 @@ info_selectors_command (char *regexp, int from_tty) sym_arr = XALLOCAVEC (struct symbol *, matches); matches = 0; - ALL_MSYMBOLS (objfile, msymbol) + for (objfile *objfile : current_program_space->objfiles ()) { - QUIT; - name = MSYMBOL_NATURAL_NAME (msymbol); - if (name && - (name[0] == '-' || name[0] == '+') && - name[1] == '[') /* Got a method name. */ + for (minimal_symbol *msymbol : objfile->msymbols ()) { - /* Filter for class/instance methods. */ - if (plusminus && name[0] != plusminus) - continue; - /* Find selector part. */ - name = (char *) strchr(name+2, ' '); - if (regexp == NULL || re_exec(++name) != 0) - sym_arr[matches++] = (struct symbol *) msymbol; + QUIT; + name = msymbol->natural_name (); + if (name && + (name[0] == '-' || name[0] == '+') && + name[1] == '[') /* Got a method name. */ + { + /* Filter for class/instance methods. */ + if (plusminus && name[0] != plusminus) + continue; + /* Find selector part. */ + name = (char *) strchr(name+2, ' '); + if (regexp == NULL || re_exec(++name) != 0) + sym_arr[matches++] = (struct symbol *) msymbol; + } } } @@ -673,7 +675,7 @@ info_selectors_command (char *regexp, int from_tty) char *p = asel; QUIT; - name = SYMBOL_NATURAL_NAME (sym_arr[ix]); + name = sym_arr[ix]->natural_name (); name = strchr (name, ' ') + 1; if (p[0] && specialcmp(name, p) == 0) continue; /* Seen this one already (not unique). */ @@ -704,8 +706,8 @@ compare_classes (const void *a, const void *b) { const char *aname, *bname; - aname = SYMBOL_PRINT_NAME (*(struct symbol **) a); - bname = SYMBOL_PRINT_NAME (*(struct symbol **) b); + aname = (*(struct symbol **) a)->print_name (); + bname = (*(struct symbol **) b)->print_name (); if (aname == NULL || bname == NULL) error (_("internal: compare_classes(1)")); @@ -723,10 +725,8 @@ compare_classes (const void *a, const void *b) */ static void -info_classes_command (char *regexp, int from_tty) +info_classes_command (const char *regexp, int from_tty) { - struct objfile *objfile; - struct minimal_symbol *msymbol; const char *name; char *val; int matches = 0; @@ -759,23 +759,26 @@ info_classes_command (char *regexp, int from_tty) } /* First time thru is JUST to get max length and count. */ - ALL_MSYMBOLS (objfile, msymbol) + for (objfile *objfile : current_program_space->objfiles ()) { - QUIT; - name = MSYMBOL_NATURAL_NAME (msymbol); - if (name && - (name[0] == '-' || name[0] == '+') && - name[1] == '[') /* Got a method name. */ - if (regexp == NULL || re_exec(name+2) != 0) - { - /* Compute length of classname part. */ - const char *mystart = name + 2; - const char *myend = strchr (mystart, ' '); + for (minimal_symbol *msymbol : objfile->msymbols ()) + { + QUIT; + name = msymbol->natural_name (); + if (name && + (name[0] == '-' || name[0] == '+') && + name[1] == '[') /* Got a method name. */ + if (regexp == NULL || re_exec(name+2) != 0) + { + /* Compute length of classname part. */ + const char *mystart = name + 2; + const char *myend = strchr (mystart, ' '); - if (myend && (myend - mystart > maxlen)) - maxlen = myend - mystart; - matches++; - } + if (myend && (myend - mystart > maxlen)) + maxlen = myend - mystart; + matches++; + } + } } if (matches) { @@ -783,15 +786,18 @@ info_classes_command (char *regexp, int from_tty) regexp ? regexp : "*"); sym_arr = XALLOCAVEC (struct symbol *, matches); matches = 0; - ALL_MSYMBOLS (objfile, msymbol) + for (objfile *objfile : current_program_space->objfiles ()) { - QUIT; - name = MSYMBOL_NATURAL_NAME (msymbol); - if (name && - (name[0] == '-' || name[0] == '+') && - name[1] == '[') /* Got a method name. */ - if (regexp == NULL || re_exec(name+2) != 0) - sym_arr[matches++] = (struct symbol *) msymbol; + for (minimal_symbol *msymbol : objfile->msymbols ()) + { + QUIT; + name = msymbol->natural_name (); + if (name && + (name[0] == '-' || name[0] == '+') && + name[1] == '[') /* Got a method name. */ + if (regexp == NULL || re_exec(name+2) != 0) + sym_arr[matches++] = (struct symbol *) msymbol; + } } qsort (sym_arr, matches, sizeof (struct minimal_symbol *), @@ -803,7 +809,7 @@ info_classes_command (char *regexp, int from_tty) char *p = aclass; QUIT; - name = SYMBOL_NATURAL_NAME (sym_arr[ix]); + name = sym_arr[ix]->natural_name (); name += 2; if (p[0] && specialcmp(name, p) == 0) continue; /* Seen this one already (not unique). */ @@ -972,10 +978,8 @@ parse_method (char *method, char *type, char **theclass, static void find_methods (char type, const char *theclass, const char *category, const char *selector, - VEC (const_char_ptr) **symbol_names) + std::vector *symbol_names) { - struct objfile *objfile = NULL; - const char *symname = NULL; char ntype = '\0'; @@ -988,10 +992,9 @@ find_methods (char type, const char *theclass, const char *category, gdb_assert (symbol_names != NULL); - ALL_OBJFILES (objfile) + for (objfile *objfile : current_program_space->objfiles ()) { unsigned int *objc_csym; - struct minimal_symbol *msymbol = NULL; /* The objfile_csym variable counts the number of ObjC methods that this objfile defines. We save that count as a private @@ -1000,18 +1003,18 @@ find_methods (char type, const char *theclass, const char *category, unsigned int objfile_csym = 0; - objc_csym = (unsigned int *) objfile_data (objfile, objc_objfile_data); + objc_csym = objc_objfile_data.get (objfile); if (objc_csym != NULL && *objc_csym == 0) /* There are no ObjC symbols in this objfile. Skip it entirely. */ continue; - ALL_OBJFILE_MSYMBOLS (objfile, msymbol) + for (minimal_symbol *msymbol : objfile->msymbols ()) { QUIT; /* Check the symbol name first as this can be done entirely without sending any query to the target. */ - symname = MSYMBOL_NATURAL_NAME (msymbol); + symname = msymbol->natural_name (); if (symname == NULL) continue; @@ -1048,51 +1051,28 @@ find_methods (char type, const char *theclass, const char *category, ((nselector == NULL) || (strcmp (selector, nselector) != 0))) continue; - VEC_safe_push (const_char_ptr, *symbol_names, symname); + symbol_names->push_back (symname); } if (objc_csym == NULL) - { - objc_csym = XOBNEW (&objfile->objfile_obstack, unsigned int); - *objc_csym = objfile_csym; - set_objfile_data (objfile, objc_objfile_data, objc_csym); - } + objc_csym = objc_objfile_data.emplace (objfile, objfile_csym); else /* Count of ObjC methods in this objfile should be constant. */ gdb_assert (*objc_csym == objfile_csym); } } -/* Uniquify a VEC of strings. */ +/* Uniquify a vector of strings. */ static void -uniquify_strings (VEC (const_char_ptr) **strings) +uniquify_strings (std::vector *strings) { - int ix; - const char *elem, *last = NULL; - int out; - - /* If the vector is empty, there's nothing to do. This explicit - check is needed to avoid invoking qsort with NULL. */ - if (VEC_empty (const_char_ptr, *strings)) + if (strings->empty ()) return; - qsort (VEC_address (const_char_ptr, *strings), - VEC_length (const_char_ptr, *strings), - sizeof (const_char_ptr), - compare_strings); - out = 0; - for (ix = 0; VEC_iterate (const_char_ptr, *strings, ix, elem); ++ix) - { - if (last == NULL || strcmp (last, elem) != 0) - { - /* Keep ELEM. */ - VEC_replace (const_char_ptr, *strings, out, elem); - ++out; - } - last = elem; - } - VEC_truncate (const_char_ptr, *strings, out); + std::sort (strings->begin (), strings->end (), compare_cstrings); + strings->erase (std::unique (strings->begin (), strings->end (), streq), + strings->end ()); } /* @@ -1126,7 +1106,7 @@ uniquify_strings (VEC (const_char_ptr) **strings) */ const char * -find_imps (const char *method, VEC (const_char_ptr) **symbol_names) +find_imps (const char *method, std::vector *symbol_names) { char type = '\0'; char *theclass = NULL; @@ -1159,22 +1139,20 @@ find_imps (const char *method, VEC (const_char_ptr) **symbol_names) /* If we hit the "selector" case, and we found some methods, then add the selector itself as a symbol, if it exists. */ - if (selector_case && !VEC_empty (const_char_ptr, *symbol_names)) + if (selector_case && !symbol_names->empty ()) { struct symbol *sym = lookup_symbol (selector, NULL, VAR_DOMAIN, 0).symbol; if (sym != NULL) - VEC_safe_push (const_char_ptr, *symbol_names, - SYMBOL_NATURAL_NAME (sym)); + symbol_names->push_back (sym->natural_name ()); else { struct bound_minimal_symbol msym = lookup_minimal_symbol (selector, 0, 0); if (msym.minsym != NULL) - VEC_safe_push (const_char_ptr, *symbol_names, - MSYMBOL_NATURAL_NAME (msym.minsym)); + symbol_names->push_back (msym.minsym->natural_name ()); } } @@ -1184,7 +1162,7 @@ find_imps (const char *method, VEC (const_char_ptr) **symbol_names) } static void -print_object_command (char *args, int from_tty) +print_object_command (const char *args, int from_tty) { struct value *object, *function, *description; CORE_ADDR string_addr, object_addr; @@ -1211,7 +1189,7 @@ print_object_command (char *args, int from_tty) if (function == NULL) error (_("Unable to locate _NSPrintForDebugger in child process")); - description = call_function_by_hand (function, NULL, 1, &object); + description = call_function_by_hand (function, NULL, object); string_addr = value_as_long (description); if (string_addr == 0) @@ -1310,43 +1288,24 @@ find_objc_msgsend (void) * dependent modules. */ -struct objc_submethod_helper_data { - int (*f) (CORE_ADDR, CORE_ADDR *); - CORE_ADDR pc; - CORE_ADDR *new_pc; -}; - -static int -find_objc_msgcall_submethod_helper (void * arg) -{ - struct objc_submethod_helper_data *s = - (struct objc_submethod_helper_data *) arg; - - if (s->f (s->pc, s->new_pc) == 0) - return 1; - else - return 0; -} - static int find_objc_msgcall_submethod (int (*f) (CORE_ADDR, CORE_ADDR *), CORE_ADDR pc, CORE_ADDR *new_pc) { - struct objc_submethod_helper_data s; - - s.f = f; - s.pc = pc; - s.new_pc = new_pc; + try + { + if (f (pc, new_pc) == 0) + return 1; + } + catch (const gdb_exception &ex) + { + exception_fprintf (gdb_stderr, ex, + "Unable to determine target of " + "Objective-C method call (ignoring):\n"); + } - if (catch_errors (find_objc_msgcall_submethod_helper, - (void *) &s, - "Unable to determine target of " - "Objective-C method call (ignoring):\n", - RETURN_MASK_ALL) == 0) - return 1; - else - return 0; + return 0; } int @@ -1373,9 +1332,6 @@ find_objc_msgcall (CORE_ADDR pc, CORE_ADDR *new_pc) return 0; } -/* -Wmissing-prototypes */ -extern initialize_file_ftype _initialize_objc_language; - void _initialize_objc_language (void) { @@ -1615,12 +1571,3 @@ resolve_msgsend_super_stret (CORE_ADDR pc, CORE_ADDR *new_pc) return 1; return 0; } - -/* Provide a prototype to silence -Wmissing-prototypes. */ -extern initialize_file_ftype _initialize_objc_lang; - -void -_initialize_objc_lang (void) -{ - objc_objfile_data = register_objfile_data (); -}