[PATCH] Note that .rela.debug* sections are debuginfo sections.
by Nick Alcock
Without this fix, strip -g misbehaves when stripping object files
and other ELF objects containing debuginfo relocation sections,
preserving all debuginfo sections in the output file because the
.rela.debug* sections reference them.
Signed-off-by: Nick Alcock <nick.alcock(a)oracle.com>
---
The selection of sections to RELAFY here is pretty much arbitrary,
covering everything I've seen .rela.* created for and anything else that
seems likely to need it.
Testing is trivial: try to strip -g a Linux kernel module (or any other
object file containing debug info) and observe the .debug* and
.rela.debug* sections turning up in the stripped output rather than (if
specified) the -f file. binutils behaves correctly in this area.
I haven't considered DWARF 1 sections not shared with DWARF 2+ at all
because I have no way to generate such sections for testing.
libebl/ChangeLog | 5 +++++
libebl/eblopenbackend.c | 36 +++++++++++++++++++-----------------
2 files changed, 24 insertions(+), 17 deletions(-)
diff --git a/libebl/ChangeLog b/libebl/ChangeLog
index af819a2..c6204c6 100644
--- a/libebl/ChangeLog
+++ b/libebl/ChangeLog
@@ -1,3 +1,8 @@
+2012-09-18 Nick Alcock <nick.alcock(a)oracle.com>
+
+ * eblopenbackend.c (default_debugscn_p): Add .rela.* versions of
+ many DWARF 2+ debuginfo sections.
+
2012-08-22 Jeff Kenton <jkenton(a)tilera.com>
* eblopenbackend.c (machines): Add tilegx.
diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c
index 89e5da5..d10b0d0 100644
--- a/libebl/eblopenbackend.c
+++ b/libebl/eblopenbackend.c
@@ -619,6 +619,7 @@ default_object_note (const char *name __attribute__ ((unused)),
static bool
default_debugscn_p (const char *name)
{
+#define RELAFY(x) x, ".rela" x
/* We know by default only about the DWARF debug sections which have
fixed names. */
static const char *dwarf_scn_names[] =
@@ -630,31 +631,32 @@ default_debugscn_p (const char *name)
".debug_srcinfo",
".debug_sfnames",
/* DWARF 1.1 and DWARF 2 */
- ".debug_aranges",
- ".debug_pubnames",
+ RELAFY(".debug_aranges"),
+ RELAFY(".debug_pubnames"),
/* DWARF 2 */
- ".debug_info",
- ".debug_abbrev",
- ".debug_line",
- ".debug_frame",
- ".debug_str",
- ".debug_loc",
- ".debug_macinfo",
+ RELAFY(".debug_info"),
+ RELAFY(".debug_abbrev"),
+ RELAFY(".debug_line"),
+ RELAFY(".debug_frame"),
+ RELAFY(".debug_str"),
+ RELAFY(".debug_loc"),
+ RELAFY(".debug_macinfo"),
/* DWARF 3 */
- ".debug_ranges",
- ".debug_pubtypes",
+ RELAFY(".debug_ranges"),
+ RELAFY(".debug_pubtypes"),
/* DWARF 4 */
- ".debug_types",
+ RELAFY(".debug_types"),
/* GDB DWARF 4 extension */
".gdb_index",
/* GNU/DWARF 5 extension/proposal */
- ".debug_macro",
+ RELAFY(".debug_macro"),
/* SGI/MIPS DWARF 2 extensions */
- ".debug_weaknames",
- ".debug_funcnames",
- ".debug_typenames",
- ".debug_varnames"
+ RELAFY(".debug_weaknames"),
+ RELAFY(".debug_funcnames"),
+ RELAFY(".debug_typenames"),
+ RELAFY(".debug_varnames")
};
+#undef RELAFY
const size_t ndwarf_scn_names = (sizeof (dwarf_scn_names)
/ sizeof (dwarf_scn_names[0]));
for (size_t cnt = 0; cnt < ndwarf_scn_names; ++cnt)
--
1.7.12.156.gd7c4257
--
NULL && (void)
10 years
[PATCH] libdw: Add new function dwarf_getlocations.
by Mark Wielaard
Using dwarf_getlocation it is possible to get single location
descriptions and with dwarf_getlocation_addr it is possible to
get a location list covering a specific address. But sometimes
it is more convenient to get all ranges covered by a location
list. For example when a specific address isn't covered and
you want to find alternative addresses where a location
description is defined.
dwarf_getlocations is modelled after dwarf_ranges. It enumerates
the location ranges and descriptions covered by the given
attribute. In the first call OFFSET should be zero and *BASEP
need not be initialized. Returns -1 for errors, zero when
there are no more locations to report, or a nonzero OFFSET
value to pass to the next call. Each subsequent call must
preserve *BASEP from the prior call. Successful calls fill in
*STARTP and *ENDP with a contiguous address range and *EXPR with
a pointer to an array of operations with length *EXPRLEN. If
the attribute describes a single location description and not a
location list the first call (with OFFSET zero) will return the
location description in *EXPR with *STARTP set to zero and *ENDP
set to minus one.
ptrdiff_t dwarf_getlocations (Dwarf_Attribute *attr, ptrdiff_t offset,
Dwarf_Addr *basep, Dwarf_Addr *startp,
Dwarf_Addr *endp, Dwarf_Op **expr,
size_t *exprlen);
Signed-off-by: Mark Wielaard <mjw(a)redhat.com>
---
libdw/ChangeLog | 9 ++
libdw/dwarf_getlocation.c | 182 ++++++++++++++++++++++++++++++++++++++-------
libdw/libdw.h | 18 ++++-
libdw/libdw.map | 5 +
4 files changed, 186 insertions(+), 28 deletions(-)
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index aa1e2cc..18ddd9e 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,12 @@
+2013-08-23 Mark Wielaard <mjw(a)redhat.com>
+
+ * dwarf_getlocation.c (attr_ok): Also accept DW_AT_segment.
+ (attr_base_address): New function, taken from...
+ (dwarf_getlocation_addr): here. Use attr_base_address.
+ (dwarf_getlocations): New function.
+ * libdw.h (dwarf_getlocations): New function definition.
+ * libdw.map (ELFUTILS_0.157): New.
+
2013-07-02 Mark Wielaard <mjw(a)redhat.com>
* dwarf_getsrclines.c (dwarf_getsrclines): Add new stack allocation
diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c
index c3f3f47..2af0df7 100644
--- a/libdw/dwarf_getlocation.c
+++ b/libdw/dwarf_getlocation.c
@@ -1,5 +1,5 @@
/* Return location expression list.
- Copyright (C) 2000-2010 Red Hat, Inc.
+ Copyright (C) 2000-2010, 2013 Red Hat, Inc.
This file is part of elfutils.
Written by Ulrich Drepper <drepper(a)redhat.com>, 2000.
@@ -56,6 +56,7 @@ attr_ok (Dwarf_Attribute *attr)
case DW_AT_frame_base:
case DW_AT_return_addr:
case DW_AT_static_link:
+ case DW_AT_segment:
break;
default:
@@ -567,6 +568,37 @@ dwarf_getlocation (attr, llbuf, listlen)
return getlocation (attr->cu, &block, llbuf, listlen, cu_sec_idx (attr->cu));
}
+static int
+attr_base_address (attr, basep)
+ Dwarf_Attribute *attr;
+ Dwarf_Addr *basep;
+{
+ /* Fetch the CU's base address. */
+ Dwarf_Die cudie = CUDIE (attr->cu);
+
+ /* Find the base address of the compilation unit. It will
+ normally be specified by DW_AT_low_pc. In DWARF-3 draft 4,
+ the base address could be overridden by DW_AT_entry_pc. It's
+ been removed, but GCC emits DW_AT_entry_pc and not DW_AT_lowpc
+ for compilation units with discontinuous ranges. */
+ Dwarf_Attribute attr_mem;
+ if (unlikely (INTUSE(dwarf_lowpc) (&cudie, basep) != 0)
+ && INTUSE(dwarf_formaddr) (INTUSE(dwarf_attr) (&cudie,
+ DW_AT_entry_pc,
+ &attr_mem),
+ basep) != 0)
+ {
+ if (INTUSE(dwarf_errno) () != 0)
+ return -1;
+
+ /* The compiler provided no base address when it should
+ have. Buggy GCC does this when it used absolute
+ addresses in the location list and no DW_AT_ranges. */
+ *basep = 0;
+ }
+ return 0;
+}
+
int
dwarf_getlocation_addr (attr, address, llbufs, listlens, maxlocs)
Dwarf_Attribute *attr;
@@ -646,32 +678,8 @@ dwarf_getlocation_addr (attr, address, llbufs, listlens, maxlocs)
goto invalid;
readp += block.length;
- if (base == (Dwarf_Addr) -1)
- {
- /* Fetch the CU's base address. */
- Dwarf_Die cudie = CUDIE (attr->cu);
-
- /* Find the base address of the compilation unit. It will
- normally be specified by DW_AT_low_pc. In DWARF-3 draft 4,
- the base address could be overridden by DW_AT_entry_pc. It's
- been removed, but GCC emits DW_AT_entry_pc and not DW_AT_lowpc
- for compilation units with discontinuous ranges. */
- Dwarf_Attribute attr_mem;
- if (unlikely (INTUSE(dwarf_lowpc) (&cudie, &base) != 0)
- && INTUSE(dwarf_formaddr) (INTUSE(dwarf_attr) (&cudie,
- DW_AT_entry_pc,
- &attr_mem),
- &base) != 0)
- {
- if (INTUSE(dwarf_errno) () != 0)
- return -1;
-
- /* The compiler provided no base address when it should
- have. Buggy GCC does this when it used absolute
- addresses in the location list and no DW_AT_ranges. */
- base = 0;
- }
- }
+ if (base == (Dwarf_Addr) -1 && attr_base_address (attr, &base) != 0)
+ return -1;
if (address >= base + begin && address < base + end)
{
@@ -687,3 +695,123 @@ dwarf_getlocation_addr (attr, address, llbufs, listlens, maxlocs)
return got;
}
+
+ptrdiff_t
+dwarf_getlocations (attr, offset, basep, startp, endp, expr, exprlen)
+ Dwarf_Attribute *attr;
+ ptrdiff_t offset;
+ Dwarf_Addr *basep;
+ Dwarf_Addr *startp;
+ Dwarf_Addr *endp;
+ Dwarf_Op **expr;
+ size_t *exprlen;
+{
+ if (! attr_ok (attr))
+ return -1;
+
+ /* 1 is an invalid offset, meaning no more locations. */
+ if (offset == 1)
+ return 0;
+
+ if (offset == 0)
+ {
+ /* If it has a block form, it's a single location expression. */
+ Dwarf_Block block;
+ if (INTUSE(dwarf_formblock) (attr, &block) == 0)
+ {
+ if (getlocation (attr->cu, &block, expr, exprlen,
+ cu_sec_idx (attr->cu)) != 0)
+ return -1;
+
+ /* This is the one and only location covering everything. */
+ *startp = 0;
+ *endp = -1;
+ return 1;
+ }
+
+ int error = INTUSE(dwarf_errno) ();
+ if (unlikely (error != DWARF_E_NO_BLOCK))
+ {
+ __libdw_seterrno (error);
+ return -1;
+ }
+
+ int result = check_constant_offset (attr, expr, exprlen);
+ if (result != 1)
+ {
+ if (result == 0)
+ {
+ /* This is the one and only location covering everything. */
+ *startp = 0;
+ *endp = -1;
+ return 1;
+ }
+ return result;
+ }
+
+ /* We must be looking at a true loclistptr, fetch the initial
+ base address and offset. */
+ if (attr_base_address (attr, basep) != 0)
+ return -1;
+
+ Dwarf_Word start_offset;
+ if (__libdw_formptr (attr, IDX_debug_loc,
+ DWARF_E_NO_LOCLIST,
+ NULL, &start_offset) == NULL)
+ return -1;
+ offset = start_offset;
+ }
+
+ const Elf_Data *d = attr->cu->dbg->sectiondata[IDX_debug_loc];
+ if (d == NULL)
+ {
+ __libdw_seterrno (DWARF_E_NO_LOCLIST);
+ return -1;
+ }
+
+ unsigned char *readp = d->d_buf + offset;
+ unsigned char *readendp = d->d_buf + d->d_size;
+
+ next:
+ if (readendp - readp < attr->cu->address_size * 2)
+ {
+ invalid:
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return -1;
+ }
+
+ Dwarf_Addr begin;
+ Dwarf_Addr end;
+
+ switch (__libdw_read_begin_end_pair_inc (attr->cu->dbg, IDX_debug_loc,
+ &readp, attr->cu->address_size,
+ &begin, &end, basep))
+ {
+ case 0: /* got location range. */
+ break;
+ case 1: /* base address setup. */
+ goto next;
+ case 2: /* end of loclist */
+ return 0;
+ default: /* error */
+ return -1;
+ }
+
+ if (readendp - readp < 2)
+ goto invalid;
+
+ /* We have a location expression. */
+ Dwarf_Block block;
+ block.length = read_2ubyte_unaligned_inc (attr->cu->dbg, readp);
+ block.data = readp;
+ if (readendp - readp < (ptrdiff_t) block.length)
+ goto invalid;
+ readp += block.length;
+
+ if (getlocation (attr->cu, &block, expr, exprlen, IDX_debug_loc) != 0)
+ return -1;
+
+ *startp = *basep + begin;
+ *endp = *basep + end;
+ return readp - (unsigned char *) d->d_buf;
+}
diff --git a/libdw/libdw.h b/libdw/libdw.h
index f5fc4e2..898aa74 100644
--- a/libdw/libdw.h
+++ b/libdw/libdw.h
@@ -1,5 +1,5 @@
/* Interfaces for libdw.
- Copyright (C) 2002-2010 Red Hat, Inc.
+ Copyright (C) 2002-2010, 2013 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -630,6 +630,22 @@ extern int dwarf_getlocation_addr (Dwarf_Attribute *attr, Dwarf_Addr address,
Dwarf_Op **exprs, size_t *exprlens,
size_t nlocs);
+/* Enumerate the locations ranges and descriptions covered by the
+ given attribute. In the first call OFFSET should be zero and
+ *BASEP need not be initialized. Returns -1 for errors, zero when
+ there are no more locations to report, or a nonzero OFFSET
+ value to pass to the next call. Each subsequent call must preserve
+ *BASEP from the prior call. Successful calls fill in *STARTP and
+ *ENDP with a contiguous address range and *EXPR with a pointer to
+ an array of operations with length *EXPRLEN. If the attribute
+ describes a single location description and not a location list the
+ first call (with OFFSET zero) will return the location description
+ in *EXPR with *STARTP set to zero and *ENDP set to minus one. */
+extern ptrdiff_t dwarf_getlocations (Dwarf_Attribute *attr,
+ ptrdiff_t offset, Dwarf_Addr *basep,
+ Dwarf_Addr *startp, Dwarf_Addr *endp,
+ Dwarf_Op **expr, size_t *exprlen);
+
/* Return the block associated with a DW_OP_implicit_value operation.
The OP pointer must point into an expression that dwarf_getlocation
or dwarf_getlocation_addr has returned given the same ATTR. */
diff --git a/libdw/libdw.map b/libdw/libdw.map
index d38a8ef..2d2d37c 100644
--- a/libdw/libdw.map
+++ b/libdw/libdw.map
@@ -260,3 +260,8 @@ ELFUTILS_0.156 {
# Replaced ELFUTILS_0.122 version, which has a wrapper without add_p_vaddr.
dwfl_report_elf;
} ELFUTILS_0.149;
+
+ELFUTILS_0.157 {
+ global:
+ dwarf_getlocations;
+} ELFUTILS_0.156;
--
1.7.1
10 years
[PATCH] libdw: Add new functions dwarf_getlocation_attr and dwarf_getlocation_die.
by Mark Wielaard
Some location expression operations have a DIE associated with them.
Examples are some of the new GNU typed DWARF extensions, DW_OP_GNU_convert,
DW_OP_GNU_reinterpret, DW_OP_GNU_const_type, DW_OP_GNU_regval_type and
DW_OP_GNU_deref_type. Others have (block) values associated with them,
like DW_OP_GNU_entry_value and DW_OP_GNU_const_type.
It is not always easy to access these values. The DIE offset is given in
various formats either as global offset or CU relative offset. The (block)
value might be constant or a location description. And the block might be
encoded with a uleb128 or ubyte length. The new functions help to easily
get at the DIE or attribute value.
In theory dwarf_getlocation_attr could be used for all cases, since
besides returning DW_AT_const_value or DW_AT_location, it could also
return an attribute referencing a DIE. But at least one operation,
DW_OP_GNU_const_type, has both a (type) DIE and a constant (block)
value associated with it. And directly getting the DIE when needed
is easier than first having to retrieve a (synthesized) attribute
and then getting the actual (type) DIE.
Expression operations that reference an actual DIE for the
DW_AT_location or DW_AT_const_value, like DW_OP_call2, DW_OP_call4,
DW_OP_callref and DW_OP_GNU_implicit_pointer can be used with both
dwarf_getlocation_attr and dwarf_getlocation_die.
DW_OP_implicit_value and DW_OP_GNU_implicit_pointer already had
their own special accessors (dwarf_getlocation_implicit_value
and dwarf_getlocation_implicit_pointer), but it seemed consistent
to include them in the new more generic accessors too.
Signed-off-by: Mark Wielaard <mjw(a)redhat.com>
---
libdw/ChangeLog | 19 ++++++++
libdw/Makefile.am | 3 +-
libdw/dwarf_getlocation.c | 37 ++++++++-------
libdw/dwarf_getlocation_attr.c | 103 +++++++++++++++++++++++++++++++++++++++++
libdw/dwarf_getlocation_die.c | 78 +++++++++++++++++++++++++++++++
libdw/libdw.h | 23 +++++++++
libdw/libdw.map | 2 +
libdw/libdwP.h | 3 +-
8 files changed, 250 insertions(+), 18 deletions(-)
create mode 100644 libdw/dwarf_getlocation_attr.c
create mode 100644 libdw/dwarf_getlocation_die.c
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 18ddd9e..78dcf69 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,22 @@
+2013-08-24 Mark Wielaard <mjw(a)redhat.com>
+
+ * dwarf_getlocation.c (store_implicit_value): Don't take data
+ as argument, get block data from op number2. Return false when
+ block data length and op number don't match up.
+ (__libdw_intern_expression): Store start of block for
+ DW_OP_implicit_value and DW_OP_GNU_entry_value instead of
+ relative data offset. Also store block start (including length)
+ for DW_OP_GNU_const_type. Don't pass data to store_implicit_value.
+ * dwarf_getlocation_attr.c: New file.
+ * dwarf_getlocation_die.c: Likewise.
+ * libdw.h (dwarf_getlocation_die): New function definition.
+ (dwarf_getlocation_attr): Likewise.
+ * libdwP.h: Declare internal dwarf_getlocation_die.
+ * libdw.map (ELFUTILS_0.157): Add dwarf_getlocation_die and
+ dwarf_getlocation_attr.
+ * Makefile.am (libdw_a_SOURCES): Add dwarf_getlocation_die.c and
+ dwarf_getlocation_attr.c.
+
2013-08-23 Mark Wielaard <mjw(a)redhat.com>
* dwarf_getlocation.c (attr_ok): Also accept DW_AT_segment.
diff --git a/libdw/Makefile.am b/libdw/Makefile.am
index 71a006f..5fef2e1 100644
--- a/libdw/Makefile.am
+++ b/libdw/Makefile.am
@@ -87,7 +87,8 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
dwarf_frame_info.c dwarf_frame_cfa.c dwarf_frame_register.c \
dwarf_cfi_addrframe.c \
dwarf_getcfi.c dwarf_getcfi_elf.c dwarf_cfi_end.c \
- dwarf_aggregate_size.c dwarf_getlocation_implicit_pointer.c
+ dwarf_aggregate_size.c dwarf_getlocation_implicit_pointer.c \
+ dwarf_getlocation_die.c dwarf_getlocation_attr.c
if MAINTAINER_MODE
BUILT_SOURCES = $(srcdir)/known-dwarf.h
diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c
index 2af0df7..428299f 100644
--- a/libdw/dwarf_getlocation.c
+++ b/libdw/dwarf_getlocation.c
@@ -95,13 +95,15 @@ loc_compare (const void *p1, const void *p2)
/* For each DW_OP_implicit_value, we store a special entry in the cache.
This points us directly to the block data for later fetching. */
static void
-store_implicit_value (Dwarf *dbg, void **cache, Dwarf_Op *op,
- unsigned char *data)
+store_implicit_value (Dwarf *dbg, void **cache, Dwarf_Op *op)
{
struct loc_block_s *block = libdw_alloc (dbg, struct loc_block_s,
sizeof (struct loc_block_s), 1);
+ const unsigned char *data = (const unsigned char *) op->number2;
+ Dwarf_Word blength; // Ignored, equal to op->number.
+ get_uleb128 (blength, data);
block->addr = op;
- block->data = data + op->number2;
+ block->data = (unsigned char *) data;
block->length = op->number;
(void) tsearch (block, cache, loc_compare);
}
@@ -412,11 +414,11 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
if (unlikely (dbg == NULL))
goto invalid;
+ newloc->number2 = (Dwarf_Word) data; /* start of block inc. len. */
/* XXX Check size. */
get_uleb128 (newloc->number, data); /* Block length. */
if (unlikely ((Dwarf_Word) (end_data - data) < newloc->number))
goto invalid;
- newloc->number2 = data - block->data; /* Relative block offset. */
data += newloc->number; /* Skip the block. */
break;
@@ -437,17 +439,20 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
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. */
+ {
+ size_t size;
+
+ /* XXX Check size. */
+ get_uleb128 (newloc->number, data);
+ if (unlikely (data >= end_data))
+ goto invalid;
+
+ newloc->number2 = (Dwarf_Word) data; /* start of block inc. len. */
+ size = *data++;
+ if (unlikely ((Dwarf_Word) (end_data - data) < size))
+ goto invalid;
+ data += size; /* Skip the block. */
+ }
break;
default:
@@ -505,7 +510,7 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
result[n].offset = loclist->offset;
if (result[n].atom == DW_OP_implicit_value)
- store_implicit_value (dbg, cache, &result[n], block->data);
+ store_implicit_value (dbg, cache, &result[n]);
loclist = loclist->next;
}
diff --git a/libdw/dwarf_getlocation_attr.c b/libdw/dwarf_getlocation_attr.c
new file mode 100644
index 0000000..2d6084e
--- /dev/null
+++ b/libdw/dwarf_getlocation_attr.c
@@ -0,0 +1,103 @@
+/* Return DWARF attribute associated with a location expression op.
+ Copyright (C) 2013 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <dwarf.h>
+#include <libdwP.h>
+
+
+int
+dwarf_getlocation_attr (attr, op, result)
+ Dwarf_Attribute *attr;
+ const Dwarf_Op *op;
+ Dwarf_Attribute *result;
+{
+ if (attr == NULL)
+ return -1;
+
+ result->cu = attr->cu;
+
+ switch (op->atom)
+ {
+ case DW_OP_implicit_value:
+ result->code = DW_AT_const_value;
+ result->form = DW_FORM_block;
+ result->valp = (unsigned char *) op->number2;
+ break;
+
+ case DW_OP_GNU_entry_value:
+ result->code = DW_AT_location;
+ result->form = DW_FORM_exprloc;
+ result->valp = (unsigned char *) op->number2;
+ break;
+
+ case DW_OP_GNU_const_type:
+ result->code = DW_AT_const_value;
+ result->form = DW_FORM_block1;
+ result->valp = (unsigned char *) op->number2;
+ break;
+
+ case DW_OP_call2:
+ case DW_OP_call4:
+ case DW_OP_call_ref:
+ {
+ Dwarf_Die die;
+ if (INTUSE(dwarf_getlocation_die) (attr, op, &die) != 0)
+ return -1;
+ if (INTUSE(dwarf_attr) (&die, DW_AT_location, result) == NULL)
+ {
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return -1;
+ }
+ }
+ break;
+
+ case DW_OP_GNU_implicit_pointer:
+ {
+ Dwarf_Die die;
+ if (INTUSE(dwarf_getlocation_die) (attr, op, &die) != 0)
+ return -1;
+ if (INTUSE(dwarf_attr) (&die, DW_AT_location, result) == NULL
+ && INTUSE(dwarf_attr) (&die, DW_AT_const_value, result) == NULL)
+ {
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return -1;
+ }
+ }
+ break;
+
+ default:
+ __libdw_seterrno (DWARF_E_INVALID_ACCESS);
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/libdw/dwarf_getlocation_die.c b/libdw/dwarf_getlocation_die.c
new file mode 100644
index 0000000..fa03aac
--- /dev/null
+++ b/libdw/dwarf_getlocation_die.c
@@ -0,0 +1,78 @@
+/* Return DIE associated with a location expression op.
+ Copyright (C) 2013 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <dwarf.h>
+#include <libdwP.h>
+
+int
+dwarf_getlocation_die (attr, op, result)
+ Dwarf_Attribute *attr;
+ const Dwarf_Op *op;
+ Dwarf_Die *result;
+{
+ if (attr == NULL)
+ return -1;
+
+ Dwarf_Off dieoff;
+ switch (op->atom)
+ {
+ case DW_OP_GNU_implicit_pointer:
+ case DW_OP_call_ref:
+ dieoff = op->number;
+ break;
+
+ case DW_OP_GNU_parameter_ref:
+ case DW_OP_GNU_convert:
+ case DW_OP_GNU_reinterpret:
+ case DW_OP_GNU_const_type:
+ case DW_OP_call2:
+ case DW_OP_call4:
+ dieoff = attr->cu->start + op->number;
+ break;
+
+ case DW_OP_GNU_regval_type:
+ case DW_OP_GNU_deref_type:
+ dieoff = attr->cu->start + op->number2;
+ break;
+
+ default:
+ __libdw_seterrno (DWARF_E_INVALID_ACCESS);
+ return -1;
+ }
+
+ if (__libdw_offdie (attr->cu->dbg, dieoff, result,
+ attr->cu->type_offset != 0) == NULL)
+ return -1;
+
+ return 0;
+}
+INTDEF(dwarf_getlocation_die);
diff --git a/libdw/libdw.h b/libdw/libdw.h
index 898aa74..d1cd177 100644
--- a/libdw/libdw.h
+++ b/libdw/libdw.h
@@ -664,6 +664,29 @@ extern int dwarf_getlocation_implicit_pointer (Dwarf_Attribute *attr,
Dwarf_Attribute *result)
__nonnull_attribute__ (2, 3);
+/* Return the DIE associated with an operation such as
+ DW_OP_GNU_implicit_pointer, DW_OP_GNU_parameter_ref, DW_OP_GNU_convert,
+ DW_OP_GNU_reinterpret, DW_OP_GNU_const_type, DW_OP_GNU_regval_type or
+ DW_OP_GNU_deref_type. The OP pointer must point into an expression that
+ dwarf_getlocation or dwarf_getlocation_addr has returned given the same
+ ATTR. The RESULT is a DIE that expresses a type or value needed by the
+ given OP. */
+extern int dwarf_getlocation_die (Dwarf_Attribute *attr,
+ const Dwarf_Op *op,
+ Dwarf_Die *result)
+ __nonnull_attribute__ (2, 3);
+
+/* Return the attribute expressing a value associated with an operation such
+ as DW_OP_implicit_value, DW_OP_GNU_entry_value or DW_OP_GNU_const_type.
+ The OP pointer must point into an expression that dwarf_getlocation
+ or dwarf_getlocation_addr has returned given the same ATTR.
+ The RESULT is a value expressed by an attribute such as DW_AT_location
+ or DW_AT_const_value. */
+extern int dwarf_getlocation_attr (Dwarf_Attribute *attr,
+ const Dwarf_Op *op,
+ Dwarf_Attribute *result)
+ __nonnull_attribute__ (2, 3);
+
/* Compute the byte-size of a type DIE according to DWARF rules.
For most types, this is just DW_AT_byte_size.
diff --git a/libdw/libdw.map b/libdw/libdw.map
index 2d2d37c..09eae6a 100644
--- a/libdw/libdw.map
+++ b/libdw/libdw.map
@@ -264,4 +264,6 @@ ELFUTILS_0.156 {
ELFUTILS_0.157 {
global:
dwarf_getlocations;
+ dwarf_getlocation_die;
+ dwarf_getlocation_attr;
} ELFUTILS_0.156;
diff --git a/libdw/libdwP.h b/libdw/libdwP.h
index 76bddff..f02a5bf 100644
--- a/libdw/libdwP.h
+++ b/libdw/libdwP.h
@@ -1,5 +1,5 @@
/* Internal definitions for libdwarf.
- Copyright (C) 2002-2011 Red Hat, Inc.
+ Copyright (C) 2002-2011, 2013 Red Hat, Inc.
This file is part of elfutils.
Written by Ulrich Drepper <drepper(a)redhat.com>, 2002.
@@ -654,6 +654,7 @@ INTDECL (dwarf_formudata)
INTDECL (dwarf_getarange_addr)
INTDECL (dwarf_getarangeinfo)
INTDECL (dwarf_getaranges)
+INTDECL (dwarf_getlocation_die)
INTDECL (dwarf_getsrcfiles)
INTDECL (dwarf_getsrclines)
INTDECL (dwarf_hasattr)
--
1.8.3.1
10 years
[PATCH] backends: Always set *prefix to "" when not used in register_info hook.
by Mark Wielaard
For ia64 and tilegx *prefix was already set to the empty string, but
arm, ppc and sh used NULL to indicate no prefix preceded the register
name in the canonical assembler syntax. Consistently use the empty string
in all backends since dwfl_module_register_names says: 'a prefix used in
assembler syntax (such as "%" or "$", may be "")'. So users had to handle
the empty string already, and might forget to handle the NULL case
(like our own addrcfi testcase).
Signed-off-by: Mark Wielaard <mjw(a)redhat.com>
---
backends/ChangeLog | 6 ++++++
backends/arm_regs.c | 2 +-
backends/ppc_regs.c | 2 +-
backends/sh_regs.c | 2 +-
4 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/backends/ChangeLog b/backends/ChangeLog
index 646a7da..64e5efd 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,9 @@
+2013-08-28 Mark Wielaard <mjw(a)redhat.com>
+
+ * arm_regs.c (arm_register_info): Set *prefix to "".
+ * ppc_regs.c (ppc_register_info): Likewise.
+ * sh_regs.c (sh_register_info): Likewise.
+
2013-08-27 Jan Kratochvil <jan.kratochvil(a)redhat.com>
* Makefile.am (ppc_SRCS, ppc64_SRCS): Add ppc_cfi.c.
diff --git a/backends/arm_regs.c b/backends/arm_regs.c
index 0155149..21c5ad3 100644
--- a/backends/arm_regs.c
+++ b/backends/arm_regs.c
@@ -48,7 +48,7 @@ arm_register_info (Ebl *ebl __attribute__ ((unused)),
if (regno < 0 || regno > 320 || namelen < 5)
return -1;
- *prefix = NULL;
+ *prefix = "";
*bits = 32;
*type = DW_ATE_signed;
*setname = "integer";
diff --git a/backends/ppc_regs.c b/backends/ppc_regs.c
index 9c2d7e8..4b92a9a 100644
--- a/backends/ppc_regs.c
+++ b/backends/ppc_regs.c
@@ -48,7 +48,7 @@ ppc_register_info (Ebl *ebl __attribute__ ((unused)),
if (regno < 0 || regno > 1155 || namelen < 8)
return -1;
- *prefix = NULL;
+ *prefix = "";
*bits = ebl->machine == EM_PPC64 ? 64 : 32;
*type = (regno < 32 ? DW_ATE_signed
: regno < 64 ? DW_ATE_float : DW_ATE_unsigned);
diff --git a/backends/sh_regs.c b/backends/sh_regs.c
index 3d323a9..d433236 100644
--- a/backends/sh_regs.c
+++ b/backends/sh_regs.c
@@ -50,7 +50,7 @@ sh_register_info (Ebl *ebl __attribute__ ((unused)),
if (regno < 0 || regno > 103 || namelen < 6)
return -1;
- *prefix = NULL;
+ *prefix = "";
*bits = 32;
*type = DW_ATE_signed;
--
1.7.1
10 years
[PATCH] backends: Hook abi_cfi for arm.
by Mark Wielaard
New arm_abi_cfi that defines initial CFA, rules for callee-saved regs
and return register.
Note the DWARF abi extension for ARM says that "registers intentionally
unused" should also be initialized as if by DW_CFA_same_value. The
example given is "an integer-only function might be included in one
executable file for targets with VFP and another for targets without".
We don't currently do this yet.
Also adds addrcfi arm testcase.
Signed-off-by: Mark Wielaard <mjw(a)redhat.com>
---
backends/ChangeLog | 6 ++++
backends/Makefile.am | 2 +-
backends/arm_cfi.c | 67 +++++++++++++++++++++++++++++++++++++++++++
backends/arm_init.c | 3 +-
tests/ChangeLog | 6 ++++
tests/Makefile.am | 3 +-
tests/run-addrcfi.sh | 76 +++++++++++++++++++++++++++++++++++++++++++++++++
tests/testfilearm.bz2 | Bin 0 -> 3545 bytes
8 files changed, 160 insertions(+), 3 deletions(-)
create mode 100644 backends/arm_cfi.c
create mode 100755 tests/testfilearm.bz2
diff --git a/backends/ChangeLog b/backends/ChangeLog
index 64e5efd..68ab00e 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,9 @@
+2013-08-29 Mark Wielaard <mjw(a)redhat.com>
+
+ * Makefile.am (arm_SRCS): Add arm_cfi.c.
+ * arm_cfi.c: New file.
+ * arm_init.c (arm_init): Initialize abi_cfi.
+
2013-08-28 Mark Wielaard <mjw(a)redhat.com>
* arm_regs.c (arm_register_info): Set *prefix to "".
diff --git a/backends/Makefile.am b/backends/Makefile.am
index ec022b0..557ed87 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -75,7 +75,7 @@ libebl_alpha_pic_a_SOURCES = $(alpha_SRCS)
am_libebl_alpha_pic_a_OBJECTS = $(alpha_SRCS:.c=.os)
arm_SRCS = arm_init.c arm_symbol.c arm_regs.c arm_corenote.c \
- arm_auxv.c arm_attrs.c arm_retval.c
+ arm_auxv.c arm_attrs.c arm_retval.c arm_cfi.c
libebl_arm_pic_a_SOURCES = $(arm_SRCS)
am_libebl_arm_pic_a_OBJECTS = $(arm_SRCS:.c=.os)
diff --git a/backends/arm_cfi.c b/backends/arm_cfi.c
new file mode 100644
index 0000000..7fb1b93
--- /dev/null
+++ b/backends/arm_cfi.c
@@ -0,0 +1,67 @@
+/* arm ABI-specified defaults for DWARF CFI.
+ Copyright (C) 2013 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <dwarf.h>
+
+#define BACKEND arm_
+#include "libebl_CPU.h"
+
+int
+arm_abi_cfi (Ebl *ebl __attribute__ ((unused)), Dwarf_CIE *abi_info)
+{
+ static const uint8_t abi_cfi[] =
+ {
+ /* The initial Canonical Frame Address is the value of the
+ Stack Pointer (r13) as setup in the previous frame. */
+ DW_CFA_def_cfa, ULEB128_7 (13), ULEB128_7 (0),
+
+#define SV(n) DW_CFA_same_value, ULEB128_7 (n)
+ /* Callee-saved regs r4-r8, r10, r11. */
+ SV (4), SV (5), SV (6), SV (7), SV (8), SV (10), SV (11),
+
+ /* The link register contains the return address setup by caller. */
+ SV (14),
+
+ /* XXX Note: registers intentionally unused by the program,
+ for example as a consequence of the procedure call standard
+ should be initialized as if by DW_CFA_same_value. */
+#undef SV
+ };
+
+ abi_info->initial_instructions = abi_cfi;
+ abi_info->initial_instructions_end = &abi_cfi[sizeof abi_cfi];
+ abi_info->data_alignment_factor = 4;
+
+ abi_info->return_address_register = 14; /* Link Register. */
+
+ return 0;
+}
diff --git a/backends/arm_init.c b/backends/arm_init.c
index 38bd4eb..cf661ce 100644
--- a/backends/arm_init.c
+++ b/backends/arm_init.c
@@ -1,5 +1,5 @@
/* Initialization of Arm specific backend library.
- Copyright (C) 2002, 2005, 2009 Red Hat, Inc.
+ Copyright (C) 2002, 2005, 2009, 2013 Red Hat, Inc.
This file is part of elfutils.
Written by Ulrich Drepper <drepper(a)redhat.com>, 2002.
@@ -62,6 +62,7 @@ arm_init (elf, machine, eh, ehlen)
HOOK (eh, auxv_info);
HOOK (eh, check_object_attribute);
HOOK (eh, return_value_location);
+ HOOK (eh, abi_cfi);
return MODVERSION;
}
diff --git a/tests/ChangeLog b/tests/ChangeLog
index b934555..3f9c878 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,9 @@
+2013-08-29 Mark Wielaard <mjw(a)redhat.com>
+
+ * run-addrcfi.sh: Add case for EM_ARM.
+ * testfilearm.bz2: New testfile.
+ * Makefile.am (EXTRA_DIST): Add testfilesarm.bz2.
+
2013-08-28 Mark Wielaard <mjw(a)redhat.com>
* addrcfi.c (handle_cfi): Handle .debug_frame or .eh_frame
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 8e4f88a..251ebc4 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -204,7 +204,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
test-core.exec.bz2 run-addr2line-test.sh \
run-addr2line-i-test.sh testfile-inlines.bz2 \
testfileppc32.bz2 testfileppc64.bz2 \
- testfiles390.bz2 testfiles390x.bz2
+ testfiles390.bz2 testfiles390x.bz2 \
+ testfilearm.bz2
if USE_VALGRIND
valgrind_cmd='valgrind -q --trace-children=yes --error-exitcode=1 --run-libc-freeres=no'
diff --git a/tests/run-addrcfi.sh b/tests/run-addrcfi.sh
index 38669ca..71143f0 100755
--- a/tests/run-addrcfi.sh
+++ b/tests/run-addrcfi.sh
@@ -2496,3 +2496,79 @@ testrun_compare ${abs_builddir}/addrcfi -e testfiles390x 0x0000000080000510 <<\E
control reg65 (%pswa): same_value
handle_cfi no CFI (.debug_frame): no error
EOF
+
+# EM_ARM (function bar 0x00008510)
+# Note. Only in .debug_frame, the .eh_frame is actually empty.
+# Same as s390 and ppc above.
+testfiles testfilearm
+testrun_compare ${abs_builddir}/addrcfi -e testfilearm 0x00008510 <<\EOF
+dwarf_cfi_addrframe (.eh_frame): no matching address range
+.debug_frame has 0x8510 => [0x8510, 0x8524):
+ return address in reg14
+ CFA location expression: bregx(13)
+ integer reg0 (r0): same_value
+ integer reg1 (r1): same_value
+ integer reg2 (r2): same_value
+ integer reg3 (r3): same_value
+ integer reg4 (r4): same_value
+ integer reg5 (r5): same_value
+ integer reg6 (r6): same_value
+ integer reg7 (r7): same_value
+ integer reg8 (r8): same_value
+ integer reg9 (r9): same_value
+ integer reg10 (r10): same_value
+ integer reg11 (r11): same_value
+ integer reg12 (r12): same_value
+ integer reg13 (sp): same_value
+ integer reg14 (lr): same_value
+ integer reg15 (pc): same_value
+ FPA reg16 (f0): same_value
+ FPA reg17 (f1): same_value
+ FPA reg18 (f2): same_value
+ FPA reg19 (f3): same_value
+ FPA reg20 (f4): same_value
+ FPA reg21 (f5): same_value
+ FPA reg22 (f6): same_value
+ FPA reg23 (f7): same_value
+ FPA reg96 (f0): same_value
+ FPA reg97 (f1): same_value
+ FPA reg98 (f2): same_value
+ FPA reg99 (f3): same_value
+ FPA reg100 (f4): same_value
+ FPA reg101 (f5): same_value
+ FPA reg102 (f6): same_value
+ FPA reg103 (f7): same_value
+ integer reg128 (spsr): same_value
+ VFP reg256 (d0): same_value
+ VFP reg257 (d1): same_value
+ VFP reg258 (d2): same_value
+ VFP reg259 (d3): same_value
+ VFP reg260 (d4): same_value
+ VFP reg261 (d5): same_value
+ VFP reg262 (d6): same_value
+ VFP reg263 (d7): same_value
+ VFP reg264 (d8): same_value
+ VFP reg265 (d9): same_value
+ VFP reg266 (d10): same_value
+ VFP reg267 (d11): same_value
+ VFP reg268 (d12): same_value
+ VFP reg269 (d13): same_value
+ VFP reg270 (d14): same_value
+ VFP reg271 (d15): same_value
+ VFP reg272 (d16): same_value
+ VFP reg273 (d17): same_value
+ VFP reg274 (d18): same_value
+ VFP reg275 (d19): same_value
+ VFP reg276 (d20): same_value
+ VFP reg277 (d21): same_value
+ VFP reg278 (d22): same_value
+ VFP reg279 (d23): same_value
+ VFP reg280 (d24): same_value
+ VFP reg281 (d25): same_value
+ VFP reg282 (d26): same_value
+ VFP reg283 (d27): same_value
+ VFP reg284 (d28): same_value
+ VFP reg285 (d29): same_value
+ VFP reg286 (d30): same_value
+ VFP reg287 (d31): same_value
+EOF
diff --git a/tests/testfilearm.bz2 b/tests/testfilearm.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..d6cd090e3e12df1d4c9cac7d626ceb62909c0de4
GIT binary patch
literal 3545
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
TxzqwcANaeHDZ+$+7wbU);YL+V
literal 0
HcmV?d00001
--
1.7.1
10 years
[PATCH] tests: Add new varlocs test for dwarf_getlocation* functions.
by Mark Wielaard
This tests the new dwarf_getlocations, dwarf_getlocation_attr and
dwarf_getlocation_die functions. But it is also an example of how
to handle location expressions and which libdw functions can be
used to access all information required to interpret each DW_OP.
It might make sense to extend this test/example into a program
that verifies various properties of DWARF expressions.
Signed-off-by: Mark Wielaard <mjw(a)redhat.com>
---
tests/ChangeLog | 23 +
tests/Makefile.am | 13 +-
tests/run-varlocs.sh | 128 ++++++
tests/testfile_const_type.bz2 | Bin 0 -> 3353 bytes
tests/testfile_const_type.c | 14 +
tests/testfile_entry_value.bz2 | Bin 0 -> 3309 bytes
tests/testfile_entry_value.c | 19 +
tests/testfile_implicit_pointer.bz2 | Bin 0 -> 2952 bytes
tests/testfile_implicit_pointer.c | 12 +
tests/testfile_implicit_value.bz2 | Bin 0 -> 2973 bytes
tests/testfile_implicit_value.c | 12 +
tests/testfile_parameter_ref.bz2 | Bin 0 -> 3329 bytes
tests/testfile_parameter_ref.c | 20 +
tests/varlocs.c | 811 ++++++++++++++++++++++++++++++++++++
14 files changed, 1049 insertions(+), 3 deletions(-)
create mode 100755 tests/run-varlocs.sh
create mode 100755 tests/testfile_const_type.bz2
create mode 100644 tests/testfile_const_type.c
create mode 100755 tests/testfile_entry_value.bz2
create mode 100644 tests/testfile_entry_value.c
create mode 100755 tests/testfile_implicit_pointer.bz2
create mode 100644 tests/testfile_implicit_pointer.c
create mode 100755 tests/testfile_implicit_value.bz2
create mode 100644 tests/testfile_implicit_value.c
create mode 100755 tests/testfile_parameter_ref.bz2
create mode 100644 tests/testfile_parameter_ref.c
create mode 100644 tests/varlocs.c
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 9808ce7..c7ba095 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,26 @@
+2013-08-30 Mark Wielaard <mjw(a)redhat.com>
+
+ * Makefile.am (check_PROGRAMS): Add varlocs.
+ (TESTS): Add run-varlocs.sh.
+ (EXTRA_DIST): Add run-varlocs.sh, testfile_const_type.c,
+ testfile_const_type.bz2, testfile_implicit_pointer.c,
+ testfile_implicit_pointer.bz2, testfile_parameter_ref.c,
+ testfile_entry_value.c, testfile_entry_value.bz2,
+ testfile_implicit_value.c and testfile_implicit_value.bz2.
+ (varlocs_LDADD): New.
+ * run-varlocs: New test.
+ * testfile_const_type.c: New test source file.
+ * testfile_entry_value.c: Likewise.
+ * testfile_implicit_pointer.c: Likewise.
+ * testfile_implicit_value.c: Likewise.
+ * testfile_parameter_ref.c: Likewise.
+ * testfile_const_type.bz2: New test file.
+ * testfile_entry_value.bz2: Likewise.
+ * testfile_implicit_pointer.bz2: Likewise.
+ * testfile_implicit_value.bz2: Likewise.
+ * testfile_parameter_ref.bz2: Likewise.
+ * varlocs.c: New test source.
+
2013-08-13 Mark Wielaard <mjw(a)redhat.com>
* run-addr2line-i-test.sh: New test.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 9aa06a6..2ca9ad4 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -52,7 +52,7 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \
test-flag-nobits dwarf-getstring rerequest_tag \
alldts md5-sha1-test typeiter low_high_pc \
test-elf_cntl_gelf_getshdr dwflsyms dwfllines \
- dwfl-report-elf-align
+ dwfl-report-elf-align varlocs
asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \
asm-tst6 asm-tst7 asm-tst8 asm-tst9
@@ -89,7 +89,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \
run-test-archive64.sh run-readelf-vmcoreinfo.sh \
run-readelf-mixed-corenote.sh run-dwfllines.sh \
run-dwfl-report-elf-align.sh run-addr2line-test.sh \
- run-addr2line-i-test.sh
+ run-addr2line-i-test.sh run-varlocs.sh
if !STANDALONE
check_PROGRAMS += msg_tst md5-sha1-test
@@ -202,7 +202,13 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
testfile-dwfl-report-elf-align-shlib.so.bz2 \
testfilenolines.bz2 test-core-lib.so.bz2 test-core.core.bz2 \
test-core.exec.bz2 run-addr2line-test.sh \
- run-addr2line-i-test.sh testfile-inlines.bz2
+ run-addr2line-i-test.sh testfile-inlines.bz2 \
+ run-varlocs.sh \
+ testfile_const_type.c testfile_const_type.bz2 \
+ testfile_implicit_pointer.c testfile_implicit_pointer.bz2 \
+ testfile_parameter_ref.c testfile_parameter_ref.bz2 \
+ testfile_entry_value.c testfile_entry_value.bz2 \
+ testfile_implicit_value.c testfile_implicit_value.bz2
if USE_VALGRIND
valgrind_cmd='valgrind -q --trace-children=yes --error-exitcode=1 --run-libc-freeres=no'
@@ -327,6 +333,7 @@ test_elf_cntl_gelf_getshdr_LDADD = $(libelf) $(libmudflap)
dwflsyms_LDADD = $(libdw) $(libelf) $(libmudflap)
dwfllines_LDADD = $(libdw) $(libelf) $(libmudflap)
dwfl_report_elf_align_LDADD = $(libdw) $(libmudflap)
+varlocs_LDADD = $(libdw) $(libelf) $(libmudflap)
if GCOV
check: check-am coverage
diff --git a/tests/run-varlocs.sh b/tests/run-varlocs.sh
new file mode 100755
index 0000000..9c4b313
--- /dev/null
+++ b/tests/run-varlocs.sh
@@ -0,0 +1,128 @@
+#! /bin/sh
+# Copyright (C) 2013 Red Hat, Inc.
+# This file is part of elfutils.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# elfutils is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/test-subr.sh
+
+# See the source files testfile_const_type.c testfile_implicit_value.c
+# testfile_entry_value.c testfile_parameter_ref.c testfile_implicit_pointer.c
+# how to regenerate the test files (needs GCC 4.8+).
+
+testfiles testfile_const_type testfile_implicit_value testfile_entry_value
+testfiles testfile_parameter_ref testfile_implicit_pointer
+
+testrun_compare ${abs_top_builddir}/tests/varlocs -e testfile_const_type <<\EOF
+module 'testfile_const_type'
+[b] CU 'const_type.c'@0
+ [33] function 'f1'@80483f0
+ frame_base: {call_frame_cfa {bregx(4,4)}}
+ [4b] parameter 'd'
+ [80483f0,804841b) {fbreg(0)}
+ [57] variable 'w'
+ [80483f0,804841b) {fbreg(0), GNU_deref_type(8){long long int,signed,64@[25]}, GNU_const_type{long long int,signed,64@[25]}(8)[0000806745230100], div, GNU_convert{long long unsigned int,unsigned,64@[2c]}, stack_value}
+ [7d] function 'main'@80482f0
+ frame_base: {call_frame_cfa {bregx(4,4)}}
+EOF
+
+testrun_compare ${abs_top_builddir}/tests/varlocs -e testfile_implicit_value <<\EOF
+module 'testfile_implicit_value'
+[b] CU 'implicit_value.c'@0
+ [25] function 'foo'@80483f0
+ frame_base: {call_frame_cfa {bregx(4,4)}}
+ [3e] variable 'a'
+ [80483f0,80483f6) {implicit_value(8){0200000000000000}, piece(8), implicit_value(8){1500000000000000}, piece(8)}
+ [86] function 'main'@80482f0
+ frame_base: {call_frame_cfa {bregx(4,4)}}
+EOF
+
+testrun_compare ${abs_top_builddir}/tests/varlocs -e testfile_entry_value <<\EOF
+module 'testfile_entry_value'
+[b] CU 'entry_value.c'@0
+ [29] function 'foo'@400500
+ frame_base: {call_frame_cfa {bregx(7,8)}}
+ [4a] parameter 'x'
+ [400500,400504) {reg5}
+ [55] parameter 'y'
+ [400500,400504) {reg4}
+ [68] function 'bar'@400510
+ frame_base: {call_frame_cfa {bregx(7,8)}}
+ [89] parameter 'x'
+ [400510,40051c) {reg5}
+ [40051c,40052b) {reg6}
+ [40052b,400531) {GNU_entry_value(1) {reg5}, stack_value}
+ [96] parameter 'y'
+ [400510,40051c) {reg4}
+ [40051c,40052a) {reg3}
+ [40052a,400531) {GNU_entry_value(1) {reg4}, stack_value}
+ [a3] variable 'z'
+ [400524,400528) {reg0}
+ [400528,400529) {reg12}
+ [400529,40052e) {breg0(0), breg12(0), plus, stack_value}
+ [40052e,400531) {reg0}
+ [e9] function 'main'@400400
+ frame_base: {call_frame_cfa {bregx(7,8)}}
+ [10a] parameter 'argc'
+ [400400,400406) {reg5}
+ [400406,40040a) {breg5(-1), stack_value}
+ [40040a,40040b) {GNU_entry_value(1) {reg5}, stack_value}
+ [119] parameter 'argv'
+ [400400,400403) {reg4}
+ [400403,40040b) {GNU_entry_value(1) {reg4}, stack_value}
+EOF
+
+testrun_compare ${abs_top_builddir}/tests/varlocs -e testfile_parameter_ref <<\EOF
+module 'testfile_parameter_ref'
+[b] CU 'parameter_ref.c'@0
+ [77] function 'foo'@400510
+ frame_base: {call_frame_cfa {bregx(7,8)}}
+ [92] parameter 'x'
+ [400510,400523) {reg5}
+ [99] parameter 'y'
+ [400510,400523) {GNU_parameter_ref[42], stack_value}
+ [a5] variable 'a'
+ [400510,400523) {breg5(0), lit1, shl, stack_value}
+ [b0] variable 'b'
+ [400510,400523) {GNU_parameter_ref[42], lit1, shl, stack_value}
+ [be] variable 'c'
+ <constant value>
+ [c4] parameter 'z'
+ <constant value>
+ [cb] function 'main'@400400
+ frame_base: {call_frame_cfa {bregx(7,8)}}
+ [ec] parameter 'x'
+ [400400,400408) {reg5}
+ [400408,400421) {reg3}
+ [400421,400423) {GNU_entry_value(1) {reg5}, stack_value}
+ [f9] parameter 'argv'
+ [400400,400408) {reg4}
+ [400408,400423) {GNU_entry_value(1) {reg4}, stack_value}
+EOF
+
+testrun_compare ${abs_top_builddir}/tests/varlocs -e testfile_implicit_pointer <<\EOF
+module 'testfile_implicit_pointer'
+[b] CU 'implicit_pointer.c'@0
+ [29] function 'foo'@400500
+ frame_base: {call_frame_cfa {bregx(7,8)}}
+ [4a] parameter 'i'
+ [400500,400503) {reg5}
+ [55] variable 'p'
+ [400500,400503) {GNU_implicit_pointer([4a],0) {reg5}}
+ [73] function 'main'@400400
+ frame_base: {call_frame_cfa {bregx(7,8)}}
+EOF
+
+
+exit 0
diff --git a/tests/testfile_const_type.bz2 b/tests/testfile_const_type.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..fea4a9cbdd3348714686f43c207fc4440f65e0a4
GIT binary patch
literal 3353
zcmV+!4d(JfT4*^jL0KkKSvV2J%K!=VfB*mg|NsC0|NsC0|L_0*-}L|f|NZTE9e;oR
zd;kA`|L@=nG88^}QfGH{sS?QTn%YwVimGo-%S~+!2!a|+YGl(ull4z2o<z~K)YH_|
z@C2Wz%4w&lJxmGcnFB$gh|tlH(WXGt$*5_g)WUi|^oOE)o}d8JPf%!RVgS=kJv2e0
zBOsV2N$3ga(kbZLCW*9~4FC^N4FGyW(WukZ)6oD8Jtlwv14BRn4FCWJngc)@0B8Uj
z21)8Nc%T3P00003KmY&$00003KmY&$00000000000003gk|Gl(ng*suDtc+^HmLnm
zPe-PLnrQVsN2aEl4^u<Y9*8tOMuva@Xahh10B8o(0MG`20BAim002EedWZlt0B8UJ
z00R&W00Te(00u^wKmZ0n000000iXZ?0004y4FMvMrfM`m(rrTthLM_$21ZOYnq=`q
zKs3?n13~DG3>uz*0D}bdMkYa{Ljo}}9-zsl2x+F6hDMkW88FZVWXJ-{wAw)gXs}Y%
z{;+ts7d%Ko<hKikMHYbLu@&6a?AyGvYORQ8qcm1!wIt_mm=okWB)w!1C=*em6k=pJ
zWb5cbm|1`qYKw5sfR46^3`LiDMX%4?>GwHF8HxHUjzmC9g-j>q*sdv=h^ColD>Cyl
z6|ei<{z!{bWFMH<Qy~JzFkqo2t24^n;5+N__*{-HP@&!J@2}v9IO$mGJVGQn1_har
z0e1)rp_Q3gMoS>87J$?k-5Fe)O-*^Ms^}SvbkbtJS%5?{MhLIfVU3y8R=LmUo3FU|
z7K~?l$U@_2*1>F8(rgmCx-=5Om@DlH0T35eAu4Of!{x}dzVl)~09;&7Dm(N@c05<}
zeipb-A_tPW<uXOXhWed?V3gfwRItSjGDT_0lKCzMWxkrZFOBO1Vx(~)#3ku!RUzg@
z<f@q0jlL54l_=e#g*s*&o?#Fkhl0X{95j6y5~7o&u+p;0VICr$s5e0Vy&^CrM40w@
zf#Kls-tY~sE?$ZigQ(;!+^aVYZ5h(ownaO*e5=z9kT5|+)EX0M0R|$WqU_OZU?o!0
zL~237EOP~SYXZVnu+9t-29i^lj)Y<+i~^0oSfHW^Y7!z4g*T*>loewQqp+A5lT1+a
zTbQz3B@%{+w`DR>6j2(=H!3FUBxKg6(7=t94NBDEuA$SgUMo}cph&`3HGo|}RTM@`
za0bz8sEVQjiV7y83|QR|Z}@&BNcotG_6k=qi6+uh?Ifx$utHI^0NA8v$&oaxnpO=c
zm?iKuC@==qk%0lLOX8B^aj+�HLW#tZ~el13epLK`1ceWTGWQP}_!tf*NdXHGf2K
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
literal 0
HcmV?d00001
diff --git a/tests/testfile_const_type.c b/tests/testfile_const_type.c
new file mode 100644
index 0000000..259007d
--- /dev/null
+++ b/tests/testfile_const_type.c
@@ -0,0 +1,14 @@
+// gcc -m32 -g -O2 -o const_type const_type.c
+
+__attribute__((noinline, noclone)) int
+f1 (long long d)
+{
+ long long w = d / 0x1234567800000LL;
+ return w;
+}
+
+int
+main ()
+{
+ return f1 (4LL) - f1 (4LL);
+}
diff --git a/tests/testfile_entry_value.bz2 b/tests/testfile_entry_value.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..fde86c6186cac0d7154366faaf2f0c786706b365
GIT binary patch
literal 3309
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
literal 0
HcmV?d00001
diff --git a/tests/testfile_entry_value.c b/tests/testfile_entry_value.c
new file mode 100644
index 0000000..d2f232b
--- /dev/null
+++ b/tests/testfile_entry_value.c
@@ -0,0 +1,19 @@
+// gcc -g -O2 -o entry_value entry_value.c
+int __attribute__((noinline, noclone)) foo (int x, int y)
+{
+ return x + y;
+}
+
+int __attribute__((noinline, noclone)) bar (int x, int y)
+{
+ int z;
+ z = foo (x, y);
+ z += foo (y, x);
+ return z;
+}
+
+int
+main (int argc, char **argv)
+{
+ return bar (argc + 1, argc - 1);
+}
diff --git a/tests/testfile_implicit_pointer.bz2 b/tests/testfile_implicit_pointer.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..72f6a69447db5dab525ccfe2fc666b23e67fc6d8
GIT binary patch
literal 2952
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
literal 0
HcmV?d00001
diff --git a/tests/testfile_implicit_pointer.c b/tests/testfile_implicit_pointer.c
new file mode 100644
index 0000000..d7e28a0
--- /dev/null
+++ b/tests/testfile_implicit_pointer.c
@@ -0,0 +1,12 @@
+// gcc -g -O2 -o implicit_pointer implicit_pointer.c
+
+static __attribute__((noinline, noclone)) int foo (int i)
+{
+ int *p = &i;
+ return *p;
+}
+
+int main (void)
+{
+ return foo (23) - 23;
+}
diff --git a/tests/testfile_implicit_value.bz2 b/tests/testfile_implicit_value.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..c365a99de0a23bcfc9c5b6721cca7c3d19c26356
GIT binary patch
literal 2973
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
TE+o`rf8y>)rwS4TH@}Qv-n9nq
literal 0
HcmV?d00001
diff --git a/tests/testfile_implicit_value.c b/tests/testfile_implicit_value.c
new file mode 100644
index 0000000..8885bbf
--- /dev/null
+++ b/tests/testfile_implicit_value.c
@@ -0,0 +1,12 @@
+// gcc -m32 -g -O2 -o implicit_value implicit_value.c
+
+static __attribute__((noinline, noclone)) int foo ()
+{
+ unsigned long long a[] = { 2, 21 };
+ return a[0] * a[1];
+}
+
+int main (void)
+{
+ return foo () - 42;
+}
diff --git a/tests/testfile_parameter_ref.bz2 b/tests/testfile_parameter_ref.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..8ff900de1422fa029cc52353439e5a17fc234842
GIT binary patch
literal 3329
zcmV+c4gT^%T4*^jL0KkKSzX{*2mlN1|NsC0|NsC0|NsC0|L_0*-~0dn?9|jk#Zmv<
zbKci~@B82jPrI)-k9%jK8_e9jt8Tg7cAEFDz3v@*y}jESH1{^V8W93CDf(#{Q%}lz
zjZZXWlhaevMyI6on@OW(Jxq@fH9bd)c@xxV^){NGkQ+(rXbk|#>6F2Uh9R{EAoV>!
z^#jUi^wi0qG$J)H)XAo%$vp{)Jt@6W`XqZ)^HlVKlR$ca27m(~0iXcT05kvq8UO&$
z000^QG|*|Oh$to`Z8B4Om?V0Ek?J0x(?OsEL8gr~#2NrSK+{0cpa1{>0iXZ?JwO9M
z006>C5#=T|PbkyTlhDyel=MSQ8hV*Lr|O1488pyokQgA-OhZ640LTH5XaEmT(?)@&
zfY2Hm06h?B$TZLzG&C6+27^EV4K!%bXlbAZfCDC)0fcC1003wVKmnit27nBJXaYo#
znkG}qo~HDtsM$=LC~T%f(g*5BfEpS-Pe=gJ12qBaG#G&O14e)i0Bt}3G&BGJ0ilo$
z)#{8?B@)ETym85I1(Upk0`8U_c_{6ciZTXf7LiO3Mmq&p`J5y%jf@5i2~P+KHxNUt
z%+oI<vsj6DoRrmsc5LM_&7eqXLQS)fw0+4$HjIfua3xClByGeBLgUPWeiKD1W<iz2
zT5DMjYvJWZ0N+yfGbhcCl@1KEEDXY`YPeFp%>frN#4xE9yf5Kq%qBxV;<1r+$-9zN
zkY@XRY7vW4jGXq=Ifbj?CsjC{Nv5%LED~r?5J3b|n8^o?sqiYw=35%p7+4sWwXbrO
zZmZq1Qpg2Kg$ySo(vmEBxZqcmfD@1lv$WD&mkGoS)M~P|1IEj-sMO(hDsk=!29(pR
zFisf=prRz!L{3IO!;_!-=JL4MnD31x6V&;67`DAEHi1_d1YBJj0tLAS0d35H6Xpu$
zr$sKD%{AvtaoA0?%PT&11Tp{<#t2y1z;x=&JFCF5zkmS(7G?|>0I>G8Q}P|{gFu62
zSiJ(ve4zVX{li;D?uQ;h@w^JWOaC>KfE|lKE<K<O|6vEq<G=t??>B=6fdFUE0z)1%
zABxgWrC9|kE=G(jojDaLJZ%dF>A7hKCUYZ!^iryl>;6(k>(vST_tw#oaQ&nU1Y`g+
z02pngB)5hLH0%Vj?IeuDNg{TDmzNmh0!$UlkP>Mcb`=^Sf-qQsZ3vmEm`R-!g9rl%
zmI5#o$_`zV2t)(}3TEOK{O4rk<P2gHVlE6Jp&{hJLqVHi4Oo;5EW~vB{H^|EcyC>(
zgcL9Z;EWboq!t(z*o6!MLjW_`Ey5w75t7u+3hjr?#U>-JVGk*a7$(l5AgsVp#B`Af
zBZnNb1i}QQOq}c>kbp^W#R%1gO`;?Qt|Y}Hh8Yto5F(-^IAAu&yogW}X{#M0Ru^Ju
zl<k^f6hcD;zS;&uLD5u@8sU6gb|Mwsy~Skjv1m7G$l9Zg(s37x;{nO7Z1~N$$7D9B
z!b9<=P=nFqG$fj>k-G$w*f1**-!ameGs-~e>o6f8P~ufo;&mFJz_p82tk;HnDQhK>
zCOeL?)pzFx!VAvi({{UJ#l|}ffynBGWVcwUu%K>Y2YVDtmM221V>*PED6TNZ3Y5!=
zS~z#~F*qx_KnYo2h`{4F{!i-v*BqiPuU7(cs=|b?{p`jk$CR9)jWAjm$Ou4OP{4v@
zTCN7(mOY0j4juFij&_@a$LQ5{x_&iAPnp!rzxj2xH@Q;jBWz?)Ql%P@1UOB(F+-5W
zuV^#vQqm4l&@h3lJYtCpchHauh7DDLHWc>IAKwC^8V%U$;s%#I%uMtmaLX#Q0=n^7
ztAg8d!XQzF84ozins+RWE@ZtPo=ap~6C1WuFU(OB4238$K_eNJ5DT{OQw1)wJG;C5
z8InQN@^OIqB*a}}_}Wb_lQB^&^9&b#HjG4?O7SQFD0_oIKwN?aC=g*3#X4&CY_+RQ
z?`yz$=-!liQRwjlzCZSw1;I2cOcomjd3sDmw5BF}+f9Y-1O{=7D;On^WfWpMF$VUc
zP407jpFhP#w(K*)FfA}z6U7;XGr5gbwqUV7NO=`_04tjN6=fDzb1c%0DXH09T@CLf
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
Lig2MIyTGszUUcY{
literal 0
HcmV?d00001
diff --git a/tests/testfile_parameter_ref.c b/tests/testfile_parameter_ref.c
new file mode 100644
index 0000000..7fe985f
--- /dev/null
+++ b/tests/testfile_parameter_ref.c
@@ -0,0 +1,20 @@
+// gcc -g -O2 -o parameter_ref parameter_ref.c
+
+volatile int vv;
+
+/* Don't inline, but do allow clone to create specialized versions. */
+static __attribute__((noinline)) int
+foo (int x, int y, int z)
+{
+ int a = x * 2;
+ int b = y * 2;
+ int c = z * 2;
+ vv++;
+ return x + z;
+}
+
+int
+main (int x, char **argv)
+{
+ return foo (x, 2, 3) + foo (x, 4, 3) + foo (x + 6, x, 3) + x;
+}
diff --git a/tests/varlocs.c b/tests/varlocs.c
new file mode 100644
index 0000000..cda18b6
--- /dev/null
+++ b/tests/varlocs.c
@@ -0,0 +1,811 @@
+/* Test program for dwarf location functions.
+ Copyright (C) 2013 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <assert.h>
+#include <argp.h>
+#include <inttypes.h>
+#include <errno.h>
+#include ELFUTILS_HEADER(dw)
+#include ELFUTILS_HEADER(dwfl)
+#include <dwarf.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <error.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "../libdw/known-dwarf.h"
+
+// The Dwarf, Dwarf_CFIs and address bias of
+// cfi table to adjust DWARF addresses against.
+// Needed for DW_OP_call_frame_cfa.
+static Dwarf *dw;
+Dwarf_CFI *cfi_debug;
+Dwarf_CFI *cfi_eh;
+Dwarf_Addr cfi_eh_bias;
+
+// Whether the current function has a DW_AT_frame_base defined.
+// Needed for DW_OP_fbreg.
+bool has_frame_base;
+
+static void
+print_die (Dwarf_Die *die, const char *what, int indent)
+{
+ Dwarf_Addr entrypc;
+ const char *name = dwarf_diename (die) ?: "<unknown>";
+ if (dwarf_entrypc (die, &entrypc) == 0)
+ printf ("%*s[%" PRIx64 "] %s '%s'@%" PRIx64 "\n", indent * 2, "",
+ dwarf_dieoffset (die), what, name, entrypc);
+ else
+ printf ("%*s[%" PRIx64 "] %s '%s'\n", indent * 2, "",
+ dwarf_dieoffset (die), what, name);
+}
+
+static const char *
+dwarf_encoding_string (unsigned int code)
+{
+ static const char *const known[] =
+ {
+#define ONE_KNOWN_DW_ATE(NAME, CODE) [CODE] = #NAME,
+ ALL_KNOWN_DW_ATE
+#undef ONE_KNOWN_DW_ATE
+ };
+
+ if (likely (code < sizeof (known) / sizeof (known[0])))
+ return known[code];
+
+ return NULL;
+}
+
+/* BASE must be a base type DIE referenced by a typed DWARF expression op. */
+static void
+print_base_type (Dwarf_Die *base)
+{
+ assert (dwarf_tag (base) == DW_TAG_base_type);
+
+ Dwarf_Attribute encoding;
+ Dwarf_Word enctype;
+ if (dwarf_attr (base, DW_AT_encoding, &encoding) == NULL
+ || dwarf_formudata (&encoding, &enctype) != 0)
+ error (EXIT_FAILURE, 0, "base type without encoding");
+
+ Dwarf_Attribute bsize;
+ Dwarf_Word bits;
+ if (dwarf_attr (base, DW_AT_byte_size, &bsize) != NULL
+ && dwarf_formudata (&bsize, &bits) == 0)
+ bits *= 8;
+ else if (dwarf_attr (base, DW_AT_bit_size, &bsize) == NULL
+ || dwarf_formudata (&bsize, &bits) != 0)
+ error (EXIT_FAILURE, 0, "base type without byte or bit size");
+
+ printf ("{%s,%s,%" PRIu64 "@[%" PRIx64 "]}",
+ dwarf_diename (base),
+ dwarf_encoding_string (enctype),
+ bits,
+ dwarf_dieoffset (base));
+}
+
+static const char *
+dwarf_opcode_string (unsigned int code)
+{
+ static const char *const known[] =
+ {
+#define ONE_KNOWN_DW_OP_DESC(NAME, CODE, DESC) ONE_KNOWN_DW_OP (NAME, CODE)
+#define ONE_KNOWN_DW_OP(NAME, CODE) [CODE] = #NAME,
+ ALL_KNOWN_DW_OP
+#undef ONE_KNOWN_DW_OP
+#undef ONE_KNOWN_DW_OP_DESC
+ };
+
+ if (likely (code < sizeof (known) / sizeof (known[0])))
+ return known[code];
+
+ return NULL;
+}
+
+// Forward reference for print_expr_block.
+static void print_expr (Dwarf_Attribute *, Dwarf_Op *, Dwarf_Addr);
+
+static void
+print_expr_block (Dwarf_Attribute *attr, Dwarf_Op *exprs, int len,
+ Dwarf_Addr addr)
+{
+ printf ("{");
+ for (int i = 0; i < len; i++)
+ {
+ print_expr (attr, &exprs[i], addr);
+ printf ("%s", (i + 1 < len ? ", " : ""));
+ }
+ printf ("}");
+}
+
+static void
+print_expr_block_addrs (Dwarf_Attribute *attr,
+ Dwarf_Addr begin, Dwarf_Addr end,
+ Dwarf_Op *exprs, int len)
+{
+ printf (" [%" PRIx64 ",%" PRIx64 ") ", begin, end);
+ print_expr_block (attr, exprs, len, begin);
+ printf ("\n");
+}
+
+static void
+print_expr (Dwarf_Attribute *attr, Dwarf_Op *expr, Dwarf_Addr addr)
+{
+ uint8_t atom = expr->atom;
+ const char *opname = dwarf_opcode_string (atom);
+ assert (opname != NULL);
+
+ switch (atom)
+ {
+ case DW_OP_deref:
+ case DW_OP_dup:
+ case DW_OP_drop:
+ case DW_OP_over:
+ case DW_OP_swap:
+ case DW_OP_rot:
+ case DW_OP_xderef:
+ case DW_OP_abs:
+ case DW_OP_and:
+ case DW_OP_div:
+ case DW_OP_minus:
+ case DW_OP_mod:
+ case DW_OP_mul:
+ case DW_OP_neg:
+ case DW_OP_not:
+ case DW_OP_or:
+ case DW_OP_plus:
+ case DW_OP_shl:
+ case DW_OP_shr:
+ case DW_OP_shra:
+ case DW_OP_xor:
+ case DW_OP_eq:
+ case DW_OP_ge:
+ case DW_OP_gt:
+ case DW_OP_le:
+ case DW_OP_lt:
+ case DW_OP_ne:
+ case DW_OP_lit0 ... DW_OP_lit31:
+ case DW_OP_reg0 ... DW_OP_reg31:
+ case DW_OP_nop:
+ case DW_OP_stack_value:
+ /* No arguments. */
+ printf ("%s", opname);
+ break;
+
+ case DW_OP_form_tls_address:
+ /* No arguments. Special. Pops and address and pushes the
+ corresponding address in the current thread local
+ storage. Uses the thread local storage block of the defining
+ module (executable, shared library). */
+ printf ("%s", opname);
+ break;
+
+ case DW_OP_GNU_push_tls_address:
+ /* No arguments. Special. Not the same as DW_OP_form_tls_address.
+ Pops an offset into the current thread local strorage and
+ pushes back the actual address. */
+ printf ("%s", opname);
+ break;
+
+ case DW_OP_call_frame_cfa:
+ /* No arguments. Special. Pushes Call Frame Address as computed
+ by CFI data (dwarf_cfi_addrframe will fetch that info (either from
+ the .eh_frame or .debug_frame CFI) and dwarf_frame_cfa translatesr
+ the CFI instructions into a plain DWARF expression.
+ Never used in CFI itself. */
+
+ if (attr == NULL)
+ error (EXIT_FAILURE, 0, "%s used in CFI", opname);
+
+ printf ("%s ", opname);
+ if (cfi_eh == NULL && cfi_debug == NULL)
+ error (EXIT_FAILURE, 0, "DW_OP_call_frame_cfa used but no cfi found.");
+
+ Dwarf_Frame *frame;
+ if (dwarf_cfi_addrframe (cfi_eh, addr + cfi_eh_bias, &frame) != 0
+ && dwarf_cfi_addrframe (cfi_debug, addr, &frame) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_cfi_addrframe 0x%" PRIx64 ": %s",
+ addr, dwarf_errmsg (-1));
+
+ Dwarf_Op *cfa_ops;
+ size_t cfa_nops;
+ if (dwarf_frame_cfa (frame, &cfa_ops, &cfa_nops) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_frame_cfa 0x%" PRIx64 ": %s",
+ addr, dwarf_errmsg (-1));
+ if (cfa_nops < 1)
+ error (EXIT_FAILURE, 0, "dwarf_frame_cfa no ops");
+ print_expr_block (NULL, cfa_ops, cfa_nops, 0);
+ free (frame);
+ break;
+
+ case DW_OP_push_object_address:
+ /* No arguments. Special. Pushes object address explicitly.
+ Normally only done implicitly by DW_AT_data_member_location.
+ Never used in CFI. */
+ if (attr == NULL)
+ error (EXIT_FAILURE, 0, "%s used in CFI", opname);
+ printf ("%s", opname);
+ break;
+
+ case DW_OP_addr:
+ /* 1 address argument. */
+ printf ("%s(0x%" PRIx64 ")", opname, (Dwarf_Addr) expr->number);
+ break;
+
+ case DW_OP_const1u:
+ case DW_OP_const2u:
+ case DW_OP_const4u:
+ case DW_OP_const8u:
+ case DW_OP_constu:
+ case DW_OP_pick:
+ case DW_OP_plus_uconst:
+ case DW_OP_regx:
+ case DW_OP_piece:
+ case DW_OP_deref_size:
+ case DW_OP_xderef_size:
+ /* 1 numeric unsigned argument. */
+ printf ("%s(%" PRIu64 ")", opname, expr->number);
+ break;
+
+ case DW_OP_call2:
+ case DW_OP_call4:
+ case DW_OP_call_ref:
+ /* 1 DIE offset argument for more ops in location attribute of DIE.
+ Never used in CFI. */
+ {
+ if (attr == NULL)
+ error (EXIT_FAILURE, 0, "%s used in CFI", opname);
+
+ Dwarf_Attribute call_attr;
+ if (dwarf_getlocation_attr (attr, expr, &call_attr) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_attr for %s error %s",
+ opname, dwarf_errmsg (-1));
+
+ Dwarf_Die call_die;
+ if (dwarf_getlocation_die (attr, expr, &call_die) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_die for %s error %s",
+ opname, dwarf_errmsg (-1));
+
+ Dwarf_Op *call_ops;
+ size_t call_len;
+ if (dwarf_getlocation (&call_attr, &call_ops, &call_len) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation for entry: %s",
+ dwarf_errmsg (-1));
+
+ printf ("%s([%" PRIx64 "]) ", opname, dwarf_dieoffset (&call_die));
+ print_expr_block (&call_attr, call_ops, call_len, addr);
+ }
+ break;
+
+ case DW_OP_const1s:
+ case DW_OP_const2s:
+ case DW_OP_const4s:
+ case DW_OP_const8s:
+ case DW_OP_consts:
+ case DW_OP_skip:
+ case DW_OP_bra:
+ case DW_OP_breg0 ... DW_OP_breg31:
+ /* 1 numeric signed argument. */
+ printf ("%s(%" PRId64 ")", opname, (Dwarf_Sword) expr->number);
+ break;
+
+ case DW_OP_fbreg:
+ /* 1 numeric signed argument. Offset from frame base. */
+ if (attr == NULL)
+ error (EXIT_FAILURE, 0, "%s used in CFI", opname);
+
+ if (! has_frame_base)
+ error (EXIT_FAILURE, 0, "DW_OP_fbreg used without a frame base");
+
+ printf ("%s(%" PRId64 ")", opname, (Dwarf_Sword) expr->number);
+ break;
+
+ case DW_OP_bregx:
+ /* 2 arguments, unsigned register number, signed offset. */
+ printf ("%s(%" PRIu64 ",%" PRId64 ")", opname,
+ expr->number, (Dwarf_Sword) expr->number2);
+ break;
+
+ case DW_OP_bit_piece:
+ /* 2 arguments, unsigned size, unsigned offset. */
+ printf ("%s(%" PRIu64 ",%" PRIu64 ")", opname,
+ expr->number, expr->number2);
+ break;
+
+ case DW_OP_implicit_value:
+ /* Special, unsigned size plus block. */
+ {
+ Dwarf_Attribute const_attr;
+ Dwarf_Block block;
+ if (dwarf_getlocation_attr (attr, expr, &const_attr) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_attr: %s",
+ dwarf_errmsg (-1));
+
+ if (dwarf_formblock (&const_attr, &block) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_formblock: %s",
+ dwarf_errmsg (-1));
+
+ /* This is the "old" way. Check they result in the same. */
+ Dwarf_Block block_impl;
+ if (dwarf_getlocation_implicit_value (attr, expr, &block_impl) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_implicit_value: %s",
+ dwarf_errmsg (-1));
+
+ assert (expr->number == block.length);
+ assert (block.length == block_impl.length);
+ printf ("%s(%" PRIu64 "){", opname, block.length);
+ for (size_t i = 0; i < block.length; i++)
+ {
+ printf ("%02x", block.data[i]);
+ assert (block.data[i] == block_impl.data[i]);
+ }
+ printf("}");
+ }
+ break;
+
+ case DW_OP_GNU_implicit_pointer:
+ /* Special, DIE offset, signed offset. Referenced DIE has a
+ location or const_value attribute. */
+ {
+ if (attr == NULL)
+ error (EXIT_FAILURE, 0, "%s used in CFI", opname);
+
+ Dwarf_Attribute attrval;
+ if (dwarf_getlocation_implicit_pointer (attr, expr, &attrval) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_implicit_pointer: %s",
+ dwarf_errmsg (-1));
+
+ // Sanity check, results should be the same.
+ Dwarf_Attribute attrval2;
+ if (dwarf_getlocation_attr (attr, expr, &attrval2) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_attr: %s",
+ dwarf_errmsg (-1));
+
+ assert (dwarf_whatattr (&attrval) == dwarf_whatattr (&attrval2));
+ assert (dwarf_whatform (&attrval) == dwarf_whatform (&attrval2));
+ // In theory two different valp pointers could point to the same
+ // value. But here we really expect them to be the equal.
+ assert (attrval.valp == attrval2.valp);
+
+ Dwarf_Die impl_die;
+ if (dwarf_getlocation_die (attr, expr, &impl_die) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_due: %s",
+ dwarf_errmsg (-1));
+
+ printf ("%s([%" PRIx64 "],%" PRId64 ") ", opname,
+ dwarf_dieoffset (&impl_die), expr->number2);
+
+ if (dwarf_whatattr (&attrval) == DW_AT_const_value)
+ printf ("<constant value>"); // Lookup type...
+ else
+ {
+ // Lookup the location description at the current address.
+ Dwarf_Op *exprval;
+ size_t exprval_len;
+ int locs = dwarf_getlocation_addr (&attrval, addr,
+ &exprval, &exprval_len, 1);
+ if (locs == 0)
+ printf ("<no location>"); // XXX should that be flagged?
+ else if (locs == 1)
+ print_expr_block (&attrval, exprval, exprval_len, addr);
+ else
+ error (EXIT_FAILURE, 0,
+ "dwarf_getlocation_addr attrval at addr 0x%" PRIx64
+ ", locs (%d): %s", addr, locs, dwarf_errmsg (-1));
+ }
+ }
+ break;
+
+ case DW_OP_GNU_entry_value:
+ /* Special, unsigned size plus expression block. All registers
+ inside the block should be interpreted as they had on
+ entering the function. dwarf_getlocation_attr will return an
+ attribute containing the block as locexpr which can be
+ retrieved with dwarf_getlocation. */
+ {
+ Dwarf_Attribute entry_attr;
+ if (dwarf_getlocation_attr (attr, expr, &entry_attr) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_attr: %s",
+ dwarf_errmsg (-1));
+
+ Dwarf_Op *entry_ops;
+ size_t entry_len;
+ if (dwarf_getlocation (&entry_attr, &entry_ops, &entry_len) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation for entry: %s",
+ dwarf_errmsg (-1));
+
+ printf ("%s(%zd) ", opname, entry_len);
+ print_expr_block (attr, entry_ops, entry_len, addr);
+ }
+ break;
+
+ case DW_OP_GNU_parameter_ref:
+ /* Special, unsigned CU relative DIE offset pointing to a
+ DW_TAG_formal_parameter. The value that parameter had at the
+ call site of the current function will be put on the DWARF
+ stack. The value can be retrieved by finding the
+ DW_TAG_GNU_call_site_parameter which has as
+ DW_AT_abstract_origin the same formal parameter DIE. */
+ {
+ Dwarf_Die param;
+ if (dwarf_getlocation_die (attr, expr, ¶m) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_die: %s",
+ dwarf_errmsg (-1));
+ // XXX actually lookup DW_TAG_GNU_call_site_parameter
+ printf ("%s[%" PRIx64 "]", opname, dwarf_dieoffset (¶m));
+ assert (expr->number == dwarf_cuoffset (¶m));
+ assert (dwarf_tag (¶m) == DW_TAG_formal_parameter);
+ }
+ break;
+
+ case DW_OP_GNU_convert:
+ case DW_OP_GNU_reinterpret:
+ /* Special, unsigned CU relative DIE offset pointing to a
+ DW_TAG_base_type. Pops a value, converts or reinterprets the
+ value to the given type. When the argument is zero the value
+ becomes untyped again. */
+ {
+ Dwarf_Die type;
+ Dwarf_Off off = expr->number;
+ if (off != 0)
+ {
+ if (dwarf_getlocation_die (attr, expr, &type) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_die: %s",
+ dwarf_errmsg (-1));
+ off = dwarf_dieoffset (&type);
+ assert (expr->number == dwarf_cuoffset (&type));
+ printf ("%s", opname);
+ print_base_type (&type);
+ }
+ else
+ printf ("%s[%" PRIu64 "]", opname, off);
+
+ }
+ break;
+
+ case DW_OP_GNU_regval_type:
+ /* Special, unsigned register number plus unsigned CU relative
+ DIE offset pointing to a DW_TAG_base_type. */
+ {
+ Dwarf_Die type;
+ if (dwarf_getlocation_die (attr, expr, &type) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_die: %s",
+ dwarf_errmsg (-1));
+ assert (expr->number2 == dwarf_cuoffset (&type));
+ // XXX check size against base_type size?
+ printf ("%s(reg%" PRIu64 ")", opname, expr->number);
+ print_base_type (&type);
+ }
+ break;
+
+ case DW_OP_GNU_deref_type:
+ /* Special, unsigned size plus unsigned CU relative DIE offset
+ pointing to a DW_TAG_base_type. */
+ {
+ Dwarf_Die type;
+ if (dwarf_getlocation_die (attr, expr, &type) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_die: %s",
+ dwarf_errmsg (-1));
+ assert (expr->number2 == dwarf_cuoffset (&type));
+ // XXX check size against base_type size?
+ printf ("%s(%" PRIu64 ")", opname, expr->number);
+ print_base_type (&type);
+ }
+ break;
+
+ case DW_OP_GNU_const_type:
+ /* Special, unsigned CU relative DIE offset pointing to a
+ DW_TAG_base_type, an unsigned size length plus a block with
+ the constant value. */
+ {
+ Dwarf_Die type;
+ if (dwarf_getlocation_die (attr, expr, &type) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_die: %s",
+ dwarf_errmsg (-1));
+ assert (expr->number == dwarf_cuoffset (&type));
+
+ Dwarf_Attribute const_attr;
+ if (dwarf_getlocation_attr (attr, expr, &const_attr) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocation_attr for type: %s",
+ dwarf_errmsg (-1));
+
+ Dwarf_Block block;
+ if (dwarf_formblock (&const_attr, &block) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_formblock for type: %s",
+ dwarf_errmsg (-1));
+
+ printf ("%s", opname);
+ print_base_type (&type);
+ printf ("(%" PRIu64 ")[", block.length);
+ for (size_t i = 0; i < block.length; i++)
+ printf ("%02x", block.data[i]);
+ printf("]");
+ }
+ break;
+
+ default:
+ error (EXIT_FAILURE, 0, "unhandled opcode: DW_OP_%s (0x%x)",
+ opname, atom);
+ }
+}
+
+/* Get all variables and print their value expressions. */
+static void
+print_varlocs (Dwarf_Die *funcdie)
+{
+ // Display frame base for function if it exists.
+ // Should be used for DW_OP_fbreg.
+ has_frame_base = dwarf_hasattr (funcdie, DW_AT_frame_base);
+ if (has_frame_base)
+ {
+ Dwarf_Attribute fb_attr;
+ if (dwarf_attr (funcdie, DW_AT_frame_base, &fb_attr) == NULL)
+ error (EXIT_FAILURE, 0, "dwarf_attr fb: %s", dwarf_errmsg (-1));
+
+ Dwarf_Op *fb_expr;
+ size_t fb_exprlen;
+ if (dwarf_getlocation (&fb_attr, &fb_expr, &fb_exprlen) == 0)
+ {
+ // Covers all of function.
+ Dwarf_Addr entrypc;
+ if (dwarf_entrypc (funcdie, &entrypc) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_entrypc: %s", dwarf_errmsg (-1));
+
+ printf (" frame_base: ");
+ if (entrypc == 0)
+ printf ("XXX zero address"); // XXX bad DWARF?
+ else
+ print_expr_block (&fb_attr, fb_expr, fb_exprlen, entrypc);
+ printf ("\n");
+ }
+ else
+ {
+ Dwarf_Addr base, start, end;
+ ptrdiff_t off = 0;
+ printf (" frame_base:\n");
+ while ((off = dwarf_getlocations (&fb_attr, off, &base,
+ &start, &end,
+ &fb_expr, &fb_exprlen)) > 0)
+ {
+ printf (" (%" PRIx64 ",%" PRIx64 ") ", start, end);
+ print_expr_block (&fb_attr, fb_expr, fb_exprlen, start);
+ printf ("\n");
+ }
+
+ if (off < 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocations fb: %s",
+ dwarf_errmsg (-1));
+ }
+ }
+ else if (dwarf_tag (funcdie) == DW_TAG_inlined_subroutine)
+ {
+ // See whether the subprogram we are inlined into has a frame
+ // base we should use.
+ Dwarf_Die *scopes;
+ int n = dwarf_getscopes_die (funcdie, &scopes);
+ if (n <= 0)
+ error (EXIT_FAILURE, 0, "dwarf_getscopes_die: %s", dwarf_errmsg (-1));
+
+ while (n-- > 0)
+ if (dwarf_tag (&scopes[n]) == DW_TAG_subprogram
+ && dwarf_hasattr (&scopes[n], DW_AT_frame_base))
+ {
+ has_frame_base = true;
+ break;
+ }
+ free (scopes);
+ }
+
+ if (! dwarf_haschildren (funcdie))
+ return;
+
+ Dwarf_Die child;
+ int res = dwarf_child (funcdie, &child);
+ if (res < 0)
+ error (EXIT_FAILURE, 0, "dwarf_child: %s", dwarf_errmsg (-1));
+
+ /* We thought there was a child, but the child list was actually
+ empty. This isn't technically an error in the DWARF, but it is
+ certainly non-optimimal. */
+ if (res == 1)
+ return;
+
+ do
+ {
+ int tag = dwarf_tag (&child);
+ if (tag == DW_TAG_variable || tag == DW_TAG_formal_parameter)
+ {
+ const char *what = tag == DW_TAG_variable ? "variable" : "parameter";
+ print_die (&child, what, 2);
+
+ if (dwarf_hasattr (&child, DW_AT_location))
+ {
+ Dwarf_Attribute attr;
+ if (dwarf_attr (&child, DW_AT_location, &attr) == NULL)
+ error (EXIT_FAILURE, 0, "dwarf_attr: %s", dwarf_errmsg (-1));
+
+ Dwarf_Op *expr;
+ size_t exprlen;
+ if (dwarf_getlocation (&attr, &expr, &exprlen) == 0)
+ {
+ // Covers all ranges of the function.
+ // Evaluate the expression block for each range.
+ ptrdiff_t offset = 0;
+ Dwarf_Addr base, begin, end;
+ do
+ {
+ offset = dwarf_ranges (funcdie, offset, &base,
+ &begin, &end);
+ if (offset < 0)
+ error (EXIT_FAILURE, 0, "dwarf_ranges: %s",
+ dwarf_errmsg (-1));
+
+ if (offset > 0)
+ {
+ if (exprlen == 0)
+ printf (" (%"
+ PRIx64 ",%" PRIx64
+ ") <empty expression>\n", begin, end);
+ else
+ print_expr_block_addrs (&attr, begin, end,
+ expr, exprlen);
+ }
+ }
+ while (offset > 0);
+
+ if (offset < 0)
+ error (EXIT_FAILURE, 0, "dwarf_ranges: %s",
+ dwarf_errmsg (-1));
+ }
+ else
+ {
+ Dwarf_Addr base, begin, end;
+ ptrdiff_t offset = 0;
+ while ((offset = dwarf_getlocations (&attr, offset,
+ &base, &begin, &end,
+ &expr, &exprlen)) > 0)
+ if (begin >= end)
+ printf (" (%" PRIx64 ",%" PRIx64
+ ") <empty range>\n", begin, end); // XXX report?
+ else
+ print_expr_block_addrs (&attr, begin, end,
+ expr, exprlen);
+
+ if (offset < 0)
+ error (EXIT_FAILURE, 0, "dwarf_getlocations: %s",
+ dwarf_errmsg (-1));
+ }
+ }
+ else if (dwarf_hasattr (&child, DW_AT_const_value))
+ {
+ printf (" <constant value>\n"); // Lookup type and print.
+ }
+ else
+ {
+ printf (" <no value>\n");
+ }
+ }
+ }
+ while (dwarf_siblingof (&child, &child) == 0);
+}
+
+static int
+handle_instance (Dwarf_Die *funcdie, void *arg __attribute__ ((unused)))
+{
+ print_die (funcdie, "inlined function", 1);
+ print_varlocs (funcdie);
+
+ return DWARF_CB_OK;
+}
+
+static int
+handle_function (Dwarf_Die *funcdie, void *arg __attribute__((unused)))
+{
+ if (dwarf_func_inline (funcdie) > 0)
+ {
+ // abstract inline definition, find all inlined instances.
+
+ // Note this is convenient for listing all instances together
+ // so you can easily compare the location expressions describing
+ // the variables and parameters, but it isn't very efficient
+ // since it will walk the DIE tree multiple times.
+ if (dwarf_func_inline_instances (funcdie, &handle_instance, NULL) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_func_inline_instances: %s",
+ dwarf_errmsg (-1));
+ }
+ else
+ {
+ // Contains actual code, not just a declaration?
+ Dwarf_Addr entrypc;
+ if (dwarf_entrypc (funcdie, &entrypc) == 0)
+ {
+ print_die (funcdie, "function", 1);
+ print_varlocs (funcdie);
+ }
+ }
+
+ return DWARF_CB_OK;
+}
+
+int
+main (int argc, char *argv[])
+{
+ int remaining;
+ Dwfl *dwfl;
+ (void) argp_parse (dwfl_standard_argp (), argc, argv, 0, &remaining,
+ &dwfl);
+ assert (dwfl != NULL);
+
+ Dwarf_Die *cu = NULL;
+ Dwarf_Addr dwbias;
+ while ((cu = dwfl_nextcu (dwfl, cu, &dwbias)) != NULL)
+ {
+ /* Only walk actual compile units (not partial units) that
+ contain code. */
+ Dwarf_Addr cubase;
+ if (dwarf_tag (cu) == DW_TAG_compile_unit
+ && dwarf_lowpc (cu, &cubase) == 0)
+ {
+ Dwfl_Module *mod = dwfl_cumodule (cu);
+ Dwarf_Addr modbias;
+ dw = dwfl_module_getdwarf (mod, &modbias);
+ assert (dwbias == modbias);
+
+ const char *mainfile;
+ const char *modname = dwfl_module_info (mod, NULL,
+ NULL, NULL,
+ NULL, NULL,
+ &mainfile,
+ NULL);
+ if (modname == NULL)
+ error (EXIT_FAILURE, 0, "dwfl_module_info: %s", dwarf_errmsg (-1));
+
+ const char *name = (modname[0] != '\0'
+ ? modname
+ : basename (mainfile));
+ printf ("module '%s'\n", name);
+ print_die (cu, "CU", 0);
+
+ Dwarf_Addr elfbias;
+ Elf *elf = dwfl_module_getelf (mod, &elfbias);
+
+ // CFI. We need both since sometimes neither is complete.
+ cfi_debug = dwarf_getcfi (dw); // No bias needed, same file.
+ cfi_eh = dwarf_getcfi_elf (elf);
+ cfi_eh_bias = dwbias - elfbias;
+
+ // Get the actual CU DIE and walk all functions inside it.
+ Dwarf_Die cudie;
+ uint8_t offsize;
+ uint8_t addrsize;
+ if (dwarf_diecu (cu, &cudie, &addrsize, &offsize) == NULL)
+ error (EXIT_FAILURE, 0, "dwarf_diecu %s", dwarf_errmsg (-1));
+
+ if (dwarf_getfuncs (cu, handle_function, NULL, 0) != 0)
+ error (EXIT_FAILURE, 0, "dwarf_getfuncs %s",
+ dwarf_errmsg (-1));
+ }
+ }
+
+ dwfl_end (dwfl);
+ return 0;
+}
--
1.8.3.1
10 years, 1 month
[PATCH] tests: Add s390 and s390x addrcfi testcases.
by Mark Wielaard
Signed-off-by: Mark Wielaard <mjw(a)redhat.com>
---
tests/ChangeLog | 10 +++
tests/Makefile.am | 3 +-
tests/addrcfi.c | 6 ++
tests/run-addrcfi.sh | 154 +++++++++++++++++++++++++++++++++++++++++++++++
tests/testfiles390.bz2 | Bin 0 -> 3132 bytes
tests/testfiles390x.bz2 | Bin 0 -> 3026 bytes
6 files changed, 172 insertions(+), 1 deletions(-)
create mode 100755 tests/testfiles390.bz2
create mode 100755 tests/testfiles390x.bz2
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 5933d3c..b934555 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,5 +1,15 @@
2013-08-28 Mark Wielaard <mjw(a)redhat.com>
+ * addrcfi.c (handle_cfi): Handle .debug_frame or .eh_frame
+ completely missing.
+ * run-addrcfi.sh: Add case for EM_S390 ELFCLASS32 and ELFCLASS64.
+ * testfiles390.bz2: New testfile.
+ * testfiles390x.bz2: Likewise.
+ * Makefile.am (EXTRA_DIST): Add testfiles390.bz2 and
+ testfiles390x.bz2.
+
+2013-08-28 Mark Wielaard <mjw(a)redhat.com>
+
* addrcfi.c (handle_cfi): Use printf not error.
* run-addrcfi.sh: Add case for EM_PPC and EM_PPC64.
* testfileppc32.bz2: New testfile.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index bebb5cd..8e4f88a 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -203,7 +203,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
testfilenolines.bz2 test-core-lib.so.bz2 test-core.core.bz2 \
test-core.exec.bz2 run-addr2line-test.sh \
run-addr2line-i-test.sh testfile-inlines.bz2 \
- testfileppc32.bz2 testfileppc64.bz2
+ testfileppc32.bz2 testfileppc64.bz2 \
+ testfiles390.bz2 testfiles390x.bz2
if USE_VALGRIND
valgrind_cmd='valgrind -q --trace-children=yes --error-exitcode=1 --run-libc-freeres=no'
diff --git a/tests/addrcfi.c b/tests/addrcfi.c
index 91f3ab5..6e6a491 100644
--- a/tests/addrcfi.c
+++ b/tests/addrcfi.c
@@ -107,6 +107,12 @@ static int
handle_cfi (Dwfl *dwfl, const char *which, Dwarf_CFI *cfi,
GElf_Addr pc, struct stuff *stuff)
{
+ if (cfi == NULL)
+ {
+ printf ("handle_cfi no CFI (%s): %s\n", which, dwarf_errmsg (-1));
+ return -1;
+ }
+
int result = dwarf_cfi_addrframe (cfi, pc - stuff->bias, &stuff->frame);
if (result != 0)
{
diff --git a/tests/run-addrcfi.sh b/tests/run-addrcfi.sh
index cf95a18..38669ca 100755
--- a/tests/run-addrcfi.sh
+++ b/tests/run-addrcfi.sh
@@ -2342,3 +2342,157 @@ dwarf_cfi_addrframe (.eh_frame): no matching address range
vector reg1154 (vr30): same_value
vector reg1155 (vr31): same_value
EOF
+
+# EM_S390 (ELFCLASS32) (function bar 0x4004d8)
+# Note. Only in .eh_frame, there is no .debug_frame.
+# Same as PPC above but with -m31.
+testfiles testfiles390
+testrun_compare ${abs_builddir}/addrcfi -e testfiles390 0x4004d8 <<\EOF
+.eh_frame has 0x4004d8 => [0x4004d8, 0x4004e8):
+ return address in reg14
+ CFA location expression: bregx(15,96)
+ integer reg0 (%r0): same_value
+ integer reg1 (%r1): same_value
+ integer reg2 (%r2): same_value
+ integer reg3 (%r3): same_value
+ integer reg4 (%r4): same_value
+ integer reg5 (%r5): same_value
+ integer reg6 (%r6): same_value
+ integer reg7 (%r7): same_value
+ integer reg8 (%r8): same_value
+ integer reg9 (%r9): same_value
+ integer reg10 (%r10): same_value
+ integer reg11 (%r11): same_value
+ integer reg12 (%r12): same_value
+ integer reg13 (%r13): same_value
+ integer reg14 (%r14): same_value
+ integer reg15 (%r15): same_value
+ FPU reg16 (%f0): same_value
+ FPU reg17 (%f2): same_value
+ FPU reg18 (%f4): same_value
+ FPU reg19 (%f6): same_value
+ FPU reg20 (%f1): same_value
+ FPU reg21 (%f3): same_value
+ FPU reg22 (%f5): same_value
+ FPU reg23 (%f7): same_value
+ FPU reg24 (%f8): same_value
+ FPU reg25 (%f10): same_value
+ FPU reg26 (%f12): same_value
+ FPU reg27 (%f14): same_value
+ FPU reg28 (%f9): same_value
+ FPU reg29 (%f11): same_value
+ FPU reg30 (%f13): same_value
+ FPU reg31 (%f15): same_value
+ control reg32 (%c0): same_value
+ control reg33 (%c1): same_value
+ control reg34 (%c2): same_value
+ control reg35 (%c3): same_value
+ control reg36 (%c4): same_value
+ control reg37 (%c5): same_value
+ control reg38 (%c6): same_value
+ control reg39 (%c7): same_value
+ control reg40 (%c8): same_value
+ control reg41 (%c9): same_value
+ control reg42 (%c10): same_value
+ control reg43 (%c11): same_value
+ control reg44 (%c12): same_value
+ control reg45 (%c13): same_value
+ control reg46 (%c14): same_value
+ control reg47 (%c15): same_value
+ access reg48 (%a0): same_value
+ access reg49 (%a1): same_value
+ access reg50 (%a2): same_value
+ access reg51 (%a3): same_value
+ access reg52 (%a4): same_value
+ access reg53 (%a5): same_value
+ access reg54 (%a6): same_value
+ access reg55 (%a7): same_value
+ access reg56 (%a8): same_value
+ access reg57 (%a9): same_value
+ access reg58 (%a10): same_value
+ access reg59 (%a11): same_value
+ access reg60 (%a12): same_value
+ access reg61 (%a13): same_value
+ access reg62 (%a14): same_value
+ access reg63 (%a15): same_value
+ control reg64 (%pswm): same_value
+ control reg65 (%pswa): same_value
+handle_cfi no CFI (.debug_frame): no error
+EOF
+
+# EM_S390 (ELFCLASS64) (function bar 0x0000000080000510)
+# Note. Only in .eh_frame, there is no .debug_frame.
+# Same as s390 above but without -m31.
+testfiles testfiles390x
+testrun_compare ${abs_builddir}/addrcfi -e testfiles390x 0x0000000080000510 <<\EOF
+.eh_frame has 0x80000510 => [0x80000510, 0x80000524):
+ return address in reg14
+ CFA location expression: bregx(15,160)
+ integer reg0 (%r0): same_value
+ integer reg1 (%r1): same_value
+ integer reg2 (%r2): same_value
+ integer reg3 (%r3): same_value
+ integer reg4 (%r4): same_value
+ integer reg5 (%r5): same_value
+ integer reg6 (%r6): same_value
+ integer reg7 (%r7): same_value
+ integer reg8 (%r8): same_value
+ integer reg9 (%r9): same_value
+ integer reg10 (%r10): same_value
+ integer reg11 (%r11): same_value
+ integer reg12 (%r12): same_value
+ integer reg13 (%r13): same_value
+ integer reg14 (%r14): same_value
+ integer reg15 (%r15): same_value
+ FPU reg16 (%f0): same_value
+ FPU reg17 (%f2): same_value
+ FPU reg18 (%f4): same_value
+ FPU reg19 (%f6): same_value
+ FPU reg20 (%f1): same_value
+ FPU reg21 (%f3): same_value
+ FPU reg22 (%f5): same_value
+ FPU reg23 (%f7): same_value
+ FPU reg24 (%f8): same_value
+ FPU reg25 (%f10): same_value
+ FPU reg26 (%f12): same_value
+ FPU reg27 (%f14): same_value
+ FPU reg28 (%f9): same_value
+ FPU reg29 (%f11): same_value
+ FPU reg30 (%f13): same_value
+ FPU reg31 (%f15): same_value
+ control reg32 (%c0): same_value
+ control reg33 (%c1): same_value
+ control reg34 (%c2): same_value
+ control reg35 (%c3): same_value
+ control reg36 (%c4): same_value
+ control reg37 (%c5): same_value
+ control reg38 (%c6): same_value
+ control reg39 (%c7): same_value
+ control reg40 (%c8): same_value
+ control reg41 (%c9): same_value
+ control reg42 (%c10): same_value
+ control reg43 (%c11): same_value
+ control reg44 (%c12): same_value
+ control reg45 (%c13): same_value
+ control reg46 (%c14): same_value
+ control reg47 (%c15): same_value
+ access reg48 (%a0): same_value
+ access reg49 (%a1): same_value
+ access reg50 (%a2): same_value
+ access reg51 (%a3): same_value
+ access reg52 (%a4): same_value
+ access reg53 (%a5): same_value
+ access reg54 (%a6): same_value
+ access reg55 (%a7): same_value
+ access reg56 (%a8): same_value
+ access reg57 (%a9): same_value
+ access reg58 (%a10): same_value
+ access reg59 (%a11): same_value
+ access reg60 (%a12): same_value
+ access reg61 (%a13): same_value
+ access reg62 (%a14): same_value
+ access reg63 (%a15): same_value
+ control reg64 (%pswm): same_value
+ control reg65 (%pswa): same_value
+handle_cfi no CFI (.debug_frame): no error
+EOF
diff --git a/tests/testfiles390.bz2 b/tests/testfiles390.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..14ebf6c76c9d00238ff1ad5fc423ceb21dd7d20a
GIT binary patch
literal 3132
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
WmVr4m`s)?H@pmLsg$V+#?qZNnDzmBp
literal 0
HcmV?d00001
diff --git a/tests/testfiles390x.bz2 b/tests/testfiles390x.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..eb63ed8dcef53aca9dedc9a51a1460a679fc83aa
GIT binary patch
literal 3026
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
U*xnW2P}lx0<ce^iA;+i*Y7N7A@c;k-
literal 0
HcmV?d00001
--
1.7.1
10 years, 1 month
[PATCH] tests: Add ppc32 and ppc64 addrcfi testcases.
by Mark Wielaard
Signed-off-by: Mark Wielaard <mjw(a)redhat.com>
---
tests/ChangeLog | 9 +
tests/Makefile.am | 3 +-
tests/addrcfi.c | 3 +-
tests/run-addrcfi.sh | 2084 +++++++++++++++++++++++++++++++++++++++++++++++
tests/testfileppc32.bz2 | Bin 0 -> 3344 bytes
tests/testfileppc64.bz2 | Bin 0 -> 3351 bytes
6 files changed, 2096 insertions(+), 3 deletions(-)
create mode 100755 tests/testfileppc32.bz2
create mode 100755 tests/testfileppc64.bz2
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 487bd2c..5933d3c 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,12 @@
+2013-08-28 Mark Wielaard <mjw(a)redhat.com>
+
+ * addrcfi.c (handle_cfi): Use printf not error.
+ * run-addrcfi.sh: Add case for EM_PPC and EM_PPC64.
+ * testfileppc32.bz2: New testfile.
+ * testfileppc64.bz2: Likewise.
+ * Makefile.am (EXTRA_DIST): Add testfileppc32.bz2 and
+ testfileppc64.bz2.
+
2013-08-27 Mark Wielaard <mjw(a)redhat.com>
* run-addrcfi.sh: New test.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index c85b749..bebb5cd 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -202,7 +202,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
testfile-dwfl-report-elf-align-shlib.so.bz2 \
testfilenolines.bz2 test-core-lib.so.bz2 test-core.core.bz2 \
test-core.exec.bz2 run-addr2line-test.sh \
- run-addr2line-i-test.sh testfile-inlines.bz2
+ run-addr2line-i-test.sh testfile-inlines.bz2 \
+ testfileppc32.bz2 testfileppc64.bz2
if USE_VALGRIND
valgrind_cmd='valgrind -q --trace-children=yes --error-exitcode=1 --run-libc-freeres=no'
diff --git a/tests/addrcfi.c b/tests/addrcfi.c
index de65f4e..91f3ab5 100644
--- a/tests/addrcfi.c
+++ b/tests/addrcfi.c
@@ -25,7 +25,6 @@
#include <stdio_ext.h>
#include <locale.h>
#include <stdlib.h>
-#include <error.h>
#include <string.h>
#include "../libdw/known-dwarf.h"
@@ -111,7 +110,7 @@ handle_cfi (Dwfl *dwfl, const char *which, Dwarf_CFI *cfi,
int result = dwarf_cfi_addrframe (cfi, pc - stuff->bias, &stuff->frame);
if (result != 0)
{
- error (0, 0, "dwarf_cfi_addrframe (%s): %s", which, dwarf_errmsg (-1));
+ printf ("dwarf_cfi_addrframe (%s): %s\n", which, dwarf_errmsg (-1));
return 1;
}
diff --git a/tests/run-addrcfi.sh b/tests/run-addrcfi.sh
index 1b3b993..cf95a18 100755
--- a/tests/run-addrcfi.sh
+++ b/tests/run-addrcfi.sh
@@ -258,3 +258,2087 @@ testrun_compare ${abs_builddir}/addrcfi -e testfile12 0x00000000000009d0 <<\EOF
control reg65 (%fcw): same_value
control reg66 (%fsw): same_value
EOF
+
+# EM_PPC (function bar 0x100004c0)
+# Note. Only in .debug_frame, not in .eh_frame.
+#
+# = bar.c =
+#
+# static int b1 = 1;
+# int b2 = 1;
+#
+# static int
+# foo (int a)
+# {
+# return a + b2;
+# }
+#
+# int bar (int b)
+# {
+# return b - foo (b - b1);
+# }
+#
+# = foo.c =
+#
+# extern int bar (int b);
+# extern int b2;
+#
+# int
+# main (int argc, char ** argv)
+# {
+# return bar (argc + b2);
+# }
+#
+# gcc -g -O2 -m32 -c foo.c
+# gcc -g -O2 -m32 -c bar.c
+# gcc -g -O2 m32 -o testfileppc32 foo.o bar.o
+testfiles testfileppc32
+testrun_compare ${abs_builddir}/addrcfi -e testfileppc32 0x100004c0 <<\EOF
+dwarf_cfi_addrframe (.eh_frame): no matching address range
+.debug_frame has 0x100004c0 => [0x100004c0, 0x100004d0):
+ return address in reg65
+ CFA location expression: bregx(1)
+ integer reg0 (r0): same_value
+ integer reg1 (r1): location expression: call_frame_cfa nop stack_value
+ integer reg2 (r2): same_value
+ integer reg3 (r3): same_value
+ integer reg4 (r4): same_value
+ integer reg5 (r5): same_value
+ integer reg6 (r6): same_value
+ integer reg7 (r7): same_value
+ integer reg8 (r8): same_value
+ integer reg9 (r9): same_value
+ integer reg10 (r10): same_value
+ integer reg11 (r11): same_value
+ integer reg12 (r12): same_value
+ integer reg13 (r13): same_value
+ integer reg14 (r14): same_value
+ integer reg15 (r15): same_value
+ integer reg16 (r16): same_value
+ integer reg17 (r17): same_value
+ integer reg18 (r18): same_value
+ integer reg19 (r19): same_value
+ integer reg20 (r20): same_value
+ integer reg21 (r21): same_value
+ integer reg22 (r22): same_value
+ integer reg23 (r23): same_value
+ integer reg24 (r24): same_value
+ integer reg25 (r25): same_value
+ integer reg26 (r26): same_value
+ integer reg27 (r27): same_value
+ integer reg28 (r28): same_value
+ integer reg29 (r29): same_value
+ integer reg30 (r30): same_value
+ integer reg31 (r31): same_value
+ FPU reg32 (f0): same_value
+ FPU reg33 (f1): same_value
+ FPU reg34 (f2): same_value
+ FPU reg35 (f3): same_value
+ FPU reg36 (f4): same_value
+ FPU reg37 (f5): same_value
+ FPU reg38 (f6): same_value
+ FPU reg39 (f7): same_value
+ FPU reg40 (f8): same_value
+ FPU reg41 (f9): same_value
+ FPU reg42 (f10): same_value
+ FPU reg43 (f11): same_value
+ FPU reg44 (f12): same_value
+ FPU reg45 (f13): same_value
+ FPU reg46 (f14): same_value
+ FPU reg47 (f15): same_value
+ FPU reg48 (f16): same_value
+ FPU reg49 (f17): same_value
+ FPU reg50 (f18): same_value
+ FPU reg51 (f19): same_value
+ FPU reg52 (f20): same_value
+ FPU reg53 (f21): same_value
+ FPU reg54 (f22): same_value
+ FPU reg55 (f23): same_value
+ FPU reg56 (f24): same_value
+ FPU reg57 (f25): same_value
+ FPU reg58 (f26): same_value
+ FPU reg59 (f27): same_value
+ FPU reg60 (f28): same_value
+ FPU reg61 (f29): same_value
+ FPU reg62 (f30): same_value
+ FPU reg63 (f31): same_value
+ integer reg64 (cr): same_value
+ FPU reg65 (fpscr): same_value
+ integer reg66 (msr): same_value
+ vector reg67 (vscr): same_value
+ privileged reg70 (sr0): same_value
+ privileged reg71 (sr1): same_value
+ privileged reg72 (sr2): same_value
+ privileged reg73 (sr3): same_value
+ privileged reg74 (sr4): same_value
+ privileged reg75 (sr5): same_value
+ privileged reg76 (sr6): same_value
+ privileged reg77 (sr7): same_value
+ privileged reg78 (sr8): same_value
+ privileged reg79 (sr9): same_value
+ privileged reg80 (sr10): same_value
+ privileged reg81 (sr11): same_value
+ privileged reg82 (sr12): same_value
+ privileged reg83 (sr13): same_value
+ privileged reg84 (sr14): same_value
+ privileged reg85 (sr15): same_value
+ privileged reg100 (mq): same_value
+ privileged reg101 (xer): same_value
+ privileged reg102 (spr2): same_value
+ privileged reg103 (spr3): same_value
+ privileged reg104 (spr4): same_value
+ privileged reg105 (spr5): same_value
+ privileged reg106 (spr6): same_value
+ privileged reg107 (spr7): same_value
+ privileged reg108 (lr): same_value
+ privileged reg109 (ctr): same_value
+ privileged reg110 (spr10): same_value
+ privileged reg111 (spr11): same_value
+ privileged reg112 (spr12): same_value
+ privileged reg113 (spr13): same_value
+ privileged reg114 (spr14): same_value
+ privileged reg115 (spr15): same_value
+ privileged reg116 (spr16): same_value
+ privileged reg117 (spr17): same_value
+ privileged reg118 (dsisr): same_value
+ privileged reg119 (dar): same_value
+ privileged reg120 (spr20): same_value
+ privileged reg121 (spr21): same_value
+ privileged reg122 (dec): same_value
+ privileged reg123 (spr23): same_value
+ privileged reg124 (spr24): same_value
+ privileged reg125 (spr25): same_value
+ privileged reg126 (spr26): same_value
+ privileged reg127 (spr27): same_value
+ privileged reg128 (spr28): same_value
+ privileged reg129 (spr29): same_value
+ privileged reg130 (spr30): same_value
+ privileged reg131 (spr31): same_value
+ privileged reg132 (spr32): same_value
+ privileged reg133 (spr33): same_value
+ privileged reg134 (spr34): same_value
+ privileged reg135 (spr35): same_value
+ privileged reg136 (spr36): same_value
+ privileged reg137 (spr37): same_value
+ privileged reg138 (spr38): same_value
+ privileged reg139 (spr39): same_value
+ privileged reg140 (spr40): same_value
+ privileged reg141 (spr41): same_value
+ privileged reg142 (spr42): same_value
+ privileged reg143 (spr43): same_value
+ privileged reg144 (spr44): same_value
+ privileged reg145 (spr45): same_value
+ privileged reg146 (spr46): same_value
+ privileged reg147 (spr47): same_value
+ privileged reg148 (spr48): same_value
+ privileged reg149 (spr49): same_value
+ privileged reg150 (spr50): same_value
+ privileged reg151 (spr51): same_value
+ privileged reg152 (spr52): same_value
+ privileged reg153 (spr53): same_value
+ privileged reg154 (spr54): same_value
+ privileged reg155 (spr55): same_value
+ privileged reg156 (spr56): same_value
+ privileged reg157 (spr57): same_value
+ privileged reg158 (spr58): same_value
+ privileged reg159 (spr59): same_value
+ privileged reg160 (spr60): same_value
+ privileged reg161 (spr61): same_value
+ privileged reg162 (spr62): same_value
+ privileged reg163 (spr63): same_value
+ privileged reg164 (spr64): same_value
+ privileged reg165 (spr65): same_value
+ privileged reg166 (spr66): same_value
+ privileged reg167 (spr67): same_value
+ privileged reg168 (spr68): same_value
+ privileged reg169 (spr69): same_value
+ privileged reg170 (spr70): same_value
+ privileged reg171 (spr71): same_value
+ privileged reg172 (spr72): same_value
+ privileged reg173 (spr73): same_value
+ privileged reg174 (spr74): same_value
+ privileged reg175 (spr75): same_value
+ privileged reg176 (spr76): same_value
+ privileged reg177 (spr77): same_value
+ privileged reg178 (spr78): same_value
+ privileged reg179 (spr79): same_value
+ privileged reg180 (spr80): same_value
+ privileged reg181 (spr81): same_value
+ privileged reg182 (spr82): same_value
+ privileged reg183 (spr83): same_value
+ privileged reg184 (spr84): same_value
+ privileged reg185 (spr85): same_value
+ privileged reg186 (spr86): same_value
+ privileged reg187 (spr87): same_value
+ privileged reg188 (spr88): same_value
+ privileged reg189 (spr89): same_value
+ privileged reg190 (spr90): same_value
+ privileged reg191 (spr91): same_value
+ privileged reg192 (spr92): same_value
+ privileged reg193 (spr93): same_value
+ privileged reg194 (spr94): same_value
+ privileged reg195 (spr95): same_value
+ privileged reg196 (spr96): same_value
+ privileged reg197 (spr97): same_value
+ privileged reg198 (spr98): same_value
+ privileged reg199 (spr99): same_value
+ privileged reg200 (spr100): same_value
+ privileged reg201 (spr101): same_value
+ privileged reg202 (spr102): same_value
+ privileged reg203 (spr103): same_value
+ privileged reg204 (spr104): same_value
+ privileged reg205 (spr105): same_value
+ privileged reg206 (spr106): same_value
+ privileged reg207 (spr107): same_value
+ privileged reg208 (spr108): same_value
+ privileged reg209 (spr109): same_value
+ privileged reg210 (spr110): same_value
+ privileged reg211 (spr111): same_value
+ privileged reg212 (spr112): same_value
+ privileged reg213 (spr113): same_value
+ privileged reg214 (spr114): same_value
+ privileged reg215 (spr115): same_value
+ privileged reg216 (spr116): same_value
+ privileged reg217 (spr117): same_value
+ privileged reg218 (spr118): same_value
+ privileged reg219 (spr119): same_value
+ privileged reg220 (spr120): same_value
+ privileged reg221 (spr121): same_value
+ privileged reg222 (spr122): same_value
+ privileged reg223 (spr123): same_value
+ privileged reg224 (spr124): same_value
+ privileged reg225 (spr125): same_value
+ privileged reg226 (spr126): same_value
+ privileged reg227 (spr127): same_value
+ privileged reg228 (spr128): same_value
+ privileged reg229 (spr129): same_value
+ privileged reg230 (spr130): same_value
+ privileged reg231 (spr131): same_value
+ privileged reg232 (spr132): same_value
+ privileged reg233 (spr133): same_value
+ privileged reg234 (spr134): same_value
+ privileged reg235 (spr135): same_value
+ privileged reg236 (spr136): same_value
+ privileged reg237 (spr137): same_value
+ privileged reg238 (spr138): same_value
+ privileged reg239 (spr139): same_value
+ privileged reg240 (spr140): same_value
+ privileged reg241 (spr141): same_value
+ privileged reg242 (spr142): same_value
+ privileged reg243 (spr143): same_value
+ privileged reg244 (spr144): same_value
+ privileged reg245 (spr145): same_value
+ privileged reg246 (spr146): same_value
+ privileged reg247 (spr147): same_value
+ privileged reg248 (spr148): same_value
+ privileged reg249 (spr149): same_value
+ privileged reg250 (spr150): same_value
+ privileged reg251 (spr151): same_value
+ privileged reg252 (spr152): same_value
+ privileged reg253 (spr153): same_value
+ privileged reg254 (spr154): same_value
+ privileged reg255 (spr155): same_value
+ privileged reg256 (spr156): same_value
+ privileged reg257 (spr157): same_value
+ privileged reg258 (spr158): same_value
+ privileged reg259 (spr159): same_value
+ privileged reg260 (spr160): same_value
+ privileged reg261 (spr161): same_value
+ privileged reg262 (spr162): same_value
+ privileged reg263 (spr163): same_value
+ privileged reg264 (spr164): same_value
+ privileged reg265 (spr165): same_value
+ privileged reg266 (spr166): same_value
+ privileged reg267 (spr167): same_value
+ privileged reg268 (spr168): same_value
+ privileged reg269 (spr169): same_value
+ privileged reg270 (spr170): same_value
+ privileged reg271 (spr171): same_value
+ privileged reg272 (spr172): same_value
+ privileged reg273 (spr173): same_value
+ privileged reg274 (spr174): same_value
+ privileged reg275 (spr175): same_value
+ privileged reg276 (spr176): same_value
+ privileged reg277 (spr177): same_value
+ privileged reg278 (spr178): same_value
+ privileged reg279 (spr179): same_value
+ privileged reg280 (spr180): same_value
+ privileged reg281 (spr181): same_value
+ privileged reg282 (spr182): same_value
+ privileged reg283 (spr183): same_value
+ privileged reg284 (spr184): same_value
+ privileged reg285 (spr185): same_value
+ privileged reg286 (spr186): same_value
+ privileged reg287 (spr187): same_value
+ privileged reg288 (spr188): same_value
+ privileged reg289 (spr189): same_value
+ privileged reg290 (spr190): same_value
+ privileged reg291 (spr191): same_value
+ privileged reg292 (spr192): same_value
+ privileged reg293 (spr193): same_value
+ privileged reg294 (spr194): same_value
+ privileged reg295 (spr195): same_value
+ privileged reg296 (spr196): same_value
+ privileged reg297 (spr197): same_value
+ privileged reg298 (spr198): same_value
+ privileged reg299 (spr199): same_value
+ privileged reg300 (spr200): same_value
+ privileged reg301 (spr201): same_value
+ privileged reg302 (spr202): same_value
+ privileged reg303 (spr203): same_value
+ privileged reg304 (spr204): same_value
+ privileged reg305 (spr205): same_value
+ privileged reg306 (spr206): same_value
+ privileged reg307 (spr207): same_value
+ privileged reg308 (spr208): same_value
+ privileged reg309 (spr209): same_value
+ privileged reg310 (spr210): same_value
+ privileged reg311 (spr211): same_value
+ privileged reg312 (spr212): same_value
+ privileged reg313 (spr213): same_value
+ privileged reg314 (spr214): same_value
+ privileged reg315 (spr215): same_value
+ privileged reg316 (spr216): same_value
+ privileged reg317 (spr217): same_value
+ privileged reg318 (spr218): same_value
+ privileged reg319 (spr219): same_value
+ privileged reg320 (spr220): same_value
+ privileged reg321 (spr221): same_value
+ privileged reg322 (spr222): same_value
+ privileged reg323 (spr223): same_value
+ privileged reg324 (spr224): same_value
+ privileged reg325 (spr225): same_value
+ privileged reg326 (spr226): same_value
+ privileged reg327 (spr227): same_value
+ privileged reg328 (spr228): same_value
+ privileged reg329 (spr229): same_value
+ privileged reg330 (spr230): same_value
+ privileged reg331 (spr231): same_value
+ privileged reg332 (spr232): same_value
+ privileged reg333 (spr233): same_value
+ privileged reg334 (spr234): same_value
+ privileged reg335 (spr235): same_value
+ privileged reg336 (spr236): same_value
+ privileged reg337 (spr237): same_value
+ privileged reg338 (spr238): same_value
+ privileged reg339 (spr239): same_value
+ privileged reg340 (spr240): same_value
+ privileged reg341 (spr241): same_value
+ privileged reg342 (spr242): same_value
+ privileged reg343 (spr243): same_value
+ privileged reg344 (spr244): same_value
+ privileged reg345 (spr245): same_value
+ privileged reg346 (spr246): same_value
+ privileged reg347 (spr247): same_value
+ privileged reg348 (spr248): same_value
+ privileged reg349 (spr249): same_value
+ privileged reg350 (spr250): same_value
+ privileged reg351 (spr251): same_value
+ privileged reg352 (spr252): same_value
+ privileged reg353 (spr253): same_value
+ privileged reg354 (spr254): same_value
+ privileged reg355 (spr255): same_value
+ vector reg356 (vrsave): same_value
+ privileged reg357 (spr257): same_value
+ privileged reg358 (spr258): same_value
+ privileged reg359 (spr259): same_value
+ privileged reg360 (spr260): same_value
+ privileged reg361 (spr261): same_value
+ privileged reg362 (spr262): same_value
+ privileged reg363 (spr263): same_value
+ privileged reg364 (spr264): same_value
+ privileged reg365 (spr265): same_value
+ privileged reg366 (spr266): same_value
+ privileged reg367 (spr267): same_value
+ privileged reg368 (spr268): same_value
+ privileged reg369 (spr269): same_value
+ privileged reg370 (spr270): same_value
+ privileged reg371 (spr271): same_value
+ privileged reg372 (spr272): same_value
+ privileged reg373 (spr273): same_value
+ privileged reg374 (spr274): same_value
+ privileged reg375 (spr275): same_value
+ privileged reg376 (spr276): same_value
+ privileged reg377 (spr277): same_value
+ privileged reg378 (spr278): same_value
+ privileged reg379 (spr279): same_value
+ privileged reg380 (spr280): same_value
+ privileged reg381 (spr281): same_value
+ privileged reg382 (spr282): same_value
+ privileged reg383 (spr283): same_value
+ privileged reg384 (spr284): same_value
+ privileged reg385 (spr285): same_value
+ privileged reg386 (spr286): same_value
+ privileged reg387 (spr287): same_value
+ privileged reg388 (spr288): same_value
+ privileged reg389 (spr289): same_value
+ privileged reg390 (spr290): same_value
+ privileged reg391 (spr291): same_value
+ privileged reg392 (spr292): same_value
+ privileged reg393 (spr293): same_value
+ privileged reg394 (spr294): same_value
+ privileged reg395 (spr295): same_value
+ privileged reg396 (spr296): same_value
+ privileged reg397 (spr297): same_value
+ privileged reg398 (spr298): same_value
+ privileged reg399 (spr299): same_value
+ privileged reg400 (spr300): same_value
+ privileged reg401 (spr301): same_value
+ privileged reg402 (spr302): same_value
+ privileged reg403 (spr303): same_value
+ privileged reg404 (spr304): same_value
+ privileged reg405 (spr305): same_value
+ privileged reg406 (spr306): same_value
+ privileged reg407 (spr307): same_value
+ privileged reg408 (spr308): same_value
+ privileged reg409 (spr309): same_value
+ privileged reg410 (spr310): same_value
+ privileged reg411 (spr311): same_value
+ privileged reg412 (spr312): same_value
+ privileged reg413 (spr313): same_value
+ privileged reg414 (spr314): same_value
+ privileged reg415 (spr315): same_value
+ privileged reg416 (spr316): same_value
+ privileged reg417 (spr317): same_value
+ privileged reg418 (spr318): same_value
+ privileged reg419 (spr319): same_value
+ privileged reg420 (spr320): same_value
+ privileged reg421 (spr321): same_value
+ privileged reg422 (spr322): same_value
+ privileged reg423 (spr323): same_value
+ privileged reg424 (spr324): same_value
+ privileged reg425 (spr325): same_value
+ privileged reg426 (spr326): same_value
+ privileged reg427 (spr327): same_value
+ privileged reg428 (spr328): same_value
+ privileged reg429 (spr329): same_value
+ privileged reg430 (spr330): same_value
+ privileged reg431 (spr331): same_value
+ privileged reg432 (spr332): same_value
+ privileged reg433 (spr333): same_value
+ privileged reg434 (spr334): same_value
+ privileged reg435 (spr335): same_value
+ privileged reg436 (spr336): same_value
+ privileged reg437 (spr337): same_value
+ privileged reg438 (spr338): same_value
+ privileged reg439 (spr339): same_value
+ privileged reg440 (spr340): same_value
+ privileged reg441 (spr341): same_value
+ privileged reg442 (spr342): same_value
+ privileged reg443 (spr343): same_value
+ privileged reg444 (spr344): same_value
+ privileged reg445 (spr345): same_value
+ privileged reg446 (spr346): same_value
+ privileged reg447 (spr347): same_value
+ privileged reg448 (spr348): same_value
+ privileged reg449 (spr349): same_value
+ privileged reg450 (spr350): same_value
+ privileged reg451 (spr351): same_value
+ privileged reg452 (spr352): same_value
+ privileged reg453 (spr353): same_value
+ privileged reg454 (spr354): same_value
+ privileged reg455 (spr355): same_value
+ privileged reg456 (spr356): same_value
+ privileged reg457 (spr357): same_value
+ privileged reg458 (spr358): same_value
+ privileged reg459 (spr359): same_value
+ privileged reg460 (spr360): same_value
+ privileged reg461 (spr361): same_value
+ privileged reg462 (spr362): same_value
+ privileged reg463 (spr363): same_value
+ privileged reg464 (spr364): same_value
+ privileged reg465 (spr365): same_value
+ privileged reg466 (spr366): same_value
+ privileged reg467 (spr367): same_value
+ privileged reg468 (spr368): same_value
+ privileged reg469 (spr369): same_value
+ privileged reg470 (spr370): same_value
+ privileged reg471 (spr371): same_value
+ privileged reg472 (spr372): same_value
+ privileged reg473 (spr373): same_value
+ privileged reg474 (spr374): same_value
+ privileged reg475 (spr375): same_value
+ privileged reg476 (spr376): same_value
+ privileged reg477 (spr377): same_value
+ privileged reg478 (spr378): same_value
+ privileged reg479 (spr379): same_value
+ privileged reg480 (spr380): same_value
+ privileged reg481 (spr381): same_value
+ privileged reg482 (spr382): same_value
+ privileged reg483 (spr383): same_value
+ privileged reg484 (spr384): same_value
+ privileged reg485 (spr385): same_value
+ privileged reg486 (spr386): same_value
+ privileged reg487 (spr387): same_value
+ privileged reg488 (spr388): same_value
+ privileged reg489 (spr389): same_value
+ privileged reg490 (spr390): same_value
+ privileged reg491 (spr391): same_value
+ privileged reg492 (spr392): same_value
+ privileged reg493 (spr393): same_value
+ privileged reg494 (spr394): same_value
+ privileged reg495 (spr395): same_value
+ privileged reg496 (spr396): same_value
+ privileged reg497 (spr397): same_value
+ privileged reg498 (spr398): same_value
+ privileged reg499 (spr399): same_value
+ privileged reg500 (spr400): same_value
+ privileged reg501 (spr401): same_value
+ privileged reg502 (spr402): same_value
+ privileged reg503 (spr403): same_value
+ privileged reg504 (spr404): same_value
+ privileged reg505 (spr405): same_value
+ privileged reg506 (spr406): same_value
+ privileged reg507 (spr407): same_value
+ privileged reg508 (spr408): same_value
+ privileged reg509 (spr409): same_value
+ privileged reg510 (spr410): same_value
+ privileged reg511 (spr411): same_value
+ privileged reg512 (spr412): same_value
+ privileged reg513 (spr413): same_value
+ privileged reg514 (spr414): same_value
+ privileged reg515 (spr415): same_value
+ privileged reg516 (spr416): same_value
+ privileged reg517 (spr417): same_value
+ privileged reg518 (spr418): same_value
+ privileged reg519 (spr419): same_value
+ privileged reg520 (spr420): same_value
+ privileged reg521 (spr421): same_value
+ privileged reg522 (spr422): same_value
+ privileged reg523 (spr423): same_value
+ privileged reg524 (spr424): same_value
+ privileged reg525 (spr425): same_value
+ privileged reg526 (spr426): same_value
+ privileged reg527 (spr427): same_value
+ privileged reg528 (spr428): same_value
+ privileged reg529 (spr429): same_value
+ privileged reg530 (spr430): same_value
+ privileged reg531 (spr431): same_value
+ privileged reg532 (spr432): same_value
+ privileged reg533 (spr433): same_value
+ privileged reg534 (spr434): same_value
+ privileged reg535 (spr435): same_value
+ privileged reg536 (spr436): same_value
+ privileged reg537 (spr437): same_value
+ privileged reg538 (spr438): same_value
+ privileged reg539 (spr439): same_value
+ privileged reg540 (spr440): same_value
+ privileged reg541 (spr441): same_value
+ privileged reg542 (spr442): same_value
+ privileged reg543 (spr443): same_value
+ privileged reg544 (spr444): same_value
+ privileged reg545 (spr445): same_value
+ privileged reg546 (spr446): same_value
+ privileged reg547 (spr447): same_value
+ privileged reg548 (spr448): same_value
+ privileged reg549 (spr449): same_value
+ privileged reg550 (spr450): same_value
+ privileged reg551 (spr451): same_value
+ privileged reg552 (spr452): same_value
+ privileged reg553 (spr453): same_value
+ privileged reg554 (spr454): same_value
+ privileged reg555 (spr455): same_value
+ privileged reg556 (spr456): same_value
+ privileged reg557 (spr457): same_value
+ privileged reg558 (spr458): same_value
+ privileged reg559 (spr459): same_value
+ privileged reg560 (spr460): same_value
+ privileged reg561 (spr461): same_value
+ privileged reg562 (spr462): same_value
+ privileged reg563 (spr463): same_value
+ privileged reg564 (spr464): same_value
+ privileged reg565 (spr465): same_value
+ privileged reg566 (spr466): same_value
+ privileged reg567 (spr467): same_value
+ privileged reg568 (spr468): same_value
+ privileged reg569 (spr469): same_value
+ privileged reg570 (spr470): same_value
+ privileged reg571 (spr471): same_value
+ privileged reg572 (spr472): same_value
+ privileged reg573 (spr473): same_value
+ privileged reg574 (spr474): same_value
+ privileged reg575 (spr475): same_value
+ privileged reg576 (spr476): same_value
+ privileged reg577 (spr477): same_value
+ privileged reg578 (spr478): same_value
+ privileged reg579 (spr479): same_value
+ privileged reg580 (spr480): same_value
+ privileged reg581 (spr481): same_value
+ privileged reg582 (spr482): same_value
+ privileged reg583 (spr483): same_value
+ privileged reg584 (spr484): same_value
+ privileged reg585 (spr485): same_value
+ privileged reg586 (spr486): same_value
+ privileged reg587 (spr487): same_value
+ privileged reg588 (spr488): same_value
+ privileged reg589 (spr489): same_value
+ privileged reg590 (spr490): same_value
+ privileged reg591 (spr491): same_value
+ privileged reg592 (spr492): same_value
+ privileged reg593 (spr493): same_value
+ privileged reg594 (spr494): same_value
+ privileged reg595 (spr495): same_value
+ privileged reg596 (spr496): same_value
+ privileged reg597 (spr497): same_value
+ privileged reg598 (spr498): same_value
+ privileged reg599 (spr499): same_value
+ privileged reg600 (spr500): same_value
+ privileged reg601 (spr501): same_value
+ privileged reg602 (spr502): same_value
+ privileged reg603 (spr503): same_value
+ privileged reg604 (spr504): same_value
+ privileged reg605 (spr505): same_value
+ privileged reg606 (spr506): same_value
+ privileged reg607 (spr507): same_value
+ privileged reg608 (spr508): same_value
+ privileged reg609 (spr509): same_value
+ privileged reg610 (spr510): same_value
+ privileged reg611 (spr511): same_value
+ vector reg612 (spefscr): same_value
+ privileged reg613 (spr513): same_value
+ privileged reg614 (spr514): same_value
+ privileged reg615 (spr515): same_value
+ privileged reg616 (spr516): same_value
+ privileged reg617 (spr517): same_value
+ privileged reg618 (spr518): same_value
+ privileged reg619 (spr519): same_value
+ privileged reg620 (spr520): same_value
+ privileged reg621 (spr521): same_value
+ privileged reg622 (spr522): same_value
+ privileged reg623 (spr523): same_value
+ privileged reg624 (spr524): same_value
+ privileged reg625 (spr525): same_value
+ privileged reg626 (spr526): same_value
+ privileged reg627 (spr527): same_value
+ privileged reg628 (spr528): same_value
+ privileged reg629 (spr529): same_value
+ privileged reg630 (spr530): same_value
+ privileged reg631 (spr531): same_value
+ privileged reg632 (spr532): same_value
+ privileged reg633 (spr533): same_value
+ privileged reg634 (spr534): same_value
+ privileged reg635 (spr535): same_value
+ privileged reg636 (spr536): same_value
+ privileged reg637 (spr537): same_value
+ privileged reg638 (spr538): same_value
+ privileged reg639 (spr539): same_value
+ privileged reg640 (spr540): same_value
+ privileged reg641 (spr541): same_value
+ privileged reg642 (spr542): same_value
+ privileged reg643 (spr543): same_value
+ privileged reg644 (spr544): same_value
+ privileged reg645 (spr545): same_value
+ privileged reg646 (spr546): same_value
+ privileged reg647 (spr547): same_value
+ privileged reg648 (spr548): same_value
+ privileged reg649 (spr549): same_value
+ privileged reg650 (spr550): same_value
+ privileged reg651 (spr551): same_value
+ privileged reg652 (spr552): same_value
+ privileged reg653 (spr553): same_value
+ privileged reg654 (spr554): same_value
+ privileged reg655 (spr555): same_value
+ privileged reg656 (spr556): same_value
+ privileged reg657 (spr557): same_value
+ privileged reg658 (spr558): same_value
+ privileged reg659 (spr559): same_value
+ privileged reg660 (spr560): same_value
+ privileged reg661 (spr561): same_value
+ privileged reg662 (spr562): same_value
+ privileged reg663 (spr563): same_value
+ privileged reg664 (spr564): same_value
+ privileged reg665 (spr565): same_value
+ privileged reg666 (spr566): same_value
+ privileged reg667 (spr567): same_value
+ privileged reg668 (spr568): same_value
+ privileged reg669 (spr569): same_value
+ privileged reg670 (spr570): same_value
+ privileged reg671 (spr571): same_value
+ privileged reg672 (spr572): same_value
+ privileged reg673 (spr573): same_value
+ privileged reg674 (spr574): same_value
+ privileged reg675 (spr575): same_value
+ privileged reg676 (spr576): same_value
+ privileged reg677 (spr577): same_value
+ privileged reg678 (spr578): same_value
+ privileged reg679 (spr579): same_value
+ privileged reg680 (spr580): same_value
+ privileged reg681 (spr581): same_value
+ privileged reg682 (spr582): same_value
+ privileged reg683 (spr583): same_value
+ privileged reg684 (spr584): same_value
+ privileged reg685 (spr585): same_value
+ privileged reg686 (spr586): same_value
+ privileged reg687 (spr587): same_value
+ privileged reg688 (spr588): same_value
+ privileged reg689 (spr589): same_value
+ privileged reg690 (spr590): same_value
+ privileged reg691 (spr591): same_value
+ privileged reg692 (spr592): same_value
+ privileged reg693 (spr593): same_value
+ privileged reg694 (spr594): same_value
+ privileged reg695 (spr595): same_value
+ privileged reg696 (spr596): same_value
+ privileged reg697 (spr597): same_value
+ privileged reg698 (spr598): same_value
+ privileged reg699 (spr599): same_value
+ privileged reg700 (spr600): same_value
+ privileged reg701 (spr601): same_value
+ privileged reg702 (spr602): same_value
+ privileged reg703 (spr603): same_value
+ privileged reg704 (spr604): same_value
+ privileged reg705 (spr605): same_value
+ privileged reg706 (spr606): same_value
+ privileged reg707 (spr607): same_value
+ privileged reg708 (spr608): same_value
+ privileged reg709 (spr609): same_value
+ privileged reg710 (spr610): same_value
+ privileged reg711 (spr611): same_value
+ privileged reg712 (spr612): same_value
+ privileged reg713 (spr613): same_value
+ privileged reg714 (spr614): same_value
+ privileged reg715 (spr615): same_value
+ privileged reg716 (spr616): same_value
+ privileged reg717 (spr617): same_value
+ privileged reg718 (spr618): same_value
+ privileged reg719 (spr619): same_value
+ privileged reg720 (spr620): same_value
+ privileged reg721 (spr621): same_value
+ privileged reg722 (spr622): same_value
+ privileged reg723 (spr623): same_value
+ privileged reg724 (spr624): same_value
+ privileged reg725 (spr625): same_value
+ privileged reg726 (spr626): same_value
+ privileged reg727 (spr627): same_value
+ privileged reg728 (spr628): same_value
+ privileged reg729 (spr629): same_value
+ privileged reg730 (spr630): same_value
+ privileged reg731 (spr631): same_value
+ privileged reg732 (spr632): same_value
+ privileged reg733 (spr633): same_value
+ privileged reg734 (spr634): same_value
+ privileged reg735 (spr635): same_value
+ privileged reg736 (spr636): same_value
+ privileged reg737 (spr637): same_value
+ privileged reg738 (spr638): same_value
+ privileged reg739 (spr639): same_value
+ privileged reg740 (spr640): same_value
+ privileged reg741 (spr641): same_value
+ privileged reg742 (spr642): same_value
+ privileged reg743 (spr643): same_value
+ privileged reg744 (spr644): same_value
+ privileged reg745 (spr645): same_value
+ privileged reg746 (spr646): same_value
+ privileged reg747 (spr647): same_value
+ privileged reg748 (spr648): same_value
+ privileged reg749 (spr649): same_value
+ privileged reg750 (spr650): same_value
+ privileged reg751 (spr651): same_value
+ privileged reg752 (spr652): same_value
+ privileged reg753 (spr653): same_value
+ privileged reg754 (spr654): same_value
+ privileged reg755 (spr655): same_value
+ privileged reg756 (spr656): same_value
+ privileged reg757 (spr657): same_value
+ privileged reg758 (spr658): same_value
+ privileged reg759 (spr659): same_value
+ privileged reg760 (spr660): same_value
+ privileged reg761 (spr661): same_value
+ privileged reg762 (spr662): same_value
+ privileged reg763 (spr663): same_value
+ privileged reg764 (spr664): same_value
+ privileged reg765 (spr665): same_value
+ privileged reg766 (spr666): same_value
+ privileged reg767 (spr667): same_value
+ privileged reg768 (spr668): same_value
+ privileged reg769 (spr669): same_value
+ privileged reg770 (spr670): same_value
+ privileged reg771 (spr671): same_value
+ privileged reg772 (spr672): same_value
+ privileged reg773 (spr673): same_value
+ privileged reg774 (spr674): same_value
+ privileged reg775 (spr675): same_value
+ privileged reg776 (spr676): same_value
+ privileged reg777 (spr677): same_value
+ privileged reg778 (spr678): same_value
+ privileged reg779 (spr679): same_value
+ privileged reg780 (spr680): same_value
+ privileged reg781 (spr681): same_value
+ privileged reg782 (spr682): same_value
+ privileged reg783 (spr683): same_value
+ privileged reg784 (spr684): same_value
+ privileged reg785 (spr685): same_value
+ privileged reg786 (spr686): same_value
+ privileged reg787 (spr687): same_value
+ privileged reg788 (spr688): same_value
+ privileged reg789 (spr689): same_value
+ privileged reg790 (spr690): same_value
+ privileged reg791 (spr691): same_value
+ privileged reg792 (spr692): same_value
+ privileged reg793 (spr693): same_value
+ privileged reg794 (spr694): same_value
+ privileged reg795 (spr695): same_value
+ privileged reg796 (spr696): same_value
+ privileged reg797 (spr697): same_value
+ privileged reg798 (spr698): same_value
+ privileged reg799 (spr699): same_value
+ privileged reg800 (spr700): same_value
+ privileged reg801 (spr701): same_value
+ privileged reg802 (spr702): same_value
+ privileged reg803 (spr703): same_value
+ privileged reg804 (spr704): same_value
+ privileged reg805 (spr705): same_value
+ privileged reg806 (spr706): same_value
+ privileged reg807 (spr707): same_value
+ privileged reg808 (spr708): same_value
+ privileged reg809 (spr709): same_value
+ privileged reg810 (spr710): same_value
+ privileged reg811 (spr711): same_value
+ privileged reg812 (spr712): same_value
+ privileged reg813 (spr713): same_value
+ privileged reg814 (spr714): same_value
+ privileged reg815 (spr715): same_value
+ privileged reg816 (spr716): same_value
+ privileged reg817 (spr717): same_value
+ privileged reg818 (spr718): same_value
+ privileged reg819 (spr719): same_value
+ privileged reg820 (spr720): same_value
+ privileged reg821 (spr721): same_value
+ privileged reg822 (spr722): same_value
+ privileged reg823 (spr723): same_value
+ privileged reg824 (spr724): same_value
+ privileged reg825 (spr725): same_value
+ privileged reg826 (spr726): same_value
+ privileged reg827 (spr727): same_value
+ privileged reg828 (spr728): same_value
+ privileged reg829 (spr729): same_value
+ privileged reg830 (spr730): same_value
+ privileged reg831 (spr731): same_value
+ privileged reg832 (spr732): same_value
+ privileged reg833 (spr733): same_value
+ privileged reg834 (spr734): same_value
+ privileged reg835 (spr735): same_value
+ privileged reg836 (spr736): same_value
+ privileged reg837 (spr737): same_value
+ privileged reg838 (spr738): same_value
+ privileged reg839 (spr739): same_value
+ privileged reg840 (spr740): same_value
+ privileged reg841 (spr741): same_value
+ privileged reg842 (spr742): same_value
+ privileged reg843 (spr743): same_value
+ privileged reg844 (spr744): same_value
+ privileged reg845 (spr745): same_value
+ privileged reg846 (spr746): same_value
+ privileged reg847 (spr747): same_value
+ privileged reg848 (spr748): same_value
+ privileged reg849 (spr749): same_value
+ privileged reg850 (spr750): same_value
+ privileged reg851 (spr751): same_value
+ privileged reg852 (spr752): same_value
+ privileged reg853 (spr753): same_value
+ privileged reg854 (spr754): same_value
+ privileged reg855 (spr755): same_value
+ privileged reg856 (spr756): same_value
+ privileged reg857 (spr757): same_value
+ privileged reg858 (spr758): same_value
+ privileged reg859 (spr759): same_value
+ privileged reg860 (spr760): same_value
+ privileged reg861 (spr761): same_value
+ privileged reg862 (spr762): same_value
+ privileged reg863 (spr763): same_value
+ privileged reg864 (spr764): same_value
+ privileged reg865 (spr765): same_value
+ privileged reg866 (spr766): same_value
+ privileged reg867 (spr767): same_value
+ privileged reg868 (spr768): same_value
+ privileged reg869 (spr769): same_value
+ privileged reg870 (spr770): same_value
+ privileged reg871 (spr771): same_value
+ privileged reg872 (spr772): same_value
+ privileged reg873 (spr773): same_value
+ privileged reg874 (spr774): same_value
+ privileged reg875 (spr775): same_value
+ privileged reg876 (spr776): same_value
+ privileged reg877 (spr777): same_value
+ privileged reg878 (spr778): same_value
+ privileged reg879 (spr779): same_value
+ privileged reg880 (spr780): same_value
+ privileged reg881 (spr781): same_value
+ privileged reg882 (spr782): same_value
+ privileged reg883 (spr783): same_value
+ privileged reg884 (spr784): same_value
+ privileged reg885 (spr785): same_value
+ privileged reg886 (spr786): same_value
+ privileged reg887 (spr787): same_value
+ privileged reg888 (spr788): same_value
+ privileged reg889 (spr789): same_value
+ privileged reg890 (spr790): same_value
+ privileged reg891 (spr791): same_value
+ privileged reg892 (spr792): same_value
+ privileged reg893 (spr793): same_value
+ privileged reg894 (spr794): same_value
+ privileged reg895 (spr795): same_value
+ privileged reg896 (spr796): same_value
+ privileged reg897 (spr797): same_value
+ privileged reg898 (spr798): same_value
+ privileged reg899 (spr799): same_value
+ privileged reg900 (spr800): same_value
+ privileged reg901 (spr801): same_value
+ privileged reg902 (spr802): same_value
+ privileged reg903 (spr803): same_value
+ privileged reg904 (spr804): same_value
+ privileged reg905 (spr805): same_value
+ privileged reg906 (spr806): same_value
+ privileged reg907 (spr807): same_value
+ privileged reg908 (spr808): same_value
+ privileged reg909 (spr809): same_value
+ privileged reg910 (spr810): same_value
+ privileged reg911 (spr811): same_value
+ privileged reg912 (spr812): same_value
+ privileged reg913 (spr813): same_value
+ privileged reg914 (spr814): same_value
+ privileged reg915 (spr815): same_value
+ privileged reg916 (spr816): same_value
+ privileged reg917 (spr817): same_value
+ privileged reg918 (spr818): same_value
+ privileged reg919 (spr819): same_value
+ privileged reg920 (spr820): same_value
+ privileged reg921 (spr821): same_value
+ privileged reg922 (spr822): same_value
+ privileged reg923 (spr823): same_value
+ privileged reg924 (spr824): same_value
+ privileged reg925 (spr825): same_value
+ privileged reg926 (spr826): same_value
+ privileged reg927 (spr827): same_value
+ privileged reg928 (spr828): same_value
+ privileged reg929 (spr829): same_value
+ privileged reg930 (spr830): same_value
+ privileged reg931 (spr831): same_value
+ privileged reg932 (spr832): same_value
+ privileged reg933 (spr833): same_value
+ privileged reg934 (spr834): same_value
+ privileged reg935 (spr835): same_value
+ privileged reg936 (spr836): same_value
+ privileged reg937 (spr837): same_value
+ privileged reg938 (spr838): same_value
+ privileged reg939 (spr839): same_value
+ privileged reg940 (spr840): same_value
+ privileged reg941 (spr841): same_value
+ privileged reg942 (spr842): same_value
+ privileged reg943 (spr843): same_value
+ privileged reg944 (spr844): same_value
+ privileged reg945 (spr845): same_value
+ privileged reg946 (spr846): same_value
+ privileged reg947 (spr847): same_value
+ privileged reg948 (spr848): same_value
+ privileged reg949 (spr849): same_value
+ privileged reg950 (spr850): same_value
+ privileged reg951 (spr851): same_value
+ privileged reg952 (spr852): same_value
+ privileged reg953 (spr853): same_value
+ privileged reg954 (spr854): same_value
+ privileged reg955 (spr855): same_value
+ privileged reg956 (spr856): same_value
+ privileged reg957 (spr857): same_value
+ privileged reg958 (spr858): same_value
+ privileged reg959 (spr859): same_value
+ privileged reg960 (spr860): same_value
+ privileged reg961 (spr861): same_value
+ privileged reg962 (spr862): same_value
+ privileged reg963 (spr863): same_value
+ privileged reg964 (spr864): same_value
+ privileged reg965 (spr865): same_value
+ privileged reg966 (spr866): same_value
+ privileged reg967 (spr867): same_value
+ privileged reg968 (spr868): same_value
+ privileged reg969 (spr869): same_value
+ privileged reg970 (spr870): same_value
+ privileged reg971 (spr871): same_value
+ privileged reg972 (spr872): same_value
+ privileged reg973 (spr873): same_value
+ privileged reg974 (spr874): same_value
+ privileged reg975 (spr875): same_value
+ privileged reg976 (spr876): same_value
+ privileged reg977 (spr877): same_value
+ privileged reg978 (spr878): same_value
+ privileged reg979 (spr879): same_value
+ privileged reg980 (spr880): same_value
+ privileged reg981 (spr881): same_value
+ privileged reg982 (spr882): same_value
+ privileged reg983 (spr883): same_value
+ privileged reg984 (spr884): same_value
+ privileged reg985 (spr885): same_value
+ privileged reg986 (spr886): same_value
+ privileged reg987 (spr887): same_value
+ privileged reg988 (spr888): same_value
+ privileged reg989 (spr889): same_value
+ privileged reg990 (spr890): same_value
+ privileged reg991 (spr891): same_value
+ privileged reg992 (spr892): same_value
+ privileged reg993 (spr893): same_value
+ privileged reg994 (spr894): same_value
+ privileged reg995 (spr895): same_value
+ privileged reg996 (spr896): same_value
+ privileged reg997 (spr897): same_value
+ privileged reg998 (spr898): same_value
+ privileged reg999 (spr899): same_value
+ vector reg1124 (vr0): same_value
+ vector reg1125 (vr1): same_value
+ vector reg1126 (vr2): same_value
+ vector reg1127 (vr3): same_value
+ vector reg1128 (vr4): same_value
+ vector reg1129 (vr5): same_value
+ vector reg1130 (vr6): same_value
+ vector reg1131 (vr7): same_value
+ vector reg1132 (vr8): same_value
+ vector reg1133 (vr9): same_value
+ vector reg1134 (vr10): same_value
+ vector reg1135 (vr11): same_value
+ vector reg1136 (vr12): same_value
+ vector reg1137 (vr13): same_value
+ vector reg1138 (vr14): same_value
+ vector reg1139 (vr15): same_value
+ vector reg1140 (vr16): same_value
+ vector reg1141 (vr17): same_value
+ vector reg1142 (vr18): same_value
+ vector reg1143 (vr19): same_value
+ vector reg1144 (vr20): same_value
+ vector reg1145 (vr21): same_value
+ vector reg1146 (vr22): same_value
+ vector reg1147 (vr23): same_value
+ vector reg1148 (vr24): same_value
+ vector reg1149 (vr25): same_value
+ vector reg1150 (vr26): same_value
+ vector reg1151 (vr27): same_value
+ vector reg1152 (vr28): same_value
+ vector reg1153 (vr29): same_value
+ vector reg1154 (vr30): same_value
+ vector reg1155 (vr31): same_value
+EOF
+
+# EM_PPC64 (function bar 0x00000000100005b0)
+# Note. Only in .debug_frame, not in .eh_frame.
+# Same as testfileppc32 but without -m32.
+testfiles testfileppc64
+testrun_compare ${abs_builddir}/addrcfi -e testfileppc64 0x00000000100005b0 <<\EOF
+dwarf_cfi_addrframe (.eh_frame): no matching address range
+.debug_frame has 0x100005b0 => [0x100005b0, 0x100005d0):
+ return address in reg65
+ CFA location expression: bregx(1)
+ integer reg0 (r0): same_value
+ integer reg1 (r1): location expression: call_frame_cfa nop stack_value
+ integer reg2 (r2): same_value
+ integer reg3 (r3): same_value
+ integer reg4 (r4): same_value
+ integer reg5 (r5): same_value
+ integer reg6 (r6): same_value
+ integer reg7 (r7): same_value
+ integer reg8 (r8): same_value
+ integer reg9 (r9): same_value
+ integer reg10 (r10): same_value
+ integer reg11 (r11): same_value
+ integer reg12 (r12): same_value
+ integer reg13 (r13): same_value
+ integer reg14 (r14): same_value
+ integer reg15 (r15): same_value
+ integer reg16 (r16): same_value
+ integer reg17 (r17): same_value
+ integer reg18 (r18): same_value
+ integer reg19 (r19): same_value
+ integer reg20 (r20): same_value
+ integer reg21 (r21): same_value
+ integer reg22 (r22): same_value
+ integer reg23 (r23): same_value
+ integer reg24 (r24): same_value
+ integer reg25 (r25): same_value
+ integer reg26 (r26): same_value
+ integer reg27 (r27): same_value
+ integer reg28 (r28): same_value
+ integer reg29 (r29): same_value
+ integer reg30 (r30): same_value
+ integer reg31 (r31): same_value
+ FPU reg32 (f0): same_value
+ FPU reg33 (f1): same_value
+ FPU reg34 (f2): same_value
+ FPU reg35 (f3): same_value
+ FPU reg36 (f4): same_value
+ FPU reg37 (f5): same_value
+ FPU reg38 (f6): same_value
+ FPU reg39 (f7): same_value
+ FPU reg40 (f8): same_value
+ FPU reg41 (f9): same_value
+ FPU reg42 (f10): same_value
+ FPU reg43 (f11): same_value
+ FPU reg44 (f12): same_value
+ FPU reg45 (f13): same_value
+ FPU reg46 (f14): same_value
+ FPU reg47 (f15): same_value
+ FPU reg48 (f16): same_value
+ FPU reg49 (f17): same_value
+ FPU reg50 (f18): same_value
+ FPU reg51 (f19): same_value
+ FPU reg52 (f20): same_value
+ FPU reg53 (f21): same_value
+ FPU reg54 (f22): same_value
+ FPU reg55 (f23): same_value
+ FPU reg56 (f24): same_value
+ FPU reg57 (f25): same_value
+ FPU reg58 (f26): same_value
+ FPU reg59 (f27): same_value
+ FPU reg60 (f28): same_value
+ FPU reg61 (f29): same_value
+ FPU reg62 (f30): same_value
+ FPU reg63 (f31): same_value
+ integer reg64 (cr): same_value
+ FPU reg65 (fpscr): same_value
+ integer reg66 (msr): same_value
+ vector reg67 (vscr): same_value
+ privileged reg70 (sr0): same_value
+ privileged reg71 (sr1): same_value
+ privileged reg72 (sr2): same_value
+ privileged reg73 (sr3): same_value
+ privileged reg74 (sr4): same_value
+ privileged reg75 (sr5): same_value
+ privileged reg76 (sr6): same_value
+ privileged reg77 (sr7): same_value
+ privileged reg78 (sr8): same_value
+ privileged reg79 (sr9): same_value
+ privileged reg80 (sr10): same_value
+ privileged reg81 (sr11): same_value
+ privileged reg82 (sr12): same_value
+ privileged reg83 (sr13): same_value
+ privileged reg84 (sr14): same_value
+ privileged reg85 (sr15): same_value
+ privileged reg100 (spr0): same_value
+ privileged reg101 (xer): same_value
+ privileged reg102 (spr2): same_value
+ privileged reg103 (spr3): same_value
+ privileged reg104 (spr4): same_value
+ privileged reg105 (spr5): same_value
+ privileged reg106 (spr6): same_value
+ privileged reg107 (spr7): same_value
+ privileged reg108 (lr): same_value
+ privileged reg109 (ctr): same_value
+ privileged reg110 (spr10): same_value
+ privileged reg111 (spr11): same_value
+ privileged reg112 (spr12): same_value
+ privileged reg113 (spr13): same_value
+ privileged reg114 (spr14): same_value
+ privileged reg115 (spr15): same_value
+ privileged reg116 (spr16): same_value
+ privileged reg117 (spr17): same_value
+ privileged reg118 (dsisr): same_value
+ privileged reg119 (dar): same_value
+ privileged reg120 (spr20): same_value
+ privileged reg121 (spr21): same_value
+ privileged reg122 (dec): same_value
+ privileged reg123 (spr23): same_value
+ privileged reg124 (spr24): same_value
+ privileged reg125 (spr25): same_value
+ privileged reg126 (spr26): same_value
+ privileged reg127 (spr27): same_value
+ privileged reg128 (spr28): same_value
+ privileged reg129 (spr29): same_value
+ privileged reg130 (spr30): same_value
+ privileged reg131 (spr31): same_value
+ privileged reg132 (spr32): same_value
+ privileged reg133 (spr33): same_value
+ privileged reg134 (spr34): same_value
+ privileged reg135 (spr35): same_value
+ privileged reg136 (spr36): same_value
+ privileged reg137 (spr37): same_value
+ privileged reg138 (spr38): same_value
+ privileged reg139 (spr39): same_value
+ privileged reg140 (spr40): same_value
+ privileged reg141 (spr41): same_value
+ privileged reg142 (spr42): same_value
+ privileged reg143 (spr43): same_value
+ privileged reg144 (spr44): same_value
+ privileged reg145 (spr45): same_value
+ privileged reg146 (spr46): same_value
+ privileged reg147 (spr47): same_value
+ privileged reg148 (spr48): same_value
+ privileged reg149 (spr49): same_value
+ privileged reg150 (spr50): same_value
+ privileged reg151 (spr51): same_value
+ privileged reg152 (spr52): same_value
+ privileged reg153 (spr53): same_value
+ privileged reg154 (spr54): same_value
+ privileged reg155 (spr55): same_value
+ privileged reg156 (spr56): same_value
+ privileged reg157 (spr57): same_value
+ privileged reg158 (spr58): same_value
+ privileged reg159 (spr59): same_value
+ privileged reg160 (spr60): same_value
+ privileged reg161 (spr61): same_value
+ privileged reg162 (spr62): same_value
+ privileged reg163 (spr63): same_value
+ privileged reg164 (spr64): same_value
+ privileged reg165 (spr65): same_value
+ privileged reg166 (spr66): same_value
+ privileged reg167 (spr67): same_value
+ privileged reg168 (spr68): same_value
+ privileged reg169 (spr69): same_value
+ privileged reg170 (spr70): same_value
+ privileged reg171 (spr71): same_value
+ privileged reg172 (spr72): same_value
+ privileged reg173 (spr73): same_value
+ privileged reg174 (spr74): same_value
+ privileged reg175 (spr75): same_value
+ privileged reg176 (spr76): same_value
+ privileged reg177 (spr77): same_value
+ privileged reg178 (spr78): same_value
+ privileged reg179 (spr79): same_value
+ privileged reg180 (spr80): same_value
+ privileged reg181 (spr81): same_value
+ privileged reg182 (spr82): same_value
+ privileged reg183 (spr83): same_value
+ privileged reg184 (spr84): same_value
+ privileged reg185 (spr85): same_value
+ privileged reg186 (spr86): same_value
+ privileged reg187 (spr87): same_value
+ privileged reg188 (spr88): same_value
+ privileged reg189 (spr89): same_value
+ privileged reg190 (spr90): same_value
+ privileged reg191 (spr91): same_value
+ privileged reg192 (spr92): same_value
+ privileged reg193 (spr93): same_value
+ privileged reg194 (spr94): same_value
+ privileged reg195 (spr95): same_value
+ privileged reg196 (spr96): same_value
+ privileged reg197 (spr97): same_value
+ privileged reg198 (spr98): same_value
+ privileged reg199 (spr99): same_value
+ privileged reg200 (spr100): same_value
+ privileged reg201 (spr101): same_value
+ privileged reg202 (spr102): same_value
+ privileged reg203 (spr103): same_value
+ privileged reg204 (spr104): same_value
+ privileged reg205 (spr105): same_value
+ privileged reg206 (spr106): same_value
+ privileged reg207 (spr107): same_value
+ privileged reg208 (spr108): same_value
+ privileged reg209 (spr109): same_value
+ privileged reg210 (spr110): same_value
+ privileged reg211 (spr111): same_value
+ privileged reg212 (spr112): same_value
+ privileged reg213 (spr113): same_value
+ privileged reg214 (spr114): same_value
+ privileged reg215 (spr115): same_value
+ privileged reg216 (spr116): same_value
+ privileged reg217 (spr117): same_value
+ privileged reg218 (spr118): same_value
+ privileged reg219 (spr119): same_value
+ privileged reg220 (spr120): same_value
+ privileged reg221 (spr121): same_value
+ privileged reg222 (spr122): same_value
+ privileged reg223 (spr123): same_value
+ privileged reg224 (spr124): same_value
+ privileged reg225 (spr125): same_value
+ privileged reg226 (spr126): same_value
+ privileged reg227 (spr127): same_value
+ privileged reg228 (spr128): same_value
+ privileged reg229 (spr129): same_value
+ privileged reg230 (spr130): same_value
+ privileged reg231 (spr131): same_value
+ privileged reg232 (spr132): same_value
+ privileged reg233 (spr133): same_value
+ privileged reg234 (spr134): same_value
+ privileged reg235 (spr135): same_value
+ privileged reg236 (spr136): same_value
+ privileged reg237 (spr137): same_value
+ privileged reg238 (spr138): same_value
+ privileged reg239 (spr139): same_value
+ privileged reg240 (spr140): same_value
+ privileged reg241 (spr141): same_value
+ privileged reg242 (spr142): same_value
+ privileged reg243 (spr143): same_value
+ privileged reg244 (spr144): same_value
+ privileged reg245 (spr145): same_value
+ privileged reg246 (spr146): same_value
+ privileged reg247 (spr147): same_value
+ privileged reg248 (spr148): same_value
+ privileged reg249 (spr149): same_value
+ privileged reg250 (spr150): same_value
+ privileged reg251 (spr151): same_value
+ privileged reg252 (spr152): same_value
+ privileged reg253 (spr153): same_value
+ privileged reg254 (spr154): same_value
+ privileged reg255 (spr155): same_value
+ privileged reg256 (spr156): same_value
+ privileged reg257 (spr157): same_value
+ privileged reg258 (spr158): same_value
+ privileged reg259 (spr159): same_value
+ privileged reg260 (spr160): same_value
+ privileged reg261 (spr161): same_value
+ privileged reg262 (spr162): same_value
+ privileged reg263 (spr163): same_value
+ privileged reg264 (spr164): same_value
+ privileged reg265 (spr165): same_value
+ privileged reg266 (spr166): same_value
+ privileged reg267 (spr167): same_value
+ privileged reg268 (spr168): same_value
+ privileged reg269 (spr169): same_value
+ privileged reg270 (spr170): same_value
+ privileged reg271 (spr171): same_value
+ privileged reg272 (spr172): same_value
+ privileged reg273 (spr173): same_value
+ privileged reg274 (spr174): same_value
+ privileged reg275 (spr175): same_value
+ privileged reg276 (spr176): same_value
+ privileged reg277 (spr177): same_value
+ privileged reg278 (spr178): same_value
+ privileged reg279 (spr179): same_value
+ privileged reg280 (spr180): same_value
+ privileged reg281 (spr181): same_value
+ privileged reg282 (spr182): same_value
+ privileged reg283 (spr183): same_value
+ privileged reg284 (spr184): same_value
+ privileged reg285 (spr185): same_value
+ privileged reg286 (spr186): same_value
+ privileged reg287 (spr187): same_value
+ privileged reg288 (spr188): same_value
+ privileged reg289 (spr189): same_value
+ privileged reg290 (spr190): same_value
+ privileged reg291 (spr191): same_value
+ privileged reg292 (spr192): same_value
+ privileged reg293 (spr193): same_value
+ privileged reg294 (spr194): same_value
+ privileged reg295 (spr195): same_value
+ privileged reg296 (spr196): same_value
+ privileged reg297 (spr197): same_value
+ privileged reg298 (spr198): same_value
+ privileged reg299 (spr199): same_value
+ privileged reg300 (spr200): same_value
+ privileged reg301 (spr201): same_value
+ privileged reg302 (spr202): same_value
+ privileged reg303 (spr203): same_value
+ privileged reg304 (spr204): same_value
+ privileged reg305 (spr205): same_value
+ privileged reg306 (spr206): same_value
+ privileged reg307 (spr207): same_value
+ privileged reg308 (spr208): same_value
+ privileged reg309 (spr209): same_value
+ privileged reg310 (spr210): same_value
+ privileged reg311 (spr211): same_value
+ privileged reg312 (spr212): same_value
+ privileged reg313 (spr213): same_value
+ privileged reg314 (spr214): same_value
+ privileged reg315 (spr215): same_value
+ privileged reg316 (spr216): same_value
+ privileged reg317 (spr217): same_value
+ privileged reg318 (spr218): same_value
+ privileged reg319 (spr219): same_value
+ privileged reg320 (spr220): same_value
+ privileged reg321 (spr221): same_value
+ privileged reg322 (spr222): same_value
+ privileged reg323 (spr223): same_value
+ privileged reg324 (spr224): same_value
+ privileged reg325 (spr225): same_value
+ privileged reg326 (spr226): same_value
+ privileged reg327 (spr227): same_value
+ privileged reg328 (spr228): same_value
+ privileged reg329 (spr229): same_value
+ privileged reg330 (spr230): same_value
+ privileged reg331 (spr231): same_value
+ privileged reg332 (spr232): same_value
+ privileged reg333 (spr233): same_value
+ privileged reg334 (spr234): same_value
+ privileged reg335 (spr235): same_value
+ privileged reg336 (spr236): same_value
+ privileged reg337 (spr237): same_value
+ privileged reg338 (spr238): same_value
+ privileged reg339 (spr239): same_value
+ privileged reg340 (spr240): same_value
+ privileged reg341 (spr241): same_value
+ privileged reg342 (spr242): same_value
+ privileged reg343 (spr243): same_value
+ privileged reg344 (spr244): same_value
+ privileged reg345 (spr245): same_value
+ privileged reg346 (spr246): same_value
+ privileged reg347 (spr247): same_value
+ privileged reg348 (spr248): same_value
+ privileged reg349 (spr249): same_value
+ privileged reg350 (spr250): same_value
+ privileged reg351 (spr251): same_value
+ privileged reg352 (spr252): same_value
+ privileged reg353 (spr253): same_value
+ privileged reg354 (spr254): same_value
+ privileged reg355 (spr255): same_value
+ vector reg356 (vrsave): same_value
+ privileged reg357 (spr257): same_value
+ privileged reg358 (spr258): same_value
+ privileged reg359 (spr259): same_value
+ privileged reg360 (spr260): same_value
+ privileged reg361 (spr261): same_value
+ privileged reg362 (spr262): same_value
+ privileged reg363 (spr263): same_value
+ privileged reg364 (spr264): same_value
+ privileged reg365 (spr265): same_value
+ privileged reg366 (spr266): same_value
+ privileged reg367 (spr267): same_value
+ privileged reg368 (spr268): same_value
+ privileged reg369 (spr269): same_value
+ privileged reg370 (spr270): same_value
+ privileged reg371 (spr271): same_value
+ privileged reg372 (spr272): same_value
+ privileged reg373 (spr273): same_value
+ privileged reg374 (spr274): same_value
+ privileged reg375 (spr275): same_value
+ privileged reg376 (spr276): same_value
+ privileged reg377 (spr277): same_value
+ privileged reg378 (spr278): same_value
+ privileged reg379 (spr279): same_value
+ privileged reg380 (spr280): same_value
+ privileged reg381 (spr281): same_value
+ privileged reg382 (spr282): same_value
+ privileged reg383 (spr283): same_value
+ privileged reg384 (spr284): same_value
+ privileged reg385 (spr285): same_value
+ privileged reg386 (spr286): same_value
+ privileged reg387 (spr287): same_value
+ privileged reg388 (spr288): same_value
+ privileged reg389 (spr289): same_value
+ privileged reg390 (spr290): same_value
+ privileged reg391 (spr291): same_value
+ privileged reg392 (spr292): same_value
+ privileged reg393 (spr293): same_value
+ privileged reg394 (spr294): same_value
+ privileged reg395 (spr295): same_value
+ privileged reg396 (spr296): same_value
+ privileged reg397 (spr297): same_value
+ privileged reg398 (spr298): same_value
+ privileged reg399 (spr299): same_value
+ privileged reg400 (spr300): same_value
+ privileged reg401 (spr301): same_value
+ privileged reg402 (spr302): same_value
+ privileged reg403 (spr303): same_value
+ privileged reg404 (spr304): same_value
+ privileged reg405 (spr305): same_value
+ privileged reg406 (spr306): same_value
+ privileged reg407 (spr307): same_value
+ privileged reg408 (spr308): same_value
+ privileged reg409 (spr309): same_value
+ privileged reg410 (spr310): same_value
+ privileged reg411 (spr311): same_value
+ privileged reg412 (spr312): same_value
+ privileged reg413 (spr313): same_value
+ privileged reg414 (spr314): same_value
+ privileged reg415 (spr315): same_value
+ privileged reg416 (spr316): same_value
+ privileged reg417 (spr317): same_value
+ privileged reg418 (spr318): same_value
+ privileged reg419 (spr319): same_value
+ privileged reg420 (spr320): same_value
+ privileged reg421 (spr321): same_value
+ privileged reg422 (spr322): same_value
+ privileged reg423 (spr323): same_value
+ privileged reg424 (spr324): same_value
+ privileged reg425 (spr325): same_value
+ privileged reg426 (spr326): same_value
+ privileged reg427 (spr327): same_value
+ privileged reg428 (spr328): same_value
+ privileged reg429 (spr329): same_value
+ privileged reg430 (spr330): same_value
+ privileged reg431 (spr331): same_value
+ privileged reg432 (spr332): same_value
+ privileged reg433 (spr333): same_value
+ privileged reg434 (spr334): same_value
+ privileged reg435 (spr335): same_value
+ privileged reg436 (spr336): same_value
+ privileged reg437 (spr337): same_value
+ privileged reg438 (spr338): same_value
+ privileged reg439 (spr339): same_value
+ privileged reg440 (spr340): same_value
+ privileged reg441 (spr341): same_value
+ privileged reg442 (spr342): same_value
+ privileged reg443 (spr343): same_value
+ privileged reg444 (spr344): same_value
+ privileged reg445 (spr345): same_value
+ privileged reg446 (spr346): same_value
+ privileged reg447 (spr347): same_value
+ privileged reg448 (spr348): same_value
+ privileged reg449 (spr349): same_value
+ privileged reg450 (spr350): same_value
+ privileged reg451 (spr351): same_value
+ privileged reg452 (spr352): same_value
+ privileged reg453 (spr353): same_value
+ privileged reg454 (spr354): same_value
+ privileged reg455 (spr355): same_value
+ privileged reg456 (spr356): same_value
+ privileged reg457 (spr357): same_value
+ privileged reg458 (spr358): same_value
+ privileged reg459 (spr359): same_value
+ privileged reg460 (spr360): same_value
+ privileged reg461 (spr361): same_value
+ privileged reg462 (spr362): same_value
+ privileged reg463 (spr363): same_value
+ privileged reg464 (spr364): same_value
+ privileged reg465 (spr365): same_value
+ privileged reg466 (spr366): same_value
+ privileged reg467 (spr367): same_value
+ privileged reg468 (spr368): same_value
+ privileged reg469 (spr369): same_value
+ privileged reg470 (spr370): same_value
+ privileged reg471 (spr371): same_value
+ privileged reg472 (spr372): same_value
+ privileged reg473 (spr373): same_value
+ privileged reg474 (spr374): same_value
+ privileged reg475 (spr375): same_value
+ privileged reg476 (spr376): same_value
+ privileged reg477 (spr377): same_value
+ privileged reg478 (spr378): same_value
+ privileged reg479 (spr379): same_value
+ privileged reg480 (spr380): same_value
+ privileged reg481 (spr381): same_value
+ privileged reg482 (spr382): same_value
+ privileged reg483 (spr383): same_value
+ privileged reg484 (spr384): same_value
+ privileged reg485 (spr385): same_value
+ privileged reg486 (spr386): same_value
+ privileged reg487 (spr387): same_value
+ privileged reg488 (spr388): same_value
+ privileged reg489 (spr389): same_value
+ privileged reg490 (spr390): same_value
+ privileged reg491 (spr391): same_value
+ privileged reg492 (spr392): same_value
+ privileged reg493 (spr393): same_value
+ privileged reg494 (spr394): same_value
+ privileged reg495 (spr395): same_value
+ privileged reg496 (spr396): same_value
+ privileged reg497 (spr397): same_value
+ privileged reg498 (spr398): same_value
+ privileged reg499 (spr399): same_value
+ privileged reg500 (spr400): same_value
+ privileged reg501 (spr401): same_value
+ privileged reg502 (spr402): same_value
+ privileged reg503 (spr403): same_value
+ privileged reg504 (spr404): same_value
+ privileged reg505 (spr405): same_value
+ privileged reg506 (spr406): same_value
+ privileged reg507 (spr407): same_value
+ privileged reg508 (spr408): same_value
+ privileged reg509 (spr409): same_value
+ privileged reg510 (spr410): same_value
+ privileged reg511 (spr411): same_value
+ privileged reg512 (spr412): same_value
+ privileged reg513 (spr413): same_value
+ privileged reg514 (spr414): same_value
+ privileged reg515 (spr415): same_value
+ privileged reg516 (spr416): same_value
+ privileged reg517 (spr417): same_value
+ privileged reg518 (spr418): same_value
+ privileged reg519 (spr419): same_value
+ privileged reg520 (spr420): same_value
+ privileged reg521 (spr421): same_value
+ privileged reg522 (spr422): same_value
+ privileged reg523 (spr423): same_value
+ privileged reg524 (spr424): same_value
+ privileged reg525 (spr425): same_value
+ privileged reg526 (spr426): same_value
+ privileged reg527 (spr427): same_value
+ privileged reg528 (spr428): same_value
+ privileged reg529 (spr429): same_value
+ privileged reg530 (spr430): same_value
+ privileged reg531 (spr431): same_value
+ privileged reg532 (spr432): same_value
+ privileged reg533 (spr433): same_value
+ privileged reg534 (spr434): same_value
+ privileged reg535 (spr435): same_value
+ privileged reg536 (spr436): same_value
+ privileged reg537 (spr437): same_value
+ privileged reg538 (spr438): same_value
+ privileged reg539 (spr439): same_value
+ privileged reg540 (spr440): same_value
+ privileged reg541 (spr441): same_value
+ privileged reg542 (spr442): same_value
+ privileged reg543 (spr443): same_value
+ privileged reg544 (spr444): same_value
+ privileged reg545 (spr445): same_value
+ privileged reg546 (spr446): same_value
+ privileged reg547 (spr447): same_value
+ privileged reg548 (spr448): same_value
+ privileged reg549 (spr449): same_value
+ privileged reg550 (spr450): same_value
+ privileged reg551 (spr451): same_value
+ privileged reg552 (spr452): same_value
+ privileged reg553 (spr453): same_value
+ privileged reg554 (spr454): same_value
+ privileged reg555 (spr455): same_value
+ privileged reg556 (spr456): same_value
+ privileged reg557 (spr457): same_value
+ privileged reg558 (spr458): same_value
+ privileged reg559 (spr459): same_value
+ privileged reg560 (spr460): same_value
+ privileged reg561 (spr461): same_value
+ privileged reg562 (spr462): same_value
+ privileged reg563 (spr463): same_value
+ privileged reg564 (spr464): same_value
+ privileged reg565 (spr465): same_value
+ privileged reg566 (spr466): same_value
+ privileged reg567 (spr467): same_value
+ privileged reg568 (spr468): same_value
+ privileged reg569 (spr469): same_value
+ privileged reg570 (spr470): same_value
+ privileged reg571 (spr471): same_value
+ privileged reg572 (spr472): same_value
+ privileged reg573 (spr473): same_value
+ privileged reg574 (spr474): same_value
+ privileged reg575 (spr475): same_value
+ privileged reg576 (spr476): same_value
+ privileged reg577 (spr477): same_value
+ privileged reg578 (spr478): same_value
+ privileged reg579 (spr479): same_value
+ privileged reg580 (spr480): same_value
+ privileged reg581 (spr481): same_value
+ privileged reg582 (spr482): same_value
+ privileged reg583 (spr483): same_value
+ privileged reg584 (spr484): same_value
+ privileged reg585 (spr485): same_value
+ privileged reg586 (spr486): same_value
+ privileged reg587 (spr487): same_value
+ privileged reg588 (spr488): same_value
+ privileged reg589 (spr489): same_value
+ privileged reg590 (spr490): same_value
+ privileged reg591 (spr491): same_value
+ privileged reg592 (spr492): same_value
+ privileged reg593 (spr493): same_value
+ privileged reg594 (spr494): same_value
+ privileged reg595 (spr495): same_value
+ privileged reg596 (spr496): same_value
+ privileged reg597 (spr497): same_value
+ privileged reg598 (spr498): same_value
+ privileged reg599 (spr499): same_value
+ privileged reg600 (spr500): same_value
+ privileged reg601 (spr501): same_value
+ privileged reg602 (spr502): same_value
+ privileged reg603 (spr503): same_value
+ privileged reg604 (spr504): same_value
+ privileged reg605 (spr505): same_value
+ privileged reg606 (spr506): same_value
+ privileged reg607 (spr507): same_value
+ privileged reg608 (spr508): same_value
+ privileged reg609 (spr509): same_value
+ privileged reg610 (spr510): same_value
+ privileged reg611 (spr511): same_value
+ vector reg612 (spefscr): same_value
+ privileged reg613 (spr513): same_value
+ privileged reg614 (spr514): same_value
+ privileged reg615 (spr515): same_value
+ privileged reg616 (spr516): same_value
+ privileged reg617 (spr517): same_value
+ privileged reg618 (spr518): same_value
+ privileged reg619 (spr519): same_value
+ privileged reg620 (spr520): same_value
+ privileged reg621 (spr521): same_value
+ privileged reg622 (spr522): same_value
+ privileged reg623 (spr523): same_value
+ privileged reg624 (spr524): same_value
+ privileged reg625 (spr525): same_value
+ privileged reg626 (spr526): same_value
+ privileged reg627 (spr527): same_value
+ privileged reg628 (spr528): same_value
+ privileged reg629 (spr529): same_value
+ privileged reg630 (spr530): same_value
+ privileged reg631 (spr531): same_value
+ privileged reg632 (spr532): same_value
+ privileged reg633 (spr533): same_value
+ privileged reg634 (spr534): same_value
+ privileged reg635 (spr535): same_value
+ privileged reg636 (spr536): same_value
+ privileged reg637 (spr537): same_value
+ privileged reg638 (spr538): same_value
+ privileged reg639 (spr539): same_value
+ privileged reg640 (spr540): same_value
+ privileged reg641 (spr541): same_value
+ privileged reg642 (spr542): same_value
+ privileged reg643 (spr543): same_value
+ privileged reg644 (spr544): same_value
+ privileged reg645 (spr545): same_value
+ privileged reg646 (spr546): same_value
+ privileged reg647 (spr547): same_value
+ privileged reg648 (spr548): same_value
+ privileged reg649 (spr549): same_value
+ privileged reg650 (spr550): same_value
+ privileged reg651 (spr551): same_value
+ privileged reg652 (spr552): same_value
+ privileged reg653 (spr553): same_value
+ privileged reg654 (spr554): same_value
+ privileged reg655 (spr555): same_value
+ privileged reg656 (spr556): same_value
+ privileged reg657 (spr557): same_value
+ privileged reg658 (spr558): same_value
+ privileged reg659 (spr559): same_value
+ privileged reg660 (spr560): same_value
+ privileged reg661 (spr561): same_value
+ privileged reg662 (spr562): same_value
+ privileged reg663 (spr563): same_value
+ privileged reg664 (spr564): same_value
+ privileged reg665 (spr565): same_value
+ privileged reg666 (spr566): same_value
+ privileged reg667 (spr567): same_value
+ privileged reg668 (spr568): same_value
+ privileged reg669 (spr569): same_value
+ privileged reg670 (spr570): same_value
+ privileged reg671 (spr571): same_value
+ privileged reg672 (spr572): same_value
+ privileged reg673 (spr573): same_value
+ privileged reg674 (spr574): same_value
+ privileged reg675 (spr575): same_value
+ privileged reg676 (spr576): same_value
+ privileged reg677 (spr577): same_value
+ privileged reg678 (spr578): same_value
+ privileged reg679 (spr579): same_value
+ privileged reg680 (spr580): same_value
+ privileged reg681 (spr581): same_value
+ privileged reg682 (spr582): same_value
+ privileged reg683 (spr583): same_value
+ privileged reg684 (spr584): same_value
+ privileged reg685 (spr585): same_value
+ privileged reg686 (spr586): same_value
+ privileged reg687 (spr587): same_value
+ privileged reg688 (spr588): same_value
+ privileged reg689 (spr589): same_value
+ privileged reg690 (spr590): same_value
+ privileged reg691 (spr591): same_value
+ privileged reg692 (spr592): same_value
+ privileged reg693 (spr593): same_value
+ privileged reg694 (spr594): same_value
+ privileged reg695 (spr595): same_value
+ privileged reg696 (spr596): same_value
+ privileged reg697 (spr597): same_value
+ privileged reg698 (spr598): same_value
+ privileged reg699 (spr599): same_value
+ privileged reg700 (spr600): same_value
+ privileged reg701 (spr601): same_value
+ privileged reg702 (spr602): same_value
+ privileged reg703 (spr603): same_value
+ privileged reg704 (spr604): same_value
+ privileged reg705 (spr605): same_value
+ privileged reg706 (spr606): same_value
+ privileged reg707 (spr607): same_value
+ privileged reg708 (spr608): same_value
+ privileged reg709 (spr609): same_value
+ privileged reg710 (spr610): same_value
+ privileged reg711 (spr611): same_value
+ privileged reg712 (spr612): same_value
+ privileged reg713 (spr613): same_value
+ privileged reg714 (spr614): same_value
+ privileged reg715 (spr615): same_value
+ privileged reg716 (spr616): same_value
+ privileged reg717 (spr617): same_value
+ privileged reg718 (spr618): same_value
+ privileged reg719 (spr619): same_value
+ privileged reg720 (spr620): same_value
+ privileged reg721 (spr621): same_value
+ privileged reg722 (spr622): same_value
+ privileged reg723 (spr623): same_value
+ privileged reg724 (spr624): same_value
+ privileged reg725 (spr625): same_value
+ privileged reg726 (spr626): same_value
+ privileged reg727 (spr627): same_value
+ privileged reg728 (spr628): same_value
+ privileged reg729 (spr629): same_value
+ privileged reg730 (spr630): same_value
+ privileged reg731 (spr631): same_value
+ privileged reg732 (spr632): same_value
+ privileged reg733 (spr633): same_value
+ privileged reg734 (spr634): same_value
+ privileged reg735 (spr635): same_value
+ privileged reg736 (spr636): same_value
+ privileged reg737 (spr637): same_value
+ privileged reg738 (spr638): same_value
+ privileged reg739 (spr639): same_value
+ privileged reg740 (spr640): same_value
+ privileged reg741 (spr641): same_value
+ privileged reg742 (spr642): same_value
+ privileged reg743 (spr643): same_value
+ privileged reg744 (spr644): same_value
+ privileged reg745 (spr645): same_value
+ privileged reg746 (spr646): same_value
+ privileged reg747 (spr647): same_value
+ privileged reg748 (spr648): same_value
+ privileged reg749 (spr649): same_value
+ privileged reg750 (spr650): same_value
+ privileged reg751 (spr651): same_value
+ privileged reg752 (spr652): same_value
+ privileged reg753 (spr653): same_value
+ privileged reg754 (spr654): same_value
+ privileged reg755 (spr655): same_value
+ privileged reg756 (spr656): same_value
+ privileged reg757 (spr657): same_value
+ privileged reg758 (spr658): same_value
+ privileged reg759 (spr659): same_value
+ privileged reg760 (spr660): same_value
+ privileged reg761 (spr661): same_value
+ privileged reg762 (spr662): same_value
+ privileged reg763 (spr663): same_value
+ privileged reg764 (spr664): same_value
+ privileged reg765 (spr665): same_value
+ privileged reg766 (spr666): same_value
+ privileged reg767 (spr667): same_value
+ privileged reg768 (spr668): same_value
+ privileged reg769 (spr669): same_value
+ privileged reg770 (spr670): same_value
+ privileged reg771 (spr671): same_value
+ privileged reg772 (spr672): same_value
+ privileged reg773 (spr673): same_value
+ privileged reg774 (spr674): same_value
+ privileged reg775 (spr675): same_value
+ privileged reg776 (spr676): same_value
+ privileged reg777 (spr677): same_value
+ privileged reg778 (spr678): same_value
+ privileged reg779 (spr679): same_value
+ privileged reg780 (spr680): same_value
+ privileged reg781 (spr681): same_value
+ privileged reg782 (spr682): same_value
+ privileged reg783 (spr683): same_value
+ privileged reg784 (spr684): same_value
+ privileged reg785 (spr685): same_value
+ privileged reg786 (spr686): same_value
+ privileged reg787 (spr687): same_value
+ privileged reg788 (spr688): same_value
+ privileged reg789 (spr689): same_value
+ privileged reg790 (spr690): same_value
+ privileged reg791 (spr691): same_value
+ privileged reg792 (spr692): same_value
+ privileged reg793 (spr693): same_value
+ privileged reg794 (spr694): same_value
+ privileged reg795 (spr695): same_value
+ privileged reg796 (spr696): same_value
+ privileged reg797 (spr697): same_value
+ privileged reg798 (spr698): same_value
+ privileged reg799 (spr699): same_value
+ privileged reg800 (spr700): same_value
+ privileged reg801 (spr701): same_value
+ privileged reg802 (spr702): same_value
+ privileged reg803 (spr703): same_value
+ privileged reg804 (spr704): same_value
+ privileged reg805 (spr705): same_value
+ privileged reg806 (spr706): same_value
+ privileged reg807 (spr707): same_value
+ privileged reg808 (spr708): same_value
+ privileged reg809 (spr709): same_value
+ privileged reg810 (spr710): same_value
+ privileged reg811 (spr711): same_value
+ privileged reg812 (spr712): same_value
+ privileged reg813 (spr713): same_value
+ privileged reg814 (spr714): same_value
+ privileged reg815 (spr715): same_value
+ privileged reg816 (spr716): same_value
+ privileged reg817 (spr717): same_value
+ privileged reg818 (spr718): same_value
+ privileged reg819 (spr719): same_value
+ privileged reg820 (spr720): same_value
+ privileged reg821 (spr721): same_value
+ privileged reg822 (spr722): same_value
+ privileged reg823 (spr723): same_value
+ privileged reg824 (spr724): same_value
+ privileged reg825 (spr725): same_value
+ privileged reg826 (spr726): same_value
+ privileged reg827 (spr727): same_value
+ privileged reg828 (spr728): same_value
+ privileged reg829 (spr729): same_value
+ privileged reg830 (spr730): same_value
+ privileged reg831 (spr731): same_value
+ privileged reg832 (spr732): same_value
+ privileged reg833 (spr733): same_value
+ privileged reg834 (spr734): same_value
+ privileged reg835 (spr735): same_value
+ privileged reg836 (spr736): same_value
+ privileged reg837 (spr737): same_value
+ privileged reg838 (spr738): same_value
+ privileged reg839 (spr739): same_value
+ privileged reg840 (spr740): same_value
+ privileged reg841 (spr741): same_value
+ privileged reg842 (spr742): same_value
+ privileged reg843 (spr743): same_value
+ privileged reg844 (spr744): same_value
+ privileged reg845 (spr745): same_value
+ privileged reg846 (spr746): same_value
+ privileged reg847 (spr747): same_value
+ privileged reg848 (spr748): same_value
+ privileged reg849 (spr749): same_value
+ privileged reg850 (spr750): same_value
+ privileged reg851 (spr751): same_value
+ privileged reg852 (spr752): same_value
+ privileged reg853 (spr753): same_value
+ privileged reg854 (spr754): same_value
+ privileged reg855 (spr755): same_value
+ privileged reg856 (spr756): same_value
+ privileged reg857 (spr757): same_value
+ privileged reg858 (spr758): same_value
+ privileged reg859 (spr759): same_value
+ privileged reg860 (spr760): same_value
+ privileged reg861 (spr761): same_value
+ privileged reg862 (spr762): same_value
+ privileged reg863 (spr763): same_value
+ privileged reg864 (spr764): same_value
+ privileged reg865 (spr765): same_value
+ privileged reg866 (spr766): same_value
+ privileged reg867 (spr767): same_value
+ privileged reg868 (spr768): same_value
+ privileged reg869 (spr769): same_value
+ privileged reg870 (spr770): same_value
+ privileged reg871 (spr771): same_value
+ privileged reg872 (spr772): same_value
+ privileged reg873 (spr773): same_value
+ privileged reg874 (spr774): same_value
+ privileged reg875 (spr775): same_value
+ privileged reg876 (spr776): same_value
+ privileged reg877 (spr777): same_value
+ privileged reg878 (spr778): same_value
+ privileged reg879 (spr779): same_value
+ privileged reg880 (spr780): same_value
+ privileged reg881 (spr781): same_value
+ privileged reg882 (spr782): same_value
+ privileged reg883 (spr783): same_value
+ privileged reg884 (spr784): same_value
+ privileged reg885 (spr785): same_value
+ privileged reg886 (spr786): same_value
+ privileged reg887 (spr787): same_value
+ privileged reg888 (spr788): same_value
+ privileged reg889 (spr789): same_value
+ privileged reg890 (spr790): same_value
+ privileged reg891 (spr791): same_value
+ privileged reg892 (spr792): same_value
+ privileged reg893 (spr793): same_value
+ privileged reg894 (spr794): same_value
+ privileged reg895 (spr795): same_value
+ privileged reg896 (spr796): same_value
+ privileged reg897 (spr797): same_value
+ privileged reg898 (spr798): same_value
+ privileged reg899 (spr799): same_value
+ privileged reg900 (spr800): same_value
+ privileged reg901 (spr801): same_value
+ privileged reg902 (spr802): same_value
+ privileged reg903 (spr803): same_value
+ privileged reg904 (spr804): same_value
+ privileged reg905 (spr805): same_value
+ privileged reg906 (spr806): same_value
+ privileged reg907 (spr807): same_value
+ privileged reg908 (spr808): same_value
+ privileged reg909 (spr809): same_value
+ privileged reg910 (spr810): same_value
+ privileged reg911 (spr811): same_value
+ privileged reg912 (spr812): same_value
+ privileged reg913 (spr813): same_value
+ privileged reg914 (spr814): same_value
+ privileged reg915 (spr815): same_value
+ privileged reg916 (spr816): same_value
+ privileged reg917 (spr817): same_value
+ privileged reg918 (spr818): same_value
+ privileged reg919 (spr819): same_value
+ privileged reg920 (spr820): same_value
+ privileged reg921 (spr821): same_value
+ privileged reg922 (spr822): same_value
+ privileged reg923 (spr823): same_value
+ privileged reg924 (spr824): same_value
+ privileged reg925 (spr825): same_value
+ privileged reg926 (spr826): same_value
+ privileged reg927 (spr827): same_value
+ privileged reg928 (spr828): same_value
+ privileged reg929 (spr829): same_value
+ privileged reg930 (spr830): same_value
+ privileged reg931 (spr831): same_value
+ privileged reg932 (spr832): same_value
+ privileged reg933 (spr833): same_value
+ privileged reg934 (spr834): same_value
+ privileged reg935 (spr835): same_value
+ privileged reg936 (spr836): same_value
+ privileged reg937 (spr837): same_value
+ privileged reg938 (spr838): same_value
+ privileged reg939 (spr839): same_value
+ privileged reg940 (spr840): same_value
+ privileged reg941 (spr841): same_value
+ privileged reg942 (spr842): same_value
+ privileged reg943 (spr843): same_value
+ privileged reg944 (spr844): same_value
+ privileged reg945 (spr845): same_value
+ privileged reg946 (spr846): same_value
+ privileged reg947 (spr847): same_value
+ privileged reg948 (spr848): same_value
+ privileged reg949 (spr849): same_value
+ privileged reg950 (spr850): same_value
+ privileged reg951 (spr851): same_value
+ privileged reg952 (spr852): same_value
+ privileged reg953 (spr853): same_value
+ privileged reg954 (spr854): same_value
+ privileged reg955 (spr855): same_value
+ privileged reg956 (spr856): same_value
+ privileged reg957 (spr857): same_value
+ privileged reg958 (spr858): same_value
+ privileged reg959 (spr859): same_value
+ privileged reg960 (spr860): same_value
+ privileged reg961 (spr861): same_value
+ privileged reg962 (spr862): same_value
+ privileged reg963 (spr863): same_value
+ privileged reg964 (spr864): same_value
+ privileged reg965 (spr865): same_value
+ privileged reg966 (spr866): same_value
+ privileged reg967 (spr867): same_value
+ privileged reg968 (spr868): same_value
+ privileged reg969 (spr869): same_value
+ privileged reg970 (spr870): same_value
+ privileged reg971 (spr871): same_value
+ privileged reg972 (spr872): same_value
+ privileged reg973 (spr873): same_value
+ privileged reg974 (spr874): same_value
+ privileged reg975 (spr875): same_value
+ privileged reg976 (spr876): same_value
+ privileged reg977 (spr877): same_value
+ privileged reg978 (spr878): same_value
+ privileged reg979 (spr879): same_value
+ privileged reg980 (spr880): same_value
+ privileged reg981 (spr881): same_value
+ privileged reg982 (spr882): same_value
+ privileged reg983 (spr883): same_value
+ privileged reg984 (spr884): same_value
+ privileged reg985 (spr885): same_value
+ privileged reg986 (spr886): same_value
+ privileged reg987 (spr887): same_value
+ privileged reg988 (spr888): same_value
+ privileged reg989 (spr889): same_value
+ privileged reg990 (spr890): same_value
+ privileged reg991 (spr891): same_value
+ privileged reg992 (spr892): same_value
+ privileged reg993 (spr893): same_value
+ privileged reg994 (spr894): same_value
+ privileged reg995 (spr895): same_value
+ privileged reg996 (spr896): same_value
+ privileged reg997 (spr897): same_value
+ privileged reg998 (spr898): same_value
+ privileged reg999 (spr899): same_value
+ vector reg1124 (vr0): same_value
+ vector reg1125 (vr1): same_value
+ vector reg1126 (vr2): same_value
+ vector reg1127 (vr3): same_value
+ vector reg1128 (vr4): same_value
+ vector reg1129 (vr5): same_value
+ vector reg1130 (vr6): same_value
+ vector reg1131 (vr7): same_value
+ vector reg1132 (vr8): same_value
+ vector reg1133 (vr9): same_value
+ vector reg1134 (vr10): same_value
+ vector reg1135 (vr11): same_value
+ vector reg1136 (vr12): same_value
+ vector reg1137 (vr13): same_value
+ vector reg1138 (vr14): same_value
+ vector reg1139 (vr15): same_value
+ vector reg1140 (vr16): same_value
+ vector reg1141 (vr17): same_value
+ vector reg1142 (vr18): same_value
+ vector reg1143 (vr19): same_value
+ vector reg1144 (vr20): same_value
+ vector reg1145 (vr21): same_value
+ vector reg1146 (vr22): same_value
+ vector reg1147 (vr23): same_value
+ vector reg1148 (vr24): same_value
+ vector reg1149 (vr25): same_value
+ vector reg1150 (vr26): same_value
+ vector reg1151 (vr27): same_value
+ vector reg1152 (vr28): same_value
+ vector reg1153 (vr29): same_value
+ vector reg1154 (vr30): same_value
+ vector reg1155 (vr31): same_value
+EOF
diff --git a/tests/testfileppc32.bz2 b/tests/testfileppc32.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..f57763a13acefa5a74e33b82d2d69a3fbe7e6d71
GIT binary patch
literal 3344
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
a0RTyNrbt+=ow96y;_gVN3K9kkY9oLv<Os+B
literal 0
HcmV?d00001
diff --git a/tests/testfileppc64.bz2 b/tests/testfileppc64.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..870046b17a8dc5a2a31c1f2436c550ccbecf380c
GIT binary patch
literal 3351
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
literal 0
HcmV?d00001
--
1.7.1
10 years, 1 month
[PATCH] gelf.h: Fix typo in comment
by Namhyung Kim
Signed-off-by: Namhyung Kim <namhyung(a)gmail.com>
---
libelf/gelf.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libelf/gelf.h b/libelf/gelf.h
index cd33225..e3f0740 100644
--- a/libelf/gelf.h
+++ b/libelf/gelf.h
@@ -150,7 +150,7 @@ typedef Elf64_Lib GElf_Lib;
extern int gelf_getclass (Elf *__elf);
-/* Return size of array of COUNT elemeents of the type denoted by TYPE
+/* Return size of array of COUNT elements of the type denoted by TYPE
in the external representation. The binary class is taken from ELF.
The result is based on version VERSION of the ELF standard. */
extern size_t gelf_fsize (Elf *__elf, Elf_Type __type, size_t __count,
--
1.7.9.2
10 years, 1 month
[patch 5/4] unwinder: non-x86* parts of the unwinder [resent]
by Jan Kratochvil
Hi,
dependent on:
[patch 4/4] unwinder: The unwinder (x86* only)
present in:
jankratochvil/forunwind-baseaddr-hookvars-corereport-unwindx86-nonx86
but this branch is not suitable for merge as it is unclear in which form get
checked in the patches above. The branch is usable only for "git checkout",
neither diff nor merge should be done on it.
ppc* and s390* extensions with core files to test them.
The testfiles are present only in the GIT branch, not in the diff below.
Thanks,
Jan
backends/
2012-11-14 Jan Kratochvil <jan.kratochvil(a)redhat.com>
* Makefile.am (ppc_SRCS, ppc64_SRCS): Add ppc_frame_state.c and
ppc_cfi.c.
(s390_SRCS): Add s390_cfi.c, s390_frame_state.c and
s390_frame_unwind.c.
(noinst_HEADERS): Add core-get-pc.c.
* core-get-pc.c: New file.
* ppc64_init.c (ppc64_init): Initialize frame_state_nregs, frame_state,
abi_cfi, frame_dwarf_to_regno, get_func_pc and destr.
* ppc_cfi.c: New file.
* ppc_frame_state.c: New file.
* ppc_init.c (ppc_init): Initialize frame_state_nregs, frame_state,
abi_cfi and frame_dwarf_to_regno.
* s390_cfi.c: New file.
* s390_frame_state.c: New file.
* s390_frame_unwind.c: New file.
* s390_init.c (s390_init): Initialize abi_cfi, frame_state_nregs,
frame_state, optionally normalize_pc and also frame_unwind.
libdwfl/
2012-11-14 Jan Kratochvil <jan.kratochvil(a)redhat.com>
* dwfl_frame_state_pc.c (dwfl_frame_state_pc): Call ebl_normalize_pc.
* dwfl_frame_unwind.c (handle_cfi): Call ebl_frame_dwarf_to_regno.
(dwfl_frame_unwind): Reinitialzie *STATEP, call ebl_frame_unwind,
handle its return value.
* libdwflP.h (dwfl_frame_state_reg_get, dwfl_frame_state_reg_set): Call
frame_dwarf_to_regno.
libebl/
2012-11-14 Jan Kratochvil <jan.kratochvil(a)redhat.com>
* Makefile.am (gen_SOURCES): Add eblnormalizepc.c, eblframeunwind.c and
eblframedwarftoregno.c.
* ebl-hooks.h (frame_dwarf_to_regno, normalize_pc, frame_unwind): New
entries.
* eblframedwarftoregno.c: New file.
* eblframeunwind.c: New file.
* eblnormalizepc.c: New file.
* libebl.h (ebl_normalize_pc, struct Dwfl_Frame_State_Process)
(ebl_frame_unwind, ebl_frame_dwarf_to_regno): New declarations.
tests/
2012-11-14 Jan Kratochvil <jan.kratochvil(a)redhat.com>
* backtrace.ppc.core.bz2: New file.
* backtrace.ppc.exec.bz2: New file.
* backtrace.ppc64.core.bz2: New file.
* backtrace.ppc64.exec.bz2: New file.
* backtrace.s390.core.bz2: New file.
* backtrace.s390.exec.bz2: New file.
* backtrace.s390x.core.bz2: New file.
* backtrace.s390x.exec.bz2: New file.
* run-backtrace.sh: Add tests for the core files above.
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 6f99758..ad909da 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -87,18 +87,20 @@ libebl_sparc_pic_a_SOURCES = $(sparc_SRCS)
am_libebl_sparc_pic_a_OBJECTS = $(sparc_SRCS:.c=.os)
ppc_SRCS = ppc_init.c ppc_symbol.c ppc_retval.c ppc_regs.c \
- ppc_corenote.c ppc_auxv.c ppc_attrs.c ppc_syscall.c
+ ppc_corenote.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \
+ ppc_frame_state.c ppc_cfi.c
libebl_ppc_pic_a_SOURCES = $(ppc_SRCS)
am_libebl_ppc_pic_a_OBJECTS = $(ppc_SRCS:.c=.os)
ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c \
ppc64_corenote.c ppc_regs.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \
- ppc64_get_func_pc.c
+ ppc64_get_func_pc.c ppc_frame_state.c ppc_cfi.c
libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS)
am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os)
s390_SRCS = s390_init.c s390_symbol.c s390_regs.c s390_retval.c \
- s390_corenote.c s390x_corenote.c
+ s390_corenote.c s390x_corenote.c s390_cfi.c s390_frame_state.c \
+ s390_frame_unwind.c
libebl_s390_pic_a_SOURCES = $(s390_SRCS)
am_libebl_s390_pic_a_OBJECTS = $(s390_SRCS:.c=.os)
@@ -136,7 +138,8 @@ uninstall: uninstall-am
done
rmdir --ignore-fail-on-non-empty $(DESTDIR)$(libdir)/$(LIBEBL_SUBDIR)
-noinst_HEADERS = libebl_CPU.h common-reloc.c linux-core-note.c x86_corenote.c
+noinst_HEADERS = libebl_CPU.h common-reloc.c linux-core-note.c x86_corenote.c \
+ core-get-pc.c
EXTRA_DIST = $(foreach m,$(modules),$($(m)_SRCS)) $(modules:=_reloc.def)
CLEANFILES += $(foreach m,$(modules),\
diff --git a/backends/core-get-pc.c b/backends/core-get-pc.c
new file mode 100644
index 0000000..4d1b92e
--- /dev/null
+++ b/backends/core-get-pc.c
@@ -0,0 +1,86 @@
+/* Common core note PC address extraction.
+ Copyright (C) 2012 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdlib.h>
+
+static bool
+core_get_pc (Elf *core, Dwarf_Addr *core_pc, unsigned pc_offset)
+{
+ size_t phnum;
+ if (elf_getphdrnum (core, &phnum) < 0)
+ return NULL;
+ unsigned bits = gelf_getclass (core) == ELFCLASS32 ? 32 : 64;
+ for (size_t cnt = 0; cnt < phnum; ++cnt)
+ {
+ GElf_Phdr phdr_mem, *phdr = gelf_getphdr (core, cnt, &phdr_mem);
+ if (phdr == NULL || phdr->p_type != PT_NOTE)
+ continue;
+ Elf_Data *data = elf_getdata_rawchunk (core, phdr->p_offset,
+ phdr->p_filesz, ELF_T_NHDR);
+ if (data == NULL)
+ return NULL;
+ size_t offset = 0;
+ GElf_Nhdr nhdr;
+ size_t name_offset;
+ size_t desc_offset;
+ while (offset < data->d_size
+ && (offset = gelf_getnote (data, offset,
+ &nhdr, &name_offset, &desc_offset)) > 0)
+ {
+ if (nhdr.n_type != NT_PRSTATUS)
+ continue;
+ const char *reg_desc = data->d_buf + desc_offset + pc_offset;
+ if (reg_desc + bits / 8 > (const char *) data->d_buf + nhdr.n_descsz)
+ continue;
+ Dwarf_Addr val;
+ switch (bits)
+ {
+ case 32:;
+ uint32_t val32 = *(const uint32_t *) reg_desc;
+ reg_desc += sizeof val32;
+ val32 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
+ ? be32toh (val32) : le32toh (val32));
+ /* Do a host width conversion. */
+ val = val32;
+ break;
+ case 64:;
+ uint64_t val64 = *(const uint64_t *) reg_desc;
+ reg_desc += sizeof val64;
+ val64 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
+ ? be64toh (val64) : le64toh (val64));
+ val = val64;
+ break;
+ default:
+ abort ();
+ }
+ *core_pc = val;
+ return true;
+ }
+ }
+ return false;
+}
diff --git a/backends/ppc64_init.c b/backends/ppc64_init.c
index da7d02c..32ca876 100644
--- a/backends/ppc64_init.c
+++ b/backends/ppc64_init.c
@@ -66,6 +66,13 @@ ppc64_init (elf, machine, eh, ehlen)
HOOK (eh, auxv_info);
HOOK (eh, get_func_pc);
HOOK (eh, destr);
+ /* gcc/config/ #define DWARF_FRAME_REGISTERS. */
+ eh->frame_state_nregs = (114 - 1) + 32;
+ HOOK (eh, frame_state);
+ HOOK (eh, abi_cfi);
+ HOOK (eh, frame_dwarf_to_regno);
+ HOOK (eh, get_func_pc);
+ HOOK (eh, destr);
return MODVERSION;
}
diff --git a/backends/ppc_cfi.c b/backends/ppc_cfi.c
new file mode 100644
index 0000000..2c7091f
--- /dev/null
+++ b/backends/ppc_cfi.c
@@ -0,0 +1,77 @@
+/* ppc ABI-specified defaults for DWARF CFI.
+ Copyright (C) 2012 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <dwarf.h>
+
+#define BACKEND ppc_
+#include "libebl_CPU.h"
+
+int
+ppc_abi_cfi (Ebl *ebl __attribute__ ((unused)), Dwarf_CIE *abi_info)
+{
+ static const uint8_t abi_cfi[] =
+ {
+ /* This instruction is provided in every CIE. It is not repeated here:
+ DW_CFA_def_cfa, ULEB128_7 (1), ULEB128_7 (0) */
+ /* r1 is assumed to be restored from cfa adress,
+ r1 acts as a stack frame pointer. */
+ DW_CFA_val_expression, ULEB128_7 (1), ULEB128_7 (1), DW_OP_nop,
+ /* lr is not callee-saved but it needs to be preserved as it is pre-set
+ by the caller. */
+ DW_CFA_same_value, ULEB128_7 (65), /* lr */
+
+ /* Callee-saved regs. */
+#define SV(n) DW_CFA_same_value, ULEB128_7 (n)
+ SV (2), /* r2 is TOC pointer. */
+ SV (13), /* Reserved as system thread id (is it for CFI?). */
+ /* r14-r31 are non-volatile registers. */
+ SV (14), SV (15), SV (16), SV (17), SV (18), SV (19), SV (20), SV (21),
+ SV (22), SV (23), SV (24), SV (25), SV (26), SV (27), SV (28), SV (29),
+ SV (30), SV (31)
+ /* VMX registers v20-v31 and vrsave are non-volatile but they are
+ assigned DWARF registers 1144-1156 (v20-v31) which is outside of the
+ CFI supported range. */
+#undef SV
+ };
+
+ abi_info->initial_instructions = abi_cfi;
+ abi_info->initial_instructions_end = &abi_cfi[sizeof abi_cfi];
+ abi_info->data_alignment_factor = ebl->class == ELFCLASS64 ? 8 : 4;
+
+ abi_info->return_address_register = 65;
+
+ return 0;
+}
+
+__typeof (ppc_abi_cfi)
+ ppc64_abi_cfi
+ __attribute__ ((alias ("ppc_abi_cfi")));
diff --git a/backends/ppc_frame_state.c b/backends/ppc_frame_state.c
new file mode 100644
index 0000000..0965e23
--- /dev/null
+++ b/backends/ppc_frame_state.c
@@ -0,0 +1,122 @@
+/* Fetch live process Dwfl_Frame_State from PID.
+ Copyright (C) 2012 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef __powerpc__
+# include <sys/user.h>
+# include <sys/ptrace.h>
+#endif
+#include "libdwflP.h"
+
+#define BACKEND ppc_
+#include "libebl_CPU.h"
+
+#include "core-get-pc.c"
+
+bool
+ppc_frame_dwarf_to_regno (Ebl *ebl __attribute__ ((unused)), unsigned *regno)
+{
+ switch (*regno)
+ {
+ case 108:
+ *regno = 65;
+ return true;
+ case 0 ... 107:
+ case 109 ... (114 - 1) -1:
+ return true;
+ case 1200 ... 1231:
+ *regno = *regno - 1200 + (114 - 1);
+ return true;
+ default:
+ return false;
+ }
+ abort ();
+}
+
+__typeof (ppc_frame_dwarf_to_regno)
+ ppc64_frame_dwarf_to_regno
+ __attribute__ ((alias ("ppc_frame_dwarf_to_regno")));
+
+bool
+ppc_frame_state (Dwfl_Frame_State *state)
+{
+ Dwfl_Frame_State_Thread *thread = state->thread;
+ Dwfl_Frame_State_Process *process = thread->process;
+ Ebl *ebl = process->ebl;
+ Elf *core = process->core;
+ pid_t tid = thread->tid;
+ if (core == NULL && tid)
+ {
+#ifndef __powerpc__
+ return false;
+#else /* __powerpc__ */
+ union
+ {
+ struct pt_regs r;
+ long l[sizeof (struct pt_regs) / sizeof (long)];
+ }
+ user_regs;
+ eu_static_assert (sizeof (struct pt_regs) % sizeof (long) == 0);
+ /* PTRACE_GETREGS is EIO on kernel-2.6.18-308.el5.ppc64. */
+ errno = 0;
+ for (unsigned regno = 0; regno < sizeof (user_regs) / sizeof (long);
+ regno++)
+ {
+ user_regs.l[regno] = ptrace (PTRACE_PEEKUSER, tid,
+ (void *) (uintptr_t) (regno
+ * sizeof (long)),
+ NULL);
+ if (errno != 0)
+ return false;
+ }
+ for (unsigned gpr = 0;
+ gpr < sizeof (user_regs.r.gpr) / sizeof (*user_regs.r.gpr); gpr++)
+ dwfl_frame_state_reg_set (state, gpr, user_regs.r.gpr[gpr]);
+ state->pc = user_regs.r.nip;
+ state->pc_state = DWFL_FRAME_STATE_PC_SET;
+ dwfl_frame_state_reg_set (state, 65, user_regs.r.link); // or 108
+ /* Registers like msr, ctr, xer, dar, dsisr etc. are probably irrelevant
+ for CFI. */
+#endif /* __powerpc__ */
+ }
+ else if (core)
+ {
+ if (! core_get_pc (core, &state->pc,
+ ebl->class == ELFCLASS64 ? 0x170 : 0xc8))
+ return false;
+ state->pc_state = DWFL_FRAME_STATE_PC_SET;
+ }
+ return true;
+}
+
+__typeof (ppc_frame_state)
+ ppc64_frame_state
+ __attribute__ ((alias ("ppc_frame_state")));
diff --git a/backends/ppc_init.c b/backends/ppc_init.c
index 6054007..87864ae 100644
--- a/backends/ppc_init.c
+++ b/backends/ppc_init.c
@@ -64,6 +64,11 @@ ppc_init (elf, machine, eh, ehlen)
HOOK (eh, core_note);
HOOK (eh, auxv_info);
HOOK (eh, check_object_attribute);
+ /* gcc/config/ #define DWARF_FRAME_REGISTERS. */
+ eh->frame_state_nregs = (114 - 1) + 32;
+ HOOK (eh, frame_state);
+ HOOK (eh, abi_cfi);
+ HOOK (eh, frame_dwarf_to_regno);
return MODVERSION;
}
diff --git a/backends/s390_cfi.c b/backends/s390_cfi.c
new file mode 100644
index 0000000..66a79ff
--- /dev/null
+++ b/backends/s390_cfi.c
@@ -0,0 +1,65 @@
+/* s390 ABI-specified defaults for DWARF CFI.
+ Copyright (C) 2012 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <dwarf.h>
+
+#define BACKEND s390_
+#include "libebl_CPU.h"
+
+int
+s390_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info)
+{
+ static const uint8_t abi_cfi[] =
+ {
+ /* This instruction is provided in every CIE. It is not repeated here:
+ DW_CFA_def_cfa, ULEB128_7 (15), ULEB128_7 (96) */
+ /* r14 is not callee-saved but it needs to be preserved as it is pre-set
+ by the caller. */
+ DW_CFA_same_value, ULEB128_7 (14), /* r14 */
+
+ /* Callee-saved regs. */
+#define SV(n) DW_CFA_same_value, ULEB128_7 (n)
+ SV (6), SV (7), SV (8), SV (9), SV (10), /* r6-r13, r15 */
+ SV (11), SV (12), SV (13), SV (15),
+ SV (16 + 8), SV (16 + 9), SV (16 + 10), SV (16 + 11), /* f8-f15 */
+ SV (16 + 12), SV (16 + 13), SV (16 + 14), SV (16 + 15)
+#undef SV
+ };
+
+ abi_info->initial_instructions = abi_cfi;
+ abi_info->initial_instructions_end = &abi_cfi[sizeof abi_cfi];
+ abi_info->data_alignment_factor = ebl->class == ELFCLASS64 ? 8 : 4;
+
+ abi_info->return_address_register = 14;
+
+ return 0;
+}
diff --git a/backends/s390_frame_state.c b/backends/s390_frame_state.c
new file mode 100644
index 0000000..ddb15aa
--- /dev/null
+++ b/backends/s390_frame_state.c
@@ -0,0 +1,99 @@
+/* Fetch live process Dwfl_Frame_State from PID.
+ Copyright (C) 2012 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef __s390__
+# include <sys/user.h>
+# include <asm/ptrace.h>
+# include <sys/ptrace.h>
+#endif
+#include "libdwflP.h"
+
+#define BACKEND s390_
+#include "libebl_CPU.h"
+
+#include "core-get-pc.c"
+
+bool
+s390_frame_state (Dwfl_Frame_State *state)
+{
+ Dwfl_Frame_State_Thread *thread = state->thread;
+ Dwfl_Frame_State_Process *process = thread->process;
+ Ebl *ebl = process->ebl;
+ Elf *core = process->core;
+ pid_t tid = thread->tid;
+ if (core == NULL && tid)
+ {
+#ifndef __s390__
+ return false;
+#else /* __s390__ */
+ struct user user_regs;
+ ptrace_area parea;
+ parea.process_addr = (uintptr_t) &user_regs;
+ parea.kernel_addr = 0;
+ parea.len = sizeof (user_regs);
+ if (ptrace (PTRACE_PEEKUSR_AREA, tid, &parea, NULL) != 0)
+ return false;
+ /* If we run as s390x we get the 64-bit registers of tid.
+ But -m31 executable seems to use only the 32-bit parts of its
+ registers so we ignore the upper half. */
+ for (unsigned u = 0; u < 16; u++)
+ dwarf_frame_state_reg_set (state, 0 + u, user_regs.regs.gprs[u]);
+ /* Avoid conversion double -> integer. */
+ eu_static_assert (sizeof user_regs.regs.fp_regs.fprs[0]
+ == sizeof state->regs[0]);
+ for (unsigned u = 0; u < 16; u++)
+ dwarf_frame_state_reg_set (state, 16 + u,
+ *((const __typeof (*state->regs) *)
+ &user_regs.regs.fp_regs.fprs[u]));
+ state->pc = user_regs.regs.psw.addr;
+ state->pc_state = DWFL_FRAME_STATE_PC_SET;
+#endif /* __s390__ */
+ }
+ else if (core)
+ {
+ /* Fetch PSWA. */
+ if (! core_get_pc (core, &state->pc,
+ ebl->class == ELFCLASS32 ? 0x4c : 0x78))
+ return false;
+ state->pc_state = DWFL_FRAME_STATE_PC_SET;
+ }
+ return true;
+}
+
+void
+s390_normalize_pc (Ebl *ebl __attribute__ ((unused)), Dwarf_Addr *pc)
+{
+ assert (ebl->class == ELFCLASS32);
+
+ /* Clear S390 bit 31. */
+ *pc &= (1U << 31) - 1;
+}
diff --git a/backends/s390_frame_unwind.c b/backends/s390_frame_unwind.c
new file mode 100644
index 0000000..fa4c0ac
--- /dev/null
+++ b/backends/s390_frame_unwind.c
@@ -0,0 +1,149 @@
+/* Get previous frame state for an existing frame state.
+ Copyright (C) 2012 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <assert.h>
+#include "libdwflP.h"
+
+#define BACKEND s390_
+#include "libebl_CPU.h"
+
+bool
+s390_frame_unwind (Ebl *ebl, Dwfl_Frame_State **statep, Dwarf_Addr pc)
+{
+ Dwfl_Frame_State *state = *statep;
+ Dwfl_Frame_State_Process *process = state->thread->process;
+ assert (state->unwound == NULL);
+ /* Caller already assumed caller adjustment but S390 instructions are 4 bytes
+ long. Undo it. */
+ if ((pc & 0x3) != 0x3)
+ return false;
+ pc++;
+ /* We can assume big-endian read here. */
+ Dwarf_Addr instr;
+ if (! process->memory_read (pc, &instr, process->memory_read_user_data))
+ return false;
+ /* Fetch only the very first two bytes. */
+ instr = (instr >> (ebl->class == ELFCLASS64 ? 48 : 16)) & 0xffff;
+ /* See GDB s390_sigtramp_frame_sniffer. */
+ /* Check for 'svc'. */
+ if (((instr >> 8) & 0xff) != 0x0a)
+ return false;
+ /* Check for 'sigreturn' or 'rt_sigreturn'. */
+ if ((instr & 0xff) != 119 && (instr & 0xff) != 173)
+ return false;
+ /* See GDB s390_sigtramp_frame_unwind_cache. */
+# define S390_SP_REGNUM (0 + 15) /* S390_R15_REGNUM */
+ Dwarf_Addr this_sp;
+ if (! dwfl_frame_state_reg_get (state, S390_SP_REGNUM, &this_sp))
+ return false;
+ unsigned word_size = ebl->class == ELFCLASS64 ? 8 : 4;
+ Dwarf_Addr next_cfa = this_sp + 16 * word_size + 32;
+ /* "New-style RT frame" is not supported,
+ assuming "Old-style RT frame and all non-RT frames". */
+ Dwarf_Addr sigreg_ptr;
+ if (! process->memory_read (next_cfa + 8, &sigreg_ptr,
+ process->memory_read_user_data))
+ return false;
+ /* Skip PSW mask. */
+ sigreg_ptr += word_size;
+ /* Read PSW address. */
+ Dwarf_Addr val;
+ if (! process->memory_read (sigreg_ptr, &val, process->memory_read_user_data))
+ return false;
+ sigreg_ptr += word_size;
+ size_t nregs = ebl->frame_state_nregs;
+ Dwfl_Frame_State *unwound;
+ unwound = malloc (sizeof (*unwound) + sizeof (*unwound->regs) * nregs);
+ state->unwound = unwound;
+ unwound->thread = state->thread;
+ unwound->unwound = NULL;
+ unwound->pc = val;
+ unwound->pc_state = DWFL_FRAME_STATE_ERROR;
+ memset (unwound->regs_set, 0, sizeof (unwound->regs_set));
+ unwound->signal_frame = true;
+ /* Then the GPRs. */
+ for (int i = 0; i < 16; i++)
+ {
+ if (! process->memory_read (sigreg_ptr, &val,
+ process->memory_read_user_data))
+ return false;
+ if (! dwfl_frame_state_reg_set (unwound, 0 + i, val))
+ return false;
+ sigreg_ptr += word_size;
+ }
+ /* Then the ACRs. Skip them, they are not used in CFI. */
+ for (int i = 0; i < 16; i++)
+ sigreg_ptr += 4;
+ /* The floating-point control word. */
+ sigreg_ptr += 8;
+ /* And finally the FPRs. */
+ for (int i = 0; i < 16; i++)
+ {
+ if (! process->memory_read (sigreg_ptr, &val,
+ process->memory_read_user_data))
+ return false;
+ if (ebl->class == ELFCLASS32)
+ {
+ Dwarf_Addr val_low;
+ if (! process->memory_read (sigreg_ptr + 4, &val_low,
+ process->memory_read_user_data))
+ return false;
+ val = (val << 32) | val_low;
+ }
+ if (! dwfl_frame_state_reg_set (unwound, 16 + i, val))
+ return false;
+ sigreg_ptr += 8;
+ }
+ /* If we have them, the GPR upper halves are appended at the end. */
+ if (ebl->class == ELFCLASS32)
+ {
+ unsigned sigreg_high_off = 4;
+ sigreg_ptr += sigreg_high_off;
+ for (int i = 0; i < 16; i++)
+ {
+ if (! process->memory_read (sigreg_ptr, &val,
+ process->memory_read_user_data))
+ return false;
+ Dwarf_Addr val_low;
+ if (! dwfl_frame_state_reg_get (unwound, 0 + i, &val_low))
+ return false;
+ val = (val << 32) | val_low;
+ if (! dwfl_frame_state_reg_set (unwound, 0 + i, val))
+ return false;
+ sigreg_ptr += 4;
+ }
+ }
+ unwound->pc_state = DWFL_FRAME_STATE_PC_SET;
+ *statep = unwound;
+ return true;
+}
diff --git a/backends/s390_init.c b/backends/s390_init.c
index 91fe4b8..8c28fb8 100644
--- a/backends/s390_init.c
+++ b/backends/s390_init.c
@@ -61,6 +61,16 @@ s390_init (elf, machine, eh, ehlen)
eh->core_note = s390x_core_note;
else
HOOK (eh, core_note);
+ HOOK (eh, abi_cfi);
+ /* gcc/config/ #define DWARF_FRAME_REGISTERS 34.
+ But from the gcc/config/s390/s390.h "Register usage." comment it looks as
+ if #32 (Argument pointer) and #33 (Condition code) are not used for
+ unwinding. */
+ eh->frame_state_nregs = 32;
+ HOOK (eh, frame_state);
+ if (eh->class == ELFCLASS32)
+ HOOK (eh, normalize_pc);
+ HOOK (eh, frame_unwind);
/* Only the 64-bit format uses the incorrect hash table entry size. */
if (eh->class == ELFCLASS64)
diff --git a/libdwfl/dwfl_frame_state_pc.c b/libdwfl/dwfl_frame_state_pc.c
index 6e9928b..4d6fc8b 100644
--- a/libdwfl/dwfl_frame_state_pc.c
+++ b/libdwfl/dwfl_frame_state_pc.c
@@ -37,6 +37,7 @@ dwfl_frame_state_pc (Dwfl_Frame_State *state, Dwarf_Addr *pc, bool *minusone)
{
assert (state->pc_state == DWFL_FRAME_STATE_PC_SET);
*pc = state->pc;
+ ebl_normalize_pc (state->thread->process->ebl, pc);
if (minusone)
{
/* Bottom frame? */
diff --git a/libdwfl/dwfl_frame_unwind.c b/libdwfl/dwfl_frame_unwind.c
index 5705f51..e35ccb5 100644
--- a/libdwfl/dwfl_frame_unwind.c
+++ b/libdwfl/dwfl_frame_unwind.c
@@ -410,7 +410,7 @@ handle_cfi (Dwfl_Frame_State **statep, Dwarf_Addr pc, Dwfl_Module *mod,
{
/* REGNO is undefined. */
unsigned ra = frame->fde->cie->return_address_register;
- if (regno == ra)
+ if (ebl_frame_dwarf_to_regno (ebl, &ra) && regno == ra)
unwound->pc_state = DWFL_FRAME_STATE_PC_UNDEFINED;
continue;
}
@@ -494,6 +494,14 @@ dwfl_frame_unwind (Dwfl_Frame_State **statep)
}
}
}
+ *statep = state;
+ if (ebl_frame_unwind (state->thread->process->ebl, statep, pc))
+ return true;
+ if (state->unwound)
+ {
+ assert (state->unwound->pc_state == DWFL_FRAME_STATE_ERROR);
+ return false;
+ }
__libdwfl_seterrno (DWFL_E_NO_DWARF);
return false;
}
diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h
index 3999d66..fb2f839 100644
--- a/libdwfl/libdwflP.h
+++ b/libdwfl/libdwflP.h
@@ -265,6 +265,9 @@ dwfl_frame_state_reg_get (Dwfl_Frame_State *state, unsigned regno,
Dwarf_Addr *val)
{
Ebl *ebl = state->thread->process->ebl;
+ if (ebl->frame_dwarf_to_regno != NULL
+ && ! ebl->frame_dwarf_to_regno (ebl, ®no))
+ return false;
if (regno >= ebl->frame_state_nregs)
return false;
if ((state->regs_set[regno / sizeof (*state->regs_set) / 8]
@@ -283,6 +286,9 @@ dwfl_frame_state_reg_set (Dwfl_Frame_State *state, unsigned regno,
Dwarf_Addr val)
{
Ebl *ebl = state->thread->process->ebl;
+ if (ebl->frame_dwarf_to_regno != NULL
+ && ! ebl->frame_dwarf_to_regno (ebl, ®no))
+ return false;
if (regno >= ebl->frame_state_nregs)
return false;
/* For example i386 user_regs_struct has signed fields. */
diff --git a/libebl/Makefile.am b/libebl/Makefile.am
index 1e39689..92497c3 100644
--- a/libebl/Makefile.am
+++ b/libebl/Makefile.am
@@ -55,7 +55,8 @@ gen_SOURCES = eblopenbackend.c eblclosebackend.c eblstrtab.c \
eblreginfo.c eblnonerelocp.c eblrelativerelocp.c \
eblsysvhashentrysize.c eblauxvinfo.c eblcheckobjattr.c \
ebl_check_special_section.c ebl_syscall_abi.c eblabicfi.c \
- eblstother.c eblgetfuncpc.c eblframestate.c
+ eblstother.c eblgetfuncpc.c eblframestate.c eblnormalizepc.c \
+ eblframeunwind.c eblframedwarftoregno.c
libebl_a_SOURCES = $(gen_SOURCES)
diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h
index 5b77f92..72f1aad 100644
--- a/libebl/ebl-hooks.h
+++ b/libebl/ebl-hooks.h
@@ -168,5 +168,18 @@ bool EBLHOOK(frame_state) (struct Dwfl_Frame_State *state);
above. */
size_t EBLHOOKVAR(frame_state_nregs);
+/* Convert *REGNO as is in DWARF to a lower range suitable for
+ Dwarf_Frame_State->REGS indexing. RETURN_ADDRESS_REGISTER should not change
+ on second call; other registers may map to numbers invalid on input. */
+bool EBLHOOK(frame_dwarf_to_regno) (Ebl *ebl, unsigned *regno);
+
+/* Optionally modify *PC as fetched from inferior data into valid PC
+ instruction pointer. */
+void EBLHOOK(normalize_pc) (Ebl *ebl, Dwarf_Addr *pc);
+
+/* See dwfl_frame_unwind. */
+bool EBLHOOK(frame_unwind) (Ebl *ebl, struct Dwfl_Frame_State **statep,
+ Dwarf_Addr pc);
+
/* Destructor for ELF backend handle. */
void EBLHOOK(destr) (struct ebl *);
diff --git a/libebl/eblframedwarftoregno.c b/libebl/eblframedwarftoregno.c
new file mode 100644
index 0000000..4cfbd46
--- /dev/null
+++ b/libebl/eblframedwarftoregno.c
@@ -0,0 +1,42 @@
+/* Convert *REGNO as is in DWARF to a lower range.
+ Copyright (C) 2012 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+bool
+ebl_frame_dwarf_to_regno (Ebl *ebl, unsigned *regno)
+{
+ if (ebl == NULL)
+ return false;
+ return (ebl->frame_dwarf_to_regno == NULL
+ ? true : ebl->frame_dwarf_to_regno (ebl, regno));
+}
diff --git a/libebl/eblframeunwind.c b/libebl/eblframeunwind.c
new file mode 100644
index 0000000..adc658b
--- /dev/null
+++ b/libebl/eblframeunwind.c
@@ -0,0 +1,41 @@
+/* Get previous frame state for an existing frame state.
+ Copyright (C) 2012 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+bool
+ebl_frame_unwind (Ebl *ebl, struct Dwfl_Frame_State **statep, Dwarf_Addr pc)
+{
+ if (ebl == NULL || ebl->frame_unwind == NULL)
+ return false;
+ return ebl->frame_unwind (ebl, statep, pc);
+}
diff --git a/libebl/eblnormalizepc.c b/libebl/eblnormalizepc.c
new file mode 100644
index 0000000..abe6352
--- /dev/null
+++ b/libebl/eblnormalizepc.c
@@ -0,0 +1,40 @@
+/* Modify PC as fetched from inferior data into valid PC.
+ Copyright (C) 2012 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+void
+ebl_normalize_pc (Ebl *ebl, Dwarf_Addr *pc)
+{
+ if (ebl != NULL && ebl->normalize_pc != NULL)
+ ebl->normalize_pc (ebl, pc);
+}
diff --git a/libebl/libebl.h b/libebl/libebl.h
index 09b7bfb..967980e 100644
--- a/libebl/libebl.h
+++ b/libebl/libebl.h
@@ -393,6 +393,20 @@ extern bool ebl_frame_state (struct Dwfl_Frame_State *state)
extern size_t ebl_frame_state_nregs (Ebl *ebl)
__nonnull_attribute__ (1);
+/* Modify PC as fetched from inferior data into valid PC. */
+extern void ebl_normalize_pc (Ebl *ebl, Dwarf_Addr *pc)
+ __nonnull_attribute__ (1, 2);
+
+/* Get previous frame state for an existing frame state. */
+struct Dwfl_Frame_State_Process;
+extern bool
+ ebl_frame_unwind (Ebl *ebl, struct Dwfl_Frame_State **statep, Dwarf_Addr pc)
+ __nonnull_attribute__ (1, 2);
+
+/* Convert *REGNO as is in DWARF to a lower range. */
+extern bool ebl_frame_dwarf_to_regno (Ebl *ebl, unsigned *regno)
+ __nonnull_attribute__ (1, 2);
+
#ifdef __cplusplus
}
#endif
diff --git a/tests/backtrace.ppc.core.bz2 b/tests/backtrace.ppc.core.bz2
new file mode 100644
index 0000000..2dca8f1
Binary files /dev/null and b/tests/backtrace.ppc.core.bz2 differ
diff --git a/tests/backtrace.ppc.exec.bz2 b/tests/backtrace.ppc.exec.bz2
new file mode 100644
index 0000000..15070a9
Binary files /dev/null and b/tests/backtrace.ppc.exec.bz2 differ
diff --git a/tests/backtrace.ppc64.core.bz2 b/tests/backtrace.ppc64.core.bz2
new file mode 100644
index 0000000..a07aa61
Binary files /dev/null and b/tests/backtrace.ppc64.core.bz2 differ
diff --git a/tests/backtrace.ppc64.exec.bz2 b/tests/backtrace.ppc64.exec.bz2
new file mode 100644
index 0000000..21a7e0d
Binary files /dev/null and b/tests/backtrace.ppc64.exec.bz2 differ
diff --git a/tests/backtrace.s390.core.bz2 b/tests/backtrace.s390.core.bz2
new file mode 100644
index 0000000..ce21012
Binary files /dev/null and b/tests/backtrace.s390.core.bz2 differ
diff --git a/tests/backtrace.s390.exec.bz2 b/tests/backtrace.s390.exec.bz2
new file mode 100644
index 0000000..8bbb75d
Binary files /dev/null and b/tests/backtrace.s390.exec.bz2 differ
diff --git a/tests/backtrace.s390x.core.bz2 b/tests/backtrace.s390x.core.bz2
new file mode 100644
index 0000000..2a2c9e7
Binary files /dev/null and b/tests/backtrace.s390x.core.bz2 differ
diff --git a/tests/backtrace.s390x.exec.bz2 b/tests/backtrace.s390x.exec.bz2
new file mode 100644
index 0000000..195d1af
Binary files /dev/null and b/tests/backtrace.s390x.exec.bz2 differ
diff --git a/tests/run-backtrace.sh b/tests/run-backtrace.sh
index 6e14653..a57d474 100755
--- a/tests/run-backtrace.sh
+++ b/tests/run-backtrace.sh
@@ -53,4 +53,15 @@ for child in backtrace-child{,-biarch}; do
check_empty $core.err
done
+for arch in ppc ppc64 s390 s390x; do
+ testfiles backtrace.$arch.{exec,core}
+ tempfiles backtrace.$arch.{bt,err}
+ echo ./backtrace ./backtrace.$arch.{exec,core}
+ mytestrun ./backtrace ./backtrace.$arch.{exec,core} 1>backtrace.$arch.bt \
+ 2>backtrace.$arch.err
+ cat backtrace.$arch.{bt,err}
+ check_gsignal backtrace.$arch.bt
+ check_empty backtrace.$arch.err
+done
+
exit 0
10 years, 1 month