X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fobjc-lang.c;h=1e4862fe3feeda38f139a49a298fed2bbd27e93f;hb=348fe36b1d64f12c60e08f6313520b3191663063;hp=fbf0dab2ae233b83ed3769f4320b289309ec4126;hpb=791b7405f4627ad65fd636d57adb9e5749d0b9e7;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index fbf0dab2ae..1e4862fe3f 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. @@ -95,7 +95,7 @@ lookup_struct_typedef (const char *name, const struct block *block, int noerr) else error (_("No struct type named %s."), name); } - if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_STRUCT) + if (SYMBOL_TYPE (sym)->code () != TYPE_CODE_STRUCT) { if (noerr) return 0; @@ -281,46 +281,6 @@ objc_demangle (const char *mangled, int options) return NULL; /* Not an objc mangled name. */ } -/* la_sniff_from_mangled_name for ObjC. */ - -static int -objc_sniff_from_mangled_name (const char *mangled, char **demangled) -{ - *demangled = objc_demangle (mangled, 0); - return *demangled != NULL; -} - -/* Determine if we are currently in the Objective-C dispatch function. - If so, get the address of the method function that the dispatcher - would call and use that as the function to step into instead. Also - skip over the trampoline for the function (if any). This is better - for the user since they are only interested in stepping into the - method function anyway. */ -static CORE_ADDR -objc_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc) -{ - struct gdbarch *gdbarch = get_frame_arch (frame); - CORE_ADDR real_stop_pc; - CORE_ADDR method_stop_pc; - - real_stop_pc = gdbarch_skip_trampoline_code (gdbarch, frame, stop_pc); - - if (real_stop_pc != 0) - find_objc_msgcall (real_stop_pc, &method_stop_pc); - else - find_objc_msgcall (stop_pc, &method_stop_pc); - - if (method_stop_pc) - { - real_stop_pc = gdbarch_skip_trampoline_code - (gdbarch, frame, method_stop_pc); - if (real_stop_pc == 0) - real_stop_pc = method_stop_pc; - } - - return real_stop_pc; -} - /* Table mapping opcodes into strings for printing operators and precedences of the operators. */ @@ -364,7 +324,10 @@ static const char *objc_extensions[] = ".m", NULL }; -extern const struct language_defn objc_language_defn = { +/* Constant data representing the Objective-C language. */ + +extern const struct language_data objc_language_data = +{ "objective-c", /* Language name */ "Objective-C", language_objc, @@ -379,40 +342,96 @@ extern const struct language_defn objc_language_defn = { c_printchar, /* Print a character constant */ c_printstr, /* Function to print string constant */ c_emit_char, - c_print_type, /* Print a type using appropriate syntax */ c_print_typedef, /* Print a typedef using appropriate syntax */ - c_val_print, /* Print a value using appropriate syntax */ - c_value_print, /* Print a top-level value */ - 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 */ - objc_sniff_from_mangled_name, - NULL, /* Language specific - class_name_from_physname */ objc_op_print_tab, /* Expression operators for printing */ 1, /* C-style arrays */ 0, /* String lower bound */ - default_word_break_characters, - default_collect_symbol_completion_matches, - 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, - default_search_name_hash, &default_varobj_ops, - NULL, - NULL, c_is_string_type_p, "{...}" /* la_struct_too_deep_ellipsis */ }; +/* Class representing the Objective-C language. */ + +class objc_language : public language_defn +{ +public: + objc_language () + : language_defn (language_objc, objc_language_data) + { /* Nothing. */ } + + /* See language.h. */ + void language_arch_info (struct gdbarch *gdbarch, + struct language_arch_info *lai) const override + { + c_language_arch_info (gdbarch, lai); + } + + /* See language.h. */ + bool sniff_from_mangled_name (const char *mangled, + char **demangled) const override + { + *demangled = objc_demangle (mangled, 0); + return *demangled != NULL; + } + + /* See language.h. */ + + char *demangle (const char *mangled, int options) const override + { + return objc_demangle (mangled, options); + } + + /* See language.h. */ + + void print_type (struct type *type, const char *varstring, + struct ui_file *stream, int show, int level, + const struct type_print_options *flags) const override + { + c_print_type (type, varstring, stream, show, level, flags); + } + + /* See language.h. */ + + CORE_ADDR skip_trampoline (struct frame_info *frame, + CORE_ADDR stop_pc) const override + { + struct gdbarch *gdbarch = get_frame_arch (frame); + CORE_ADDR real_stop_pc; + CORE_ADDR method_stop_pc; + + /* Determine if we are currently in the Objective-C dispatch function. + If so, get the address of the method function that the dispatcher + would call and use that as the function to step into instead. Also + skip over the trampoline for the function (if any). This is better + for the user since they are only interested in stepping into the + method function anyway. */ + + real_stop_pc = gdbarch_skip_trampoline_code (gdbarch, frame, stop_pc); + + if (real_stop_pc != 0) + find_objc_msgcall (real_stop_pc, &method_stop_pc); + else + find_objc_msgcall (stop_pc, &method_stop_pc); + + if (method_stop_pc) + { + real_stop_pc = gdbarch_skip_trampoline_code + (gdbarch, frame, method_stop_pc); + if (real_stop_pc == 0) + real_stop_pc = method_stop_pc; + } + + return real_stop_pc; + } +}; + +/* Single instance of the class representing the Objective-C language. */ + +static objc_language objc_language_defn; + /* * ObjC: * Following functions help construct Objective-C message calls. @@ -538,8 +557,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)")); @@ -611,7 +630,7 @@ info_selectors_command (const char *regexp, int from_tty) for (minimal_symbol *msymbol : objfile->msymbols ()) { QUIT; - name = MSYMBOL_NATURAL_NAME (msymbol); + name = msymbol->natural_name (); if (name && (name[0] == '-' || name[0] == '+') && name[1] == '[') /* Got a method name. */ @@ -624,7 +643,7 @@ info_selectors_command (const char *regexp, int from_tty) if (name == NULL) { complaint (_("Bad method name '%s'"), - MSYMBOL_NATURAL_NAME (msymbol)); + msymbol->natural_name ()); continue; } if (regexp == NULL || re_exec(++name) != 0) @@ -651,7 +670,7 @@ info_selectors_command (const char *regexp, int from_tty) for (minimal_symbol *msymbol : objfile->msymbols ()) { QUIT; - name = MSYMBOL_NATURAL_NAME (msymbol); + name = msymbol->natural_name (); if (name && (name[0] == '-' || name[0] == '+') && name[1] == '[') /* Got a method name. */ @@ -676,7 +695,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). */ @@ -707,8 +726,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)")); @@ -765,7 +784,7 @@ info_classes_command (const char *regexp, int from_tty) for (minimal_symbol *msymbol : objfile->msymbols ()) { QUIT; - name = MSYMBOL_NATURAL_NAME (msymbol); + name = msymbol->natural_name (); if (name && (name[0] == '-' || name[0] == '+') && name[1] == '[') /* Got a method name. */ @@ -792,7 +811,7 @@ info_classes_command (const char *regexp, int from_tty) for (minimal_symbol *msymbol : objfile->msymbols ()) { QUIT; - name = MSYMBOL_NATURAL_NAME (msymbol); + name = msymbol->natural_name (); if (name && (name[0] == '-' || name[0] == '+') && name[1] == '[') /* Got a method name. */ @@ -810,7 +829,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). */ @@ -1015,7 +1034,7 @@ find_methods (char type, const char *theclass, const char *category, /* 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; @@ -1146,14 +1165,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 ()); } } @@ -1333,8 +1352,9 @@ find_objc_msgcall (CORE_ADDR pc, CORE_ADDR *new_pc) return 0; } +void _initialize_objc_language (); void -_initialize_objc_language (void) +_initialize_objc_language () { add_info ("selectors", info_selectors_command, _("All Objective-C selectors, or those matching REGEXP."));