forked from Imagelibrary/binutils-gdb
* dwarf2expr.h (dwarf_value_location): Add more comments describing
enum values. (struct dwarf_stack_value): New struct. (struct dwarf_expr_context): Change type of `stack' from CORE_ADDR* to struct dwarf_stack_value*. (struct dwarf_expr_piece): Move `v.value' into its own struct, v.expr, all uses updated. Add v.expr.in_stack_memory. (dwarf_expr_push): Update declaration. (dwarf_expr_fetch_in_stack_memory): Declare. * dwarf2expr.c (dwarf_expr_grow_stack): Update calculation of size of stack value. (dwarf_expr_push): New arg in_stack_memory, all callers updated. (dwarf_expr_fetch_in_stack_memory): New function. (add_piece): Set in_stack_memory for non-literal values. (execute_stack_op): Allow ops to specify whether the value is on the program's stack. (execute_stack_op, case DW_OP_fbreg): Mark value as in stack memory. (execute_stack_op, case DW_OP_call_frame_cfa): Ditto. (execute_stack_op, case DW_OP_dup): Copy in_stack_memory flag. (execute_stack_op, cases DW_OP_pick, DW_OP_over): Ditto. (execute_stack_op, cases DW_OP_swap, DW_OP_rot): Update type of dwarf stack value. * dwarf2loc.c (read_pieced_value): Call read_stack for values known to be on the program's stack. (dwarf2_evaluate_loc_desc, case DWARF_VALUE_MEMORY): Call set_value_stack only for objects known to be in stack memory. * dwarf2-frame.c (execute_stack_op): New arg initial_in_stack_memory, all callers updated.
This commit is contained in:
@@ -357,7 +357,8 @@ register %s (#%d) at %s"),
|
||||
|
||||
static CORE_ADDR
|
||||
execute_stack_op (gdb_byte *exp, ULONGEST len, int addr_size,
|
||||
struct frame_info *this_frame, CORE_ADDR initial)
|
||||
struct frame_info *this_frame, CORE_ADDR initial,
|
||||
int initial_in_stack_memory)
|
||||
{
|
||||
struct dwarf_expr_context *ctx;
|
||||
CORE_ADDR result;
|
||||
@@ -375,7 +376,7 @@ execute_stack_op (gdb_byte *exp, ULONGEST len, int addr_size,
|
||||
ctx->get_frame_cfa = no_get_frame_cfa;
|
||||
ctx->get_tls_address = no_get_tls_address;
|
||||
|
||||
dwarf_expr_push (ctx, initial);
|
||||
dwarf_expr_push (ctx, initial, initial_in_stack_memory);
|
||||
dwarf_expr_eval (ctx, exp, len);
|
||||
result = dwarf_expr_fetch (ctx, 0);
|
||||
|
||||
@@ -975,7 +976,7 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache)
|
||||
case CFA_EXP:
|
||||
cache->cfa =
|
||||
execute_stack_op (fs->regs.cfa_exp, fs->regs.cfa_exp_len,
|
||||
cache->addr_size, this_frame, 0);
|
||||
cache->addr_size, this_frame, 0, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1131,7 +1132,7 @@ dwarf2_frame_prev_register (struct frame_info *this_frame, void **this_cache,
|
||||
case DWARF2_FRAME_REG_SAVED_EXP:
|
||||
addr = execute_stack_op (cache->reg[regnum].loc.exp,
|
||||
cache->reg[regnum].exp_len,
|
||||
cache->addr_size, this_frame, cache->cfa);
|
||||
cache->addr_size, this_frame, cache->cfa, 1);
|
||||
return frame_unwind_got_memory (this_frame, regnum, addr);
|
||||
|
||||
case DWARF2_FRAME_REG_SAVED_VAL_OFFSET:
|
||||
@@ -1141,7 +1142,7 @@ dwarf2_frame_prev_register (struct frame_info *this_frame, void **this_cache,
|
||||
case DWARF2_FRAME_REG_SAVED_VAL_EXP:
|
||||
addr = execute_stack_op (cache->reg[regnum].loc.exp,
|
||||
cache->reg[regnum].exp_len,
|
||||
cache->addr_size, this_frame, cache->cfa);
|
||||
cache->addr_size, this_frame, cache->cfa, 1);
|
||||
return frame_unwind_got_constant (this_frame, regnum, addr);
|
||||
|
||||
case DWARF2_FRAME_REG_UNSPECIFIED:
|
||||
|
||||
Reference in New Issue
Block a user