diff options
| author | Roland McGrath <[email protected]> | 2010-05-08 04:01:14 -0700 |
|---|---|---|
| committer | Roland McGrath <[email protected]> | 2010-08-30 04:10:41 -0700 |
| commit | 932585d2385c9d4e5686e4ddc9ba30c68172d7f3 (patch) | |
| tree | d9a9bd294301b8d01c7a994b9560cb68121dcd3f /src/readelf.c | |
| parent | a159915a87d83951acb9e504b9cefc08ba98b8bd (diff) | |
Handle DW_OP_GNU_implicit_pointer.
Diffstat (limited to 'src/readelf.c')
| -rw-r--r-- | src/readelf.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/readelf.c b/src/readelf.c index fd9f9a5d..8c5e8151 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -3969,6 +3969,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, [DW_OP_bit_piece] = "bit_piece", [DW_OP_implicit_value] = "implicit_value", [DW_OP_stack_value] = "stack_value", + [DW_OP_GNU_implicit_pointer] = "GNU_implicit_pointer", }; if (len == 0) @@ -4211,6 +4212,28 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, offset += 1 + (data - start); break; + case DW_OP_GNU_implicit_pointer: + /* DIE offset operand. */ + start = data; + NEED (ref_size + 1); + if (ref_size == 4) + addr = read_4ubyte_unaligned (dbg, data); + else + { + assert (ref_size == 8); + addr = read_8ubyte_unaligned (dbg, data); + } + data += ref_size; + /* Byte offset operand. */ + get_sleb128 (sleb, data); /* XXX check overrun */ + + printf ("%*s[%4" PRIuMAX "] %s %#" PRIxMAX ", %+" PRId64 "\n", + indent, "", (intmax_t) offset, + known[op], (uintmax_t) addr, sleb); + CONSUME (data - start); + offset += 1 + (data - start); + break; + default: /* No Operand. */ if (op < sizeof known / sizeof known[0] && known[op] != NULL) |
