aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2expr.c
diff options
context:
space:
mode:
authorAndreas Arnez <arnez@linux.vnet.ibm.com>2016-10-05 12:36:29 +0200
committerAndreas Arnez <arnez@linux.vnet.ibm.com>2016-10-05 12:36:29 +0200
commitf206f69cb43e420f92a63464036b342386963261 (patch)
tree4f7cf4be286e39dca00d95226b3aacfe35f42fc8 /gdb/dwarf2expr.c
parented2f09e183df513e9616c53cdace32cf8b824b98 (diff)
downloadgdb-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.c17
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);