summaryrefslogtreecommitdiffstats
path: root/patches/elfutils-0.176/0009-mips_cfi.patch
blob: 8920f0882d69047ac95d565384c5d2db23bc16b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
From: Michael Olbrich <m.olbrich@pengutronix.de>
Date: Mon, 4 Mar 2019 13:20:36 +0100
Subject: [PATCH] mips_cfi

Imported from elfutils_0.176-1.debian.tar.xz

Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
---
 backends/Makefile.am |  2 +-
 backends/mips_cfi.c  | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 backends/mips_init.c |  1 +
 3 files changed, 82 insertions(+), 1 deletion(-)
 create mode 100644 backends/mips_cfi.c

diff --git a/backends/Makefile.am b/backends/Makefile.am
index ba84da61cd20..8949a59210c3 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -141,7 +141,7 @@ parisc_SRCS = parisc_init.c parisc_symbol.c parisc_regs.c parisc_retval.c
 libebl_parisc_pic_a_SOURCES = $(parisc_SRCS)
 am_libebl_parisc_pic_a_OBJECTS = $(parisc_SRCS:.c=.os)
 
-mips_SRCS = mips_init.c mips_symbol.c mips_regs.c mips_retval.c
+mips_SRCS = mips_init.c mips_symbol.c mips_regs.c mips_retval.c mips_cfi.c
 libebl_mips_pic_a_SOURCES = $(mips_SRCS)
 am_libebl_mips_pic_a_OBJECTS = $(mips_SRCS:.c=.os)
 
diff --git a/backends/mips_cfi.c b/backends/mips_cfi.c
new file mode 100644
index 000000000000..9ffdab5beb03
--- /dev/null
+++ b/backends/mips_cfi.c
@@ -0,0 +1,80 @@
+/* MIPS ABI-specified defaults for DWARF CFI.
+   Copyright (C) 2018 Kurt Roeckx, 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 mips_
+#include "libebl_CPU.h"
+
+int
+mips_abi_cfi (Ebl *ebl __attribute__ ((unused)), Dwarf_CIE *abi_info)
+{
+  static const uint8_t abi_cfi[] =
+    {
+      /* Call-saved regs.  */
+      DW_CFA_same_value, ULEB128_7 (16), /* $16 */
+      DW_CFA_same_value, ULEB128_7 (17), /* $17 */
+      DW_CFA_same_value, ULEB128_7 (18), /* $18 */
+      DW_CFA_same_value, ULEB128_7 (19), /* $19 */
+      DW_CFA_same_value, ULEB128_7 (20), /* $20 */
+      DW_CFA_same_value, ULEB128_7 (21), /* $21 */
+      DW_CFA_same_value, ULEB128_7 (22), /* $22 */
+      DW_CFA_same_value, ULEB128_7 (23), /* $23 */
+      DW_CFA_same_value, ULEB128_7 (28), /* $28 */
+      DW_CFA_same_value, ULEB128_7 (29), /* $29 */
+      DW_CFA_same_value, ULEB128_7 (30), /* $30 */
+
+      DW_CFA_same_value, ULEB128_7 (52), /* $f20 */
+      DW_CFA_same_value, ULEB128_7 (53), /* $f21 */
+      DW_CFA_same_value, ULEB128_7 (54), /* $f22 */
+      DW_CFA_same_value, ULEB128_7 (55), /* $f23 */
+      DW_CFA_same_value, ULEB128_7 (56), /* $f24 */
+      DW_CFA_same_value, ULEB128_7 (57), /* $f25 */
+      DW_CFA_same_value, ULEB128_7 (58), /* $f26 */
+      DW_CFA_same_value, ULEB128_7 (59), /* $f27 */
+      DW_CFA_same_value, ULEB128_7 (60), /* $f28 */
+      DW_CFA_same_value, ULEB128_7 (61), /* $f29 */
+      DW_CFA_same_value, ULEB128_7 (62), /* $f30 */
+      DW_CFA_same_value, ULEB128_7 (63), /* $f31 */
+
+      /* The CFA is the SP.  */
+      DW_CFA_def_cfa, ULEB128_7 (29), ULEB128_7 (0),
+    };
+
+  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 = 31; /* $31 */
+
+  return 0;
+}
diff --git a/backends/mips_init.c b/backends/mips_init.c
index 8482e7fe6e96..bce5abe1d98a 100644
--- a/backends/mips_init.c
+++ b/backends/mips_init.c
@@ -50,6 +50,7 @@ mips_init (Elf *elf __attribute__ ((unused)),
   HOOK (eh, reloc_simple_type);
   HOOK (eh, return_value_location);
   HOOK (eh, register_info);
+  HOOK (eh, abi_cfi);
 
   return MODVERSION;
 }