mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 17:18:55 +00:00
* 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.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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, ®);
|
||||
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;
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user