/* Generic SDT probe support for GDB.

   Copyright (C) 2012-2016 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#if !defined (PROBE_H)
#define PROBE_H 1

struct event_location;

#include "gdb_vecs.h"

/* Definition of a vector of probes.  */

typedef struct probe *probe_p;
DEF_VEC_P (probe_p);

struct linespec_result;

/* Structure useful for passing the header names in the method
   `gen_ui_out_table_header'.  */

struct info_probe_column
  {
    /* The internal name of the field.  This string cannot be capitalized nor
       localized, e.g., "extra_field".  */

    const char *field_name;

    /* The field name to be printed in the `info probes' command.  This
       string can be capitalized and localized, e.g., _("Extra Field").  */
    const char *print_name;
  };

typedef struct info_probe_column info_probe_column_s;
DEF_VEC_O (info_probe_column_s);

/* Operations associated with a probe.  */

struct probe_ops
  {
    /* Method responsible for verifying if LINESPECP is a valid linespec for
       a probe breakpoint.  It should return 1 if it is, or zero if it is not.
       It also should update LINESPECP in order to discard the breakpoint
       option associated with this linespec.  For example, if the option is
       `-probe', and the LINESPECP is `-probe abc', the function should
       return 1 and set LINESPECP to `abc'.  */

    int (*is_linespec) (const char **linespecp);

    /* Function that should fill PROBES with known probes from OBJFILE.  */

    void (*get_probes) (VEC (probe_p) **probes, struct objfile *objfile);

    /* Compute the probe's relocated address.  OBJFILE is the objfile
       in which the probe originated.  */

    CORE_ADDR (*get_probe_address) (struct probe *probe,
				    struct objfile *objfile);

    /* Return the number of arguments of PROBE.  This function can
       throw an exception.  */

    unsigned (*get_probe_argument_count) (struct probe *probe,
					  struct frame_info *frame);

    /* Return 1 if the probe interface can evaluate the arguments of probe
       PROBE, zero otherwise.  See the comments on
       sym_probe_fns:can_evaluate_probe_arguments for more details.  */

    int (*can_evaluate_probe_arguments) (struct probe *probe);

    /* Evaluate the Nth argument from the PROBE, returning a value
       corresponding to it.  The argument number is represented N.
       This function can throw an exception.  */

    struct value *(*evaluate_probe_argument) (struct probe *probe,
					      unsigned n,
					      struct frame_info *frame);

    /* Compile the Nth argument of the PROBE to an agent expression.
       The argument number is represented by N.  */

    void (*compile_to_ax) (struct probe *probe, struct agent_expr *aexpr,
			   struct axs_value *axs_value, unsigned n);

    /* Set the semaphore associated with the PROBE.  This function only makes
       sense if the probe has a concept of semaphore associated to a
       probe, otherwise it can be set to NULL.  */

    void (*set_semaphore) (struct probe *probe, struct objfile *objfile,
			   struct gdbarch *gdbarch);

    /* Clear the semaphore associated with the PROBE.  This function only
       makes sense if the probe has a concept of semaphore associated to
       a probe, otherwise it can be set to NULL.  */

    void (*clear_semaphore) (struct probe *probe, struct objfile *objfile,
			     struct gdbarch *gdbarch);

    /* Function called to destroy PROBE's specific data.  This function
       shall not free PROBE itself.  */

    void (*destroy) (struct probe *probe);

    /* Return a pointer to a name identifying the probe type.  This is
       the string that will be displayed in the "Type" column of the
       `info probes' command.  */

    const char *(*type_name) (struct probe *probe);

    /* Function responsible for providing the extra fields that will be
       printed in the `info probes' command.  It should fill HEADS
       with whatever extra fields it needs.  If the backend doesn't need
       to print extra fields, it can set this method to NULL.  */

    void (*gen_info_probes_table_header) (VEC (info_probe_column_s) **heads);

    /* Function that will fill VALUES with the values of the extra fields
       to be printed for PROBE.  If the backend implements the
       `gen_ui_out_table_header' method, then it should implement
       this method as well.  The backend should also guarantee that the
       order and the number of values in the vector is exactly the same
       as the order of the extra fields provided in the method
       `gen_ui_out_table_header'.  If a certain field is to be skipped
       when printing the information, you can push a NULL value in that
       position in the vector.  */

    void (*gen_info_probes_table_values) (struct probe *probe,
					  VEC (const_char_ptr) **values);

    /* Enable a probe.  The semantics of "enabling" a probe depend on
       the specific backend and the field can be NULL in case enabling
       probes is not supported.  This function can throw an
       exception.  */

    void (*enable_probe) (struct probe *probe);

    /* Disable a probe.  The semantics of "disabling" a probe depend
       on the specific backend and the field can be NULL in case
       disabling probes is not supported.  This function can throw an
       exception.  */

    void (*disable_probe) (struct probe *probe);
  };

/* Definition of a vector of probe_ops.  */

typedef const struct probe_ops *probe_ops_cp;
DEF_VEC_P (probe_ops_cp);
extern VEC (probe_ops_cp) *all_probe_ops;

/* The probe_ops associated with the generic probe.  */

extern const struct probe_ops probe_ops_any;

/* Helper function that, given KEYWORDS, iterate over it trying to match
   each keyword with LINESPECP.  If it succeeds, it updates the LINESPECP
   pointer and returns 1.  Otherwise, nothing is done to LINESPECP and zero
   is returned.  */

extern int probe_is_linespec_by_keyword (const char **linespecp,
					 const char *const *keywords);

/* Return specific PROBE_OPS * matching *LINESPECP and possibly updating
   *LINESPECP to skip its "-probe-type " prefix.  Return &probe_ops_any if
   *LINESPECP matches "-probe ", that is any unspecific probe.  Return NULL if
   *LINESPECP is not identified as any known probe type, *LINESPECP is not
   modified in such case.  */

extern const struct probe_ops *probe_linespec_to_ops (const char **linespecp);

/* The probe itself.  The struct contains generic information about the
   probe, and then some specific information which should be stored in
   the `probe_info' field.  */

struct probe
  {
    /* The operations associated with this probe.  */
    const struct probe_ops *pops;

    /* The probe's architecture.  */
    struct gdbarch *arch;

    /* The name of the probe.  */
    const char *name;

    /* The provider of the probe.  It generally defaults to the name of
       the objfile which contains the probe.  */
    const char *provider;

    /* The address where the probe is inserted, relative to
       SECT_OFF_TEXT.  */
    CORE_ADDR address;
  };

/* A bound probe holds a pointer to a probe and a pointer to the
   probe's defining objfile.  This is needed because probes are
   independent of the program space and thus require relocation at
   their point of use.  */

struct bound_probe
  {
    /* The probe.  */

    struct probe *probe;

    /* The objfile in which the probe originated.  */

    struct objfile *objfile;
  };

/* A helper for linespec that decodes a probe specification.  It returns a
   symtabs_and_lines object and updates LOC or throws an error.  */

extern struct symtabs_and_lines parse_probes (const struct event_location *loc,
					      struct program_space *pspace,
					      struct linespec_result *canon);

/* Helper function to register the proper probe_ops to a newly created probe.
   This function is mainly called from `sym_get_probes'.  */

extern void register_probe_ops (struct probe *probe);

/* Given a PC, find an associated probe.  If a probe is found, return
   it.  If no probe is found, return a bound probe whose fields are
   both NULL.  */

extern struct bound_probe find_probe_by_pc (CORE_ADDR pc);

/* Search OBJFILE for a probe with the given PROVIDER, NAME.  Return a
   VEC of all probes that were found.  If no matching probe is found,
   return NULL.  The caller must free the VEC.  */

extern VEC (probe_p) *find_probes_in_objfile (struct objfile *objfile,
					      const char *provider,
					      const char *name);

/* Generate a `info probes' command output for probe_ops represented by
   POPS.  If POPS is NULL it considers any probes types.  It is a helper
   function that can be used by the probe backends to print their
   `info probe TYPE'.  */

extern void info_probes_for_ops (const char *arg, int from_tty,
				 const struct probe_ops *pops);

/* Return the `cmd_list_element' associated with the `info probes' command,
   or create a new one if it doesn't exist.  Helper function that serves the
   purpose of avoiding the case of a backend using the `cmd_list_element'
   associated with `info probes', without having it registered yet.  */

extern struct cmd_list_element **info_probes_cmdlist_get (void);

/* Compute the probe's relocated address.  OBJFILE is the objfile in
   which the probe originated.  */

extern CORE_ADDR get_probe_address (struct probe *probe,
				    struct objfile *objfile);

/* Return the argument count of the specified probe.

   This function can throw an exception.  */

extern unsigned get_probe_argument_count (struct probe *probe,
					  struct frame_info *frame);

/* Return 1 if the probe interface associated with PROBE can evaluate
   arguments, zero otherwise.  See the comments on the definition of
   sym_probe_fns:can_evaluate_probe_arguments for more details.  */

extern int can_evaluate_probe_arguments (struct probe *probe);

/* Evaluate argument N of the specified probe.  N must be between 0
   inclusive and get_probe_argument_count exclusive.

   This function can throw an exception.  */

extern struct value *evaluate_probe_argument (struct probe *probe,
					      unsigned n,
					      struct frame_info *frame);

/* A convenience function that finds a probe at the PC in FRAME and
   evaluates argument N, with 0 <= N < number_of_args.  If there is no
   probe at that location, or if the probe does not have enough arguments,
   this returns NULL.  */

extern struct value *probe_safe_evaluate_at_pc (struct frame_info *frame,
						unsigned n);

#endif /* !defined (PROBE_H) */
