xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/probe.c (revision 7863ba460b0a05b553c754e5dbc29247dddec322)
1 /* Generic static probe support for GDB.
2 
3    Copyright (C) 2012-2016 Free Software Foundation, Inc.
4 
5    This file is part of GDB.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19 
20 #include "defs.h"
21 #include "probe.h"
22 #include "command.h"
23 #include "cli/cli-cmds.h"
24 #include "cli/cli-utils.h"
25 #include "objfiles.h"
26 #include "symtab.h"
27 #include "progspace.h"
28 #include "filenames.h"
29 #include "linespec.h"
30 #include "gdb_regex.h"
31 #include "frame.h"
32 #include "arch-utils.h"
33 #include "value.h"
34 #include "ax.h"
35 #include "ax-gdb.h"
36 #include "location.h"
37 #include <ctype.h>
38 
39 typedef struct bound_probe bound_probe_s;
40 DEF_VEC_O (bound_probe_s);
41 
42 
43 
44 /* A helper for parse_probes that decodes a probe specification in
45    SEARCH_PSPACE.  It appends matching SALs to RESULT.  */
46 
47 static void
48 parse_probes_in_pspace (const struct probe_ops *probe_ops,
49 			struct program_space *search_pspace,
50 			const char *objfile_namestr,
51 			const char *provider,
52 			const char *name,
53 			struct symtabs_and_lines *result)
54 {
55   struct objfile *objfile;
56 
57   ALL_PSPACE_OBJFILES (search_pspace, objfile)
58     {
59       VEC (probe_p) *probes;
60       struct probe *probe;
61       int ix;
62 
63       if (!objfile->sf || !objfile->sf->sym_probe_fns)
64 	continue;
65 
66       if (objfile_namestr
67 	  && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0
68 	  && FILENAME_CMP (lbasename (objfile_name (objfile)),
69 			   objfile_namestr) != 0)
70 	continue;
71 
72       probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
73 
74       for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
75 	{
76 	  struct symtab_and_line *sal;
77 
78 	  if (probe_ops != &probe_ops_any && probe->pops != probe_ops)
79 	    continue;
80 
81 	  if (provider && strcmp (probe->provider, provider) != 0)
82 	    continue;
83 
84 	  if (strcmp (probe->name, name) != 0)
85 	    continue;
86 
87 	  ++result->nelts;
88 	  result->sals = XRESIZEVEC (struct symtab_and_line, result->sals,
89 				     result->nelts);
90 	  sal = &result->sals[result->nelts - 1];
91 
92 	  init_sal (sal);
93 
94 	  sal->pc = get_probe_address (probe, objfile);
95 	  sal->explicit_pc = 1;
96 	  sal->section = find_pc_overlay (sal->pc);
97 	  sal->pspace = search_pspace;
98 	  sal->probe = probe;
99 	  sal->objfile = objfile;
100 	}
101     }
102 }
103 
104 /* See definition in probe.h.  */
105 
106 struct symtabs_and_lines
107 parse_probes (const struct event_location *location,
108 	      struct program_space *search_pspace,
109 	      struct linespec_result *canonical)
110 {
111   char *arg_end, *arg;
112   char *objfile_namestr = NULL, *provider = NULL, *name, *p;
113   struct cleanup *cleanup;
114   struct symtabs_and_lines result;
115   const struct probe_ops *probe_ops;
116   const char *arg_start, *cs;
117 
118   result.sals = NULL;
119   result.nelts = 0;
120 
121   gdb_assert (event_location_type (location) == PROBE_LOCATION);
122   arg_start = get_probe_location (location);
123 
124   cs = arg_start;
125   probe_ops = probe_linespec_to_ops (&cs);
126   if (probe_ops == NULL)
127     error (_("'%s' is not a probe linespec"), arg_start);
128 
129   arg = (char *) cs;
130   arg = skip_spaces (arg);
131   if (!*arg)
132     error (_("argument to `%s' missing"), arg_start);
133 
134   arg_end = skip_to_space (arg);
135 
136   /* We make a copy here so we can write over parts with impunity.  */
137   arg = savestring (arg, arg_end - arg);
138   cleanup = make_cleanup (xfree, arg);
139 
140   /* Extract each word from the argument, separated by ":"s.  */
141   p = strchr (arg, ':');
142   if (p == NULL)
143     {
144       /* This is `-p name'.  */
145       name = arg;
146     }
147   else
148     {
149       char *hold = p + 1;
150 
151       *p = '\0';
152       p = strchr (hold, ':');
153       if (p == NULL)
154 	{
155 	  /* This is `-p provider:name'.  */
156 	  provider = arg;
157 	  name = hold;
158 	}
159       else
160 	{
161 	  /* This is `-p objfile:provider:name'.  */
162 	  *p = '\0';
163 	  objfile_namestr = arg;
164 	  provider = hold;
165 	  name = p + 1;
166 	}
167     }
168 
169   if (*name == '\0')
170     error (_("no probe name specified"));
171   if (provider && *provider == '\0')
172     error (_("invalid provider name"));
173   if (objfile_namestr && *objfile_namestr == '\0')
174     error (_("invalid objfile name"));
175 
176   if (search_pspace != NULL)
177     {
178       parse_probes_in_pspace (probe_ops, search_pspace, objfile_namestr,
179 			      provider, name, &result);
180     }
181   else
182     {
183       struct program_space *pspace;
184 
185       ALL_PSPACES (pspace)
186 	parse_probes_in_pspace (probe_ops, pspace, objfile_namestr,
187 				provider, name, &result);
188     }
189 
190   if (result.nelts == 0)
191     {
192       throw_error (NOT_FOUND_ERROR,
193 		   _("No probe matching objfile=`%s', provider=`%s', name=`%s'"),
194 		   objfile_namestr ? objfile_namestr : _("<any>"),
195 		   provider ? provider : _("<any>"),
196 		   name);
197     }
198 
199   if (canonical)
200     {
201       char *canon;
202 
203       canon = savestring (arg_start, arg_end - arg_start);
204       make_cleanup (xfree, canon);
205       canonical->special_display = 1;
206       canonical->pre_expanded = 1;
207       canonical->location = new_probe_location (canon);
208     }
209 
210   do_cleanups (cleanup);
211 
212   return result;
213 }
214 
215 /* See definition in probe.h.  */
216 
217 VEC (probe_p) *
218 find_probes_in_objfile (struct objfile *objfile, const char *provider,
219 			const char *name)
220 {
221   VEC (probe_p) *probes, *result = NULL;
222   int ix;
223   struct probe *probe;
224 
225   if (!objfile->sf || !objfile->sf->sym_probe_fns)
226     return NULL;
227 
228   probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
229   for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
230     {
231       if (strcmp (probe->provider, provider) != 0)
232 	continue;
233 
234       if (strcmp (probe->name, name) != 0)
235 	continue;
236 
237       VEC_safe_push (probe_p, result, probe);
238     }
239 
240   return result;
241 }
242 
243 /* See definition in probe.h.  */
244 
245 struct bound_probe
246 find_probe_by_pc (CORE_ADDR pc)
247 {
248   struct objfile *objfile;
249   struct bound_probe result;
250 
251   result.objfile = NULL;
252   result.probe = NULL;
253 
254   ALL_OBJFILES (objfile)
255   {
256     VEC (probe_p) *probes;
257     int ix;
258     struct probe *probe;
259 
260     if (!objfile->sf || !objfile->sf->sym_probe_fns
261 	|| objfile->sect_index_text == -1)
262       continue;
263 
264     /* If this proves too inefficient, we can replace with a hash.  */
265     probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
266     for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
267       if (get_probe_address (probe, objfile) == pc)
268 	{
269 	  result.objfile = objfile;
270 	  result.probe = probe;
271 	  return result;
272 	}
273   }
274 
275   return result;
276 }
277 
278 
279 
280 /* Make a vector of probes matching OBJNAME, PROVIDER, and PROBE_NAME.
281    If POPS is not NULL, only probes of this certain probe_ops will match.
282    Each argument is a regexp, or NULL, which matches anything.  */
283 
284 static VEC (bound_probe_s) *
285 collect_probes (char *objname, char *provider, char *probe_name,
286 		const struct probe_ops *pops)
287 {
288   struct objfile *objfile;
289   VEC (bound_probe_s) *result = NULL;
290   struct cleanup *cleanup, *cleanup_temps;
291   regex_t obj_pat, prov_pat, probe_pat;
292 
293   cleanup = make_cleanup (VEC_cleanup (bound_probe_s), &result);
294 
295   cleanup_temps = make_cleanup (null_cleanup, NULL);
296   if (provider != NULL)
297     compile_rx_or_error (&prov_pat, provider, _("Invalid provider regexp"));
298   if (probe_name != NULL)
299     compile_rx_or_error (&probe_pat, probe_name, _("Invalid probe regexp"));
300   if (objname != NULL)
301     compile_rx_or_error (&obj_pat, objname, _("Invalid object file regexp"));
302 
303   ALL_OBJFILES (objfile)
304     {
305       VEC (probe_p) *probes;
306       struct probe *probe;
307       int ix;
308 
309       if (! objfile->sf || ! objfile->sf->sym_probe_fns)
310 	continue;
311 
312       if (objname)
313 	{
314 	  if (regexec (&obj_pat, objfile_name (objfile), 0, NULL, 0) != 0)
315 	    continue;
316 	}
317 
318       probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
319 
320       for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
321 	{
322 	  struct bound_probe bound;
323 
324 	  if (pops != NULL && probe->pops != pops)
325 	    continue;
326 
327 	  if (provider
328 	      && regexec (&prov_pat, probe->provider, 0, NULL, 0) != 0)
329 	    continue;
330 
331 	  if (probe_name
332 	      && regexec (&probe_pat, probe->name, 0, NULL, 0) != 0)
333 	    continue;
334 
335 	  bound.objfile = objfile;
336 	  bound.probe = probe;
337 	  VEC_safe_push (bound_probe_s, result, &bound);
338 	}
339     }
340 
341   do_cleanups (cleanup_temps);
342   discard_cleanups (cleanup);
343   return result;
344 }
345 
346 /* A qsort comparison function for bound_probe_s objects.  */
347 
348 static int
349 compare_probes (const void *a, const void *b)
350 {
351   const struct bound_probe *pa = (const struct bound_probe *) a;
352   const struct bound_probe *pb = (const struct bound_probe *) b;
353   int v;
354 
355   v = strcmp (pa->probe->provider, pb->probe->provider);
356   if (v)
357     return v;
358 
359   v = strcmp (pa->probe->name, pb->probe->name);
360   if (v)
361     return v;
362 
363   if (pa->probe->address < pb->probe->address)
364     return -1;
365   if (pa->probe->address > pb->probe->address)
366     return 1;
367 
368   return strcmp (objfile_name (pa->objfile), objfile_name (pb->objfile));
369 }
370 
371 /* Helper function that generate entries in the ui_out table being
372    crafted by `info_probes_for_ops'.  */
373 
374 static void
375 gen_ui_out_table_header_info (VEC (bound_probe_s) *probes,
376 			      const struct probe_ops *p)
377 {
378   /* `headings' refers to the names of the columns when printing `info
379      probes'.  */
380   VEC (info_probe_column_s) *headings = NULL;
381   struct cleanup *c;
382   info_probe_column_s *column;
383   size_t headings_size;
384   int ix;
385 
386   gdb_assert (p != NULL);
387 
388   if (p->gen_info_probes_table_header == NULL
389       && p->gen_info_probes_table_values == NULL)
390     return;
391 
392   gdb_assert (p->gen_info_probes_table_header != NULL
393 	      && p->gen_info_probes_table_values != NULL);
394 
395   c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
396   p->gen_info_probes_table_header (&headings);
397 
398   headings_size = VEC_length (info_probe_column_s, headings);
399 
400   for (ix = 0;
401        VEC_iterate (info_probe_column_s, headings, ix, column);
402        ++ix)
403     {
404       struct bound_probe *probe;
405       int jx;
406       size_t size_max = strlen (column->print_name);
407 
408       for (jx = 0; VEC_iterate (bound_probe_s, probes, jx, probe); ++jx)
409 	{
410 	  /* `probe_fields' refers to the values of each new field that this
411 	     probe will display.  */
412 	  VEC (const_char_ptr) *probe_fields = NULL;
413 	  struct cleanup *c2;
414 	  const char *val;
415 	  int kx;
416 
417 	  if (probe->probe->pops != p)
418 	    continue;
419 
420 	  c2 = make_cleanup (VEC_cleanup (const_char_ptr), &probe_fields);
421 	  p->gen_info_probes_table_values (probe->probe, &probe_fields);
422 
423 	  gdb_assert (VEC_length (const_char_ptr, probe_fields)
424 		      == headings_size);
425 
426 	  for (kx = 0; VEC_iterate (const_char_ptr, probe_fields, kx, val);
427 	       ++kx)
428 	    {
429 	      /* It is valid to have a NULL value here, which means that the
430 		 backend does not have something to write and this particular
431 		 field should be skipped.  */
432 	      if (val == NULL)
433 		continue;
434 
435 	      size_max = max (strlen (val), size_max);
436 	    }
437 	  do_cleanups (c2);
438 	}
439 
440       ui_out_table_header (current_uiout, size_max, ui_left,
441 			   column->field_name, column->print_name);
442     }
443 
444   do_cleanups (c);
445 }
446 
447 /* Helper function to print not-applicable strings for all the extra
448    columns defined in a probe_ops.  */
449 
450 static void
451 print_ui_out_not_applicables (const struct probe_ops *pops)
452 {
453   struct cleanup *c;
454   VEC (info_probe_column_s) *headings = NULL;
455   info_probe_column_s *column;
456   int ix;
457 
458   if (pops->gen_info_probes_table_header == NULL)
459     return;
460 
461   c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
462   pops->gen_info_probes_table_header (&headings);
463 
464   for (ix = 0;
465        VEC_iterate (info_probe_column_s, headings, ix, column);
466        ++ix)
467     ui_out_field_string (current_uiout, column->field_name, _("n/a"));
468 
469   do_cleanups (c);
470 }
471 
472 /* Helper function to print extra information about a probe and an objfile
473    represented by PROBE.  */
474 
475 static void
476 print_ui_out_info (struct probe *probe)
477 {
478   int ix;
479   int j = 0;
480   /* `values' refers to the actual values of each new field in the output
481      of `info probe'.  `headings' refers to the names of each new field.  */
482   VEC (const_char_ptr) *values = NULL;
483   VEC (info_probe_column_s) *headings = NULL;
484   info_probe_column_s *column;
485   struct cleanup *c;
486 
487   gdb_assert (probe != NULL);
488   gdb_assert (probe->pops != NULL);
489 
490   if (probe->pops->gen_info_probes_table_header == NULL
491       && probe->pops->gen_info_probes_table_values == NULL)
492     return;
493 
494   gdb_assert (probe->pops->gen_info_probes_table_header != NULL
495 	      && probe->pops->gen_info_probes_table_values != NULL);
496 
497   c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
498   make_cleanup (VEC_cleanup (const_char_ptr), &values);
499 
500   probe->pops->gen_info_probes_table_header (&headings);
501   probe->pops->gen_info_probes_table_values (probe, &values);
502 
503   gdb_assert (VEC_length (info_probe_column_s, headings)
504 	      == VEC_length (const_char_ptr, values));
505 
506   for (ix = 0;
507        VEC_iterate (info_probe_column_s, headings, ix, column);
508        ++ix)
509     {
510       const char *val = VEC_index (const_char_ptr, values, j++);
511 
512       if (val == NULL)
513 	ui_out_field_skip (current_uiout, column->field_name);
514       else
515 	ui_out_field_string (current_uiout, column->field_name, val);
516     }
517 
518   do_cleanups (c);
519 }
520 
521 /* Helper function that returns the number of extra fields which POPS will
522    need.  */
523 
524 static int
525 get_number_extra_fields (const struct probe_ops *pops)
526 {
527   VEC (info_probe_column_s) *headings = NULL;
528   struct cleanup *c;
529   int n;
530 
531   if (pops->gen_info_probes_table_header == NULL)
532     return 0;
533 
534   c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
535   pops->gen_info_probes_table_header (&headings);
536 
537   n = VEC_length (info_probe_column_s, headings);
538 
539   do_cleanups (c);
540 
541   return n;
542 }
543 
544 /* Helper function that returns 1 if there is a probe in PROBES
545    featuring the given POPS.  It returns 0 otherwise.  */
546 
547 static int
548 exists_probe_with_pops (VEC (bound_probe_s) *probes,
549 			const struct probe_ops *pops)
550 {
551   struct bound_probe *probe;
552   int ix;
553 
554   for (ix = 0; VEC_iterate (bound_probe_s, probes, ix, probe); ++ix)
555     if (probe->probe->pops == pops)
556       return 1;
557 
558   return 0;
559 }
560 
561 /* Helper function that parses a probe linespec of the form [PROVIDER
562    [PROBE [OBJNAME]]] from the provided string STR.  */
563 
564 static void
565 parse_probe_linespec (const char *str, char **provider,
566 		      char **probe_name, char **objname)
567 {
568   *probe_name = *objname = NULL;
569 
570   *provider = extract_arg_const (&str);
571   if (*provider != NULL)
572     {
573       *probe_name = extract_arg_const (&str);
574       if (*probe_name != NULL)
575 	*objname = extract_arg_const (&str);
576     }
577 }
578 
579 /* See comment in probe.h.  */
580 
581 void
582 info_probes_for_ops (const char *arg, int from_tty,
583 		     const struct probe_ops *pops)
584 {
585   char *provider, *probe_name = NULL, *objname = NULL;
586   struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
587   VEC (bound_probe_s) *probes;
588   int i, any_found;
589   int ui_out_extra_fields = 0;
590   size_t size_addr;
591   size_t size_name = strlen ("Name");
592   size_t size_objname = strlen ("Object");
593   size_t size_provider = strlen ("Provider");
594   size_t size_type = strlen ("Type");
595   struct bound_probe *probe;
596   struct gdbarch *gdbarch = get_current_arch ();
597 
598   parse_probe_linespec (arg, &provider, &probe_name, &objname);
599   make_cleanup (xfree, provider);
600   make_cleanup (xfree, probe_name);
601   make_cleanup (xfree, objname);
602 
603   probes = collect_probes (objname, provider, probe_name, pops);
604   make_cleanup (VEC_cleanup (probe_p), &probes);
605 
606   if (pops == NULL)
607     {
608       const struct probe_ops *po;
609       int ix;
610 
611       /* If the probe_ops is NULL, it means the user has requested a "simple"
612 	 `info probes', i.e., she wants to print all information about all
613 	 probes.  For that, we have to identify how many extra fields we will
614 	 need to add in the ui_out table.
615 
616 	 To do that, we iterate over all probe_ops, querying each one about
617 	 its extra fields, and incrementing `ui_out_extra_fields' to reflect
618 	 that number.  But note that we ignore the probe_ops for which no probes
619 	 are defined with the given search criteria.  */
620 
621       for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
622 	if (exists_probe_with_pops (probes, po))
623 	  ui_out_extra_fields += get_number_extra_fields (po);
624     }
625   else
626     ui_out_extra_fields = get_number_extra_fields (pops);
627 
628   make_cleanup_ui_out_table_begin_end (current_uiout,
629 				       5 + ui_out_extra_fields,
630 				       VEC_length (bound_probe_s, probes),
631 				       "StaticProbes");
632 
633   if (!VEC_empty (bound_probe_s, probes))
634     qsort (VEC_address (bound_probe_s, probes),
635 	   VEC_length (bound_probe_s, probes),
636 	   sizeof (bound_probe_s), compare_probes);
637 
638   /* What's the size of an address in our architecture?  */
639   size_addr = gdbarch_addr_bit (gdbarch) == 64 ? 18 : 10;
640 
641   /* Determining the maximum size of each field (`type', `provider',
642      `name' and `objname').  */
643   for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
644     {
645       const char *probe_type = probe->probe->pops->type_name (probe->probe);
646 
647       size_type = max (strlen (probe_type), size_type);
648       size_name = max (strlen (probe->probe->name), size_name);
649       size_provider = max (strlen (probe->probe->provider), size_provider);
650       size_objname = max (strlen (objfile_name (probe->objfile)), size_objname);
651     }
652 
653   ui_out_table_header (current_uiout, size_type, ui_left, "type", _("Type"));
654   ui_out_table_header (current_uiout, size_provider, ui_left, "provider",
655 		       _("Provider"));
656   ui_out_table_header (current_uiout, size_name, ui_left, "name", _("Name"));
657   ui_out_table_header (current_uiout, size_addr, ui_left, "addr", _("Where"));
658 
659   if (pops == NULL)
660     {
661       const struct probe_ops *po;
662       int ix;
663 
664       /* We have to generate the table header for each new probe type
665 	 that we will print.  Note that this excludes probe types not
666 	 having any defined probe with the search criteria.  */
667       for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
668 	if (exists_probe_with_pops (probes, po))
669 	  gen_ui_out_table_header_info (probes, po);
670     }
671   else
672     gen_ui_out_table_header_info (probes, pops);
673 
674   ui_out_table_header (current_uiout, size_objname, ui_left, "object",
675 		       _("Object"));
676   ui_out_table_body (current_uiout);
677 
678   for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
679     {
680       struct cleanup *inner;
681       const char *probe_type = probe->probe->pops->type_name (probe->probe);
682 
683       inner = make_cleanup_ui_out_tuple_begin_end (current_uiout, "probe");
684 
685       ui_out_field_string (current_uiout, "type",probe_type);
686       ui_out_field_string (current_uiout, "provider", probe->probe->provider);
687       ui_out_field_string (current_uiout, "name", probe->probe->name);
688       ui_out_field_core_addr (current_uiout, "addr",
689 			      probe->probe->arch,
690 			      get_probe_address (probe->probe, probe->objfile));
691 
692       if (pops == NULL)
693 	{
694 	  const struct probe_ops *po;
695 	  int ix;
696 
697 	  for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po);
698 	       ++ix)
699 	    if (probe->probe->pops == po)
700 	      print_ui_out_info (probe->probe);
701 	    else if (exists_probe_with_pops (probes, po))
702 	      print_ui_out_not_applicables (po);
703 	}
704       else
705 	print_ui_out_info (probe->probe);
706 
707       ui_out_field_string (current_uiout, "object",
708 			   objfile_name (probe->objfile));
709       ui_out_text (current_uiout, "\n");
710 
711       do_cleanups (inner);
712     }
713 
714   any_found = !VEC_empty (bound_probe_s, probes);
715   do_cleanups (cleanup);
716 
717   if (!any_found)
718     ui_out_message (current_uiout, 0, _("No probes matched.\n"));
719 }
720 
721 /* Implementation of the `info probes' command.  */
722 
723 static void
724 info_probes_command (char *arg, int from_tty)
725 {
726   info_probes_for_ops (arg, from_tty, NULL);
727 }
728 
729 /* Implementation of the `enable probes' command.  */
730 
731 static void
732 enable_probes_command (char *arg, int from_tty)
733 {
734   char *provider, *probe_name = NULL, *objname = NULL;
735   struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
736   VEC (bound_probe_s) *probes;
737   struct bound_probe *probe;
738   int i;
739 
740   parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
741   make_cleanup (xfree, provider);
742   make_cleanup (xfree, probe_name);
743   make_cleanup (xfree, objname);
744 
745   probes = collect_probes (objname, provider, probe_name, NULL);
746   if (VEC_empty (bound_probe_s, probes))
747     {
748       ui_out_message (current_uiout, 0, _("No probes matched.\n"));
749       do_cleanups (cleanup);
750       return;
751     }
752 
753   /* Enable the selected probes, provided their backends support the
754      notion of enabling a probe.  */
755   for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
756     {
757       const struct probe_ops *pops = probe->probe->pops;
758 
759       if (pops->enable_probe != NULL)
760 	{
761 	  pops->enable_probe (probe->probe);
762 	  ui_out_message (current_uiout, 0,
763 			  _("Probe %s:%s enabled.\n"),
764 			  probe->probe->provider, probe->probe->name);
765 	}
766       else
767 	ui_out_message (current_uiout, 0,
768 			_("Probe %s:%s cannot be enabled.\n"),
769 			probe->probe->provider, probe->probe->name);
770     }
771 
772   do_cleanups (cleanup);
773 }
774 
775 /* Implementation of the `disable probes' command.  */
776 
777 static void
778 disable_probes_command (char *arg, int from_tty)
779 {
780   char *provider, *probe_name = NULL, *objname = NULL;
781   struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
782   VEC (bound_probe_s) *probes;
783   struct bound_probe *probe;
784   int i;
785 
786   parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
787   make_cleanup (xfree, provider);
788   make_cleanup (xfree, probe_name);
789   make_cleanup (xfree, objname);
790 
791   probes = collect_probes (objname, provider, probe_name, NULL /* pops */);
792   if (VEC_empty (bound_probe_s, probes))
793     {
794       ui_out_message (current_uiout, 0, _("No probes matched.\n"));
795       do_cleanups (cleanup);
796       return;
797     }
798 
799   /* Disable the selected probes, provided their backends support the
800      notion of enabling a probe.  */
801   for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
802     {
803       const struct probe_ops *pops = probe->probe->pops;
804 
805       if (pops->disable_probe != NULL)
806 	{
807 	  pops->disable_probe (probe->probe);
808 	  ui_out_message (current_uiout, 0,
809 			  _("Probe %s:%s disabled.\n"),
810 			  probe->probe->provider, probe->probe->name);
811 	}
812       else
813 	ui_out_message (current_uiout, 0,
814 			_("Probe %s:%s cannot be disabled.\n"),
815 			probe->probe->provider, probe->probe->name);
816     }
817 
818   do_cleanups (cleanup);
819 }
820 
821 /* See comments in probe.h.  */
822 
823 CORE_ADDR
824 get_probe_address (struct probe *probe, struct objfile *objfile)
825 {
826   return probe->pops->get_probe_address (probe, objfile);
827 }
828 
829 /* See comments in probe.h.  */
830 
831 unsigned
832 get_probe_argument_count (struct probe *probe, struct frame_info *frame)
833 {
834   return probe->pops->get_probe_argument_count (probe, frame);
835 }
836 
837 /* See comments in probe.h.  */
838 
839 int
840 can_evaluate_probe_arguments (struct probe *probe)
841 {
842   return probe->pops->can_evaluate_probe_arguments (probe);
843 }
844 
845 /* See comments in probe.h.  */
846 
847 struct value *
848 evaluate_probe_argument (struct probe *probe, unsigned n,
849 			 struct frame_info *frame)
850 {
851   return probe->pops->evaluate_probe_argument (probe, n, frame);
852 }
853 
854 /* See comments in probe.h.  */
855 
856 struct value *
857 probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n)
858 {
859   struct bound_probe probe;
860   unsigned n_args;
861 
862   probe = find_probe_by_pc (get_frame_pc (frame));
863   if (!probe.probe)
864     return NULL;
865 
866   n_args = get_probe_argument_count (probe.probe, frame);
867   if (n >= n_args)
868     return NULL;
869 
870   return evaluate_probe_argument (probe.probe, n, frame);
871 }
872 
873 /* See comment in probe.h.  */
874 
875 const struct probe_ops *
876 probe_linespec_to_ops (const char **linespecp)
877 {
878   int ix;
879   const struct probe_ops *probe_ops;
880 
881   for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, probe_ops); ix++)
882     if (probe_ops->is_linespec (linespecp))
883       return probe_ops;
884 
885   return NULL;
886 }
887 
888 /* See comment in probe.h.  */
889 
890 int
891 probe_is_linespec_by_keyword (const char **linespecp, const char *const *keywords)
892 {
893   const char *s = *linespecp;
894   const char *const *csp;
895 
896   for (csp = keywords; *csp; csp++)
897     {
898       const char *keyword = *csp;
899       size_t len = strlen (keyword);
900 
901       if (strncmp (s, keyword, len) == 0 && isspace (s[len]))
902 	{
903 	  *linespecp += len + 1;
904 	  return 1;
905 	}
906     }
907 
908   return 0;
909 }
910 
911 /* Implementation of `is_linespec' method for `struct probe_ops'.  */
912 
913 static int
914 probe_any_is_linespec (const char **linespecp)
915 {
916   static const char *const keywords[] = { "-p", "-probe", NULL };
917 
918   return probe_is_linespec_by_keyword (linespecp, keywords);
919 }
920 
921 /* Dummy method used for `probe_ops_any'.  */
922 
923 static void
924 probe_any_get_probes (VEC (probe_p) **probesp, struct objfile *objfile)
925 {
926   /* No probes can be provided by this dummy backend.  */
927 }
928 
929 /* Operations associated with a generic probe.  */
930 
931 const struct probe_ops probe_ops_any =
932 {
933   probe_any_is_linespec,
934   probe_any_get_probes,
935 };
936 
937 /* See comments in probe.h.  */
938 
939 struct cmd_list_element **
940 info_probes_cmdlist_get (void)
941 {
942   static struct cmd_list_element *info_probes_cmdlist;
943 
944   if (info_probes_cmdlist == NULL)
945     add_prefix_cmd ("probes", class_info, info_probes_command,
946 		    _("\
947 Show available static probes.\n\
948 Usage: info probes [all|TYPE [ARGS]]\n\
949 TYPE specifies the type of the probe, and can be one of the following:\n\
950   - stap\n\
951 If you specify TYPE, there may be additional arguments needed by the\n\
952 subcommand.\n\
953 If you do not specify any argument, or specify `all', then the command\n\
954 will show information about all types of probes."),
955 		    &info_probes_cmdlist, "info probes ",
956 		    0/*allow-unknown*/, &infolist);
957 
958   return &info_probes_cmdlist;
959 }
960 
961 
962 
963 /* This is called to compute the value of one of the $_probe_arg*
964    convenience variables.  */
965 
966 static struct value *
967 compute_probe_arg (struct gdbarch *arch, struct internalvar *ivar,
968 		   void *data)
969 {
970   struct frame_info *frame = get_selected_frame (_("No frame selected"));
971   CORE_ADDR pc = get_frame_pc (frame);
972   int sel = (int) (uintptr_t) data;
973   struct bound_probe pc_probe;
974   const struct sym_probe_fns *pc_probe_fns;
975   unsigned n_args;
976 
977   /* SEL == -1 means "_probe_argc".  */
978   gdb_assert (sel >= -1);
979 
980   pc_probe = find_probe_by_pc (pc);
981   if (pc_probe.probe == NULL)
982     error (_("No probe at PC %s"), core_addr_to_string (pc));
983 
984   n_args = get_probe_argument_count (pc_probe.probe, frame);
985   if (sel == -1)
986     return value_from_longest (builtin_type (arch)->builtin_int, n_args);
987 
988   if (sel >= n_args)
989     error (_("Invalid probe argument %d -- probe has %u arguments available"),
990 	   sel, n_args);
991 
992   return evaluate_probe_argument (pc_probe.probe, sel, frame);
993 }
994 
995 /* This is called to compile one of the $_probe_arg* convenience
996    variables into an agent expression.  */
997 
998 static void
999 compile_probe_arg (struct internalvar *ivar, struct agent_expr *expr,
1000 		   struct axs_value *value, void *data)
1001 {
1002   CORE_ADDR pc = expr->scope;
1003   int sel = (int) (uintptr_t) data;
1004   struct bound_probe pc_probe;
1005   const struct sym_probe_fns *pc_probe_fns;
1006   int n_args;
1007   struct frame_info *frame = get_selected_frame (NULL);
1008 
1009   /* SEL == -1 means "_probe_argc".  */
1010   gdb_assert (sel >= -1);
1011 
1012   pc_probe = find_probe_by_pc (pc);
1013   if (pc_probe.probe == NULL)
1014     error (_("No probe at PC %s"), core_addr_to_string (pc));
1015 
1016   n_args = get_probe_argument_count (pc_probe.probe, frame);
1017 
1018   if (sel == -1)
1019     {
1020       value->kind = axs_rvalue;
1021       value->type = builtin_type (expr->gdbarch)->builtin_int;
1022       ax_const_l (expr, n_args);
1023       return;
1024     }
1025 
1026   gdb_assert (sel >= 0);
1027   if (sel >= n_args)
1028     error (_("Invalid probe argument %d -- probe has %d arguments available"),
1029 	   sel, n_args);
1030 
1031   pc_probe.probe->pops->compile_to_ax (pc_probe.probe, expr, value, sel);
1032 }
1033 
1034 static const struct internalvar_funcs probe_funcs =
1035 {
1036   compute_probe_arg,
1037   compile_probe_arg,
1038   NULL
1039 };
1040 
1041 
1042 VEC (probe_ops_cp) *all_probe_ops;
1043 
1044 void _initialize_probe (void);
1045 
1046 void
1047 _initialize_probe (void)
1048 {
1049   VEC_safe_push (probe_ops_cp, all_probe_ops, &probe_ops_any);
1050 
1051   create_internalvar_type_lazy ("_probe_argc", &probe_funcs,
1052 				(void *) (uintptr_t) -1);
1053   create_internalvar_type_lazy ("_probe_arg0", &probe_funcs,
1054 				(void *) (uintptr_t) 0);
1055   create_internalvar_type_lazy ("_probe_arg1", &probe_funcs,
1056 				(void *) (uintptr_t) 1);
1057   create_internalvar_type_lazy ("_probe_arg2", &probe_funcs,
1058 				(void *) (uintptr_t) 2);
1059   create_internalvar_type_lazy ("_probe_arg3", &probe_funcs,
1060 				(void *) (uintptr_t) 3);
1061   create_internalvar_type_lazy ("_probe_arg4", &probe_funcs,
1062 				(void *) (uintptr_t) 4);
1063   create_internalvar_type_lazy ("_probe_arg5", &probe_funcs,
1064 				(void *) (uintptr_t) 5);
1065   create_internalvar_type_lazy ("_probe_arg6", &probe_funcs,
1066 				(void *) (uintptr_t) 6);
1067   create_internalvar_type_lazy ("_probe_arg7", &probe_funcs,
1068 				(void *) (uintptr_t) 7);
1069   create_internalvar_type_lazy ("_probe_arg8", &probe_funcs,
1070 				(void *) (uintptr_t) 8);
1071   create_internalvar_type_lazy ("_probe_arg9", &probe_funcs,
1072 				(void *) (uintptr_t) 9);
1073   create_internalvar_type_lazy ("_probe_arg10", &probe_funcs,
1074 				(void *) (uintptr_t) 10);
1075   create_internalvar_type_lazy ("_probe_arg11", &probe_funcs,
1076 				(void *) (uintptr_t) 11);
1077 
1078   add_cmd ("all", class_info, info_probes_command,
1079 	   _("\
1080 Show information about all type of probes."),
1081 	   info_probes_cmdlist_get ());
1082 
1083   add_cmd ("probes", class_breakpoint, enable_probes_command, _("\
1084 Enable probes.\n\
1085 Usage: enable probes [PROVIDER [NAME [OBJECT]]]\n\
1086 Each argument is a regular expression, used to select probes.\n\
1087 PROVIDER matches probe provider names.\n\
1088 NAME matches the probe names.\n\
1089 OBJECT matches the executable or shared library name.\n\
1090 If you do not specify any argument then the command will enable\n\
1091 all defined probes."),
1092 	   &enablelist);
1093 
1094   add_cmd ("probes", class_breakpoint, disable_probes_command, _("\
1095 Disable probes.\n\
1096 Usage: disable probes [PROVIDER [NAME [OBJECT]]]\n\
1097 Each argument is a regular expression, used to select probes.\n\
1098 PROVIDER matches probe provider names.\n\
1099 NAME matches the probe names.\n\
1100 OBJECT matches the executable or shared library name.\n\
1101 If you do not specify any argument then the command will disable\n\
1102 all defined probes."),
1103 	   &disablelist);
1104 
1105 }
1106