[PATCH] target attributes [2/5] agent support

Hui Zhu hui_zhu@mentor.com
Wed Aug 29 08:12:00 GMT 2012


This patch add the target attributes support to the agent generate function.

Thanks,
Hui

2012-08-29  Hui Zhu  <hui_zhu@mentor.com>

	* ax-gdb.c (target-attributes.h): New include.
	(gen_expr): Add handler for target attributes.
	* breakpoint.c (target-attributes.h): New include.
	(set_breakpoint_condition): Set b->target_only_cond_check to 0.
	(build_target_condition_list): Handle target attributes.
	(build_target_command_list): Ditto.
	(bpstat_stop_status): Check b->target_only_cond_check before
	call bpstat_check_breakpoint_conditions.
	* remote.c (remote_download_tracepoint): Call
	set_check_agent_target_attribute.
	* tracepoint.c (validate_actionline): Ditto.
	(encode_actions_1): Ditto.
-------------- next part --------------
--- a/ax-gdb.c
+++ b/ax-gdb.c
@@ -43,6 +43,7 @@
 #include "arch-utils.h"
 #include "cli/cli-utils.h"
 #include "linespec.h"
+#include "target-attributes.h"
 
 #include "valprint.h"
 #include "c-lang.h"
@@ -1923,22 +1924,38 @@ gen_expr (struct expression *exp, union
 	{
 	  char *name = internalvar_name ((*pc)[1].internalvar);
 	  struct trace_state_variable *tsv;
+	  struct target_attribute *ta;
+	  int id = -1;
 
 	  (*pc) += 3;
 	  gen_expr (exp, pc, ax, value);
-	  tsv = find_trace_state_variable (name);
-	  if (tsv)
+
+	  ta = find_target_attribute_name (name);
+	  if (ta)
 	    {
-	      ax_tsv (ax, aop_setv, tsv->number);
+	      check_agent_target_attribute (ta, 1);
+	      id = ta->id;
+	    }
+	  else
+	    {
+	      tsv = find_trace_state_variable (name);
+	      if (tsv)
+		id = tsv->number;
+	    }
+
+	  if (id >= 0)
+	    {
+	      ax_tsv (ax, aop_setv, id);
 	      if (trace_kludge)
-		ax_tsv (ax, aop_tracev, tsv->number);
+		ax_tsv (ax, aop_tracev, id);
 	    }
 	  else
-	    error (_("$%s is not a trace state variable, "
+	    error (_("$%s is not a target attribute or trace state variable, "
 		     "may not assign to it"), name);
 	}
       else
-	error (_("May only assign to trace state variables"));
+	error (_("\
+May only assign to target attribute or trace state variables"));
       break;
 
     case BINOP_ASSIGN_MODIFY:
@@ -1949,32 +1966,51 @@ gen_expr (struct expression *exp, union
       if ((*pc)[0].opcode == OP_INTERNALVAR)
 	{
 	  char *name = internalvar_name ((*pc)[1].internalvar);
-	  struct trace_state_variable *tsv;
+	  struct trace_state_variable *tsv = NULL;
+	  struct target_attribute *ta = NULL;
+	  int id = -1;
 
 	  (*pc) += 3;
-	  tsv = find_trace_state_variable (name);
-	  if (tsv)
+
+	  ta = find_target_attribute_name (name);
+	  if (ta)
+	    {
+	      check_agent_target_attribute (ta, 0);
+	      id = ta->id;
+	    }
+	  else
+	    {
+	      tsv = find_trace_state_variable (name);
+	      if (tsv)
+		id = tsv->number;
+	    }
+
+	  if (id >= 0)
 	    {
 	      /* The tsv will be the left half of the binary operation.  */
-	      ax_tsv (ax, aop_getv, tsv->number);
+	      ax_tsv (ax, aop_getv, id);
 	      if (trace_kludge)
-		ax_tsv (ax, aop_tracev, tsv->number);
+		ax_tsv (ax, aop_tracev, id);
 	      /* Trace state variables are always 64-bit integers.  */
 	      value1.kind = axs_rvalue;
-	      value1.type = builtin_type (exp->gdbarch)->builtin_long_long;
+	      if (ta)
+		value1.type = target_attribute_type (exp->gdbarch, ta);
+	      else
+		value1.type = builtin_type (exp->gdbarch)->builtin_long_long;
 	      /* Now do right half of expression.  */
 	      gen_expr_binop_rest (exp, op2, pc, ax, value, &value1, &value2);
 	      /* We have a result of the binary op, set the tsv.  */
-	      ax_tsv (ax, aop_setv, tsv->number);
+	      ax_tsv (ax, aop_setv, id);
 	      if (trace_kludge)
-		ax_tsv (ax, aop_tracev, tsv->number);
+		ax_tsv (ax, aop_tracev, id);
 	    }
 	  else
-	    error (_("$%s is not a trace state variable, "
+	    error (_("$%s is not a target attribute or trace state variable, "
 		     "may not assign to it"), name);
 	}
       else
-	error (_("May only assign to trace state variables"));
+	error (_("\
+May only assign to target attribute or trace state variables"));
       break;
 
       /* Note that we need to be a little subtle about generating code
@@ -2040,22 +2076,41 @@ gen_expr (struct expression *exp, union
       {
 	struct internalvar *var = (*pc)[1].internalvar;
 	const char *name = internalvar_name (var);
-	struct trace_state_variable *tsv;
+	struct trace_state_variable *tsv = NULL;
+	struct target_attribute *ta = NULL;
+	int id = -1;
 
 	(*pc) += 3;
-	tsv = find_trace_state_variable (name);
-	if (tsv)
+
+	ta = find_target_attribute_name (name);
+	if (ta)
+	 {
+	    check_agent_target_attribute (ta, 0);
+	    id = ta->id;
+	 }
+	else
 	  {
-	    ax_tsv (ax, aop_getv, tsv->number);
+	    tsv = find_trace_state_variable (name);
+	    if (tsv)
+	      id = tsv->number;
+	  }
+
+	if (id >= 0)
+	  {
+	    ax_tsv (ax, aop_getv, id);
 	    if (trace_kludge)
-	      ax_tsv (ax, aop_tracev, tsv->number);
+	      ax_tsv (ax, aop_tracev, id);
 	    /* Trace state variables are always 64-bit integers.  */
 	    value->kind = axs_rvalue;
-	    value->type = builtin_type (exp->gdbarch)->builtin_long_long;
+	    if (ta)
+	      value->type = target_attribute_type (exp->gdbarch, ta);
+	    else
+	      value->type = builtin_type (exp->gdbarch)->builtin_long_long;
 	  }
 	else if (! compile_internalvar_to_ax (var, ax, value))
-	  error (_("$%s is not a trace state variable; GDB agent "
-		   "expressions cannot use convenience variables."), name);
+	  error (_("$%s is not a target attribute or trace state variable; "
+		   "GDB agent expressions cannot use convenience variables."),
+		 name);
       }
       break;
 
--- a/remote.c
+++ b/remote.c
@@ -10339,7 +10339,9 @@ remote_download_tracepoint (struct bp_lo
 	 capabilities at definition time.  */
       if (remote_supports_cond_tracepoints ())
 	{
+	  struct cleanup *back_to = set_check_agent_target_attribute (loc);
 	  aexpr = gen_eval_for_expr (tpaddr, loc->cond);
+	  do_cleanups (back_to);
 	  aexpr_chain = make_cleanup_free_agent_expr (aexpr);
 	  xsnprintf (buf + strlen (buf), BUF_SIZE - strlen (buf), ":X%x,",
 		     aexpr->len);
--- a/tracepoint.c
+++ b/tracepoint.c
@@ -786,6 +786,7 @@ validate_actionline (char **line, struct
 	  tmp_p = p;
 	  for (loc = t->base.loc; loc; loc = loc->next)
 	    {
+	      struct cleanup *back_to;
 	      p = tmp_p;
 	      exp = parse_exp_1 (&p, loc->address,
 				 block_for_pc (loc->address), 1);
@@ -809,10 +810,12 @@ validate_actionline (char **line, struct
 		    }
 		}
 
+	      back_to = set_check_agent_target_attribute (loc);
 	      /* We have something to collect, make sure that the expr to
 		 bytecode translator can handle it and that it's not too
 		 long.  */
 	      aexpr = gen_trace_for_expr (loc->address, exp);
+	      do_cleanups (back_to);
 	      make_cleanup_free_agent_expr (aexpr);
 
 	      if (aexpr->len > MAX_AGENT_EXPR_LEN)
@@ -839,16 +842,20 @@ validate_actionline (char **line, struct
 	  tmp_p = p;
 	  for (loc = t->base.loc; loc; loc = loc->next)
 	    {
+	      struct cleanup *back_to;
+
 	      p = tmp_p;
 	      /* Only expressions are allowed for this action.  */
 	      exp = parse_exp_1 (&p, loc->address,
 				 block_for_pc (loc->address), 1);
 	      old_chain = make_cleanup (free_current_contents, &exp);
 
+	      back_to = set_check_agent_target_attribute (loc);
 	      /* We have something to evaluate, make sure that the expr to
 		 bytecode translator can handle it and that it's not too
 		 long.  */
 	      aexpr = gen_eval_for_expr (loc->address, exp);
+	      do_cleanups (back_to);
 	      make_cleanup_free_agent_expr (aexpr);
 
 	      if (aexpr->len > MAX_AGENT_EXPR_LEN)
@@ -1506,6 +1513,7 @@ encode_actions_1 (struct command_line *a
 		  unsigned long addr, len;
 		  struct cleanup *old_chain = NULL;
 		  struct cleanup *old_chain1 = NULL;
+		  struct cleanup *back_to;
 
 		  exp = parse_exp_1 (&action_exp, tloc->address,
 				     block_for_pc (tloc->address), 1);
@@ -1547,7 +1555,9 @@ encode_actions_1 (struct command_line *a
 		      break;
 
 		    default:	/* Full-fledged expression.  */
+		      back_to = set_check_agent_target_attribute (tloc);
 		      aexpr = gen_trace_for_expr (tloc->address, exp);
+		      do_cleanups (back_to);
 
 		      old_chain1 = make_cleanup_free_agent_expr (aexpr);
 
@@ -1596,12 +1606,15 @@ encode_actions_1 (struct command_line *a
 		{
 		  struct cleanup *old_chain = NULL;
 		  struct cleanup *old_chain1 = NULL;
+		  struct cleanup *back_to;
 
 		  exp = parse_exp_1 (&action_exp, tloc->address,
 				     block_for_pc (tloc->address), 1);
 		  old_chain = make_cleanup (free_current_contents, &exp);
 
+		  back_to = set_check_agent_target_attribute (tloc);
 		  aexpr = gen_eval_for_expr (tloc->address, exp);
+		  do_cleanups (back_to);
 		  old_chain1 = make_cleanup_free_agent_expr (aexpr);
 
 		  ax_reqs (aexpr);


More information about the Gdb-patches mailing list