Do not load .eh_frame section from separete object files
[deliverable/binutils-gdb.git] / gdb / ax-gdb.c
index 091fd95f1fc6c042ef6d495ed48180f16757f8ad..5258167df3824a9ce0e836b03e03820bbfd1b424 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;
       }
@@ -329,7 +332,7 @@ maybe_const_expr (union exp_element **pc)
 
    Setting the flag trace_kludge to non-zero enables the code that
    emits the trace bytecodes at the appropriate points.  */
-static int trace_kludge;
+int trace_kludge;
 
 /* Scan for all static fields in the given class, including any base
    classes, and generate tracing bytecodes for each.  */
@@ -363,10 +366,9 @@ gen_trace_static_fields (struct gdbarch *gdbarch,
              break;
 
            case axs_lvalue_register:
-             /* We need to mention the register somewhere in the bytecode,
-                so ax_reqs will pick it up and add it to the mask of
-                registers used.  */
-             ax_reg (ax, value.u.reg);
+             /* We don't actually need the register's value to be pushed,
+                just note that we need it to be collected.  */
+             ax_reg_mask (ax, value.u.reg);
 
            default:
              break;
@@ -414,11 +416,11 @@ gen_traced_pop (struct gdbarch *gdbarch,
        break;
 
       case axs_lvalue_register:
-       /* We need to mention the register somewhere in the bytecode,
-          so ax_reqs will pick it up and add it to the mask of
-          registers used.  */
-       ax_reg (ax, value->u.reg);
-       ax_simple (ax, aop_pop);
+       /* We don't actually need the register's value to be on the
+          stack, and the target will get heartburn if the register is
+          larger than will fit in a stack, so just mark it for
+          collection and be done with it.  */
+       ax_reg_mask (ax, value->u.reg);
        break;
       }
   else
@@ -454,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));
 }
@@ -478,6 +481,7 @@ gen_fetch (struct agent_expr *ax, struct type *type)
     case TYPE_CODE_ENUM:
     case TYPE_CODE_INT:
     case TYPE_CODE_CHAR:
+    case TYPE_CODE_BOOL:
       /* It's a scalar value, so we know how to dereference it.  How
          many bytes long is it?  */
       switch (TYPE_LENGTH (type))
@@ -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));
 
@@ -745,6 +751,15 @@ gen_int_literal (struct agent_expr *ax, struct axs_value *value, LONGEST k,
 static void
 require_rvalue (struct agent_expr *ax, struct axs_value *value)
 {
+  /* Only deal with scalars, structs and such may be too large
+     to fit in a stack entry.  */
+  value->type = check_typedef (value->type);
+  if (TYPE_CODE (value->type) == TYPE_CODE_ARRAY
+      || TYPE_CODE (value->type) == TYPE_CODE_STRUCT
+      || TYPE_CODE (value->type) == TYPE_CODE_UNION
+      || TYPE_CODE (value->type) == TYPE_CODE_FUNC)
+    error (_("Value not scalar: cannot be an rvalue."));
+
   switch (value->kind)
     {
     case axs_rvalue:
@@ -809,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
@@ -822,8 +838,9 @@ gen_usual_unary (struct expression *exp, struct agent_expr *ax,
     case TYPE_CODE_UNION:
       return;
 
-      /* If the value is an enum, call it an integer.  */
+      /* If the value is an enum or a bool, call it an integer.  */
     case TYPE_CODE_ENUM:
+    case TYPE_CODE_BOOL:
       value->type = builtin_type (exp->gdbarch)->builtin_int;
       break;
     }
@@ -887,7 +904,7 @@ gen_conversion (struct agent_expr *ax, struct type *from, struct type *to)
 static int
 is_nontrivial_conversion (struct type *from, struct type *to)
 {
-  struct agent_expr *ax = new_agent_expr (0);
+  struct agent_expr *ax = new_agent_expr (NULL, 0);
   int nontrivial;
 
   /* Actually generate the code, and see if anything came out.  At the
@@ -971,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))
@@ -989,6 +1006,7 @@ gen_cast (struct agent_expr *ax, struct axs_value *value, struct type *type)
       error (_("Invalid type cast: intended type must be scalar."));
 
     case TYPE_CODE_ENUM:
+    case TYPE_CODE_BOOL:
       /* We don't have to worry about the size of the value, because
          all our integral values are fully sign-extended, and when
          casting pointers we can do anything we like.  Is there any
@@ -1086,6 +1104,33 @@ an integer nor a pointer of the same type."));
   value->kind = axs_rvalue;
 }
 
+static void
+gen_equal (struct agent_expr *ax, struct axs_value *value,
+          struct axs_value *value1, struct axs_value *value2,
+          struct type *result_type)
+{
+  if (pointer_type (value1->type) || pointer_type (value2->type))
+    ax_simple (ax, aop_equal);
+  else
+    gen_binop (ax, value, value1, value2,
+              aop_equal, aop_equal, 0, "equal");
+  value->type = result_type;
+  value->kind = axs_rvalue;
+}
+
+static void
+gen_less (struct agent_expr *ax, struct axs_value *value,
+         struct axs_value *value1, struct axs_value *value2,
+         struct type *result_type)
+{
+  if (pointer_type (value1->type) || pointer_type (value2->type))
+    ax_simple (ax, aop_less_unsigned);
+  else
+    gen_binop (ax, value, value1, value2,
+              aop_less_signed, aop_less_unsigned, 0, "less than");
+  value->type = result_type;
+  value->kind = axs_rvalue;
+}
 
 /* Generate code for a binary operator that doesn't do pointer magic.
    We set VALUE to describe the result value; we assume VALUE1 and
@@ -1095,8 +1140,9 @@ an integer nor a pointer of the same type."));
    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)
@@ -1200,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
@@ -1247,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?  */
@@ -1405,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;
                }
@@ -1427,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;
@@ -1502,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)
@@ -1529,7 +1576,6 @@ gen_struct_elt_for_reference (struct expression *exp,
 {
   struct type *t = type;
   int i;
-  struct value *v, *result;
 
   if (TYPE_CODE (t) != TYPE_CODE_STRUCT
       && TYPE_CODE (t) != TYPE_CODE_UNION)
@@ -1546,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;
            }
@@ -1636,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
@@ -1652,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);
@@ -1664,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);
@@ -1700,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.  */
@@ -1724,6 +1774,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
   struct axs_value value1, value2, value3;
   enum exp_opcode op = (*pc)[0].opcode, op2;
   int if1, go1, if2, go2, end;
+  struct type *int_type = builtin_type (exp->gdbarch)->builtin_int;
 
   /* If we're looking at a constant expression, just push its value.  */
   {
@@ -1785,7 +1836,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
       ax_const_l (ax, 0);
       ax_label (ax, end, ax->len);
       value->kind = axs_rvalue;
-      value->type = language_bool_type (exp->language_defn, exp->gdbarch);
+      value->type = int_type;
       break;
 
     case BINOP_LOGICAL_OR:
@@ -1804,7 +1855,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
       ax_const_l (ax, 1);
       ax_label (ax, end, ax->len);
       value->kind = axs_rvalue;
-      value->type = language_bool_type (exp->language_defn, exp->gdbarch);
+      value->type = int_type;
       break;
 
     case TERNOP_COND:
@@ -1815,8 +1866,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
         bytecodes in order, but if_goto jumps on true, so we invert
         the sense of A.  Then we can do B by dropping through, and
         jump to do C.  */
-      gen_logical_not (ax, &value1,
-                      language_bool_type (exp->language_defn, exp->gdbarch));
+      gen_logical_not (ax, &value1, int_type);
       if1 = ax_goto (ax, aop_if_goto);
       gen_expr (exp, pc, ax, &value2);
       gen_usual_unary (exp, ax, &value2);
@@ -1836,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);
@@ -1846,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"));
@@ -1861,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)
@@ -1880,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"));
@@ -1907,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);
       }
@@ -1926,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;
@@ -1945,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)
@@ -1957,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;
 
@@ -1971,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);
@@ -1980,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;
       }
@@ -1997,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;
@@ -2018,8 +2079,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
       (*pc)++;
       gen_expr (exp, pc, ax, value);
       gen_usual_unary (exp, ax, value);
-      gen_logical_not (ax, value,
-                      language_bool_type (exp->language_defn, exp->gdbarch));
+      gen_logical_not (ax, value, int_type);
       break;
 
     case UNOP_COMPLEMENT:
@@ -2078,18 +2138,17 @@ gen_expr (struct expression *exp, union exp_element **pc,
     case OP_THIS:
       {
        char *this_name;
-       struct symbol *func, *sym;
+       struct symbol *sym, *func;
        struct block *b;
+       const struct language_defn *lang;
 
-       func = block_linkage_function (block_for_pc (ax->scope));
-       this_name = language_def (SYMBOL_LANGUAGE (func))->la_name_of_this;
-       b = SYMBOL_BLOCK_VALUE (func);
+       b = block_for_pc (ax->scope);
+       func = block_linkage_function (b);
+       lang = language_def (SYMBOL_LANGUAGE (func));
 
-       /* Calling lookup_block_symbol is necessary to get the LOC_REGISTER
-          symbol instead of the LOC_ARG one (if both exist).  */
-       sym = lookup_block_symbol (b, this_name, VAR_DOMAIN);
+       sym = lookup_language_this (lang, b);
        if (!sym)
-         error (_("no `%s' found"), this_name);
+         error (_("no `%s' found"), lang->la_name_of_this);
 
        gen_var_ref (exp->gdbarch, ax, value, sym);
 
@@ -2135,6 +2194,8 @@ gen_expr_binop_rest (struct expression *exp,
                     struct agent_expr *ax, struct axs_value *value,
                     struct axs_value *value1, struct axs_value *value2)
 {
+  struct type *int_type = builtin_type (exp->gdbarch)->builtin_int;
+
   gen_expr (exp, pc, ax, value2);
   gen_usual_unary (exp, ax, value2);
   gen_usual_arithmetic (exp, ax, value1, value2);
@@ -2194,8 +2255,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
          {
@@ -2215,7 +2276,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);
@@ -2237,44 +2299,32 @@ cannot subscript requested type: cannot call user defined functions"));
       break;
 
     case BINOP_EQUAL:
-      gen_binop (ax, value, value1, value2,
-                aop_equal, aop_equal, 0, "equal");
+      gen_equal (ax, value, value1, value2, int_type);
       break;
 
     case BINOP_NOTEQUAL:
-      gen_binop (ax, value, value1, value2,
-                aop_equal, aop_equal, 0, "equal");
-      gen_logical_not (ax, value,
-                      language_bool_type (exp->language_defn,
-                                          exp->gdbarch));
+      gen_equal (ax, value, value1, value2, int_type);
+      gen_logical_not (ax, value, int_type);
       break;
 
     case BINOP_LESS:
-      gen_binop (ax, value, value1, value2,
-                aop_less_signed, aop_less_unsigned, 0, "less than");
+      gen_less (ax, value, value1, value2, int_type);
       break;
 
     case BINOP_GTR:
       ax_simple (ax, aop_swap);
-      gen_binop (ax, value, value1, value2,
-                aop_less_signed, aop_less_unsigned, 0, "less than");
+      gen_less (ax, value, value1, value2, int_type);
       break;
 
     case BINOP_LEQ:
       ax_simple (ax, aop_swap);
-      gen_binop (ax, value, value1, value2,
-                aop_less_signed, aop_less_unsigned, 0, "less than");
-      gen_logical_not (ax, value,
-                      language_bool_type (exp->language_defn,
-                                          exp->gdbarch));
+      gen_less (ax, value, value1, value2, int_type);
+      gen_logical_not (ax, value, int_type);
       break;
 
     case BINOP_GEQ:
-      gen_binop (ax, value, value1, value2,
-                aop_less_signed, aop_less_unsigned, 0, "less than");
-      gen_logical_not (ax, value,
-                      language_bool_type (exp->language_defn,
-                                          exp->gdbarch));
+      gen_less (ax, value, value1, value2, int_type);
+      gen_logical_not (ax, value, int_type);
       break;
 
     default:
@@ -2296,7 +2346,7 @@ gen_trace_for_var (CORE_ADDR scope, struct gdbarch *gdbarch,
                   struct symbol *var)
 {
   struct cleanup *old_chain = 0;
-  struct agent_expr *ax = new_agent_expr (scope);
+  struct agent_expr *ax = new_agent_expr (gdbarch, scope);
   struct axs_value value;
 
   old_chain = make_cleanup_free_agent_expr (ax);
@@ -2336,7 +2386,7 @@ struct agent_expr *
 gen_trace_for_expr (CORE_ADDR scope, struct expression *expr)
 {
   struct cleanup *old_chain = 0;
-  struct agent_expr *ax = new_agent_expr (scope);
+  struct agent_expr *ax = new_agent_expr (expr->gdbarch, scope);
   union exp_element *pc;
   struct axs_value value;
 
@@ -2344,6 +2394,7 @@ gen_trace_for_expr (CORE_ADDR scope, struct expression *expr)
 
   pc = expr->elts;
   trace_kludge = 1;
+  value.optimized_out = 0;
   gen_expr (expr, &pc, ax, &value);
 
   /* Make sure we record the final object, and get rid of it.  */
@@ -2370,7 +2421,7 @@ struct agent_expr *
 gen_eval_for_expr (CORE_ADDR scope, struct expression *expr)
 {
   struct cleanup *old_chain = 0;
-  struct agent_expr *ax = new_agent_expr (scope);
+  struct agent_expr *ax = new_agent_expr (expr->gdbarch, scope);
   union exp_element *pc;
   struct axs_value value;
 
@@ -2378,8 +2429,11 @@ gen_eval_for_expr (CORE_ADDR scope, struct expression *expr)
 
   pc = expr->elts;
   trace_kludge = 0;
+  value.optimized_out = 0;
   gen_expr (expr, &pc, ax, &value);
 
+  require_rvalue (ax, &value);
+
   /* Oh, and terminate.  */
   ax_simple (ax, aop_end);
 
@@ -2412,6 +2466,7 @@ agent_command (char *exp, int from_tty)
   old_chain = make_cleanup (free_current_contents, &expr);
   agent = gen_trace_for_expr (get_frame_pc (fi), expr);
   make_cleanup_free_agent_expr (agent);
+  ax_reqs (agent);
   ax_print (gdb_stdout, agent);
 
   /* It would be nice to call ax_reqs here to gather some general info
@@ -2447,6 +2502,7 @@ agent_eval_command (char *exp, int from_tty)
   old_chain = make_cleanup (free_current_contents, &expr);
   agent = gen_eval_for_expr (get_frame_pc (fi), expr);
   make_cleanup_free_agent_expr (agent);
+  ax_reqs (agent);
   ax_print (gdb_stdout, agent);
 
   /* It would be nice to call ax_reqs here to gather some general info
@@ -2464,10 +2520,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.032753 seconds and 4 git commands to generate.