This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] backends: Hook abi_cfi for arm.


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@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@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@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@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@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@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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]