gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / objc-lang.c
index b25a98106c1339791c82d046b5bc2370abf0e26d..ff028fc012a9164f850b684cb1572af833ff2733 100644 (file)
@@ -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<unsigned int> 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
@@ -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,18 +342,12 @@ 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_inner,         /* la_value_print_inner */
   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 */
@@ -398,21 +355,93 @@ extern const struct language_defn objc_language_defn = {
   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 +567,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 +640,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 +653,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 +680,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 +705,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 +736,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 +794,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 +821,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 +839,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).  */
@@ -1004,7 +1033,7 @@ 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;
@@ -1015,7 +1044,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;
 
@@ -1056,18 +1085,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<const char *> *strings)
@@ -1150,14 +1175,14 @@ find_imps (const char *method, std::vector<const char *> *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 ());
        }
     }
 
@@ -1337,8 +1362,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."));
@@ -1576,9 +1602,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 ();
-}
This page took 0.029999 seconds and 4 git commands to generate.