From 505e835dc07557a142853b0f18513b876f7b7625 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Wed, 17 Jun 2009 18:40:53 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 17 +++++++++++++++++ gdb/ax-gdb.c | 22 ++++++++++++---------- gdb/dwarf2loc.c | 21 +++++++++++---------- gdb/symtab.h | 4 ++-- 4 files changed, 42 insertions(+), 22 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 40a6a02b94a..d8ac8300d07 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2009-06-17 Ulrich Weigand + + * 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 * prologue-value.c (make_pv_area): Add ADDR_BIT argument. diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c index 05728997e41..5e04b07f520 100644 --- a/gdb/ax-gdb.c +++ b/gdb/ax-gdb.c @@ -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 diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 4cd77304b9f..16d8ceed057 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -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 diff --git a/gdb/symtab.h b/gdb/symtab.h index 18304b30c46..b126c16361e 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -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. */ -- 2.30.2