Class-ify ui_out
[deliverable/binutils-gdb.git] / gdb / probe.c
index dce2b25967de09b3b74127ae41ef003356db1b32..e3bc915ba7d7a784ae32dc07d4db112ba9f42cfd 100644 (file)
@@ -1,6 +1,6 @@
 /* Generic static probe support for GDB.
 
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
+   Copyright (C) 2012-2016 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "value.h"
 #include "ax.h"
 #include "ax-gdb.h"
+#include "location.h"
 #include <ctype.h>
+#include <algorithm>
 
 typedef struct bound_probe bound_probe_s;
 DEF_VEC_O (bound_probe_s);
 
 \f
 
+/* A helper for parse_probes that decodes a probe specification in
+   SEARCH_PSPACE.  It appends matching SALs to RESULT.  */
+
+static void
+parse_probes_in_pspace (const struct probe_ops *probe_ops,
+                       struct program_space *search_pspace,
+                       const char *objfile_namestr,
+                       const char *provider,
+                       const char *name,
+                       struct symtabs_and_lines *result)
+{
+  struct objfile *objfile;
+
+  ALL_PSPACE_OBJFILES (search_pspace, objfile)
+    {
+      VEC (probe_p) *probes;
+      struct probe *probe;
+      int ix;
+
+      if (!objfile->sf || !objfile->sf->sym_probe_fns)
+       continue;
+
+      if (objfile_namestr
+         && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0
+         && FILENAME_CMP (lbasename (objfile_name (objfile)),
+                          objfile_namestr) != 0)
+       continue;
+
+      probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
+
+      for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
+       {
+         struct symtab_and_line *sal;
+
+         if (probe_ops != &probe_ops_any && probe->pops != probe_ops)
+           continue;
+
+         if (provider && strcmp (probe->provider, provider) != 0)
+           continue;
+
+         if (strcmp (probe->name, name) != 0)
+           continue;
+
+         ++result->nelts;
+         result->sals = XRESIZEVEC (struct symtab_and_line, result->sals,
+                                    result->nelts);
+         sal = &result->sals[result->nelts - 1];
+
+         init_sal (sal);
+
+         sal->pc = get_probe_address (probe, objfile);
+         sal->explicit_pc = 1;
+         sal->section = find_pc_overlay (sal->pc);
+         sal->pspace = search_pspace;
+         sal->probe = probe;
+         sal->objfile = objfile;
+       }
+    }
+}
+
 /* See definition in probe.h.  */
 
 struct symtabs_and_lines
-parse_probes (char **argptr, struct linespec_result *canonical)
+parse_probes (const struct event_location *location,
+             struct program_space *search_pspace,
+             struct linespec_result *canonical)
 {
-  char *arg_start, *arg_end, *arg;
+  char *arg_end, *arg;
   char *objfile_namestr = NULL, *provider = NULL, *name, *p;
   struct cleanup *cleanup;
   struct symtabs_and_lines result;
-  struct objfile *objfile;
-  struct program_space *pspace;
   const struct probe_ops *probe_ops;
-  const char *cs;
+  const char *arg_start, *cs;
 
   result.sals = NULL;
   result.nelts = 0;
 
-  arg_start = *argptr;
+  gdb_assert (event_location_type (location) == PROBE_LOCATION);
+  arg_start = get_probe_location (location);
 
-  cs = *argptr;
+  cs = arg_start;
   probe_ops = probe_linespec_to_ops (&cs);
   if (probe_ops == NULL)
     error (_("'%s' is not a probe linespec"), arg_start);
@@ -111,53 +174,19 @@ parse_probes (char **argptr, struct linespec_result *canonical)
   if (objfile_namestr && *objfile_namestr == '\0')
     error (_("invalid objfile name"));
 
-  ALL_PSPACES (pspace)
-    ALL_PSPACE_OBJFILES (pspace, objfile)
-      {
-       VEC (probe_p) *probes;
-       struct probe *probe;
-       int ix;
-
-       if (!objfile->sf || !objfile->sf->sym_probe_fns)
-         continue;
-
-       if (objfile_namestr
-           && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0
-           && FILENAME_CMP (lbasename (objfile_name (objfile)),
-                            objfile_namestr) != 0)
-         continue;
-
-       probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
-
-       for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
-         {
-           struct symtab_and_line *sal;
-
-           if (probe_ops != &probe_ops_any && probe->pops != probe_ops)
-             continue;
-
-           if (provider && strcmp (probe->provider, provider) != 0)
-             continue;
-
-           if (strcmp (probe->name, name) != 0)
-             continue;
-
-           ++result.nelts;
-           result.sals = xrealloc (result.sals,
-                                   result.nelts
-                                   * sizeof (struct symtab_and_line));
-           sal = &result.sals[result.nelts - 1];
-
-           init_sal (sal);
+  if (search_pspace != NULL)
+    {
+      parse_probes_in_pspace (probe_ops, search_pspace, objfile_namestr,
+                             provider, name, &result);
+    }
+  else
+    {
+      struct program_space *pspace;
 
-           sal->pc = get_probe_address (probe, objfile);
-           sal->explicit_pc = 1;
-           sal->section = find_pc_overlay (sal->pc);
-           sal->pspace = pspace;
-           sal->probe = probe;
-           sal->objfile = objfile;
-         }
-      }
+      ALL_PSPACES (pspace)
+       parse_probes_in_pspace (probe_ops, pspace, objfile_namestr,
+                               provider, name, &result);
+    }
 
   if (result.nelts == 0)
     {
@@ -170,12 +199,15 @@ parse_probes (char **argptr, struct linespec_result *canonical)
 
   if (canonical)
     {
+      char *canon;
+
+      canon = savestring (arg_start, arg_end - arg_start);
+      make_cleanup (xfree, canon);
       canonical->special_display = 1;
       canonical->pre_expanded = 1;
-      canonical->addr_string = savestring (*argptr, arg_end - *argptr);
+      canonical->location = new_probe_location (canon);
     }
 
-  *argptr = arg_end;
   do_cleanups (cleanup);
 
   return result;
@@ -401,13 +433,13 @@ gen_ui_out_table_header_info (VEC (bound_probe_s) *probes,
              if (val == NULL)
                continue;
 
-             size_max = max (strlen (val), size_max);
+             size_max = std::max (strlen (val), size_max);
            }
          do_cleanups (c2);
        }
 
-      ui_out_table_header (current_uiout, size_max, ui_left,
-                          column->field_name, column->print_name);
+      current_uiout->table_header (size_max, ui_left,
+                                  column->field_name, column->print_name);
     }
 
   do_cleanups (c);
@@ -433,7 +465,7 @@ print_ui_out_not_applicables (const struct probe_ops *pops)
   for (ix = 0;
        VEC_iterate (info_probe_column_s, headings, ix, column);
        ++ix)
-    ui_out_field_string (current_uiout, column->field_name, _("n/a"));
+    current_uiout->field_string (column->field_name, _("n/a"));
 
   do_cleanups (c);
 }
@@ -479,9 +511,9 @@ print_ui_out_info (struct probe *probe)
       const char *val = VEC_index (const_char_ptr, values, j++);
 
       if (val == NULL)
-       ui_out_field_skip (current_uiout, column->field_name);
+       current_uiout->field_skip (column->field_name);
       else
-       ui_out_field_string (current_uiout, column->field_name, val);
+       current_uiout->field_string (column->field_name, val);
     }
 
   do_cleanups (c);
@@ -613,17 +645,18 @@ info_probes_for_ops (const char *arg, int from_tty,
     {
       const char *probe_type = probe->probe->pops->type_name (probe->probe);
 
-      size_type = max (strlen (probe_type), size_type);
-      size_name = max (strlen (probe->probe->name), size_name);
-      size_provider = max (strlen (probe->probe->provider), size_provider);
-      size_objname = max (strlen (objfile_name (probe->objfile)), size_objname);
+      size_type = std::max (strlen (probe_type), size_type);
+      size_name = std::max (strlen (probe->probe->name), size_name);
+      size_provider = std::max (strlen (probe->probe->provider), size_provider);
+      size_objname = std::max (strlen (objfile_name (probe->objfile)),
+                              size_objname);
     }
 
-  ui_out_table_header (current_uiout, size_type, ui_left, "type", _("Type"));
-  ui_out_table_header (current_uiout, size_provider, ui_left, "provider",
-                      _("Provider"));
-  ui_out_table_header (current_uiout, size_name, ui_left, "name", _("Name"));
-  ui_out_table_header (current_uiout, size_addr, ui_left, "addr", _("Where"));
+  current_uiout->table_header (size_type, ui_left, "type", _("Type"));
+  current_uiout->table_header (size_provider, ui_left, "provider",
+                              _("Provider"));
+  current_uiout->table_header (size_name, ui_left, "name", _("Name"));
+  current_uiout->table_header (size_addr, ui_left, "addr", _("Where"));
 
   if (pops == NULL)
     {
@@ -640,9 +673,8 @@ info_probes_for_ops (const char *arg, int from_tty,
   else
     gen_ui_out_table_header_info (probes, pops);
 
-  ui_out_table_header (current_uiout, size_objname, ui_left, "object",
-                      _("Object"));
-  ui_out_table_body (current_uiout);
+  current_uiout->table_header (size_objname, ui_left, "object", _("Object"));
+  current_uiout->table_body ();
 
   for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
     {
@@ -651,12 +683,12 @@ info_probes_for_ops (const char *arg, int from_tty,
 
       inner = make_cleanup_ui_out_tuple_begin_end (current_uiout, "probe");
 
-      ui_out_field_string (current_uiout, "type",probe_type);
-      ui_out_field_string (current_uiout, "provider", probe->probe->provider);
-      ui_out_field_string (current_uiout, "name", probe->probe->name);
-      ui_out_field_core_addr (current_uiout, "addr",
-                             probe->probe->arch,
-                             get_probe_address (probe->probe, probe->objfile));
+      current_uiout->field_string ("type",probe_type);
+      current_uiout->field_string ("provider", probe->probe->provider);
+      current_uiout->field_string ("name", probe->probe->name);
+      current_uiout->field_core_addr (
+       "addr", probe->probe->arch,
+       get_probe_address (probe->probe, probe->objfile));
 
       if (pops == NULL)
        {
@@ -673,9 +705,9 @@ info_probes_for_ops (const char *arg, int from_tty,
       else
        print_ui_out_info (probe->probe);
 
-      ui_out_field_string (current_uiout, "object",
+      current_uiout->field_string ("object",
                           objfile_name (probe->objfile));
-      ui_out_text (current_uiout, "\n");
+      current_uiout->text ("\n");
 
       do_cleanups (inner);
     }
@@ -684,7 +716,7 @@ info_probes_for_ops (const char *arg, int from_tty,
   do_cleanups (cleanup);
 
   if (!any_found)
-    ui_out_message (current_uiout, 0, _("No probes matched.\n"));
+    current_uiout->message (_("No probes matched.\n"));
 }
 
 /* Implementation of the `info probes' command.  */
@@ -714,7 +746,7 @@ enable_probes_command (char *arg, int from_tty)
   probes = collect_probes (objname, provider, probe_name, NULL);
   if (VEC_empty (bound_probe_s, probes))
     {
-      ui_out_message (current_uiout, 0, _("No probes matched.\n"));
+      current_uiout->message (_("No probes matched.\n"));
       do_cleanups (cleanup);
       return;
     }
@@ -728,14 +760,12 @@ enable_probes_command (char *arg, int from_tty)
       if (pops->enable_probe != NULL)
        {
          pops->enable_probe (probe->probe);
-         ui_out_message (current_uiout, 0,
-                         _("Probe %s:%s enabled.\n"),
-                         probe->probe->provider, probe->probe->name);
+         current_uiout->message (_("Probe %s:%s enabled.\n"),
+                                 probe->probe->provider, probe->probe->name);
        }
       else
-       ui_out_message (current_uiout, 0,
-                       _("Probe %s:%s cannot be enabled.\n"),
-                       probe->probe->provider, probe->probe->name);
+       current_uiout->message (_("Probe %s:%s cannot be enabled.\n"),
+                               probe->probe->provider, probe->probe->name);
     }
 
   do_cleanups (cleanup);
@@ -760,7 +790,7 @@ disable_probes_command (char *arg, int from_tty)
   probes = collect_probes (objname, provider, probe_name, NULL /* pops */);
   if (VEC_empty (bound_probe_s, probes))
     {
-      ui_out_message (current_uiout, 0, _("No probes matched.\n"));
+      current_uiout->message (_("No probes matched.\n"));
       do_cleanups (cleanup);
       return;
     }
@@ -774,14 +804,12 @@ disable_probes_command (char *arg, int from_tty)
       if (pops->disable_probe != NULL)
        {
          pops->disable_probe (probe->probe);
-         ui_out_message (current_uiout, 0,
-                         _("Probe %s:%s disabled.\n"),
-                         probe->probe->provider, probe->probe->name);
+         current_uiout->message (_("Probe %s:%s disabled.\n"),
+                                 probe->probe->provider, probe->probe->name);
        }
       else
-       ui_out_message (current_uiout, 0,
-                       _("Probe %s:%s cannot be disabled.\n"),
-                       probe->probe->provider, probe->probe->name);
+       current_uiout->message (_("Probe %s:%s cannot be disabled.\n"),
+                               probe->probe->provider, probe->probe->name);
     }
 
   do_cleanups (cleanup);
This page took 0.030833 seconds and 4 git commands to generate.