summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose E. Marchesi <jose.marchesi@oracle.com>2015-12-08 19:10:40 +0100
committerMark Wielaard <mjw@redhat.com>2016-01-03 10:26:30 +0100
commit42f0df13d7c0b3ec1a547eca84eca694f6d42310 (patch)
tree4a909286c3d57ee73d3b39c1e17bd204dec29efb
parenta5a354b9d7d4ca8c912945dd708ab465aec67c7f (diff)
downloadelfutils-42f0df13d7c0b3ec1a547eca84eca694f6d42310.tar.gz
libebl: new backend attribute ra_offset.
Some backends need to fine-tune the return address as fetched from the corresponding CFI register. This patch adds a new backend attribute ra_offset and the corresponding ebl_ra_offset getter function. Signed-off-by: Jose E. Marchesi <jose.marchesi@oracle.com>
-rw-r--r--libebl/ChangeLog6
-rw-r--r--libebl/eblabicfi.c6
-rw-r--r--libebl/libebl.h6
-rw-r--r--libebl/libeblP.h6
4 files changed, 24 insertions, 0 deletions
diff --git a/libebl/ChangeLog b/libebl/ChangeLog
index d040c08f..a1a10224 100644
--- a/libebl/ChangeLog
+++ b/libebl/ChangeLog
@@ -1,3 +1,9 @@
+2015-12-08 Jose E. Marchesi <jose.marchesi@oracle.com>
+
+ * libebl.h: Prototype for ebl_ra_offset.
+ * eblabicfi.c (ebl_ra_offset): New function.
+ * libeblP.h (struct ebl): new field ra_offset;
+
2015-09-24 Jose E. Marchesi <jose.marchesi@oracle.com>
* Makefile.am (AM_CFLAGS): Use -fPIC instead of -fpic to avoid
diff --git a/libebl/eblabicfi.c b/libebl/eblabicfi.c
index 6b0e18e4..8bf189f1 100644
--- a/libebl/eblabicfi.c
+++ b/libebl/eblabicfi.c
@@ -38,3 +38,9 @@ ebl_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info)
{
return ebl == NULL ? -1 : ebl->abi_cfi (ebl, abi_info);
}
+
+int
+ebl_ra_offset (Ebl *ebl)
+{
+ return ebl->ra_offset;
+}
diff --git a/libebl/libebl.h b/libebl/libebl.h
index 7dbf4608..efcb6d60 100644
--- a/libebl/libebl.h
+++ b/libebl/libebl.h
@@ -422,6 +422,12 @@ extern bool ebl_set_initial_registers_tid (Ebl *ebl,
extern size_t ebl_frame_nregs (Ebl *ebl)
__nonnull_attribute__ (1);
+/* Offset to apply to the value of the return_address_register, as
+ fetched from a Dwarf CFI. This is used by some backends, where the
+ return_address_register actually contains the call address. */
+extern int ebl_ra_offset (Ebl *ebl)
+ __nonnull_attribute__ (1);
+
/* Mask to use for function symbol or unwind return addresses in case
the architecture adds some extra non-address bits to it. This is
different from ebl_resolve_sym_value which only works for actual
diff --git a/libebl/libeblP.h b/libebl/libeblP.h
index dbd67f3e..5b339b31 100644
--- a/libebl/libeblP.h
+++ b/libebl/libeblP.h
@@ -64,6 +64,12 @@ struct ebl
Ebl architecture can unwind iff FRAME_NREGS > 0. */
size_t frame_nregs;
+ /* Offset to apply to the value of the return_address_register, as
+ fetched from a Dwarf CFI. This is used by some backends, where
+ the return_address_register actually contains the call
+ address. */
+ int ra_offset;
+
/* Mask to use to turn a function value into a real function address
in case the architecture adds some extra non-address bits to it.
If not initialized (0) then ebl_func_addr_mask will return ~0,