sim: bfin: add support for glued SIC interrupt lines
[deliverable/binutils-gdb.git] / gdb / ax-gdb.c
index e6b82c5521cb8bac7a89b00d568107de438fc2c5..19c00ade5a36d0a171ca1f354993d549801a55e0 100644 (file)
@@ -1,6 +1,6 @@
 /* GDB-specific functions for operating on agent expressions.
 
-   Copyright (C) 1998, 1999, 2000, 2001, 2003, 2007, 2008, 2009, 2010
+   Copyright (C) 1998, 1999, 2000, 2001, 2003, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -59,7 +59,7 @@
 \f
 
 
-/* Prototypes for local functions. */
+/* Prototypes for local functions.  */
 
 /* There's a standard order to the arguments of these functions:
    union exp_element ** --- pointer into expression
@@ -70,7 +70,8 @@ static struct value *const_var_ref (struct symbol *var);
 static struct value *const_expr (union exp_element **pc);
 static struct value *maybe_const_expr (union exp_element **pc);
 
-static void gen_traced_pop (struct gdbarch *, struct agent_expr *, struct axs_value *);
+static void gen_traced_pop (struct gdbarch *, struct agent_expr *,
+                           struct axs_value *);
 
 static void gen_sign_extend (struct agent_expr *, struct type *);
 static void gen_extend (struct agent_expr *, struct type *);
@@ -219,6 +220,7 @@ const_expr (union exp_element **pc)
       {
        struct type *type = (*pc)[1].type;
        LONGEST k = (*pc)[2].longconst;
+
        (*pc) += 4;
        return value_from_longest (type, k);
       }
@@ -226,6 +228,7 @@ const_expr (union exp_element **pc)
     case OP_VAR_VALUE:
       {
        struct value *v = const_var_ref ((*pc)[2].symbol);
+
        (*pc) += 4;
        return v;
       }
@@ -453,6 +456,7 @@ static void
 gen_extend (struct agent_expr *ax, struct type *type)
 {
   int bits = TYPE_LENGTH (type) * TARGET_CHAR_BIT;
+
   /* I just had to.  */
   ((TYPE_UNSIGNED (type) ? ax_zero_ext : ax_ext) (ax, bits));
 }
@@ -611,7 +615,7 @@ static void
 gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
             struct axs_value *value, struct symbol *var)
 {
-  /* Dereference any typedefs. */
+  /* Dereference any typedefs.  */
   value->type = check_typedef (SYMBOL_TYPE (var));
   value->optimized_out = 0;
 
@@ -630,7 +634,8 @@ gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
 
     case LOC_CONST_BYTES:
       internal_error (__FILE__, __LINE__,
-                     _("gen_var_ref: LOC_CONST_BYTES symbols are not supported"));
+                     _("gen_var_ref: LOC_CONST_BYTES "
+                       "symbols are not supported"));
 
       /* Variable at a fixed location in memory.  Easy.  */
     case LOC_STATIC:
@@ -691,6 +696,7 @@ gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
       {
        struct minimal_symbol *msym
          = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, NULL);
+
        if (!msym)
          error (_("Couldn't resolve symbol `%s'."), SYMBOL_PRINT_NAME (var));
 
@@ -818,6 +824,7 @@ gen_usual_unary (struct expression *exp, struct agent_expr *ax,
     case TYPE_CODE_ARRAY:
       {
        struct type *elements = TYPE_TARGET_TYPE (value->type);
+
        value->type = lookup_pointer_type (elements);
        value->kind = axs_rvalue;
        /* We don't need to generate any code; the address of the array
@@ -981,7 +988,7 @@ gen_cast (struct agent_expr *ax, struct axs_value *value, struct type *type)
   /* GCC does allow casts to yield lvalues, so this should be fixed
      before merging these changes into the trunk.  */
   require_rvalue (ax, value);
-  /* Dereference typedefs. */
+  /* Dereference typedefs.  */
   type = check_typedef (type);
 
   switch (TYPE_CODE (type))
@@ -1133,8 +1140,9 @@ gen_less (struct agent_expr *ax, struct axs_value *value,
    operator, used in error messages */
 static void
 gen_binop (struct agent_expr *ax, struct axs_value *value,
-          struct axs_value *value1, struct axs_value *value2, enum agent_op op,
-          enum agent_op op_unsigned, int may_carry, char *name)
+          struct axs_value *value1, struct axs_value *value2,
+          enum agent_op op, enum agent_op op_unsigned,
+          int may_carry, char *name)
 {
   /* We only handle INT op INT.  */
   if ((TYPE_CODE (value1->type) != TYPE_CODE_INT)
@@ -1238,8 +1246,7 @@ gen_bitfield_ref (struct expression *exp, struct agent_expr *ax,
 {
   /* Note that ops[i] fetches 8 << i bits.  */
   static enum agent_op ops[]
-  =
-  {aop_ref8, aop_ref16, aop_ref32, aop_ref64};
+    = {aop_ref8, aop_ref16, aop_ref32, aop_ref64};
   static int num_ops = (sizeof (ops) / sizeof (ops[0]));
 
   /* We don't want to touch any byte that the bitfield doesn't
@@ -1285,7 +1292,7 @@ gen_bitfield_ref (struct expression *exp, struct agent_expr *ax,
      equal to the number of `one' bits in bytesize, but who cares?  */
   int fragment_count;
 
-  /* Dereference any typedefs. */
+  /* Dereference any typedefs.  */
   type = check_typedef (type);
 
   /* Can we fetch the number of bits requested at all?  */
@@ -1443,7 +1450,8 @@ gen_struct_ref_recursive (struct expression *exp, struct agent_expr *ax,
                {
                  gen_static_field (exp->gdbarch, ax, value, type, i);
                  if (value->optimized_out)
-                   error (_("static field `%s' has been optimized out, cannot use"),
+                   error (_("static field `%s' has been "
+                            "optimized out, cannot use"),
                           field);
                  return 1;
                }
@@ -1465,7 +1473,8 @@ gen_struct_ref_recursive (struct expression *exp, struct agent_expr *ax,
       struct type *basetype = check_typedef (TYPE_BASECLASS (type, i));
 
       rslt = gen_struct_ref_recursive (exp, ax, value, field,
-                                      offset + TYPE_BASECLASS_BITPOS (type, i) / TARGET_CHAR_BIT,
+                                      offset + TYPE_BASECLASS_BITPOS (type, i)
+                                      / TARGET_CHAR_BIT,
                                       basetype);
       if (rslt)
        return 1;
@@ -1540,7 +1549,7 @@ gen_static_field (struct gdbarch *gdbarch,
     }
   else
     {
-      char *phys_name = TYPE_FIELD_STATIC_PHYSNAME (type, fieldno);
+      const char *phys_name = TYPE_FIELD_STATIC_PHYSNAME (type, fieldno);
       struct symbol *sym = lookup_symbol (phys_name, 0, VAR_DOMAIN, 0);
 
       if (sym)
@@ -1583,7 +1592,8 @@ gen_struct_elt_for_reference (struct expression *exp,
            {
              gen_static_field (exp->gdbarch, ax, value, t, i);
              if (value->optimized_out)
-               error (_("static field `%s' has been optimized out, cannot use"),
+               error (_("static field `%s' has been "
+                        "optimized out, cannot use"),
                       fieldname);
              return 1;
            }
@@ -1673,7 +1683,7 @@ gen_aggregate_elt_ref (struct expression *exp,
   return 0;
 }
 
-/* Generate code for GDB's magical `repeat' operator.  
+/* Generate code for GDB's magical `repeat' operator.
    LVALUE @ INT creates an array INT elements long, and whose elements
    have the same type as LVALUE, located in memory so that LVALUE is
    its first element.  For example, argv[0]@argc gives you the array
@@ -1689,6 +1699,7 @@ gen_repeat (struct expression *exp, union exp_element **pc,
            struct agent_expr *ax, struct axs_value *value)
 {
   struct axs_value value1;
+
   /* We don't want to turn this into an rvalue, so no conversions
      here.  */
   gen_expr (exp, pc, ax, &value1);
@@ -1701,7 +1712,8 @@ gen_repeat (struct expression *exp, union exp_element **pc,
     int length;
 
     if (!v)
-      error (_("Right operand of `@' must be a constant, in agent expressions."));
+      error (_("Right operand of `@' must be a "
+              "constant, in agent expressions."));
     if (TYPE_CODE (value_type (v)) != TYPE_CODE_INT)
       error (_("Right operand of `@' must be an integer."));
     length = value_as_long (v);
@@ -1737,6 +1749,7 @@ gen_sizeof (struct expression *exp, union exp_element **pc,
      So we generate code for the operand, and then throw it away,
      replacing it with code that simply pushes its size.  */
   int start = ax->len;
+
   gen_expr (exp, pc, ax, value);
 
   /* Throw away the code we just generated.  */
@@ -1873,6 +1886,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
        {
          char *name = internalvar_name ((*pc)[1].internalvar);
          struct trace_state_variable *tsv;
+
          (*pc) += 3;
          gen_expr (exp, pc, ax, value);
          tsv = find_trace_state_variable (name);
@@ -1883,7 +1897,8 @@ gen_expr (struct expression *exp, union exp_element **pc,
                ax_tsv (ax, aop_tracev, tsv->number);
            }
          else
-           error (_("$%s is not a trace state variable, may not assign to it"), name);
+           error (_("$%s is not a trace state variable, "
+                    "may not assign to it"), name);
        }
       else
        error (_("May only assign to trace state variables"));
@@ -1898,6 +1913,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
        {
          char *name = internalvar_name ((*pc)[1].internalvar);
          struct trace_state_variable *tsv;
+
          (*pc) += 3;
          tsv = find_trace_state_variable (name);
          if (tsv)
@@ -1917,7 +1933,8 @@ gen_expr (struct expression *exp, union exp_element **pc,
                ax_tsv (ax, aop_tracev, tsv->number);
            }
          else
-           error (_("$%s is not a trace state variable, may not assign to it"), name);
+           error (_("$%s is not a trace state variable, "
+                    "may not assign to it"), name);
        }
       else
        error (_("May only assign to trace state variables"));
@@ -1944,6 +1961,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
       {
        struct type *type = (*pc)[1].type;
        LONGEST k = (*pc)[2].longconst;
+
        (*pc) += 4;
        gen_int_literal (ax, value, k, type);
       }
@@ -1963,14 +1981,17 @@ gen_expr (struct expression *exp, union exp_element **pc,
       {
        const char *name = &(*pc)[2].string;
        int reg;
+
        (*pc) += 4 + BYTES_TO_EXP_ELEM ((*pc)[1].longconst + 1);
        reg = user_reg_map_name_to_regnum (exp->gdbarch, name, strlen (name));
        if (reg == -1)
          internal_error (__FILE__, __LINE__,
                          _("Register $%s not available"), name);
-       if (reg >= gdbarch_num_regs (exp->gdbarch))
-         error (_("'%s' is a pseudo-register; "
-                  "GDB cannot yet trace pseudoregister contents."),
+       /* No support for tracing user registers yet.  */
+       if (reg >= gdbarch_num_regs (exp->gdbarch)
+           + gdbarch_num_pseudo_regs (exp->gdbarch))
+         error (_("'%s' is a user-register; "
+                  "GDB cannot yet trace user-register contents."),
                 name);
        value->kind = axs_lvalue_register;
        value->u.reg = reg;
@@ -1982,6 +2003,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
       {
        const char *name = internalvar_name ((*pc)[1].internalvar);
        struct trace_state_variable *tsv;
+
        (*pc) += 3;
        tsv = find_trace_state_variable (name);
        if (tsv)
@@ -1994,7 +2016,8 @@ gen_expr (struct expression *exp, union exp_element **pc,
            value->type = builtin_type (exp->gdbarch)->builtin_long_long;
          }
        else
-         error (_("$%s is not a trace state variable; GDB agent expressions cannot use convenience variables."), name);
+         error (_("$%s is not a trace state variable; GDB agent "
+                  "expressions cannot use convenience variables."), name);
       }
       break;
 
@@ -2008,6 +2031,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
     case UNOP_CAST:
       {
        struct type *type = (*pc)[1].type;
+
        (*pc) += 3;
        gen_expr (exp, pc, ax, value);
        gen_cast (ax, value, type);
@@ -2017,16 +2041,16 @@ gen_expr (struct expression *exp, union exp_element **pc,
     case UNOP_MEMVAL:
       {
        struct type *type = check_typedef ((*pc)[1].type);
+
        (*pc) += 3;
        gen_expr (exp, pc, ax, value);
-       /* I'm not sure I understand UNOP_MEMVAL entirely.  I think
-          it's just a hack for dealing with minsyms; you take some
-          integer constant, pretend it's the address of an lvalue of
-          the given type, and dereference it.  */
-       if (value->kind != axs_rvalue)
-         /* This would be weird.  */
-         internal_error (__FILE__, __LINE__,
-                         _("gen_expr: OP_MEMVAL operand isn't an rvalue???"));
+
+       /* If we have an axs_rvalue or an axs_lvalue_memory, then we
+          already have the right value on the stack.  For
+          axs_lvalue_register, we must convert.  */
+       if (value->kind == axs_lvalue_register)
+         require_rvalue (ax, value);
+
        value->type = type;
        value->kind = axs_lvalue_memory;
       }
@@ -2034,7 +2058,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
 
     case UNOP_PLUS:
       (*pc)++;
-      /* + FOO is equivalent to 0 + FOO, which can be optimized. */
+      /* + FOO is equivalent to 0 + FOO, which can be optimized.  */
       gen_expr (exp, pc, ax, value);
       gen_usual_unary (exp, ax, value);
       break;
@@ -2232,8 +2256,8 @@ gen_expr_binop_rest (struct expression *exp,
 
        if (binop_types_user_defined_p (op, value1->type, value2->type))
          {
-           error (_("\
-cannot subscript requested type: cannot call user defined functions"));
+           error (_("cannot subscript requested type: "
+                    "cannot call user defined functions"));
          }
        else
          {
@@ -2253,7 +2277,8 @@ cannot subscript requested type: cannot call user defined functions"));
          }
 
        if (!is_integral_type (value2->type))
-         error (_("Argument to arithmetic operation not a number or boolean."));
+         error (_("Argument to arithmetic operation "
+                  "not a number or boolean."));
 
        gen_ptradd (ax, value, value1, value2);
        gen_deref (ax, value);
@@ -2496,10 +2521,12 @@ void
 _initialize_ax_gdb (void)
 {
   add_cmd ("agent", class_maintenance, agent_command,
-          _("Translate an expression into remote agent bytecode for tracing."),
+          _("Translate an expression into "
+            "remote agent bytecode for tracing."),
           &maintenancelist);
 
   add_cmd ("agent-eval", class_maintenance, agent_eval_command,
-          _("Translate an expression into remote agent bytecode for evaluation."),
+          _("Translate an expression into remote "
+            "agent bytecode for evaluation."),
           &maintenancelist);
 }
This page took 0.034288 seconds and 4 git commands to generate.