* ax-gdb.c (gen_bitfield_ref): Add EXP argument, use expression

architecture instead of current_gdbarch.
	(gen_struct_ref): Add EXP argument, pass to get_bitfield_ref.
	(gen_expr): Pass expression to get_struct_ref.

	* symtab.h (struct symbol_ops): Add GDBARCH parameter to
	tracepoint_var_ref callback.
	* ax-gdb.c (gen_var_ref): Pass architecture to tracepoint_var_ref
	symbol operation callback.
	* dwarf2loc.c (dwarf2_tracepoint_var_ref): Add GDBARCH parameter.
	Use it instead of current_gdbarch.
	(locexpr_tracepoint_var_ref): Add GDBARCH parameter.  Pass it to
	dwarf2_tracepoint_var_ref.
	(loclist_tracepoint_var_ref): Likewise.
This commit is contained in:
Ulrich Weigand 2009-06-17 18:40:53 +00:00
parent 55f960e1d2
commit 505e835dc0
4 changed files with 42 additions and 22 deletions

View File

@ -1,3 +1,20 @@
2009-06-17 Ulrich Weigand <uweigand@de.ibm.com>
* ax-gdb.c (gen_bitfield_ref): Add EXP argument, use expression
architecture instead of current_gdbarch.
(gen_struct_ref): Add EXP argument, pass to get_bitfield_ref.
(gen_expr): Pass expression to get_struct_ref.
* symtab.h (struct symbol_ops): Add GDBARCH parameter to
tracepoint_var_ref callback.
* ax-gdb.c (gen_var_ref): Pass architecture to tracepoint_var_ref
symbol operation callback.
* dwarf2loc.c (dwarf2_tracepoint_var_ref): Add GDBARCH parameter.
Use it instead of current_gdbarch.
(locexpr_tracepoint_var_ref): Add GDBARCH parameter. Pass it to
dwarf2_tracepoint_var_ref.
(loclist_tracepoint_var_ref): Likewise.
2009-06-17 Ulrich Weigand <uweigand@de.ibm.com>
* prologue-value.c (make_pv_area): Add ADDR_BIT argument.

View File

@ -124,10 +124,10 @@ static void gen_complement (struct agent_expr *ax, struct axs_value *value);
static void gen_deref (struct agent_expr *, struct axs_value *);
static void gen_address_of (struct agent_expr *, struct axs_value *);
static int find_field (struct type *type, char *name);
static void gen_bitfield_ref (struct agent_expr *ax,
static void gen_bitfield_ref (struct expression *exp, struct agent_expr *ax,
struct axs_value *value,
struct type *type, int start, int end);
static void gen_struct_ref (struct agent_expr *ax,
static void gen_struct_ref (struct expression *exp, struct agent_expr *ax,
struct axs_value *value,
char *field,
char *operator_name, char *operand_name);
@ -623,7 +623,7 @@ gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
Unfortunately DWARF 2 stores the frame-base (instead of the
function) location in a function's symbol. Oops! For the
moment enable this when/where applicable. */
SYMBOL_COMPUTED_OPS (var)->tracepoint_var_ref (var, ax, value);
SYMBOL_COMPUTED_OPS (var)->tracepoint_var_ref (var, gdbarch, ax, value);
break;
case LOC_OPTIMIZED_OUT:
@ -1147,8 +1147,9 @@ find_field (struct type *type, char *name)
starting and one-past-ending *bit* numbers of the field within the
structure. */
static void
gen_bitfield_ref (struct agent_expr *ax, struct axs_value *value,
struct type *type, int start, int end)
gen_bitfield_ref (struct expression *exp, struct agent_expr *ax,
struct axs_value *value, struct type *type,
int start, int end)
{
/* Note that ops[i] fetches 8 << i bits. */
static enum agent_op ops[]
@ -1274,7 +1275,7 @@ gen_bitfield_ref (struct agent_expr *ax, struct axs_value *value,
the sign/zero extension will wipe them out.
- If we're in the interior of the word, then there is no garbage
on either end, because the ref operators zero-extend. */
if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
if (gdbarch_byte_order (exp->gdbarch) == BFD_ENDIAN_BIG)
gen_left_shift (ax, end - (offset + op_size));
else
gen_left_shift (ax, offset - start);
@ -1308,7 +1309,8 @@ gen_bitfield_ref (struct agent_expr *ax, struct axs_value *value,
the operator being compiled, and OPERAND_NAME is the kind of thing
it operates on; we use them in error messages. */
static void
gen_struct_ref (struct agent_expr *ax, struct axs_value *value, char *field,
gen_struct_ref (struct expression *exp, struct agent_expr *ax,
struct axs_value *value, char *field,
char *operator_name, char *operand_name)
{
struct type *type;
@ -1339,7 +1341,7 @@ gen_struct_ref (struct agent_expr *ax, struct axs_value *value, char *field,
/* Is this a bitfield? */
if (TYPE_FIELD_PACKED (type, i))
gen_bitfield_ref (ax, value, TYPE_FIELD_TYPE (type, i),
gen_bitfield_ref (exp, ax, value, TYPE_FIELD_TYPE (type, i),
TYPE_FIELD_BITPOS (type, i),
(TYPE_FIELD_BITPOS (type, i)
+ TYPE_FIELD_BITSIZE (type, i)));
@ -1698,9 +1700,9 @@ gen_expr (struct expression *exp, union exp_element **pc,
(*pc) += 4 + BYTES_TO_EXP_ELEM (length + 1);
gen_expr (exp, pc, ax, value);
if (op == STRUCTOP_STRUCT)
gen_struct_ref (ax, value, name, ".", "structure or union");
gen_struct_ref (exp, ax, value, name, ".", "structure or union");
else if (op == STRUCTOP_PTR)
gen_struct_ref (ax, value, name, "->",
gen_struct_ref (exp, ax, value, name, "->",
"pointer to a structure or union");
else
/* If this `if' chain doesn't handle it, then the case list

View File

@ -366,9 +366,9 @@ dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size,
}
static void
dwarf2_tracepoint_var_ref (struct symbol *symbol, struct agent_expr *ax,
struct axs_value *value, gdb_byte *data,
int size)
dwarf2_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
struct agent_expr *ax, struct axs_value *value,
gdb_byte *data, int size)
{
if (size == 0)
error (_("Symbol \"%s\" has been optimized out."),
@ -401,7 +401,7 @@ dwarf2_tracepoint_var_ref (struct symbol *symbol, struct agent_expr *ax,
error (_("Unexpected opcode after DW_OP_fbreg for symbol \"%s\"."),
SYMBOL_PRINT_NAME (symbol));
gdbarch_virtual_frame_pointer (current_gdbarch,
gdbarch_virtual_frame_pointer (gdbarch,
ax->scope, &frame_reg, &frame_offset);
ax_reg (ax, frame_reg);
ax_const_l (ax, frame_offset);
@ -522,12 +522,13 @@ locexpr_describe_location (struct symbol *symbol, struct ui_file *stream)
against. When there is one this function should be revisited. */
static void
locexpr_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax,
struct axs_value * value)
locexpr_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
struct agent_expr *ax, struct axs_value *value)
{
struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
dwarf2_tracepoint_var_ref (symbol, ax, value, dlbaton->data, dlbaton->size);
dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value,
dlbaton->data, dlbaton->size);
}
/* The set of location functions used with the DWARF-2 expression
@ -594,8 +595,8 @@ loclist_describe_location (struct symbol *symbol, struct ui_file *stream)
/* Describe the location of SYMBOL as an agent value in VALUE, generating
any necessary bytecode in AX. */
static void
loclist_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax,
struct axs_value * value)
loclist_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
struct agent_expr *ax, struct axs_value *value)
{
struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
gdb_byte *data;
@ -605,7 +606,7 @@ loclist_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax,
if (data == NULL)
error (_("Variable \"%s\" is not available."), SYMBOL_NATURAL_NAME (symbol));
dwarf2_tracepoint_var_ref (symbol, ax, value, data, size);
dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value, data, size);
}
/* The set of location functions used with the DWARF-2 expression

View File

@ -527,8 +527,8 @@ struct symbol_computed_ops
the caller will generate the right code in the process of
treating this as an lvalue or rvalue. */
void (*tracepoint_var_ref) (struct symbol * symbol, struct agent_expr * ax,
struct axs_value * value);
void (*tracepoint_var_ref) (struct symbol *symbol, struct gdbarch *gdbarch,
struct agent_expr *ax, struct axs_value *value);
};
/* Functions used with LOC_REGISTER and LOC_REGPARM_ADDR. */