xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/probe.c (revision 867d70fc718005c0918b8b8b2f9d7f2d52d0a0db)
1 /* Generic static probe support for GDB.
2 
3    Copyright (C) 2012-2019 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 #include <algorithm>
39 #include "common/gdb_optional.h"
40 
41 /* Class that implements the static probe methods for "any" probe.  */
42 
43 class any_static_probe_ops : public static_probe_ops
44 {
45 public:
46   /* See probe.h.  */
47   bool is_linespec (const char **linespecp) const override;
48 
49   /* See probe.h.  */
50   void get_probes (std::vector<probe *> *probesp,
51 		   struct objfile *objfile) const override;
52 
53   /* See probe.h.  */
54   const char *type_name () const override;
55 
56   /* See probe.h.  */
57   std::vector<struct info_probe_column> gen_info_probes_table_header
58     () const override;
59 };
60 
61 /* Static operations associated with a generic probe.  */
62 
63 const any_static_probe_ops any_static_probe_ops {};
64 
65 /* A helper for parse_probes that decodes a probe specification in
66    SEARCH_PSPACE.  It appends matching SALs to RESULT.  */
67 
68 static void
69 parse_probes_in_pspace (const static_probe_ops *spops,
70 			struct program_space *search_pspace,
71 			const char *objfile_namestr,
72 			const char *provider,
73 			const char *name,
74 			std::vector<symtab_and_line> *result)
75 {
76   for (objfile *objfile : search_pspace->objfiles ())
77     {
78       if (!objfile->sf || !objfile->sf->sym_probe_fns)
79 	continue;
80 
81       if (objfile_namestr
82 	  && FILENAME_CMP (objfile_name (objfile), objfile_namestr) != 0
83 	  && FILENAME_CMP (lbasename (objfile_name (objfile)),
84 			   objfile_namestr) != 0)
85 	continue;
86 
87       const std::vector<probe *> &probes
88 	= objfile->sf->sym_probe_fns->sym_get_probes (objfile);
89 
90       for (probe *p : probes)
91 	{
92 	  if (spops != &any_static_probe_ops && p->get_static_ops () != spops)
93 	    continue;
94 
95 	  if (provider != NULL && p->get_provider () != provider)
96 	    continue;
97 
98 	  if (p->get_name () != name)
99 	    continue;
100 
101 	  symtab_and_line sal;
102 	  sal.pc = p->get_relocated_address (objfile);
103 	  sal.explicit_pc = 1;
104 	  sal.section = find_pc_overlay (sal.pc);
105 	  sal.pspace = search_pspace;
106 	  sal.prob = p;
107 	  sal.objfile = objfile;
108 
109 	  result->push_back (std::move (sal));
110 	}
111     }
112 }
113 
114 /* See definition in probe.h.  */
115 
116 std::vector<symtab_and_line>
117 parse_probes (const struct event_location *location,
118 	      struct program_space *search_pspace,
119 	      struct linespec_result *canonical)
120 {
121   char *arg_end, *arg;
122   char *objfile_namestr = NULL, *provider = NULL, *name, *p;
123   const char *arg_start, *cs;
124 
125   gdb_assert (event_location_type (location) == PROBE_LOCATION);
126   arg_start = get_probe_location (location);
127 
128   cs = arg_start;
129   const static_probe_ops *spops = probe_linespec_to_static_ops (&cs);
130   if (spops == NULL)
131     error (_("'%s' is not a probe linespec"), arg_start);
132 
133   arg = (char *) cs;
134   arg = skip_spaces (arg);
135   if (!*arg)
136     error (_("argument to `%s' missing"), arg_start);
137 
138   arg_end = skip_to_space (arg);
139 
140   /* We make a copy here so we can write over parts with impunity.  */
141   std::string copy (arg, arg_end - arg);
142   arg = &copy[0];
143 
144   /* Extract each word from the argument, separated by ":"s.  */
145   p = strchr (arg, ':');
146   if (p == NULL)
147     {
148       /* This is `-p name'.  */
149       name = arg;
150     }
151   else
152     {
153       char *hold = p + 1;
154 
155       *p = '\0';
156       p = strchr (hold, ':');
157       if (p == NULL)
158 	{
159 	  /* This is `-p provider:name'.  */
160 	  provider = arg;
161 	  name = hold;
162 	}
163       else
164 	{
165 	  /* This is `-p objfile:provider:name'.  */
166 	  *p = '\0';
167 	  objfile_namestr = arg;
168 	  provider = hold;
169 	  name = p + 1;
170 	}
171     }
172 
173   if (*name == '\0')
174     error (_("no probe name specified"));
175   if (provider && *provider == '\0')
176     error (_("invalid provider name"));
177   if (objfile_namestr && *objfile_namestr == '\0')
178     error (_("invalid objfile name"));
179 
180   std::vector<symtab_and_line> result;
181   if (search_pspace != NULL)
182     {
183       parse_probes_in_pspace (spops, search_pspace, objfile_namestr,
184 			      provider, name, &result);
185     }
186   else
187     {
188       struct program_space *pspace;
189 
190       ALL_PSPACES (pspace)
191 	parse_probes_in_pspace (spops, pspace, objfile_namestr,
192 				provider, name, &result);
193     }
194 
195   if (result.empty ())
196     {
197       throw_error (NOT_FOUND_ERROR,
198 		   _("No probe matching objfile=`%s', provider=`%s', name=`%s'"),
199 		   objfile_namestr ? objfile_namestr : _("<any>"),
200 		   provider ? provider : _("<any>"),
201 		   name);
202     }
203 
204   if (canonical)
205     {
206       std::string canon (arg_start, arg_end - arg_start);
207       canonical->special_display = 1;
208       canonical->pre_expanded = 1;
209       canonical->location = new_probe_location (canon.c_str ());
210     }
211 
212   return result;
213 }
214 
215 /* See definition in probe.h.  */
216 
217 std::vector<probe *>
218 find_probes_in_objfile (struct objfile *objfile, const char *provider,
219 			const char *name)
220 {
221   std::vector<probe *> result;
222 
223   if (!objfile->sf || !objfile->sf->sym_probe_fns)
224     return result;
225 
226   const std::vector<probe *> &probes
227     = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
228   for (probe *p : probes)
229     {
230       if (p->get_provider () != provider)
231 	continue;
232 
233       if (p->get_name () != name)
234 	continue;
235 
236       result.push_back (p);
237     }
238 
239   return result;
240 }
241 
242 /* See definition in probe.h.  */
243 
244 struct bound_probe
245 find_probe_by_pc (CORE_ADDR pc)
246 {
247   struct bound_probe result;
248 
249   result.objfile = NULL;
250   result.prob = NULL;
251 
252   for (objfile *objfile : current_program_space->objfiles ())
253     {
254       if (!objfile->sf || !objfile->sf->sym_probe_fns
255 	  || objfile->sect_index_text == -1)
256 	continue;
257 
258       /* If this proves too inefficient, we can replace with a hash.  */
259       const std::vector<probe *> &probes
260 	= objfile->sf->sym_probe_fns->sym_get_probes (objfile);
261       for (probe *p : probes)
262 	if (p->get_relocated_address (objfile) == pc)
263 	  {
264 	    result.objfile = objfile;
265 	    result.prob = p;
266 	    return result;
267 	  }
268     }
269 
270   return result;
271 }
272 
273 
274 
275 /* Make a vector of probes matching OBJNAME, PROVIDER, and PROBE_NAME.
276    If SPOPS is not &any_static_probe_ops, only probes related to this
277    specific static probe ops will match.  Each argument is a regexp,
278    or NULL, which matches anything.  */
279 
280 static std::vector<bound_probe>
281 collect_probes (const std::string &objname, const std::string &provider,
282 		const std::string &probe_name, const static_probe_ops *spops)
283 {
284   std::vector<bound_probe> result;
285   gdb::optional<compiled_regex> obj_pat, prov_pat, probe_pat;
286 
287   if (!provider.empty ())
288     prov_pat.emplace (provider.c_str (), REG_NOSUB,
289 		      _("Invalid provider regexp"));
290   if (!probe_name.empty ())
291     probe_pat.emplace (probe_name.c_str (), REG_NOSUB,
292 		       _("Invalid probe regexp"));
293   if (!objname.empty ())
294     obj_pat.emplace (objname.c_str (), REG_NOSUB,
295 		     _("Invalid object file regexp"));
296 
297   for (objfile *objfile : current_program_space->objfiles ())
298     {
299       if (! objfile->sf || ! objfile->sf->sym_probe_fns)
300 	continue;
301 
302       if (obj_pat)
303 	{
304 	  if (obj_pat->exec (objfile_name (objfile), 0, NULL, 0) != 0)
305 	    continue;
306 	}
307 
308       const std::vector<probe *> &probes
309 	= objfile->sf->sym_probe_fns->sym_get_probes (objfile);
310 
311       for (probe *p : probes)
312 	{
313 	  if (spops != &any_static_probe_ops && p->get_static_ops () != spops)
314 	    continue;
315 
316 	  if (prov_pat
317 	      && prov_pat->exec (p->get_provider ().c_str (), 0, NULL, 0) != 0)
318 	    continue;
319 
320 	  if (probe_pat
321 	      && probe_pat->exec (p->get_name ().c_str (), 0, NULL, 0) != 0)
322 	    continue;
323 
324 	  result.emplace_back (p, objfile);
325 	}
326     }
327 
328   return result;
329 }
330 
331 /* A qsort comparison function for bound_probe_s objects.  */
332 
333 static bool
334 compare_probes (const bound_probe &a, const bound_probe &b)
335 {
336   int v;
337 
338   v = a.prob->get_provider ().compare (b.prob->get_provider ());
339   if (v != 0)
340     return v < 0;
341 
342   v = a.prob->get_name ().compare (b.prob->get_name ());
343   if (v != 0)
344     return v < 0;
345 
346   if (a.prob->get_address () != b.prob->get_address ())
347     return a.prob->get_address () < b.prob->get_address ();
348 
349   return strcmp (objfile_name (a.objfile), objfile_name (b.objfile)) < 0;
350 }
351 
352 /* Helper function that generate entries in the ui_out table being
353    crafted by `info_probes_for_ops'.  */
354 
355 static void
356 gen_ui_out_table_header_info (const std::vector<bound_probe> &probes,
357 			      const static_probe_ops *spops)
358 {
359   /* `headings' refers to the names of the columns when printing `info
360      probes'.  */
361   gdb_assert (spops != NULL);
362 
363   std::vector<struct info_probe_column> headings
364     = spops->gen_info_probes_table_header ();
365 
366   for (const info_probe_column &column : headings)
367     {
368       size_t size_max = strlen (column.print_name);
369 
370       for (const bound_probe &probe : probes)
371 	{
372 	  /* `probe_fields' refers to the values of each new field that this
373 	     probe will display.  */
374 
375 	  if (probe.prob->get_static_ops () != spops)
376 	    continue;
377 
378 	  std::vector<const char *> probe_fields
379 	    = probe.prob->gen_info_probes_table_values ();
380 
381 	  gdb_assert (probe_fields.size () == headings.size ());
382 
383 	  for (const char *val : probe_fields)
384 	    {
385 	      /* It is valid to have a NULL value here, which means that the
386 		 backend does not have something to write and this particular
387 		 field should be skipped.  */
388 	      if (val == NULL)
389 		continue;
390 
391 	      size_max = std::max (strlen (val), size_max);
392 	    }
393 	}
394 
395       current_uiout->table_header (size_max, ui_left,
396 				   column.field_name, column.print_name);
397     }
398 }
399 
400 /* Helper function to print not-applicable strings for all the extra
401    columns defined in a static_probe_ops.  */
402 
403 static void
404 print_ui_out_not_applicables (const static_probe_ops *spops)
405 {
406    std::vector<struct info_probe_column> headings
407      = spops->gen_info_probes_table_header ();
408 
409   for (const info_probe_column &column : headings)
410     current_uiout->field_string (column.field_name, _("n/a"));
411 }
412 
413 /* Helper function to print extra information about a probe and an objfile
414    represented by PROBE.  */
415 
416 static void
417 print_ui_out_info (probe *probe)
418 {
419   /* `values' refers to the actual values of each new field in the output
420      of `info probe'.  `headings' refers to the names of each new field.  */
421   gdb_assert (probe != NULL);
422   std::vector<struct info_probe_column> headings
423     = probe->get_static_ops ()->gen_info_probes_table_header ();
424   std::vector<const char *> values
425     = probe->gen_info_probes_table_values ();
426 
427   gdb_assert (headings.size () == values.size ());
428 
429   for (int ix = 0; ix < headings.size (); ++ix)
430     {
431       struct info_probe_column column = headings[ix];
432       const char *val = values[ix];
433 
434       if (val == NULL)
435 	current_uiout->field_skip (column.field_name);
436       else
437 	current_uiout->field_string (column.field_name, val);
438     }
439 }
440 
441 /* Helper function that returns the number of extra fields which POPS will
442    need.  */
443 
444 static int
445 get_number_extra_fields (const static_probe_ops *spops)
446 {
447   return spops->gen_info_probes_table_header ().size ();
448 }
449 
450 /* Helper function that returns true if there is a probe in PROBES
451    featuring the given SPOPS.  It returns false otherwise.  */
452 
453 static bool
454 exists_probe_with_spops (const std::vector<bound_probe> &probes,
455 			 const static_probe_ops *spops)
456 {
457   for (const bound_probe &probe : probes)
458     if (probe.prob->get_static_ops () == spops)
459       return true;
460 
461   return false;
462 }
463 
464 /* Helper function that parses a probe linespec of the form [PROVIDER
465    [PROBE [OBJNAME]]] from the provided string STR.  */
466 
467 static void
468 parse_probe_linespec (const char *str, std::string *provider,
469 		      std::string *probe_name, std::string *objname)
470 {
471   *probe_name = *objname = "";
472 
473   *provider = extract_arg (&str);
474   if (!provider->empty ())
475     {
476       *probe_name = extract_arg (&str);
477       if (!probe_name->empty ())
478 	*objname = extract_arg (&str);
479     }
480 }
481 
482 /* See comment in probe.h.  */
483 
484 void
485 info_probes_for_spops (const char *arg, int from_tty,
486 		       const static_probe_ops *spops)
487 {
488   std::string provider, probe_name, objname;
489   int any_found;
490   int ui_out_extra_fields = 0;
491   size_t size_addr;
492   size_t size_name = strlen ("Name");
493   size_t size_objname = strlen ("Object");
494   size_t size_provider = strlen ("Provider");
495   size_t size_type = strlen ("Type");
496   struct gdbarch *gdbarch = get_current_arch ();
497 
498   parse_probe_linespec (arg, &provider, &probe_name, &objname);
499 
500   std::vector<bound_probe> probes
501     = collect_probes (objname, provider, probe_name, spops);
502 
503   if (spops == &any_static_probe_ops)
504     {
505       /* If SPOPS is &any_static_probe_ops, it means the user has
506 	 requested a "simple" `info probes', i.e., she wants to print
507 	 all information about all probes.  For that, we have to
508 	 identify how many extra fields we will need to add in the
509 	 ui_out table.
510 
511 	 To do that, we iterate over all static_probe_ops, querying
512 	 each one about its extra fields, and incrementing
513 	 `ui_out_extra_fields' to reflect that number.  But note that
514 	 we ignore the static_probe_ops for which no probes are
515 	 defined with the given search criteria.  */
516 
517       for (const static_probe_ops *po : all_static_probe_ops)
518 	if (exists_probe_with_spops (probes, po))
519 	  ui_out_extra_fields += get_number_extra_fields (po);
520     }
521   else
522     ui_out_extra_fields = get_number_extra_fields (spops);
523 
524   {
525     ui_out_emit_table table_emitter (current_uiout,
526 				     5 + ui_out_extra_fields,
527 				     probes.size (), "StaticProbes");
528 
529     std::sort (probes.begin (), probes.end (), compare_probes);
530 
531     /* What's the size of an address in our architecture?  */
532     size_addr = gdbarch_addr_bit (gdbarch) == 64 ? 18 : 10;
533 
534     /* Determining the maximum size of each field (`type', `provider',
535        `name' and `objname').  */
536     for (const bound_probe &probe : probes)
537       {
538 	const char *probe_type = probe.prob->get_static_ops ()->type_name ();
539 
540 	size_type = std::max (strlen (probe_type), size_type);
541 	size_name = std::max (probe.prob->get_name ().size (), size_name);
542 	size_provider = std::max (probe.prob->get_provider ().size (),
543 				  size_provider);
544 	size_objname = std::max (strlen (objfile_name (probe.objfile)),
545 				 size_objname);
546       }
547 
548     current_uiout->table_header (size_type, ui_left, "type", _("Type"));
549     current_uiout->table_header (size_provider, ui_left, "provider",
550 				 _("Provider"));
551     current_uiout->table_header (size_name, ui_left, "name", _("Name"));
552     current_uiout->table_header (size_addr, ui_left, "addr", _("Where"));
553 
554     if (spops == &any_static_probe_ops)
555       {
556 	/* We have to generate the table header for each new probe type
557 	   that we will print.  Note that this excludes probe types not
558 	   having any defined probe with the search criteria.  */
559 	for (const static_probe_ops *po : all_static_probe_ops)
560 	  if (exists_probe_with_spops (probes, po))
561 	    gen_ui_out_table_header_info (probes, po);
562       }
563     else
564       gen_ui_out_table_header_info (probes, spops);
565 
566     current_uiout->table_header (size_objname, ui_left, "object", _("Object"));
567     current_uiout->table_body ();
568 
569     for (const bound_probe &probe : probes)
570       {
571 	const char *probe_type = probe.prob->get_static_ops ()->type_name ();
572 
573 	ui_out_emit_tuple tuple_emitter (current_uiout, "probe");
574 
575 	current_uiout->field_string ("type", probe_type);
576 	current_uiout->field_string ("provider",
577 				     probe.prob->get_provider ().c_str ());
578 	current_uiout->field_string ("name", probe.prob->get_name ().c_str ());
579 	current_uiout->field_core_addr ("addr", probe.prob->get_gdbarch (),
580 					probe.prob->get_relocated_address
581 					(probe.objfile));
582 
583 	if (spops == &any_static_probe_ops)
584 	  {
585 	    for (const static_probe_ops *po : all_static_probe_ops)
586 	      {
587 		if (probe.prob->get_static_ops () == po)
588 		  print_ui_out_info (probe.prob);
589 		else if (exists_probe_with_spops (probes, po))
590 		  print_ui_out_not_applicables (po);
591 	      }
592 	  }
593 	else
594 	  print_ui_out_info (probe.prob);
595 
596 	current_uiout->field_string ("object",
597 				     objfile_name (probe.objfile));
598 	current_uiout->text ("\n");
599       }
600 
601     any_found = !probes.empty ();
602   }
603 
604   if (!any_found)
605     current_uiout->message (_("No probes matched.\n"));
606 }
607 
608 /* Implementation of the `info probes' command.  */
609 
610 static void
611 info_probes_command (const char *arg, int from_tty)
612 {
613   info_probes_for_spops (arg, from_tty, &any_static_probe_ops);
614 }
615 
616 /* Implementation of the `enable probes' command.  */
617 
618 static void
619 enable_probes_command (const char *arg, int from_tty)
620 {
621   std::string provider, probe_name, objname;
622 
623   parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
624 
625   std::vector<bound_probe> probes
626     = collect_probes (objname, provider, probe_name, &any_static_probe_ops);
627   if (probes.empty ())
628     {
629       current_uiout->message (_("No probes matched.\n"));
630       return;
631     }
632 
633   /* Enable the selected probes, provided their backends support the
634      notion of enabling a probe.  */
635   for (const bound_probe &probe: probes)
636     {
637       if (probe.prob->get_static_ops ()->can_enable ())
638 	{
639 	  probe.prob->enable ();
640 	  current_uiout->message (_("Probe %s:%s enabled.\n"),
641 				  probe.prob->get_provider ().c_str (),
642 				  probe.prob->get_name ().c_str ());
643 	}
644       else
645 	current_uiout->message (_("Probe %s:%s cannot be enabled.\n"),
646 				probe.prob->get_provider ().c_str (),
647 				probe.prob->get_name ().c_str ());
648     }
649 }
650 
651 /* Implementation of the `disable probes' command.  */
652 
653 static void
654 disable_probes_command (const char *arg, int from_tty)
655 {
656   std::string provider, probe_name, objname;
657 
658   parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
659 
660   std::vector<bound_probe> probes
661     = collect_probes (objname, provider, probe_name, &any_static_probe_ops);
662   if (probes.empty ())
663     {
664       current_uiout->message (_("No probes matched.\n"));
665       return;
666     }
667 
668   /* Disable the selected probes, provided their backends support the
669      notion of enabling a probe.  */
670   for (const bound_probe &probe : probes)
671     {
672       if (probe.prob->get_static_ops ()->can_enable ())
673 	{
674 	  probe.prob->disable ();
675 	  current_uiout->message (_("Probe %s:%s disabled.\n"),
676 				  probe.prob->get_provider ().c_str (),
677 				  probe.prob->get_name ().c_str ());
678 	}
679       else
680 	current_uiout->message (_("Probe %s:%s cannot be disabled.\n"),
681 				probe.prob->get_provider ().c_str (),
682 				probe.prob->get_name ().c_str ());
683     }
684 }
685 
686 /* See comments in probe.h.  */
687 
688 struct value *
689 probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n)
690 {
691   struct bound_probe probe;
692   unsigned n_args;
693 
694   probe = find_probe_by_pc (get_frame_pc (frame));
695   if (!probe.prob)
696     return NULL;
697 
698   n_args = probe.prob->get_argument_count (frame);
699   if (n >= n_args)
700     return NULL;
701 
702   return probe.prob->evaluate_argument (n, frame);
703 }
704 
705 /* See comment in probe.h.  */
706 
707 const struct static_probe_ops *
708 probe_linespec_to_static_ops (const char **linespecp)
709 {
710   for (const static_probe_ops *ops : all_static_probe_ops)
711     if (ops->is_linespec (linespecp))
712       return ops;
713 
714   return NULL;
715 }
716 
717 /* See comment in probe.h.  */
718 
719 int
720 probe_is_linespec_by_keyword (const char **linespecp, const char *const *keywords)
721 {
722   const char *s = *linespecp;
723   const char *const *csp;
724 
725   for (csp = keywords; *csp; csp++)
726     {
727       const char *keyword = *csp;
728       size_t len = strlen (keyword);
729 
730       if (strncmp (s, keyword, len) == 0 && isspace (s[len]))
731 	{
732 	  *linespecp += len + 1;
733 	  return 1;
734 	}
735     }
736 
737   return 0;
738 }
739 
740 /* Implementation of `is_linespec' method.  */
741 
742 bool
743 any_static_probe_ops::is_linespec (const char **linespecp) const
744 {
745   static const char *const keywords[] = { "-p", "-probe", NULL };
746 
747   return probe_is_linespec_by_keyword (linespecp, keywords);
748 }
749 
750 /* Implementation of 'get_probes' method.  */
751 
752 void
753 any_static_probe_ops::get_probes (std::vector<probe *> *probesp,
754 				  struct objfile *objfile) const
755 {
756   /* No probes can be provided by this dummy backend.  */
757 }
758 
759 /* Implementation of the 'type_name' method.  */
760 
761 const char *
762 any_static_probe_ops::type_name () const
763 {
764   return NULL;
765 }
766 
767 /* Implementation of the 'gen_info_probes_table_header' method.  */
768 
769 std::vector<struct info_probe_column>
770 any_static_probe_ops::gen_info_probes_table_header () const
771 {
772   return std::vector<struct info_probe_column> ();
773 }
774 
775 /* See comments in probe.h.  */
776 
777 struct cmd_list_element **
778 info_probes_cmdlist_get (void)
779 {
780   static struct cmd_list_element *info_probes_cmdlist;
781 
782   if (info_probes_cmdlist == NULL)
783     add_prefix_cmd ("probes", class_info, info_probes_command,
784 		    _("\
785 Show available static probes.\n\
786 Usage: info probes [all|TYPE [ARGS]]\n\
787 TYPE specifies the type of the probe, and can be one of the following:\n\
788   - stap\n\
789 If you specify TYPE, there may be additional arguments needed by the\n\
790 subcommand.\n\
791 If you do not specify any argument, or specify `all', then the command\n\
792 will show information about all types of probes."),
793 		    &info_probes_cmdlist, "info probes ",
794 		    0/*allow-unknown*/, &infolist);
795 
796   return &info_probes_cmdlist;
797 }
798 
799 
800 
801 /* This is called to compute the value of one of the $_probe_arg*
802    convenience variables.  */
803 
804 static struct value *
805 compute_probe_arg (struct gdbarch *arch, struct internalvar *ivar,
806 		   void *data)
807 {
808   struct frame_info *frame = get_selected_frame (_("No frame selected"));
809   CORE_ADDR pc = get_frame_pc (frame);
810   int sel = (int) (uintptr_t) data;
811   struct bound_probe pc_probe;
812   unsigned n_args;
813 
814   /* SEL == -1 means "_probe_argc".  */
815   gdb_assert (sel >= -1);
816 
817   pc_probe = find_probe_by_pc (pc);
818   if (pc_probe.prob == NULL)
819     error (_("No probe at PC %s"), core_addr_to_string (pc));
820 
821   n_args = pc_probe.prob->get_argument_count (frame);
822   if (sel == -1)
823     return value_from_longest (builtin_type (arch)->builtin_int, n_args);
824 
825   if (sel >= n_args)
826     error (_("Invalid probe argument %d -- probe has %u arguments available"),
827 	   sel, n_args);
828 
829   return pc_probe.prob->evaluate_argument (sel, frame);
830 }
831 
832 /* This is called to compile one of the $_probe_arg* convenience
833    variables into an agent expression.  */
834 
835 static void
836 compile_probe_arg (struct internalvar *ivar, struct agent_expr *expr,
837 		   struct axs_value *value, void *data)
838 {
839   CORE_ADDR pc = expr->scope;
840   int sel = (int) (uintptr_t) data;
841   struct bound_probe pc_probe;
842   int n_args;
843   struct frame_info *frame = get_selected_frame (NULL);
844 
845   /* SEL == -1 means "_probe_argc".  */
846   gdb_assert (sel >= -1);
847 
848   pc_probe = find_probe_by_pc (pc);
849   if (pc_probe.prob == NULL)
850     error (_("No probe at PC %s"), core_addr_to_string (pc));
851 
852   n_args = pc_probe.prob->get_argument_count (frame);
853 
854   if (sel == -1)
855     {
856       value->kind = axs_rvalue;
857       value->type = builtin_type (expr->gdbarch)->builtin_int;
858       ax_const_l (expr, n_args);
859       return;
860     }
861 
862   gdb_assert (sel >= 0);
863   if (sel >= n_args)
864     error (_("Invalid probe argument %d -- probe has %d arguments available"),
865 	   sel, n_args);
866 
867   pc_probe.prob->compile_to_ax (expr, value, sel);
868 }
869 
870 static const struct internalvar_funcs probe_funcs =
871 {
872   compute_probe_arg,
873   compile_probe_arg,
874   NULL
875 };
876 
877 
878 std::vector<const static_probe_ops *> all_static_probe_ops;
879 
880 void
881 _initialize_probe (void)
882 {
883   all_static_probe_ops.push_back (&any_static_probe_ops);
884 
885   create_internalvar_type_lazy ("_probe_argc", &probe_funcs,
886 				(void *) (uintptr_t) -1);
887   create_internalvar_type_lazy ("_probe_arg0", &probe_funcs,
888 				(void *) (uintptr_t) 0);
889   create_internalvar_type_lazy ("_probe_arg1", &probe_funcs,
890 				(void *) (uintptr_t) 1);
891   create_internalvar_type_lazy ("_probe_arg2", &probe_funcs,
892 				(void *) (uintptr_t) 2);
893   create_internalvar_type_lazy ("_probe_arg3", &probe_funcs,
894 				(void *) (uintptr_t) 3);
895   create_internalvar_type_lazy ("_probe_arg4", &probe_funcs,
896 				(void *) (uintptr_t) 4);
897   create_internalvar_type_lazy ("_probe_arg5", &probe_funcs,
898 				(void *) (uintptr_t) 5);
899   create_internalvar_type_lazy ("_probe_arg6", &probe_funcs,
900 				(void *) (uintptr_t) 6);
901   create_internalvar_type_lazy ("_probe_arg7", &probe_funcs,
902 				(void *) (uintptr_t) 7);
903   create_internalvar_type_lazy ("_probe_arg8", &probe_funcs,
904 				(void *) (uintptr_t) 8);
905   create_internalvar_type_lazy ("_probe_arg9", &probe_funcs,
906 				(void *) (uintptr_t) 9);
907   create_internalvar_type_lazy ("_probe_arg10", &probe_funcs,
908 				(void *) (uintptr_t) 10);
909   create_internalvar_type_lazy ("_probe_arg11", &probe_funcs,
910 				(void *) (uintptr_t) 11);
911 
912   add_cmd ("all", class_info, info_probes_command,
913 	   _("\
914 Show information about all type of probes."),
915 	   info_probes_cmdlist_get ());
916 
917   add_cmd ("probes", class_breakpoint, enable_probes_command, _("\
918 Enable probes.\n\
919 Usage: enable probes [PROVIDER [NAME [OBJECT]]]\n\
920 Each argument is a regular expression, used to select probes.\n\
921 PROVIDER matches probe provider names.\n\
922 NAME matches the probe names.\n\
923 OBJECT matches the executable or shared library name.\n\
924 If you do not specify any argument then the command will enable\n\
925 all defined probes."),
926 	   &enablelist);
927 
928   add_cmd ("probes", class_breakpoint, disable_probes_command, _("\
929 Disable probes.\n\
930 Usage: disable probes [PROVIDER [NAME [OBJECT]]]\n\
931 Each argument is a regular expression, used to select probes.\n\
932 PROVIDER matches probe provider names.\n\
933 NAME matches the probe names.\n\
934 OBJECT matches the executable or shared library name.\n\
935 If you do not specify any argument then the command will disable\n\
936 all defined probes."),
937 	   &disablelist);
938 
939 }
940