/* Branch trace support for GDB, the GNU debugger.

   Copyright (C) 2013-2015 Free Software Foundation, Inc.

   Contributed by Intel Corp. <markus.t.metzger@intel.com>.

   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/>.  */

#ifndef BTRACE_H
#define BTRACE_H

/* Branch tracing (btrace) is a per-thread control-flow execution trace of the
   inferior.  For presentation purposes, the branch trace is represented as a
   list of sequential control-flow blocks, one such list per thread.  */

#include "btrace-common.h"
#include "target/waitstatus.h" /* For enum target_stop_reason.  */

#if defined (HAVE_LIBIPT)
#  include <intel-pt.h>
#endif

struct thread_info;
struct btrace_function;

/* A coarse instruction classification.  */
enum btrace_insn_class
{
  /* The instruction is something not listed below.  */
  BTRACE_INSN_OTHER,

  /* The instruction is a function call.  */
  BTRACE_INSN_CALL,

  /* The instruction is a function return.  */
  BTRACE_INSN_RETURN,

  /* The instruction is an unconditional jump.  */
  BTRACE_INSN_JUMP
};

/* Instruction flags.  */
enum btrace_insn_flag
{
  /* The instruction has been executed speculatively.  */
  BTRACE_INSN_FLAG_SPECULATIVE = (1 << 0)
};

/* A branch trace instruction.

   This represents a single instruction in a branch trace.  */
struct btrace_insn
{
  /* The address of this instruction.  */
  CORE_ADDR pc;

  /* The size of this instruction in bytes.  */
  gdb_byte size;

  /* The instruction class of this instruction.  */
  enum btrace_insn_class iclass;

  /* A bit vector of BTRACE_INSN_FLAGS.  */
  enum btrace_insn_flag flags;
};

/* A vector of branch trace instructions.  */
typedef struct btrace_insn btrace_insn_s;
DEF_VEC_O (btrace_insn_s);

/* A doubly-linked list of branch trace function segments.  */
struct btrace_func_link
{
  struct btrace_function *prev;
  struct btrace_function *next;
};

/* Flags for btrace function segments.  */
enum btrace_function_flag
{
  /* The 'up' link interpretation.
     If set, it points to the function segment we returned to.
     If clear, it points to the function segment we called from.  */
  BFUN_UP_LINKS_TO_RET = (1 << 0),

  /* The 'up' link points to a tail call.  This obviously only makes sense
     if bfun_up_links_to_ret is clear.  */
  BFUN_UP_LINKS_TO_TAILCALL = (1 << 1)
};

/* Decode errors for the BTS recording format.  */
enum btrace_bts_error
{
  /* The instruction trace overflowed the end of the trace block.  */
  BDE_BTS_OVERFLOW = 1,

  /* The instruction size could not be determined.  */
  BDE_BTS_INSN_SIZE
};

/* Decode errors for the Intel(R) Processor Trace recording format.  */
enum btrace_pt_error
{
  /* The user cancelled trace processing.  */
  BDE_PT_USER_QUIT = 1,

  /* Tracing was temporarily disabled.  */
  BDE_PT_DISABLED,

  /* Trace recording overflowed.  */
  BDE_PT_OVERFLOW

  /* Negative numbers are used by the decoder library.  */
};

/* A branch trace function segment.

   This represents a function segment in a branch trace, i.e. a consecutive
   number of instructions belonging to the same function.

   In case of decode errors, we add an empty function segment to indicate
   the gap in the trace.

   We do not allow function segments without instructions otherwise.  */
struct btrace_function
{
  /* The full and minimal symbol for the function.  Both may be NULL.  */
  struct minimal_symbol *msym;
  struct symbol *sym;

  /* The previous and next segment belonging to the same function.
     If a function calls another function, the former will have at least
     two segments: one before the call and another after the return.  */
  struct btrace_func_link segment;

  /* The previous and next function in control flow order.  */
  struct btrace_func_link flow;

  /* The directly preceding function segment in a (fake) call stack.  */
  struct btrace_function *up;

  /* The instructions in this function segment.
     The instruction vector will be empty if the function segment
     represents a decode error.  */
  VEC (btrace_insn_s) *insn;

  /* The error code of a decode error that led to a gap.
     Must be zero unless INSN is empty; non-zero otherwise.  */
  int errcode;

  /* The instruction number offset for the first instruction in this
     function segment.
     If INSN is empty this is the insn_offset of the succeding function
     segment in control-flow order.  */
  unsigned int insn_offset;

  /* The function number in control-flow order.
     If INSN is empty indicating a gap in the trace due to a decode error,
     we still count the gap as a function.  */
  unsigned int number;

  /* The function level in a back trace across the entire branch trace.
     A caller's level is one lower than the level of its callee.

     Levels can be negative if we see returns for which we have not seen
     the corresponding calls.  The branch trace thread information provides
     a fixup to normalize function levels so the smallest level is zero.  */
  int level;

  /* A bit-vector of btrace_function_flag.  */
  enum btrace_function_flag flags;
};

/* A branch trace instruction iterator.  */
struct btrace_insn_iterator
{
  /* The branch trace function segment containing the instruction.
     Will never be NULL.  */
  const struct btrace_function *function;

  /* The index into the function segment's instruction vector.  */
  unsigned int index;
};

/* A branch trace function call iterator.  */
struct btrace_call_iterator
{
  /* The branch trace information for this thread.  Will never be NULL.  */
  const struct btrace_thread_info *btinfo;

  /* The branch trace function segment.
     This will be NULL for the iterator pointing to the end of the trace.  */
  const struct btrace_function *function;
};

/* Branch trace iteration state for "record instruction-history".  */
struct btrace_insn_history
{
  /* The branch trace instruction range from BEGIN (inclusive) to
     END (exclusive) that has been covered last time.  */
  struct btrace_insn_iterator begin;
  struct btrace_insn_iterator end;
};

/* Branch trace iteration state for "record function-call-history".  */
struct btrace_call_history
{
  /* The branch trace function range from BEGIN (inclusive) to END (exclusive)
     that has been covered last time.  */
  struct btrace_call_iterator begin;
  struct btrace_call_iterator end;
};

/* Branch trace thread flags.  */
enum btrace_thread_flag
{
  /* The thread is to be stepped forwards.  */
  BTHR_STEP = (1 << 0),

  /* The thread is to be stepped backwards.  */
  BTHR_RSTEP = (1 << 1),

  /* The thread is to be continued forwards.  */
  BTHR_CONT = (1 << 2),

  /* The thread is to be continued backwards.  */
  BTHR_RCONT = (1 << 3),

  /* The thread is to be moved.  */
  BTHR_MOVE = (BTHR_STEP | BTHR_RSTEP | BTHR_CONT | BTHR_RCONT),

  /* The thread is to be stopped.  */
  BTHR_STOP = (1 << 4)
};

#if defined (HAVE_LIBIPT)
/* A packet.  */
struct btrace_pt_packet
{
  /* The offset in the trace stream.  */
  uint64_t offset;

  /* The decode error code.  */
  enum pt_error_code errcode;

  /* The decoded packet.  Only valid if ERRCODE == pte_ok.  */
  struct pt_packet packet;
};

/* Define functions operating on a vector of packets.  */
typedef struct btrace_pt_packet btrace_pt_packet_s;
DEF_VEC_O (btrace_pt_packet_s);
#endif /* defined (HAVE_LIBIPT)  */

/* Branch trace iteration state for "maintenance btrace packet-history".  */
struct btrace_maint_packet_history
{
  /* The branch trace packet range from BEGIN (inclusive) to
     END (exclusive) that has been covered last time.  */
  unsigned int begin;
  unsigned int end;
};

/* Branch trace maintenance information per thread.

   This information is used by "maintenance btrace" commands.  */
struct btrace_maint_info
{
  /* Most information is format-specific.
     The format can be found in the BTRACE.DATA.FORMAT field of each thread.  */
  union
  {
    /* BTRACE.DATA.FORMAT == BTRACE_FORMAT_BTS  */
    struct
    {
      /* The packet history iterator.
	 We are iterating over BTRACE.DATA.FORMAT.VARIANT.BTS.BLOCKS.  */
      struct btrace_maint_packet_history packet_history;
    } bts;

#if defined (HAVE_LIBIPT)
    /* BTRACE.DATA.FORMAT == BTRACE_FORMAT_PT  */
    struct
    {
      /* A vector of decoded packets.  */
      VEC (btrace_pt_packet_s) *packets;

      /* The packet history iterator.
	 We are iterating over the above PACKETS vector.  */
      struct btrace_maint_packet_history packet_history;
    } pt;
#endif /* defined (HAVE_LIBIPT)  */
  } variant;
};

/* Branch trace information per thread.

   This represents the branch trace configuration as well as the entry point
   into the branch trace data.  For the latter, it also contains the index into
   an array of branch trace blocks used for iterating though the branch trace
   blocks of a thread.  */
struct btrace_thread_info
{
  /* The target branch trace information for this thread.

     This contains the branch trace configuration as well as any
     target-specific information necessary for implementing branch tracing on
     the underlying architecture.  */
  struct btrace_target_info *target;

  /* The raw branch trace data for the below branch trace.  */
  struct btrace_data data;

  /* The current branch trace for this thread (both inclusive).

     The last instruction of END is the current instruction, which is not
     part of the execution history.
     Both will be NULL if there is no branch trace available.  If there is
     branch trace available, both will be non-NULL.  */
  struct btrace_function *begin;
  struct btrace_function *end;

  /* The function level offset.  When added to each function's LEVEL,
     this normalizes the function levels such that the smallest level
     becomes zero.  */
  int level;

  /* The number of gaps in the trace.  */
  unsigned int ngaps;

  /* A bit-vector of btrace_thread_flag.  */
  enum btrace_thread_flag flags;

  /* The instruction history iterator.  */
  struct btrace_insn_history *insn_history;

  /* The function call history iterator.  */
  struct btrace_call_history *call_history;

  /* The current replay position.  NULL if not replaying.
     Gaps are skipped during replay, so REPLAY always points to a valid
     instruction.  */
  struct btrace_insn_iterator *replay;

  /* Why the thread stopped, if we need to track it.  */
  enum target_stop_reason stop_reason;

  /* Maintenance information.  */
  struct btrace_maint_info maint;
};

/* Enable branch tracing for a thread.  */
extern void btrace_enable (struct thread_info *tp,
			   const struct btrace_config *conf);

/* Get the branch trace configuration for a thread.
   Return NULL if branch tracing is not enabled for that thread.  */
extern const struct btrace_config *
  btrace_conf (const struct btrace_thread_info *);

/* Disable branch tracing for a thread.
   This will also delete the current branch trace data.  */
extern void btrace_disable (struct thread_info *);

/* Disable branch tracing for a thread during teardown.
   This is similar to btrace_disable, except that it will use
   target_teardown_btrace instead of target_disable_btrace.  */
extern void btrace_teardown (struct thread_info *);

/* Fetch the branch trace for a single thread.  */
extern void btrace_fetch (struct thread_info *);

/* Clear the branch trace for a single thread.  */
extern void btrace_clear (struct thread_info *);

/* Clear the branch trace for all threads when an object file goes away.  */
extern void btrace_free_objfile (struct objfile *);

/* Parse a branch trace xml document XML into DATA.  */
extern void parse_xml_btrace (struct btrace_data *data, const char *xml);

/* Parse a branch trace configuration xml document XML into CONF.  */
extern void parse_xml_btrace_conf (struct btrace_config *conf, const char *xml);

/* Dereference a branch trace instruction iterator.  Return a pointer to the
   instruction the iterator points to.
   May return NULL if the iterator points to a gap in the trace.  */
extern const struct btrace_insn *
  btrace_insn_get (const struct btrace_insn_iterator *);

/* Return the instruction number for a branch trace iterator.
   Returns one past the maximum instruction number for the end iterator.
   Returns zero if the iterator does not point to a valid instruction.  */
extern unsigned int btrace_insn_number (const struct btrace_insn_iterator *);

/* Initialize a branch trace instruction iterator to point to the begin/end of
   the branch trace.  Throws an error if there is no branch trace.  */
extern void btrace_insn_begin (struct btrace_insn_iterator *,
			       const struct btrace_thread_info *);
extern void btrace_insn_end (struct btrace_insn_iterator *,
			     const struct btrace_thread_info *);

/* Increment/decrement a branch trace instruction iterator by at most STRIDE
   instructions.  Return the number of instructions by which the instruction
   iterator has been advanced.
   Returns zero, if the operation failed or STRIDE had been zero.  */
extern unsigned int btrace_insn_next (struct btrace_insn_iterator *,
				      unsigned int stride);
extern unsigned int btrace_insn_prev (struct btrace_insn_iterator *,
				      unsigned int stride);

/* Compare two branch trace instruction iterators.
   Return a negative number if LHS < RHS.
   Return zero if LHS == RHS.
   Return a positive number if LHS > RHS.  */
extern int btrace_insn_cmp (const struct btrace_insn_iterator *lhs,
			    const struct btrace_insn_iterator *rhs);

/* Find an instruction in the function branch trace by its number.
   If the instruction is found, initialize the branch trace instruction
   iterator to point to this instruction and return non-zero.
   Return zero otherwise.  */
extern int btrace_find_insn_by_number (struct btrace_insn_iterator *,
				       const struct btrace_thread_info *,
				       unsigned int number);

/* Dereference a branch trace call iterator.  Return a pointer to the
   function the iterator points to or NULL if the interator points past
   the end of the branch trace.  */
extern const struct btrace_function *
  btrace_call_get (const struct btrace_call_iterator *);

/* Return the function number for a branch trace call iterator.
   Returns one past the maximum function number for the end iterator.
   Returns zero if the iterator does not point to a valid function.  */
extern unsigned int btrace_call_number (const struct btrace_call_iterator *);

/* Initialize a branch trace call iterator to point to the begin/end of
   the branch trace.  Throws an error if there is no branch trace.  */
extern void btrace_call_begin (struct btrace_call_iterator *,
			       const struct btrace_thread_info *);
extern void btrace_call_end (struct btrace_call_iterator *,
			     const struct btrace_thread_info *);

/* Increment/decrement a branch trace call iterator by at most STRIDE function
   segments.  Return the number of function segments by which the call
   iterator has been advanced.
   Returns zero, if the operation failed or STRIDE had been zero.  */
extern unsigned int btrace_call_next (struct btrace_call_iterator *,
				      unsigned int stride);
extern unsigned int btrace_call_prev (struct btrace_call_iterator *,
				      unsigned int stride);

/* Compare two branch trace call iterators.
   Return a negative number if LHS < RHS.
   Return zero if LHS == RHS.
   Return a positive number if LHS > RHS.  */
extern int btrace_call_cmp (const struct btrace_call_iterator *lhs,
			    const struct btrace_call_iterator *rhs);

/* Find a function in the function branch trace by its NUMBER.
   If the function is found, initialize the branch trace call
   iterator to point to this function and return non-zero.
   Return zero otherwise.  */
extern int btrace_find_call_by_number (struct btrace_call_iterator *,
				       const struct btrace_thread_info *,
				       unsigned int number);

/* Set the branch trace instruction history from BEGIN (inclusive) to
   END (exclusive).  */
extern void btrace_set_insn_history (struct btrace_thread_info *,
				     const struct btrace_insn_iterator *begin,
				     const struct btrace_insn_iterator *end);

/* Set the branch trace function call history from BEGIN (inclusive) to
   END (exclusive).  */
extern void btrace_set_call_history (struct btrace_thread_info *,
				     const struct btrace_call_iterator *begin,
				     const struct btrace_call_iterator *end);

/* Determine if branch tracing is currently replaying TP.  */
extern int btrace_is_replaying (struct thread_info *tp);

/* Return non-zero if the branch trace for TP is empty; zero otherwise.  */
extern int btrace_is_empty (struct thread_info *tp);

/* Create a cleanup for DATA.  */
extern struct cleanup *make_cleanup_btrace_data (struct btrace_data *data);

#endif /* BTRACE_H */
