From 7dc54575d91a2b41f6c3e838eec44a7017a24436 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Mon, 28 Nov 2016 17:09:26 +0000 Subject: [PATCH] Adjust Value.location for lval_register value.regnum and value.next_frame_id are only used for lval_register, so this patch moves them to union value.location. As a result, when we copy value, only copy location, don't need to copy regnum and next_frame_id. This patch also changes regnum's type to int as there is no space constraint, so update deprecated_value_regnum_hack return type too. gdb: 2016-11-28 Yao Qi * valops.c (value_slice): Don't set frame id of slice. * value.c (struct value) : Move them to... (struct value) : ... here. Update comments. (allocate_value_lazy): Don't set frame id and regnum. (deprecated_value_next_frame_id_hack): Adjust. (deprecated_value_regnum_hack): Adjust. (value_copy): Don't copy frame id and regnu. (value_primitive_field): Likewise. (value_from_component): Likewise. (deprecated_value_regnum_hack): Return int *. * value.h (deprecated_value_regnum_hack): Update declaration. --- gdb/valops.c | 1 - gdb/value.c | 44 +++++++++++++++++--------------------------- gdb/value.h | 2 +- 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/gdb/valops.c b/gdb/valops.c index 8a45641..3a7550d 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -3827,7 +3827,6 @@ value_slice (struct value *array, int lowbound, int length) } set_value_component_location (slice, array); - VALUE_NEXT_FRAME_ID (slice) = VALUE_NEXT_FRAME_ID (array); set_value_offset (slice, value_offset (array) + offset); } diff --git a/gdb/value.c b/gdb/value.c index 8d33501..13a0bb9 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -205,17 +205,23 @@ struct value /* If the value has been released. */ unsigned int released : 1; - /* Register number if the value is from a register. */ - short regnum; - /* Location of value (if lval). */ union { - /* If lval == lval_memory, this is the address in the inferior. - If lval == lval_register, this is the byte offset into the - registers structure. */ + /* If lval == lval_memory, this is the address in the inferior */ CORE_ADDR address; + /*If lval == lval_register, the value is from a register. */ + struct + { + /* Register number. */ + int regnum; + /* Frame ID of "next" frame to which a register value is relative. + If the register value is found relative to frame F, then the + frame id of F->next will be stored in next_frame_id. */ + struct frame_id next_frame_id; + } reg; + /* Pointer to internal variable. */ struct internalvar *internalvar; @@ -236,10 +242,8 @@ struct value } location; /* Describes offset of a value within lval of a structure in target - addressable memory units. If lval == lval_memory, this is an offset to - the address. If lval == lval_register, this is a further offset from - location.address within the registers structure. Note also the member - embedded_offset below. */ + addressable memory units. Note also the member embedded_offset + below. */ LONGEST offset; /* Only used for bitfields; number of bits contained in them. */ @@ -262,12 +266,6 @@ struct value bitfields. */ struct value *parent; - /* Frame ID of "next" frame to which a register value is relative. A - register value is indicated when the lval enum (above) is set to - lval_register. So, if the register value is found relative to frame F, - then the frame id of F->next will be stored in next_frame_id. */ - struct frame_id next_frame_id; - /* Type of the value. */ struct type *type; @@ -945,11 +943,9 @@ allocate_value_lazy (struct type *type) val->enclosing_type = type; VALUE_LVAL (val) = not_lval; val->location.address = 0; - VALUE_NEXT_FRAME_ID (val) = null_frame_id; val->offset = 0; val->bitpos = 0; val->bitsize = 0; - VALUE_REGNUM (val) = -1; val->lazy = 1; val->embedded_offset = 0; val->pointed_to_offset = 0; @@ -1586,13 +1582,13 @@ deprecated_value_internalvar_hack (struct value *value) struct frame_id * deprecated_value_next_frame_id_hack (struct value *value) { - return &value->next_frame_id; + return &value->location.reg.next_frame_id; } -short * +int * deprecated_value_regnum_hack (struct value *value) { - return &value->regnum; + return &value->location.reg.regnum; } int @@ -1788,8 +1784,6 @@ value_copy (struct value *arg) val->offset = arg->offset; val->bitpos = arg->bitpos; val->bitsize = arg->bitsize; - VALUE_NEXT_FRAME_ID (val) = VALUE_NEXT_FRAME_ID (arg); - VALUE_REGNUM (val) = VALUE_REGNUM (arg); val->lazy = arg->lazy; val->embedded_offset = value_embedded_offset (arg); val->pointed_to_offset = arg->pointed_to_offset; @@ -3229,8 +3223,6 @@ value_primitive_field (struct value *arg1, LONGEST offset, + value_embedded_offset (arg1)); } set_value_component_location (v, arg1); - VALUE_REGNUM (v) = VALUE_REGNUM (arg1); - VALUE_NEXT_FRAME_ID (v) = VALUE_NEXT_FRAME_ID (arg1); return v; } @@ -3814,8 +3806,6 @@ value_from_component (struct value *whole, struct type *type, LONGEST offset) } v->offset = value_offset (whole) + offset + value_embedded_offset (whole); set_value_component_location (v, whole); - VALUE_REGNUM (v) = VALUE_REGNUM (whole); - VALUE_NEXT_FRAME_ID (v) = VALUE_NEXT_FRAME_ID (whole); return v; } diff --git a/gdb/value.h b/gdb/value.h index 281b5a8..f776323 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -448,7 +448,7 @@ extern struct frame_id *deprecated_value_next_frame_id_hack (struct value *); #define VALUE_FRAME_ID(val) (get_prev_frame_id_by_id (VALUE_NEXT_FRAME_ID (val))) /* Register number if the value is from a register. */ -extern short *deprecated_value_regnum_hack (struct value *); +extern int *deprecated_value_regnum_hack (struct value *); #define VALUE_REGNUM(val) (*deprecated_value_regnum_hack (val)) /* Return value after lval_funcs->coerce_ref (after check_typedef). Return -- 2.7.4