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 5/5] backends: Hook abi_cfi for arm.


New arm_abi_cfi that defines initial CFA, rules for callee-saved regs,
including VFP ones 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. See the DWARF and calling convention
documents:

DWARF for the ARM Architecture ABI r2.09
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040b/IHI0040B_aadwarf.pdf

Procedure Call Standard for the ARM Architecture ABI r2.09
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf

Also adds addrcfi arm testcase.

Signed-off-by: Mark Wielaard <mjw@redhat.com>
---
 backends/ChangeLog    |    6 +++
 backends/Makefile.am  |    2 +-
 backends/arm_cfi.c    |   87 +++++++++++++++++++++++++++++++++++++++++++++++++
 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, 180 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 48b1b7b..3409010 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-27  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
 	* Makefile.am (ppc_SRCS, ppc64_SRCS): Add ppc_cfi.c.
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..e0cc44b
--- /dev/null
+++ b/backends/arm_cfi.c
@@ -0,0 +1,87 @@
+/* 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"
+
+
+/* ABI-specified state of DWARF CFI based on:
+
+   "DWARF for the ARM Architecture ABI r2.09"
+http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040b/IHI0040B_aadwarf.pdf
+
+   "Procedure Call Standard for the ARM Architecture ABI r2.09"
+http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf
+*/
+
+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),
+      DW_CFA_register, ULEB128_7 (15), ULEB128_7 (14), /* pc = lr */
+#undef SV
+
+      /* VFP S16-S31/D8-D15/Q4-Q7 are callee saved.
+         And uleb128 encoded with two bytes.  */
+#define ULEB128_8_2(x) ((x & 0x7f) | 0x80), 0x02
+#define SV(n) DW_CFA_same_value, ULEB128_8_2 (n)
+      SV (264), SV (265), SV (266), SV (267),
+      SV (268), SV (269), SV (270), SV (271),
+
+      /* 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 ULEB128_8_2
+#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 = 15; /* pc.  */
+
+  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 5871f9d..b11f27b 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 adf8d8b..70e85ed 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): undefined
 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): undefined
+	integer reg1 (r1): undefined
+	integer reg2 (r2): undefined
+	integer reg3 (r3): undefined
+	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): undefined
+	integer reg10 (r10): same_value
+	integer reg11 (r11): same_value
+	integer reg12 (r12): undefined
+	integer reg13 (sp): undefined
+	integer reg14 (lr): same_value
+	integer reg15 (pc): location expression: regx(14)
+	FPA reg16 (f0): undefined
+	FPA reg17 (f1): undefined
+	FPA reg18 (f2): undefined
+	FPA reg19 (f3): undefined
+	FPA reg20 (f4): undefined
+	FPA reg21 (f5): undefined
+	FPA reg22 (f6): undefined
+	FPA reg23 (f7): undefined
+	FPA reg96 (f0): undefined
+	FPA reg97 (f1): undefined
+	FPA reg98 (f2): undefined
+	FPA reg99 (f3): undefined
+	FPA reg100 (f4): undefined
+	FPA reg101 (f5): undefined
+	FPA reg102 (f6): undefined
+	FPA reg103 (f7): undefined
+	integer reg128 (spsr): undefined
+	VFP reg256 (d0): undefined
+	VFP reg257 (d1): undefined
+	VFP reg258 (d2): undefined
+	VFP reg259 (d3): undefined
+	VFP reg260 (d4): undefined
+	VFP reg261 (d5): undefined
+	VFP reg262 (d6): undefined
+	VFP reg263 (d7): undefined
+	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): undefined
+	VFP reg273 (d17): undefined
+	VFP reg274 (d18): undefined
+	VFP reg275 (d19): undefined
+	VFP reg276 (d20): undefined
+	VFP reg277 (d21): undefined
+	VFP reg278 (d22): undefined
+	VFP reg279 (d23): undefined
+	VFP reg280 (d24): undefined
+	VFP reg281 (d25): undefined
+	VFP reg282 (d26): undefined
+	VFP reg283 (d27): undefined
+	VFP reg284 (d28): undefined
+	VFP reg285 (d29): undefined
+	VFP reg286 (d30): undefined
+	VFP reg287 (d31): undefined
+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]