Hurd: Adjust to changes to "push pruning old threads down to the target"
[deliverable/binutils-gdb.git] / gdb / probe.c
index 5e95178f1e69ee5fea59b99fd98842de72414d7a..611a7522981a37640c42ce241a808e79d6bd8ac4 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 "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 (const struct event_location *location,
+             struct program_space *search_pspace,
              struct linespec_result *canonical)
 {
   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 *arg_start, *cs;
 
@@ -114,52 +174,19 @@ parse_probes (const struct event_location *location,
   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 = XRESIZEVEC (struct symtab_and_line, result.sals,
-                                     result.nelts);
-           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)
     {
@@ -406,7 +433,7 @@ 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);
        }
@@ -618,10 +645,11 @@ 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"));
@@ -689,7 +717,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"));
+    ui_out_message (current_uiout, _("No probes matched.\n"));
 }
 
 /* Implementation of the `info probes' command.  */
@@ -719,7 +747,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"));
+      ui_out_message (current_uiout, _("No probes matched.\n"));
       do_cleanups (cleanup);
       return;
     }
@@ -733,12 +761,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,
+         ui_out_message (current_uiout,
                          _("Probe %s:%s enabled.\n"),
                          probe->probe->provider, probe->probe->name);
        }
       else
-       ui_out_message (current_uiout, 0,
+       ui_out_message (current_uiout,
                        _("Probe %s:%s cannot be enabled.\n"),
                        probe->probe->provider, probe->probe->name);
     }
@@ -765,7 +793,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"));
+      ui_out_message (current_uiout, _("No probes matched.\n"));
       do_cleanups (cleanup);
       return;
     }
@@ -779,12 +807,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,
+         ui_out_message (current_uiout,
                          _("Probe %s:%s disabled.\n"),
                          probe->probe->provider, probe->probe->name);
        }
       else
-       ui_out_message (current_uiout, 0,
+       ui_out_message (current_uiout,
                        _("Probe %s:%s cannot be disabled.\n"),
                        probe->probe->provider, probe->probe->name);
     }
This page took 0.026677 seconds and 4 git commands to generate.