+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.
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);
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:
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[]
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);
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;
/* 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)));
(*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
}
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."),
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);
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
/* 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;
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