+2012-10-09 Petr Machata <pmachata@redhat.com>
+
+ * dwarf_getlocation.c (__libdw_intern_expression): Handle
+ DW_OP_GNU_parameter_ref, DW_OP_GNU_convert, DW_OP_GNU_reinterpret,
+ DW_OP_GNU_regval_type, DW_OP_GNU_entry_value,
+ DW_OP_GNU_deref_type, DW_OP_GNU_const_type.
+
2012-10-08 Jan Kratochvil <jan.kratochvil@redhat.com>
* cfi.c: New include system.h.
case DW_OP_const4s:
case DW_OP_call4:
+ case DW_OP_GNU_parameter_ref:
if (unlikely (data + 4 > end_data))
goto invalid;
case DW_OP_plus_uconst:
case DW_OP_regx:
case DW_OP_piece:
+ case DW_OP_GNU_convert:
+ case DW_OP_GNU_reinterpret:
/* XXX Check size. */
get_uleb128 (newloc->number, data);
break;
break;
case DW_OP_bit_piece:
+ case DW_OP_GNU_regval_type:
/* XXX Check size. */
get_uleb128 (newloc->number, data);
get_uleb128 (newloc->number2, data);
break;
case DW_OP_implicit_value:
+ case DW_OP_GNU_entry_value:
/* This cannot be used in a CFI expression. */
if (unlikely (dbg == NULL))
goto invalid;
get_uleb128 (newloc->number2, data); /* Byte offset. */
break;
+ case DW_OP_GNU_deref_type:
+ if (unlikely (data >= end_data))
+ goto invalid;
+ newloc->number = *data++;
+ get_uleb128 (newloc->number2, data);
+ break;
+
+ case DW_OP_GNU_const_type:
+ /* XXX Check size. */
+ get_uleb128 (newloc->number, data);
+ if (unlikely (data >= end_data))
+ goto invalid;
+ newloc->number2 = *data++; /* Block length. */
+ if (unlikely ((Dwarf_Word) (end_data - data) < newloc->number2))
+ goto invalid;
+ /* The third operand is relative block offset:
+ newloc->number3 = data - block->data;
+ We don't support this at this point. */
+ data += newloc->number2; /* Skip the block. */
+ break;
+
default:
goto invalid;
}