X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fobjc-lang.c;h=c423d575db805135c41763a6ffe3b1cf09f07a63;hb=301a9420d947da145884261ac31a7a52438c2894;hp=a3908f2b0980084b1776bdbd44eda81c10a03127;hpb=42a4f53d2bf8938c2aeda9f52be7a20534b214a9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index a3908f2b09..c423d575db 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-2019 Free Software Foundation, Inc. + Copyright (C) 2002-2020 Free Software Foundation, Inc. Contributed by Apple Computer, Inc. Written by Michael Snyder. @@ -75,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 @@ -401,7 +401,6 @@ 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_matcher */ iterate_over_symbols, @@ -409,7 +408,8 @@ extern const struct language_defn objc_language_defn = { &default_varobj_ops, NULL, NULL, - LANG_MAGIC + c_is_string_type_p, + "{...}" /* la_struct_too_deep_ellipsis */ }; /* @@ -491,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); @@ -537,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)")); @@ -562,8 +562,6 @@ compare_selectors (const void *a, const void *b) static void info_selectors_command (const char *regexp, int from_tty) { - struct objfile *objfile; - struct minimal_symbol *msymbol; const char *name; char *val; int matches = 0; @@ -607,33 +605,36 @@ info_selectors_command (const 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 (_("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++; + } } } } @@ -644,21 +645,24 @@ info_selectors_command (const 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; + } } } @@ -671,7 +675,7 @@ info_selectors_command (const 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). */ @@ -702,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,8 +727,6 @@ compare_classes (const void *a, const void *b) static void info_classes_command (const char *regexp, int from_tty) { - struct objfile *objfile; - struct minimal_symbol *msymbol; const char *name; char *val; int matches = 0; @@ -757,23 +759,26 @@ info_classes_command (const 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) { @@ -781,15 +786,18 @@ info_classes_command (const 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 *), @@ -801,7 +809,7 @@ info_classes_command (const 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,8 +980,6 @@ find_methods (char type, const char *theclass, const char *category, const char *selector, std::vector *symbol_names) { - struct objfile *objfile = NULL; - const char *symname = NULL; char ntype = '\0'; @@ -986,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 @@ -998,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; @@ -1050,18 +1055,14 @@ find_methods (char type, const char *theclass, const char *category, } 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 (std::vector *strings) @@ -1144,14 +1145,14 @@ find_imps (const char *method, std::vector *symbol_names) 0).symbol; if (sym != NULL) - symbol_names->push_back (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) - symbol_names->push_back (MSYMBOL_NATURAL_NAME (msym.minsym)); + symbol_names->push_back (msym.minsym->natural_name ()); } } @@ -1292,18 +1293,17 @@ find_objc_msgcall_submethod (int (*f) (CORE_ADDR, CORE_ADDR *), CORE_ADDR pc, CORE_ADDR *new_pc) { - TRY + try { if (f (pc, new_pc) == 0) return 1; } - CATCH (ex, RETURN_MASK_ALL) + catch (const gdb_exception &ex) { exception_fprintf (gdb_stderr, ex, "Unable to determine target of " "Objective-C method call (ignoring):\n"); } - END_CATCH return 0; } @@ -1571,9 +1571,3 @@ resolve_msgsend_super_stret (CORE_ADDR pc, CORE_ADDR *new_pc) return 1; return 0; } - -void -_initialize_objc_lang (void) -{ - objc_objfile_data = register_objfile_data (); -}