From: Jakub Jelinek Date: Tue, 17 May 2011 15:00:14 +0000 (+0200) Subject: Add DW_OP_GNU_const_type/regval_type/deref_type/convert/reinterpret. X-Git-Tag: elfutils-0.153~42 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0312424b6f374dac5c72b86791745d80b38049fb;p=thirdparty%2Felfutils.git Add DW_OP_GNU_const_type/regval_type/deref_type/convert/reinterpret. --- diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 8febd4287..fc7d6295b 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,9 @@ +2011-05-16 Jakub Jelinek + + * dwarf.h (DW_OP_GNU_const_type, DW_OP_GNU_regval_type, + DW_OP_GNU_deref_type, DW_OP_GNU_convert, DW_OP_GNU_reinterpret): + New. + 2011-04-26 Mark Wielaard * dwarf_child (dwarf_child): Sanity check end of section against diff --git a/libdw/dwarf.h b/libdw/dwarf.h index c0dcbdd29..e6a83670e 100644 --- a/libdw/dwarf.h +++ b/libdw/dwarf.h @@ -1,5 +1,5 @@ /* This file defines standard DWARF types, structures, and macros. - Copyright (C) 2000-2010 Red Hat, Inc. + Copyright (C) 2000-2011 Red Hat, Inc. This file is part of Red Hat elfutils. Red Hat elfutils is free software; you can redistribute it and/or modify @@ -487,6 +487,11 @@ enum DW_OP_GNU_encoded_addr = 0xf1, DW_OP_GNU_implicit_pointer = 0xf2, DW_OP_GNU_entry_value = 0xf3, + DW_OP_GNU_const_type = 0xf4, + DW_OP_GNU_regval_type = 0xf5, + DW_OP_GNU_deref_type = 0xf6, + DW_OP_GNU_convert = 0xf7, + DW_OP_GNU_reinterpret = 0xf9, DW_OP_lo_user = 0xe0, /* Implementation-defined range start. */ DW_OP_hi_user = 0xff /* Implementation-defined range end. */ diff --git a/src/ChangeLog b/src/ChangeLog index 4de8162b2..5f164e0d9 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2011-05-16 Jakub Jelinek + + * readelf.c (print_ops): Handle DW_OP_GNU_const_type, + DW_OP_GNU_regval_type, DW_OP_GNU_deref_type, DW_OP_GNU_convert + and DW_OP_GNU_reinterpret. + 2011-05-17 Mark Wielaard * readelf.c (dwarf_tag_string): Fixup DW_TAG_GNU_call_site and diff --git a/src/readelf.c b/src/readelf.c index 72be50269..1d9249189 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -4064,6 +4064,11 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, [DW_OP_stack_value] = "stack_value", [DW_OP_GNU_implicit_pointer] = "GNU_implicit_pointer", [DW_OP_GNU_entry_value] = "GNU_entry_value", + [DW_OP_GNU_const_type] = "GNU_const_type", + [DW_OP_GNU_regval_type] = "GNU_regval_type", + [DW_OP_GNU_deref_type] = "GNU_deref_type", + [DW_OP_GNU_convert] = "GNU_convert", + [DW_OP_GNU_reinterpret] = "GNU_reinterpret", }; if (len == 0) @@ -4343,6 +4348,55 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, offset += 1 + (data - start); break; + case DW_OP_GNU_const_type: + /* DIE offset, size plus block. */ + start = data; + NEED (2); + get_uleb128 (uleb, data); /* XXX check overrun */ + uint8_t usize = *(uint8_t *) data++; + NEED (usize); + printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "] ", + indent, "", (uintmax_t) offset, known[op], uleb); + print_block (usize, data); + data += usize; + CONSUME (data - start); + offset += 1 + (data - start); + break; + + case DW_OP_GNU_regval_type: + start = data; + NEED (2); + get_uleb128 (uleb, data); /* XXX check overrun */ + get_uleb128 (uleb2, data); /* XXX check overrun */ + printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 " %#" PRIx64 "\n", + indent, "", (uintmax_t) offset, known[op], uleb, uleb2); + CONSUME (data - start); + offset += 1 + (data - start); + break; + + case DW_OP_GNU_deref_type: + start = data; + NEED (2); + usize = *(uint8_t *) data++; + get_uleb128 (uleb, data); /* XXX check overrun */ + printf ("%*s[%4" PRIuMAX "] %s %" PRIu8 " [%6" PRIxMAX "]\n", + indent, "", (uintmax_t) offset, + known[op], usize, uleb); + CONSUME (data - start); + offset += 1 + (data - start); + break; + + case DW_OP_GNU_convert: + case DW_OP_GNU_reinterpret: + start = data; + NEED (1); + get_uleb128 (uleb, data); /* XXX check overrun */ + printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n", + indent, "", (uintmax_t) offset, known[op], uleb); + CONSUME (data - start); + offset += 1 + (data - start); + break; + default: /* No Operand. */ if (op < sizeof known / sizeof known[0] && known[op] != NULL)