* dwarf2expr.h (struct dwarf_expr_context): Remove extra arguments
authorDaniel Jacobowitz <drow@false.org>
Sun, 13 Apr 2003 15:53:44 +0000 (15:53 +0000)
committerDaniel Jacobowitz <drow@false.org>
Sun, 13 Apr 2003 15:53:44 +0000 (15:53 +0000)
to read_reg and update its comment.  Remove regnum member.
* dwarf2expr.c (execute_stack_op): Remove memaddr and expr_lval.
Don't call read_reg when setting in_reg.  Call read_reg to get
the frame base if it's in a register.  Return the register number
on the stack instead of in the context.  Remove extra arguments
to read_reg.
* dwarf2loc.c (dwarf_expr_read_reg): Remove extra arguments.
(dwarf2_evaluate_loc_desc): Call value_from_register.  Expect
the register number on the expression stack.
(needs_frame_read_reg): Remove extra arguments.

gdb/ChangeLog
gdb/dwarf2expr.c
gdb/dwarf2expr.h
gdb/dwarf2loc.c

index 502514aad4cc8691bca70b88015616499d508287..afe3c564b54185dba15e173740f49e2de86e18bb 100644 (file)
@@ -1,3 +1,17 @@
+2003-04-13  Daniel Jacobowitz  <drow@mvista.com>
+
+       * dwarf2expr.h (struct dwarf_expr_context): Remove extra arguments
+       to read_reg and update its comment.  Remove regnum member.
+       * dwarf2expr.c (execute_stack_op): Remove memaddr and expr_lval.
+       Don't call read_reg when setting in_reg.  Call read_reg to get
+       the frame base if it's in a register.  Return the register number
+       on the stack instead of in the context.  Remove extra arguments
+       to read_reg.
+       * dwarf2loc.c (dwarf_expr_read_reg): Remove extra arguments.
+       (dwarf2_evaluate_loc_desc): Call value_from_register.  Expect
+       the register number on the expression stack.
+       (needs_frame_read_reg): Remove extra arguments.
+
 2003-04-13  Daniel Jacobowitz  <drow@mvista.com>
 
        * dwarf2expr.c (dwarf2_read_address): Renamed from read_address;
index a87dfc6fb85162497839f3b7fd02c83da663f096..35e76f3cd40bb09ccdc51d40154f56f8d978ebb1 100644 (file)
@@ -231,11 +231,10 @@ execute_stack_op (struct dwarf_expr_context *ctx, unsigned char *op_ptr,
   while (op_ptr < op_end)
     {
       enum dwarf_location_atom op = *op_ptr++;
-      CORE_ADDR result, memaddr;
+      CORE_ADDR result;
       ULONGEST uoffset, reg;
       LONGEST offset;
       int bytes_read;
-      enum lval_type expr_lval;
 
       ctx->in_reg = 0;
 
@@ -361,19 +360,8 @@ execute_stack_op (struct dwarf_expr_context *ctx, unsigned char *op_ptr,
            error ("DWARF-2 expression error: DW_OP_reg operations must be "
                   "used alone.");
 
-         /* FIXME drow/2003-02-21: This call to read_reg could be pushed
-            into the evaluator's caller by changing the semantics for in_reg.
-            Then we wouldn't need to return an lval_type and a memaddr.  */
-         result = (ctx->read_reg) (ctx->baton, op - DW_OP_reg0, &expr_lval,
-                                   &memaddr);
-
-         if (expr_lval == lval_register)
-           {
-             ctx->regnum = op - DW_OP_reg0;
-             ctx->in_reg = 1;
-           }
-         else
-           result = memaddr;
+         result = op - DW_OP_reg0;
+         ctx->in_reg = 1;
 
          break;
 
@@ -383,16 +371,8 @@ execute_stack_op (struct dwarf_expr_context *ctx, unsigned char *op_ptr,
            error ("DWARF-2 expression error: DW_OP_reg operations must be "
                   "used alone.");
 
-         result = (ctx->read_reg) (ctx->baton, reg, &expr_lval, &memaddr);
-
-         if (expr_lval == lval_register)
-           {
-             ctx->regnum = reg;
-             ctx->in_reg = 1;
-           }
-         else
-           result = memaddr;
-
+         result = reg;
+         ctx->in_reg = 1;
          break;
 
        case DW_OP_breg0:
@@ -429,8 +409,7 @@ execute_stack_op (struct dwarf_expr_context *ctx, unsigned char *op_ptr,
        case DW_OP_breg31:
          {
            op_ptr = read_sleb128 (op_ptr, op_end, &offset);
-           result = (ctx->read_reg) (ctx->baton, op - DW_OP_breg0,
-                                     &expr_lval, &memaddr);
+           result = (ctx->read_reg) (ctx->baton, op - DW_OP_breg0);
            result += offset;
          }
          break;
@@ -438,7 +417,7 @@ execute_stack_op (struct dwarf_expr_context *ctx, unsigned char *op_ptr,
          {
            op_ptr = read_uleb128 (op_ptr, op_end, &reg);
            op_ptr = read_sleb128 (op_ptr, op_end, &offset);
-           result = (ctx->read_reg) (ctx->baton, reg, &expr_lval, &memaddr);
+           result = (ctx->read_reg) (ctx->baton, reg);
            result += offset;
          }
          break;
@@ -460,7 +439,9 @@ execute_stack_op (struct dwarf_expr_context *ctx, unsigned char *op_ptr,
            (ctx->get_frame_base) (ctx->baton, &datastart, &datalen);
            dwarf_expr_eval (ctx, datastart, datalen);
            result = dwarf_expr_fetch (ctx, 0);
-           if (! ctx->in_reg)
+           if (ctx->in_reg)
+             result = (ctx->read_reg) (ctx->baton, result);
+           else
              {
                char *buf = alloca (TARGET_ADDR_BIT / TARGET_CHAR_BIT);
                int bytes_read;
index 599800ce4823d9c4fd01ceec988f4cba2c519eda..9e6fe808789d87c8362c1852a5551d4f7498813a 100644 (file)
@@ -36,13 +36,8 @@ struct dwarf_expr_context
      to all of the callback functions.  */
   void *baton;
 
-  /* Return the value of register number REGNUM.  LVALP will be set
-     to the kind of lval this register is (generally lval_register
-     for the current frame's registers or lval_memory for a register
-     saved to the stack).  For lval_memory ADDRP will be set to the
-     saved location of the register.  */
-  CORE_ADDR (*read_reg) (void *baton, int regnum, enum lval_type *lvalp,
-                        CORE_ADDR *addrp);
+  /* Return the value of register number REGNUM.  */
+  CORE_ADDR (*read_reg) (void *baton, int regnum);
 
   /* Read LENGTH bytes at ADDR into BUF.  */
   void (*read_mem) (void *baton, char *buf, CORE_ADDR addr,
@@ -77,12 +72,8 @@ struct dwarf_expr_context
   int recursion_depth, max_recursion_depth;
 
   /* Non-zero if the result is in a register.  The register number
-     will be in REGNUM, and the result will be the contents of the
-     register.  */
+     will be on the expression stack.  */
   int in_reg;
-
-  /* If the result is in a register, the register number.  */
-  int regnum;
 };
 
 struct dwarf_expr_context *new_dwarf_expr_context ();
index 2f5cce5f0daec9e150a3ac7df156b56483d30aaa..8927e8798b52da0d33cf59cdcf6834c18d39367a 100644 (file)
@@ -110,11 +110,11 @@ struct dwarf_expr_baton
    type will be returned in LVALP, and for lval_memory the register
    save address will be returned in ADDRP.  */
 static CORE_ADDR
-dwarf_expr_read_reg (void *baton, int dwarf_regnum, enum lval_type *lvalp,
-                    CORE_ADDR *addrp)
+dwarf_expr_read_reg (void *baton, int dwarf_regnum)
 {
   struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
-  CORE_ADDR result;
+  CORE_ADDR result, save_addr;
+  enum lval_type lval_type;
   char *buf;
   int optimized, regnum, realnum, regsize;
 
@@ -122,8 +122,8 @@ dwarf_expr_read_reg (void *baton, int dwarf_regnum, enum lval_type *lvalp,
   regsize = register_size (current_gdbarch, regnum);
   buf = (char *) alloca (regsize);
 
-  frame_register (debaton->frame, regnum, &optimized, lvalp, addrp, &realnum,
-                 buf);
+  frame_register (debaton->frame, regnum, &optimized, &lval_type, &save_addr,
+                 &realnum, buf);
   result = extract_address (buf, regsize);
 
   return result;
@@ -220,21 +220,15 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
   ctx->get_tls_address = dwarf_expr_tls_address;
 
   dwarf_expr_eval (ctx, data, size);
-
-  retval = allocate_value (SYMBOL_TYPE (var));
-  VALUE_BFD_SECTION (retval) = SYMBOL_BFD_SECTION (var);
+  result = dwarf_expr_fetch (ctx, 0);
 
   if (ctx->in_reg)
-    {
-      store_unsigned_integer (VALUE_CONTENTS_RAW (retval),
-                             TYPE_LENGTH (SYMBOL_TYPE (var)),
-                             dwarf_expr_fetch (ctx, 0));
-      VALUE_LVAL (retval) = lval_register;
-      VALUE_REGNO (retval) = ctx->regnum;
-    }
+    retval = value_from_register (SYMBOL_TYPE (var), result, frame);
   else
     {
-      result = dwarf_expr_fetch (ctx, 0);
+      retval = allocate_value (SYMBOL_TYPE (var));
+      VALUE_BFD_SECTION (retval) = SYMBOL_BFD_SECTION (var);
+
       VALUE_LVAL (retval) = lval_memory;
       VALUE_LAZY (retval) = 1;
       VALUE_ADDRESS (retval) = result;
@@ -258,8 +252,7 @@ struct needs_frame_baton
 
 /* Reads from registers do require a frame.  */
 static CORE_ADDR
-needs_frame_read_reg (void *baton, int regnum, enum lval_type *lvalp,
-                           CORE_ADDR *addrp)
+needs_frame_read_reg (void *baton, int regnum)
 {
   struct needs_frame_baton *nf_baton = baton;
   nf_baton->needs_frame = 1;