diff options
author | Andreas Arnez <arnez@linux.vnet.ibm.com> | 2016-10-05 12:36:29 +0200 |
---|---|---|
committer | Andreas Arnez <arnez@linux.vnet.ibm.com> | 2016-10-05 12:36:29 +0200 |
commit | f206f69cb43e420f92a63464036b342386963261 (patch) | |
tree | 4f7cf4be286e39dca00d95226b3aacfe35f42fc8 /gdb/dwarf2expr.c | |
parent | ed2f09e183df513e9616c53cdace32cf8b824b98 (diff) | |
download | gdb-f206f69cb43e420f92a63464036b342386963261.zip gdb-f206f69cb43e420f92a63464036b342386963261.tar.gz gdb-f206f69cb43e420f92a63464036b342386963261.tar.bz2 |
Allow DW_OP_GNU_uninit in dwarf_expr_require_composition
In DWARF expression handling, some operators are required to be either
at the end of an expression or followed by a composition operator. So
far only the operators DW_OP_reg0-31 were allowed to be followed by
DW_OP_GNU_uninit instead, and particularly DW_OP_regx was not, which is
obviously inconsistent.
This patch allows DW_OP_GNU_uninit after all operators requiring a
composition, to simplify the code and make it more consistent. This
policy may be more permissive than necessary, but in the worst case just
leads to a DWARF location description resulting in an uninitialized
value instead of an error message.
gdb/ChangeLog:
* dwarf2expr.c (dwarf_expr_require_composition): Allow
DW_OP_GNU_uninit.
(execute_stack_op): Use dwarf_expr_require_composition instead of
copying its logic.
Diffstat (limited to 'gdb/dwarf2expr.c')
-rw-r--r-- | gdb/dwarf2expr.c | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c index 7eb1982..90e4e25 100644 --- a/gdb/dwarf2expr.c +++ b/gdb/dwarf2expr.c @@ -401,16 +401,15 @@ safe_skip_leb128 (const gdb_byte *buf, const gdb_byte *buf_end) /* Check that the current operator is either at the end of an - expression, or that it is followed by a composition operator. */ + expression, or that it is followed by a composition operator or by + DW_OP_GNU_uninit (which should terminate the expression). */ void dwarf_expr_require_composition (const gdb_byte *op_ptr, const gdb_byte *op_end, const char *op_name) { - /* It seems like DW_OP_GNU_uninit should be handled here. However, - it doesn't seem to make sense for DW_OP_*_value, and it was not - checked at the other place that this function is called. */ - if (op_ptr != op_end && *op_ptr != DW_OP_piece && *op_ptr != DW_OP_bit_piece) + if (op_ptr != op_end && *op_ptr != DW_OP_piece && *op_ptr != DW_OP_bit_piece + && *op_ptr != DW_OP_GNU_uninit) error (_("DWARF-2 expression error: `%s' operations must be " "used either alone or in conjunction with DW_OP_piece " "or DW_OP_bit_piece."), @@ -818,13 +817,7 @@ execute_stack_op (struct dwarf_expr_context *ctx, case DW_OP_reg29: case DW_OP_reg30: case DW_OP_reg31: - if (op_ptr != op_end - && *op_ptr != DW_OP_piece - && *op_ptr != DW_OP_bit_piece - && *op_ptr != DW_OP_GNU_uninit) - error (_("DWARF-2 expression error: DW_OP_reg operations must be " - "used either alone or in conjunction with DW_OP_piece " - "or DW_OP_bit_piece.")); + dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_reg"); result = op - DW_OP_reg0; result_val = value_from_ulongest (address_type, result); |