Changeset View
Changeset View
Standalone View
Standalone View
head/contrib/gdb/gdb/dwarf2loc.c
Show First 20 Lines • Show All 200 Lines • ▼ Show 20 Lines | /* Evaluate a location description, starting at DATA and with length | ||||
SIZE, to find the current location of variable VAR in the context | SIZE, to find the current location of variable VAR in the context | ||||
of FRAME. */ | of FRAME. */ | ||||
static struct value * | static struct value * | ||||
dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame, | dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame, | ||||
unsigned char *data, unsigned short size, | unsigned char *data, unsigned short size, | ||||
struct objfile *objfile) | struct objfile *objfile) | ||||
{ | { | ||||
CORE_ADDR result; | CORE_ADDR result; | ||||
struct gdbarch *arch = get_frame_arch (frame); | |||||
struct value *retval; | struct value *retval; | ||||
struct dwarf_expr_baton baton; | struct dwarf_expr_baton baton; | ||||
struct dwarf_expr_context *ctx; | struct dwarf_expr_context *ctx; | ||||
if (size == 0) | if (size == 0) | ||||
{ | { | ||||
retval = allocate_value (SYMBOL_TYPE (var)); | retval = allocate_value (SYMBOL_TYPE (var)); | ||||
VALUE_LVAL (retval) = not_lval; | VALUE_LVAL (retval) = not_lval; | ||||
VALUE_OPTIMIZED_OUT (retval) = 1; | VALUE_OPTIMIZED_OUT (retval) = 1; | ||||
} | } | ||||
baton.frame = frame; | baton.frame = frame; | ||||
baton.objfile = objfile; | baton.objfile = objfile; | ||||
ctx = new_dwarf_expr_context (); | ctx = new_dwarf_expr_context (); | ||||
ctx->baton = &baton; | ctx->baton = &baton; | ||||
ctx->read_reg = dwarf_expr_read_reg; | ctx->read_reg = dwarf_expr_read_reg; | ||||
ctx->read_mem = dwarf_expr_read_mem; | ctx->read_mem = dwarf_expr_read_mem; | ||||
ctx->get_frame_base = dwarf_expr_frame_base; | ctx->get_frame_base = dwarf_expr_frame_base; | ||||
ctx->get_tls_address = dwarf_expr_tls_address; | ctx->get_tls_address = dwarf_expr_tls_address; | ||||
dwarf_expr_eval (ctx, data, size); | dwarf_expr_eval (ctx, data, size); | ||||
result = dwarf_expr_fetch (ctx, 0); | result = dwarf_expr_fetch (ctx, 0); | ||||
if (ctx->in_reg) | if (ctx->num_pieces > 0) | ||||
{ | { | ||||
int i; | |||||
long offset = 0; | |||||
bfd_byte *contents; | |||||
retval = allocate_value (SYMBOL_TYPE (var)); | |||||
contents = VALUE_CONTENTS_RAW (retval); | |||||
for (i = 0; i < ctx->num_pieces; i++) | |||||
{ | |||||
struct dwarf_expr_piece *p = &ctx->pieces[i]; | |||||
if (p->in_reg) | |||||
{ | |||||
bfd_byte regval[MAX_REGISTER_SIZE]; | |||||
int gdb_regnum = DWARF2_REG_TO_REGNUM (p->value); | |||||
get_frame_register (frame, gdb_regnum, regval); | |||||
memcpy (contents + offset, regval, p->size); | |||||
} | |||||
else /* In memory? */ | |||||
{ | |||||
read_memory (p->value, contents + offset, p->size); | |||||
} | |||||
offset += p->size; | |||||
} | |||||
} | |||||
else if (ctx->in_reg) | |||||
{ | |||||
int regnum = DWARF2_REG_TO_REGNUM (result); | int regnum = DWARF2_REG_TO_REGNUM (result); | ||||
retval = value_from_register (SYMBOL_TYPE (var), regnum, frame); | retval = value_from_register (SYMBOL_TYPE (var), regnum, frame); | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
retval = allocate_value (SYMBOL_TYPE (var)); | retval = allocate_value (SYMBOL_TYPE (var)); | ||||
VALUE_BFD_SECTION (retval) = SYMBOL_BFD_SECTION (var); | VALUE_BFD_SECTION (retval) = SYMBOL_BFD_SECTION (var); | ||||
VALUE_LVAL (retval) = lval_memory; | VALUE_LVAL (retval) = lval_memory; | ||||
VALUE_LAZY (retval) = 1; | VALUE_LAZY (retval) = 1; | ||||
VALUE_ADDRESS (retval) = result; | VALUE_ADDRESS (retval) = result; | ||||
} | } | ||||
set_value_initialized (retval, ctx->initialized); | |||||
free_dwarf_expr_context (ctx); | free_dwarf_expr_context (ctx); | ||||
return retval; | return retval; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | dwarf2_loc_desc_needs_frame (unsigned char *data, unsigned short size) | ||||
ctx->read_reg = needs_frame_read_reg; | ctx->read_reg = needs_frame_read_reg; | ||||
ctx->read_mem = needs_frame_read_mem; | ctx->read_mem = needs_frame_read_mem; | ||||
ctx->get_frame_base = needs_frame_frame_base; | ctx->get_frame_base = needs_frame_frame_base; | ||||
ctx->get_tls_address = needs_frame_tls_address; | ctx->get_tls_address = needs_frame_tls_address; | ||||
dwarf_expr_eval (ctx, data, size); | dwarf_expr_eval (ctx, data, size); | ||||
in_reg = ctx->in_reg; | in_reg = ctx->in_reg; | ||||
if (ctx->num_pieces > 0) | |||||
{ | |||||
int i; | |||||
/* If the location has several pieces, and any of them are in | |||||
registers, then we will need a frame to fetch them from. */ | |||||
for (i = 0; i < ctx->num_pieces; i++) | |||||
if (ctx->pieces[i].in_reg) | |||||
in_reg = 1; | |||||
} | |||||
free_dwarf_expr_context (ctx); | free_dwarf_expr_context (ctx); | ||||
return baton.needs_frame || in_reg; | return baton.needs_frame || in_reg; | ||||
} | } | ||||
static void | static void | ||||
dwarf2_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax, | dwarf2_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax, | ||||
▲ Show 20 Lines • Show All 222 Lines • Show Last 20 Lines |