diff options
author | Mark Hatle <mark.hatle@amd.com> | 2022-11-04 15:08:58 -0500 |
---|---|---|
committer | Mark Hatle <mark.hatle@amd.com> | 2022-11-08 12:53:00 -0600 |
commit | b3bfe36ddeefad92655fc94055dacb3e098623cc (patch) | |
tree | d9fd3533036e6597a3a6f10e42423a46abcd77b2 /meta-microblaze/recipes-devtools | |
parent | 5a75cf75df6908101043a8c8aaf9c788c265429c (diff) | |
download | meta-xilinx-b3bfe36ddeefad92655fc94055dacb3e098623cc.tar.gz |
gdb-microblaze: Update to new version of the port
Signed-off-by: Mark Hatle <mark.hatle@amd.com>
Diffstat (limited to 'meta-microblaze/recipes-devtools')
12 files changed, 1738 insertions, 2191 deletions
diff --git a/meta-microblaze/recipes-devtools/gdb/gdb-microblaze.inc b/meta-microblaze/recipes-devtools/gdb/gdb-microblaze.inc index 9f86f19b..55f921f4 100644 --- a/meta-microblaze/recipes-devtools/gdb/gdb-microblaze.inc +++ b/meta-microblaze/recipes-devtools/gdb/gdb-microblaze.inc | |||
@@ -1,7 +1,7 @@ | |||
1 | # This does not currently work | 1 | ## This does not currently work |
2 | python() { | 2 | #python() { |
3 | raise bb.parse.SkipRecipe("GDB does not current support microblaze.") | 3 | # raise bb.parse.SkipRecipe("GDB does not current support microblaze.") |
4 | } | 4 | #} |
5 | 5 | ||
6 | # MicroBlaze does not support LTTng UST | 6 | # MicroBlaze does not support LTTng UST |
7 | LTTNGUST:microblaze = "" | 7 | LTTNGUST:microblaze = "" |
@@ -10,15 +10,12 @@ LTTNGUST:microblaze = "" | |||
10 | FILESEXTRAPATHS:append := ":${THISDIR}/gdb" | 10 | FILESEXTRAPATHS:append := ":${THISDIR}/gdb" |
11 | 11 | ||
12 | SRC_URI:append:microblaze = " \ | 12 | SRC_URI:append:microblaze = " \ |
13 | file://0001-Patch-MicroBlaze.patch \ | 13 | file://0001-Add-initial-port-of-linux-gdbserver.patch \ |
14 | file://0002-Initial-port-of-core-reading-support.patch \ | 14 | file://0002-Patch-MicroBlaze-Initial-port-of-core-reading-suppor.patch \ |
15 | file://0003-Fix-debug-message-when-register-is-unavailable.patch \ | 15 | file://0003-Fix-debug-message-when-register-is-unavailable.patch \ |
16 | file://0004-microblaze-Add-build_gdbserver-yes-to-top-level-conf.patch \ | 16 | file://0004-Patch-MicroBlaze-MicroBlaze-native-gdb-port.patch \ |
17 | file://0005-Fixing-the-issues-related-to-GDB-7.12.patch \ | 17 | file://0005-Patch-microblaze-Adding-64-bit-MB-support.patch \ |
18 | file://0006-Patch-MicroBlaze-MicroBlaze-native-gdb-port.patch \ | 18 | file://0006-Patch-MicroBlaze-these-changes-will-make-64-bit-vect.patch \ |
19 | file://0007-Patch-microblaze-Adding-64-bit-MB-support.patch \ | 19 | file://0007-Patch-MicroBlaze-Added-m64-abi-for-64-bit-target-des.patch \ |
20 | file://0008-Patch-MicroBlaze-these-changes-will-make-64-bit-vect.patch \ | 20 | file://0008-Patch-MicroBlaze.patch \ |
21 | file://0009-Patch-MicroBlaze-Added-m64-abi-for-64-bit-target-des.patch \ | ||
22 | file://0010-Patch-MicroBlaze-Code-changes-for-gdbserver.patch \ | ||
23 | file://0011-Patch-Microblaze-Depth-Total-number.patch \ | ||
24 | " | 21 | " |
diff --git a/meta-microblaze/recipes-devtools/gdb/gdb/0001-Patch-MicroBlaze.patch b/meta-microblaze/recipes-devtools/gdb/gdb/0001-Add-initial-port-of-linux-gdbserver.patch index b5a2726b..a5f3acd2 100644 --- a/meta-microblaze/recipes-devtools/gdb/gdb/0001-Patch-MicroBlaze.patch +++ b/meta-microblaze/recipes-devtools/gdb/gdb/0001-Add-initial-port-of-linux-gdbserver.patch | |||
@@ -1,8 +1,8 @@ | |||
1 | From b7b3c1eb19b770b2d700dd3c9fa23a7ae225a72b Mon Sep 17 00:00:00 2001 | 1 | From baac387700a72407b3994bfd0a03825112c9745f Mon Sep 17 00:00:00 2001 |
2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
3 | Date: Thu, 16 Jun 2022 09:50:14 +0530 | 3 | Date: Mon, 10 Oct 2022 15:07:22 +0530 |
4 | Subject: [PATCH 01/10] [Patch,MicroBlaze] : Add initial port of linux | 4 | Subject: [PATCH 1/8] Add initial port of linux gdbserver add |
5 | gdbserver add gdb_proc_service_h to gdbserver microblaze-linux | 5 | gdb_proc_service_h to gdbserver microblaze-linux |
6 | 6 | ||
7 | gdbserver needs to initialise the microblaze registers | 7 | gdbserver needs to initialise the microblaze registers |
8 | 8 | ||
@@ -19,51 +19,63 @@ architecture specific setup - may need to add in future | |||
19 | 19 | ||
20 | Signed-off-by: David Holsgrove <david.holsgrove@petalogix.com> | 20 | Signed-off-by: David Holsgrove <david.holsgrove@petalogix.com> |
21 | Signed-off-by: Nathan Rossi <nathan.rossi@petalogix.com> | 21 | Signed-off-by: Nathan Rossi <nathan.rossi@petalogix.com> |
22 | 22 | Signed-off-by: Mahesh Bodapati <mbodapat@xilinx.com> | |
23 | Conflicts: | ||
24 | gdbserver/Makefile.in | ||
25 | --- | 23 | --- |
26 | gdb/configure.host | 3 + | 24 | gdb/configure.host | 2 + |
27 | gdb/features/microblaze-linux.xml | 12 ++ | 25 | gdb/features/Makefile | 1 + |
28 | gdb/gdbserver/linux-microblaze-low.c | 189 +++++++++++++++++++++++++++ | 26 | gdb/features/microblaze-linux.xml | 13 ++ |
29 | gdb/microblaze-linux-tdep.c | 29 +++- | 27 | gdb/microblaze-linux-tdep.c | 29 ++- |
30 | gdb/microblaze-tdep.c | 35 ++++- | 28 | gdb/microblaze-tdep.c | 35 +++- |
31 | gdb/microblaze-tdep.h | 4 +- | 29 | gdb/microblaze-tdep.h | 4 +- |
32 | gdb/regformats/reg-microblaze.dat | 41 ++++++ | 30 | gdb/regformats/microblaze-linux.dat | 64 +++++++ |
33 | gdbserver/Makefile.in | 6 +- | 31 | gdb/regformats/reg-microblaze.dat | 41 +++++ |
34 | gdbserver/configure.srv | 8 ++ | 32 | gdbserver/Makefile.in | 1 + |
35 | 9 files changed, 323 insertions(+), 4 deletions(-) | 33 | gdbserver/configure.srv | 10 ++ |
34 | gdbserver/linux-microblaze-low.cc | 269 ++++++++++++++++++++++++++++ | ||
35 | 11 files changed, 466 insertions(+), 3 deletions(-) | ||
36 | create mode 100644 gdb/features/microblaze-linux.xml | 36 | create mode 100644 gdb/features/microblaze-linux.xml |
37 | create mode 100644 gdb/gdbserver/linux-microblaze-low.c | 37 | create mode 100644 gdb/regformats/microblaze-linux.dat |
38 | create mode 100644 gdb/regformats/reg-microblaze.dat | 38 | create mode 100644 gdb/regformats/reg-microblaze.dat |
39 | create mode 100644 gdbserver/linux-microblaze-low.cc | ||
39 | 40 | ||
40 | diff --git a/gdb/configure.host b/gdb/configure.host | 41 | diff --git a/gdb/configure.host b/gdb/configure.host |
41 | index ce528237291..cf1a08e8b28 100644 | 42 | index da71675b201..877537d06ef 100644 |
42 | --- a/gdb/configure.host | 43 | --- a/gdb/configure.host |
43 | +++ b/gdb/configure.host | 44 | +++ b/gdb/configure.host |
44 | @@ -65,6 +65,7 @@ hppa*) gdb_host_cpu=pa ;; | 45 | @@ -61,6 +61,7 @@ i[34567]86*) gdb_host_cpu=i386 ;; |
45 | i[34567]86*) gdb_host_cpu=i386 ;; | 46 | loongarch*) gdb_host_cpu=loongarch ;; |
46 | m68*) gdb_host_cpu=m68k ;; | 47 | m68*) gdb_host_cpu=m68k ;; |
47 | mips*) gdb_host_cpu=mips ;; | 48 | mips*) gdb_host_cpu=mips ;; |
48 | +microblaze*) gdb_host_cpu=microblaze ;; | 49 | +microblaze*) gdb_host_cpu=microblaze ;; |
49 | powerpc* | rs6000) gdb_host_cpu=powerpc ;; | 50 | powerpc* | rs6000) gdb_host_cpu=powerpc ;; |
50 | sparcv9 | sparc64) gdb_host_cpu=sparc ;; | 51 | sparcv9 | sparc64) gdb_host_cpu=sparc ;; |
51 | s390*) gdb_host_cpu=s390 ;; | 52 | s390*) gdb_host_cpu=s390 ;; |
52 | @@ -133,6 +134,8 @@ mips*-*-netbsd* | mips*-*-knetbsd*-gnu) | 53 | @@ -127,6 +128,7 @@ m68*-*-openbsd*) gdb_host=obsd ;; |
53 | mips*-*-freebsd*) gdb_host=fbsd ;; | ||
54 | mips64*-*-openbsd*) gdb_host=obsd64 ;; | ||
55 | 54 | ||
56 | +microblaze*-*linux*) gdb_host=linux ;; | 55 | m88*-*-openbsd*) gdb_host=obsd ;; |
57 | + | 56 | |
58 | powerpc-*-aix* | rs6000-*-* | powerpc64-*-aix*) | 57 | +microblaze*-*linux*) gdb_host=linux ;; |
59 | gdb_host=aix ;; | 58 | mips*-*-linux*) gdb_host=linux ;; |
60 | powerpc*-*-freebsd*) gdb_host=fbsd ;; | 59 | mips*-*-netbsdaout* | mips*-*-knetbsd*-gnu) |
60 | gdb_host=nbsd ;; | ||
61 | diff --git a/gdb/features/Makefile b/gdb/features/Makefile | ||
62 | index 68e17d0085d..fc3196864c9 100644 | ||
63 | --- a/gdb/features/Makefile | ||
64 | +++ b/gdb/features/Makefile | ||
65 | @@ -46,6 +46,7 @@ | ||
66 | # List of .dat files to create in ../regformats/ | ||
67 | WHICH = mips-linux mips-dsp-linux \ | ||
68 | mips64-linux mips64-dsp-linux \ | ||
69 | + microblaze-linux \ | ||
70 | nios2-linux \ | ||
71 | or1k-linux \ | ||
72 | rs6000/powerpc-32 \ | ||
61 | diff --git a/gdb/features/microblaze-linux.xml b/gdb/features/microblaze-linux.xml | 73 | diff --git a/gdb/features/microblaze-linux.xml b/gdb/features/microblaze-linux.xml |
62 | new file mode 100644 | 74 | new file mode 100644 |
63 | index 00000000000..8983e66eb3d | 75 | index 00000000000..688a3f83d1e |
64 | --- /dev/null | 76 | --- /dev/null |
65 | +++ b/gdb/features/microblaze-linux.xml | 77 | +++ b/gdb/features/microblaze-linux.xml |
66 | @@ -0,0 +1,12 @@ | 78 | @@ -0,0 +1,13 @@ |
67 | +<?xml version="1.0"?> | 79 | +<?xml version="1.0"?> |
68 | +<!-- Copyright (C) 2014-2018 Free Software Foundation, Inc. | 80 | +<!-- Copyright (C) 2014-2018 Free Software Foundation, Inc. |
69 | + | 81 | + |
@@ -73,206 +85,12 @@ index 00000000000..8983e66eb3d | |||
73 | + | 85 | + |
74 | +<!DOCTYPE target SYSTEM "gdb-target.dtd"> | 86 | +<!DOCTYPE target SYSTEM "gdb-target.dtd"> |
75 | +<target> | 87 | +<target> |
88 | + <architecture>microblaze</architecture> | ||
76 | + <osabi>GNU/Linux</osabi> | 89 | + <osabi>GNU/Linux</osabi> |
77 | + <xi:include href="microblaze-core.xml"/> | 90 | + <xi:include href="microblaze-core.xml"/> |
78 | +</target> | 91 | +</target> |
79 | diff --git a/gdb/gdbserver/linux-microblaze-low.c b/gdb/gdbserver/linux-microblaze-low.c | ||
80 | new file mode 100644 | ||
81 | index 00000000000..cba5d6fc585 | ||
82 | --- /dev/null | ||
83 | +++ b/gdb/gdbserver/linux-microblaze-low.c | ||
84 | @@ -0,0 +1,189 @@ | ||
85 | +/* GNU/Linux/Microblaze specific low level interface, for the remote server for | ||
86 | + GDB. | ||
87 | + Copyright (C) 1995-2013 Free Software Foundation, Inc. | ||
88 | + | ||
89 | + This file is part of GDB. | ||
90 | + | ||
91 | + This program is free software; you can redistribute it and/or modify | ||
92 | + it under the terms of the GNU General Public License as published by | ||
93 | + the Free Software Foundation; either version 3 of the License, or | ||
94 | + (at your option) any later version. | ||
95 | + | ||
96 | + This program is distributed in the hope that it will be useful, | ||
97 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
98 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
99 | + GNU General Public License for more details. | ||
100 | + | ||
101 | + You should have received a copy of the GNU General Public License | ||
102 | + along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
103 | + | ||
104 | +#include "server.h" | ||
105 | +#include "linux-low.h" | ||
106 | + | ||
107 | +#include <asm/ptrace.h> | ||
108 | +#include <sys/procfs.h> | ||
109 | +#include <sys/ptrace.h> | ||
110 | + | ||
111 | +#include "gdb_proc_service.h" | ||
112 | + | ||
113 | +static int microblaze_regmap[] = | ||
114 | + {PT_GPR(0), PT_GPR(1), PT_GPR(2), PT_GPR(3), | ||
115 | + PT_GPR(4), PT_GPR(5), PT_GPR(6), PT_GPR(7), | ||
116 | + PT_GPR(8), PT_GPR(9), PT_GPR(10), PT_GPR(11), | ||
117 | + PT_GPR(12), PT_GPR(13), PT_GPR(14), PT_GPR(15), | ||
118 | + PT_GPR(16), PT_GPR(17), PT_GPR(18), PT_GPR(19), | ||
119 | + PT_GPR(20), PT_GPR(21), PT_GPR(22), PT_GPR(23), | ||
120 | + PT_GPR(24), PT_GPR(25), PT_GPR(26), PT_GPR(27), | ||
121 | + PT_GPR(28), PT_GPR(29), PT_GPR(30), PT_GPR(31), | ||
122 | + PT_PC, PT_MSR, PT_EAR, PT_ESR, | ||
123 | + PT_FSR | ||
124 | + }; | ||
125 | + | ||
126 | +#define microblaze_num_regs (sizeof microblaze_regmap / sizeof microblaze_regmap[0]) | ||
127 | + | ||
128 | +/* Defined in auto-generated file microblaze-linux.c. */ | ||
129 | +void init_registers_microblaze (void); | ||
130 | + | ||
131 | +static int | ||
132 | +microblaze_cannot_store_register (int regno) | ||
133 | +{ | ||
134 | + if (microblaze_regmap[regno] == -1 || regno == 0) | ||
135 | + return 1; | ||
136 | + | ||
137 | + return 0; | ||
138 | +} | ||
139 | + | ||
140 | +static int | ||
141 | +microblaze_cannot_fetch_register (int regno) | ||
142 | +{ | ||
143 | + return 0; | ||
144 | +} | ||
145 | + | ||
146 | +static CORE_ADDR | ||
147 | +microblaze_get_pc (struct regcache *regcache) | ||
148 | +{ | ||
149 | + unsigned long pc; | ||
150 | + | ||
151 | + collect_register_by_name (regcache, "pc", &pc); | ||
152 | + return (CORE_ADDR) pc; | ||
153 | +} | ||
154 | + | ||
155 | +static void | ||
156 | +microblaze_set_pc (struct regcache *regcache, CORE_ADDR pc) | ||
157 | +{ | ||
158 | + unsigned long newpc = pc; | ||
159 | + | ||
160 | + supply_register_by_name (regcache, "pc", &newpc); | ||
161 | +} | ||
162 | + | ||
163 | +/* dbtrap insn */ | ||
164 | +/* brki r16, 0x18; */ | ||
165 | +static const unsigned long microblaze_breakpoint = 0xba0c0018; | ||
166 | +#define microblaze_breakpoint_len 4 | ||
167 | + | ||
168 | +static int | ||
169 | +microblaze_breakpoint_at (CORE_ADDR where) | ||
170 | +{ | ||
171 | + unsigned long insn; | ||
172 | + | ||
173 | + (*the_target->read_memory) (where, (unsigned char *) &insn, 4); | ||
174 | + if (insn == microblaze_breakpoint) | ||
175 | + return 1; | ||
176 | + /* If necessary, recognize more trap instructions here. GDB only uses the | ||
177 | + one. */ | ||
178 | + return 0; | ||
179 | +} | ||
180 | + | ||
181 | +static CORE_ADDR | ||
182 | +microblaze_reinsert_addr (struct regcache *regcache) | ||
183 | +{ | ||
184 | + unsigned long pc; | ||
185 | + collect_register_by_name (regcache, "r15", &pc); | ||
186 | + return pc; | ||
187 | +} | ||
188 | + | ||
189 | +#ifdef HAVE_PTRACE_GETREGS | ||
190 | + | ||
191 | +static void | ||
192 | +microblaze_collect_ptrace_register (struct regcache *regcache, int regno, char *buf) | ||
193 | +{ | ||
194 | + int size = register_size (regno); | ||
195 | + | ||
196 | + memset (buf, 0, sizeof (long)); | ||
197 | + | ||
198 | + if (size < sizeof (long)) | ||
199 | + collect_register (regcache, regno, buf + sizeof (long) - size); | ||
200 | + else | ||
201 | + collect_register (regcache, regno, buf); | ||
202 | +} | ||
203 | + | ||
204 | +static void | ||
205 | +microblaze_supply_ptrace_register (struct regcache *regcache, | ||
206 | + int regno, const char *buf) | ||
207 | +{ | ||
208 | + int size = register_size (regno); | ||
209 | + | ||
210 | + if (regno == 0) { | ||
211 | + unsigned long regbuf_0 = 0; | ||
212 | + /* clobbering r0 so that it is always 0 as enforced by hardware */ | ||
213 | + supply_register (regcache, regno, (const char*)®buf_0); | ||
214 | + } else { | ||
215 | + if (size < sizeof (long)) | ||
216 | + supply_register (regcache, regno, buf + sizeof (long) - size); | ||
217 | + else | ||
218 | + supply_register (regcache, regno, buf); | ||
219 | + } | ||
220 | +} | ||
221 | + | ||
222 | +/* Provide only a fill function for the general register set. ps_lgetregs | ||
223 | + will use this for NPTL support. */ | ||
224 | + | ||
225 | +static void microblaze_fill_gregset (struct regcache *regcache, void *buf) | ||
226 | +{ | ||
227 | + int i; | ||
228 | + | ||
229 | + for (i = 0; i < 32; i++) | ||
230 | + microblaze_collect_ptrace_register (regcache, i, (char *) buf + microblaze_regmap[i]); | ||
231 | +} | ||
232 | + | ||
233 | +static void | ||
234 | +microblaze_store_gregset (struct regcache *regcache, const void *buf) | ||
235 | +{ | ||
236 | + int i; | ||
237 | + | ||
238 | + for (i = 0; i < 32; i++) | ||
239 | + supply_register (regcache, i, (char *) buf + microblaze_regmap[i]); | ||
240 | +} | ||
241 | + | ||
242 | +#endif /* HAVE_PTRACE_GETREGS */ | ||
243 | + | ||
244 | +struct regset_info target_regsets[] = { | ||
245 | +#ifdef HAVE_PTRACE_GETREGS | ||
246 | + { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t), GENERAL_REGS, microblaze_fill_gregset, microblaze_store_gregset }, | ||
247 | + { 0, 0, 0, -1, -1, NULL, NULL }, | ||
248 | +#endif /* HAVE_PTRACE_GETREGS */ | ||
249 | + { 0, 0, 0, -1, -1, NULL, NULL } | ||
250 | +}; | ||
251 | + | ||
252 | +struct linux_target_ops the_low_target = { | ||
253 | + init_registers_microblaze, | ||
254 | + microblaze_num_regs, | ||
255 | + microblaze_regmap, | ||
256 | + NULL, | ||
257 | + microblaze_cannot_fetch_register, | ||
258 | + microblaze_cannot_store_register, | ||
259 | + NULL, /* fetch_register */ | ||
260 | + microblaze_get_pc, | ||
261 | + microblaze_set_pc, | ||
262 | + (const unsigned char *) µblaze_breakpoint, | ||
263 | + microblaze_breakpoint_len, | ||
264 | + microblaze_reinsert_addr, | ||
265 | + 0, | ||
266 | + microblaze_breakpoint_at, | ||
267 | + NULL, | ||
268 | + NULL, | ||
269 | + NULL, | ||
270 | + NULL, | ||
271 | + microblaze_collect_ptrace_register, | ||
272 | + microblaze_supply_ptrace_register, | ||
273 | +}; | ||
274 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c | 92 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c |
275 | index 3fc5e768120..0322b4ea813 100644 | 93 | index daa7ddf7e4d..5748556a556 100644 |
276 | --- a/gdb/microblaze-linux-tdep.c | 94 | --- a/gdb/microblaze-linux-tdep.c |
277 | +++ b/gdb/microblaze-linux-tdep.c | 95 | +++ b/gdb/microblaze-linux-tdep.c |
278 | @@ -37,6 +37,22 @@ | 96 | @@ -37,6 +37,22 @@ |
@@ -332,10 +150,10 @@ index 3fc5e768120..0322b4ea813 100644 | |||
332 | 150 | ||
333 | void _initialize_microblaze_linux_tdep (); | 151 | void _initialize_microblaze_linux_tdep (); |
334 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c | 152 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c |
335 | index c263228856f..28c2ed9a74c 100644 | 153 | index 3d5dd669341..3e8e8fe35b9 100644 |
336 | --- a/gdb/microblaze-tdep.c | 154 | --- a/gdb/microblaze-tdep.c |
337 | +++ b/gdb/microblaze-tdep.c | 155 | +++ b/gdb/microblaze-tdep.c |
338 | @@ -137,7 +137,38 @@ microblaze_fetch_instruction (CORE_ADDR pc) | 156 | @@ -128,7 +128,38 @@ microblaze_fetch_instruction (CORE_ADDR pc) |
339 | constexpr gdb_byte microblaze_break_insn[] = MICROBLAZE_BREAKPOINT; | 157 | constexpr gdb_byte microblaze_break_insn[] = MICROBLAZE_BREAKPOINT; |
340 | 158 | ||
341 | typedef BP_MANIPULATION (microblaze_break_insn) microblaze_breakpoint; | 159 | typedef BP_MANIPULATION (microblaze_break_insn) microblaze_breakpoint; |
@@ -375,7 +193,7 @@ index c263228856f..28c2ed9a74c 100644 | |||
375 | 193 | ||
376 | /* Allocate and initialize a frame cache. */ | 194 | /* Allocate and initialize a frame cache. */ |
377 | 195 | ||
378 | @@ -731,6 +762,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 196 | @@ -716,6 +747,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
379 | microblaze_breakpoint::kind_from_pc); | 197 | microblaze_breakpoint::kind_from_pc); |
380 | set_gdbarch_sw_breakpoint_from_kind (gdbarch, | 198 | set_gdbarch_sw_breakpoint_from_kind (gdbarch, |
381 | microblaze_breakpoint::bp_from_kind); | 199 | microblaze_breakpoint::bp_from_kind); |
@@ -383,17 +201,17 @@ index c263228856f..28c2ed9a74c 100644 | |||
383 | 201 | ||
384 | set_gdbarch_frame_args_skip (gdbarch, 8); | 202 | set_gdbarch_frame_args_skip (gdbarch, 8); |
385 | 203 | ||
386 | @@ -771,4 +803,5 @@ When non-zero, microblaze specific debugging is enabled."), | 204 | @@ -756,4 +788,5 @@ When non-zero, microblaze specific debugging is enabled."), |
387 | NULL, | 205 | NULL, |
388 | &setdebuglist, &showdebuglist); | 206 | &setdebuglist, &showdebuglist); |
389 | 207 | ||
390 | + | 208 | + |
391 | } | 209 | } |
392 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h | 210 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h |
393 | index 08af0d191c5..8a429cbf001 100644 | 211 | index 4d90e8785dc..53fcb2297e6 100644 |
394 | --- a/gdb/microblaze-tdep.h | 212 | --- a/gdb/microblaze-tdep.h |
395 | +++ b/gdb/microblaze-tdep.h | 213 | +++ b/gdb/microblaze-tdep.h |
396 | @@ -117,6 +117,8 @@ struct microblaze_frame_cache | 214 | @@ -118,6 +118,8 @@ struct microblaze_frame_cache |
397 | 215 | ||
398 | /* MICROBLAZE_BREAKPOINT defines the breakpoint that should be used. | 216 | /* MICROBLAZE_BREAKPOINT defines the breakpoint that should be used. |
399 | Only used for native debugging. */ | 217 | Only used for native debugging. */ |
@@ -403,6 +221,76 @@ index 08af0d191c5..8a429cbf001 100644 | |||
403 | + | 221 | + |
404 | 222 | ||
405 | #endif /* microblaze-tdep.h */ | 223 | #endif /* microblaze-tdep.h */ |
224 | diff --git a/gdb/regformats/microblaze-linux.dat b/gdb/regformats/microblaze-linux.dat | ||
225 | new file mode 100644 | ||
226 | index 00000000000..b5b49f485cd | ||
227 | --- /dev/null | ||
228 | +++ b/gdb/regformats/microblaze-linux.dat | ||
229 | @@ -0,0 +1,64 @@ | ||
230 | +# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro: | ||
231 | +# Generated from: microblaze-linux.xml | ||
232 | +name:microblaze_linux | ||
233 | +xmltarget:microblaze-linux.xml | ||
234 | +expedite:r1,rpc | ||
235 | +32:r0 | ||
236 | +32:r1 | ||
237 | +32:r2 | ||
238 | +32:r3 | ||
239 | +32:r4 | ||
240 | +32:r5 | ||
241 | +32:r6 | ||
242 | +32:r7 | ||
243 | +32:r8 | ||
244 | +32:r9 | ||
245 | +32:r10 | ||
246 | +32:r11 | ||
247 | +32:r12 | ||
248 | +32:r13 | ||
249 | +32:r14 | ||
250 | +32:r15 | ||
251 | +32:r16 | ||
252 | +32:r17 | ||
253 | +32:r18 | ||
254 | +32:r19 | ||
255 | +32:r20 | ||
256 | +32:r21 | ||
257 | +32:r22 | ||
258 | +32:r23 | ||
259 | +32:r24 | ||
260 | +32:r25 | ||
261 | +32:r26 | ||
262 | +32:r27 | ||
263 | +32:r28 | ||
264 | +32:r29 | ||
265 | +32:r30 | ||
266 | +32:r31 | ||
267 | +32:rpc | ||
268 | +32:rmsr | ||
269 | +32:rear | ||
270 | +32:resr | ||
271 | +32:rfsr | ||
272 | +32:rbtr | ||
273 | +32:rpvr0 | ||
274 | +32:rpvr1 | ||
275 | +32:rpvr2 | ||
276 | +32:rpvr3 | ||
277 | +32:rpvr4 | ||
278 | +32:rpvr5 | ||
279 | +32:rpvr6 | ||
280 | +32:rpvr7 | ||
281 | +32:rpvr8 | ||
282 | +32:rpvr9 | ||
283 | +32:rpvr10 | ||
284 | +32:rpvr11 | ||
285 | +32:redr | ||
286 | +32:rpid | ||
287 | +32:rzpr | ||
288 | +32:rtlbx | ||
289 | +32:rtlbsx | ||
290 | +32:rtlblo | ||
291 | +32:rtlbhi | ||
292 | +32:slr | ||
293 | +32:shr | ||
406 | diff --git a/gdb/regformats/reg-microblaze.dat b/gdb/regformats/reg-microblaze.dat | 294 | diff --git a/gdb/regformats/reg-microblaze.dat b/gdb/regformats/reg-microblaze.dat |
407 | new file mode 100644 | 295 | new file mode 100644 |
408 | index 00000000000..bd8a4384424 | 296 | index 00000000000..bd8a4384424 |
@@ -451,55 +339,313 @@ index 00000000000..bd8a4384424 | |||
451 | +32:slr | 339 | +32:slr |
452 | +32:shr | 340 | +32:shr |
453 | diff --git a/gdbserver/Makefile.in b/gdbserver/Makefile.in | 341 | diff --git a/gdbserver/Makefile.in b/gdbserver/Makefile.in |
454 | index 2bd3a578932..46b5a0c7c60 100644 | 342 | index 47648b8d962..55a5f5b81ae 100644 |
455 | --- a/gdbserver/Makefile.in | 343 | --- a/gdbserver/Makefile.in |
456 | +++ b/gdbserver/Makefile.in | 344 | +++ b/gdbserver/Makefile.in |
457 | @@ -184,7 +184,8 @@ SFILES = \ | 345 | @@ -178,6 +178,7 @@ SFILES = \ |
458 | $(srcdir)/linux-ia64-low.cc \ | 346 | $(srcdir)/linux-ia64-low.cc \ |
459 | $(srcdir)/linux-low.cc \ | 347 | $(srcdir)/linux-low.cc \ |
460 | $(srcdir)/linux-m68k-low.cc \ | 348 | $(srcdir)/linux-m68k-low.cc \ |
461 | - $(srcdir)/linux-mips-low.cc \ | 349 | + $(srcdir)/linux-microblaze-low.cc \ |
462 | + $(srcdir)/linux-microblaze-low.c \ | 350 | $(srcdir)/linux-mips-low.cc \ |
463 | + $(srcdir)/linux-mips-low.cc \ | ||
464 | $(srcdir)/linux-nios2-low.cc \ | 351 | $(srcdir)/linux-nios2-low.cc \ |
465 | $(srcdir)/linux-ppc-low.cc \ | 352 | $(srcdir)/linux-or1k-low.cc \ |
466 | $(srcdir)/linux-riscv-low.cc \ | ||
467 | @@ -221,6 +222,7 @@ SFILES = \ | ||
468 | $(srcdir)/../gdb/nat/linux-namespaces.c \ | ||
469 | $(srcdir)/../gdb/nat/linux-osdata.c \ | ||
470 | $(srcdir)/../gdb/nat/linux-personality.c \ | ||
471 | + $(srcdir)/../gdb/nat/microblaze-linux.c \ | ||
472 | $(srcdir)/../gdb/nat/mips-linux-watch.c \ | ||
473 | $(srcdir)/../gdb/nat/ppc-linux.c \ | ||
474 | $(srcdir)/../gdb/nat/riscv-linux-tdesc.c \ | ||
475 | @@ -562,6 +564,8 @@ target/%.o: ../gdb/target/%.c | ||
476 | |||
477 | %-generated.cc: ../gdb/regformats/rs6000/%.dat $(regdat_sh) | ||
478 | $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $< $@ | ||
479 | +microblaze-linux.c : $(srcdir)/../regformats/reg-microblaze.dat $(regdat_sh) | ||
480 | + $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-microblaze.dat microblaze-linux.c | ||
481 | |||
482 | # | ||
483 | # Dependency tracking. | ||
484 | diff --git a/gdbserver/configure.srv b/gdbserver/configure.srv | 353 | diff --git a/gdbserver/configure.srv b/gdbserver/configure.srv |
485 | index 0cb5072c8ab..9d68c24a92d 100644 | 354 | index 6e09b0eeb79..1817f1f04fb 100644 |
486 | --- a/gdbserver/configure.srv | 355 | --- a/gdbserver/configure.srv |
487 | +++ b/gdbserver/configure.srv | 356 | +++ b/gdbserver/configure.srv |
488 | @@ -166,6 +166,14 @@ case "${gdbserver_host}" in | 357 | @@ -145,6 +145,16 @@ case "${gdbserver_host}" in |
489 | srv_linux_usrregs=yes | 358 | srv_linux_regsets=yes |
490 | srv_linux_thread_db=yes | 359 | srv_linux_thread_db=yes |
491 | ;; | 360 | ;; |
492 | + microblaze*-*-linux*) srv_regobj="microblaze-linux.o" | 361 | + |
493 | + srv_tgtobj="linux-low.o linux-osdata.o linux-microblaze-low.o " | 362 | +microblaze*-*-linux*) srv_regobj="microblaze-linux.o" |
494 | + srv_tgtobj="${srv_tgtobj} linux-procfs.o linux-ptrace.o" | 363 | + srv_tgtobj="$srv_linux_obj linux-microblaze-low.o" |
495 | + srv_xmlfiles="microblaze-linux.xml" | 364 | + srv_xmlfiles="microblaze-linux.xml" |
496 | + srv_linux_regsets=yes | 365 | + srv_xmlfiles="${srv_xmlfiles} microblaze-core.xml" |
497 | + srv_linux_usrregs=yes | 366 | + srv_linux_usrregs=yes |
498 | + srv_linux_thread_db=yes | 367 | + srv_linux_regsets=yes |
499 | + ;; | 368 | + srv_linux_thread_db=yes |
500 | powerpc*-*-linux*) srv_regobj="powerpc-32l.o" | 369 | + ;; |
501 | srv_regobj="${srv_regobj} powerpc-altivec32l.o" | 370 | + |
502 | srv_regobj="${srv_regobj} powerpc-vsx32l.o" | 371 | mips*-*-linux*) srv_regobj="mips-linux.o" |
372 | srv_regobj="${srv_regobj} mips-dsp-linux.o" | ||
373 | srv_regobj="${srv_regobj} mips64-linux.o" | ||
374 | diff --git a/gdbserver/linux-microblaze-low.cc b/gdbserver/linux-microblaze-low.cc | ||
375 | new file mode 100644 | ||
376 | index 00000000000..bf9eecc41ab | ||
377 | --- /dev/null | ||
378 | +++ b/gdbserver/linux-microblaze-low.cc | ||
379 | @@ -0,0 +1,269 @@ | ||
380 | +/* GNU/Linux/Microblaze specific low level interface, for the remote server for | ||
381 | + GDB. | ||
382 | + Copyright (C) 1995-2013 Free Software Foundation, Inc. | ||
383 | + | ||
384 | + This file is part of GDB. | ||
385 | + | ||
386 | + This program is free software; you can redistribute it and/or modify | ||
387 | + it under the terms of the GNU General Public License as published by | ||
388 | + the Free Software Foundation; either version 3 of the License, or | ||
389 | + (at your option) any later version. | ||
390 | + | ||
391 | + This program is distributed in the hope that it will be useful, | ||
392 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
393 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
394 | + GNU General Public License for more details. | ||
395 | + | ||
396 | + You should have received a copy of the GNU General Public License | ||
397 | + along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
398 | + | ||
399 | +#include "server.h" | ||
400 | +#include "linux-low.h" | ||
401 | + | ||
402 | +#include "elf/common.h" | ||
403 | +#include "nat/gdb_ptrace.h" | ||
404 | +#include <endian.h> | ||
405 | + | ||
406 | +#include <asm/ptrace.h> | ||
407 | +#include <sys/procfs.h> | ||
408 | +#include <sys/ptrace.h> | ||
409 | + | ||
410 | +#include "gdb_proc_service.h" | ||
411 | + | ||
412 | + | ||
413 | +static int microblaze_regmap[] = | ||
414 | + {PT_GPR(0), PT_GPR(1), PT_GPR(2), PT_GPR(3), | ||
415 | + PT_GPR(4), PT_GPR(5), PT_GPR(6), PT_GPR(7), | ||
416 | + PT_GPR(8), PT_GPR(9), PT_GPR(10), PT_GPR(11), | ||
417 | + PT_GPR(12), PT_GPR(13), PT_GPR(14), PT_GPR(15), | ||
418 | + PT_GPR(16), PT_GPR(17), PT_GPR(18), PT_GPR(19), | ||
419 | + PT_GPR(20), PT_GPR(21), PT_GPR(22), PT_GPR(23), | ||
420 | + PT_GPR(24), PT_GPR(25), PT_GPR(26), PT_GPR(27), | ||
421 | + PT_GPR(28), PT_GPR(29), PT_GPR(30), PT_GPR(31), | ||
422 | + PT_PC, PT_MSR, PT_EAR, PT_ESR, | ||
423 | + PT_FSR | ||
424 | + }; | ||
425 | + | ||
426 | + | ||
427 | + | ||
428 | +class microblaze_target : public linux_process_target | ||
429 | +{ | ||
430 | +public: | ||
431 | + | ||
432 | + const regs_info *get_regs_info () override; | ||
433 | + | ||
434 | + const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) override; | ||
435 | + // CORE_ADDR microblaze_reinsert_addr (regcache *regcache); | ||
436 | + | ||
437 | +protected: | ||
438 | + | ||
439 | + void low_arch_setup () override; | ||
440 | + | ||
441 | + bool low_cannot_fetch_register (int regno) override; | ||
442 | + | ||
443 | + bool low_cannot_store_register (int regno) override; | ||
444 | + | ||
445 | + // bool low_supports_breakpoints () override; | ||
446 | + | ||
447 | + CORE_ADDR low_get_pc (regcache *regcache) override; | ||
448 | + | ||
449 | + void low_set_pc (regcache *regcache, CORE_ADDR newpc) override; | ||
450 | + | ||
451 | + bool low_breakpoint_at (CORE_ADDR pc) override; | ||
452 | +}; | ||
453 | + | ||
454 | +/* The singleton target ops object. */ | ||
455 | + | ||
456 | +static microblaze_target the_microblaze_target; | ||
457 | + | ||
458 | +#define microblaze_num_regs (sizeof (microblaze_regmap) / sizeof (microblaze_regmap[0])) | ||
459 | + | ||
460 | +/* Defined in auto-generated file microblaze-linux.c. */ | ||
461 | +void init_registers_microblaze_linux (void); | ||
462 | +extern const struct target_desc *tdesc_microblaze_linux; | ||
463 | + | ||
464 | +bool | ||
465 | +microblaze_target::low_cannot_store_register (int regno) | ||
466 | +{ | ||
467 | + if (microblaze_regmap[regno] == -1 || regno == 0) | ||
468 | + return 1; | ||
469 | + | ||
470 | + return 0; | ||
471 | +} | ||
472 | + | ||
473 | +bool | ||
474 | +microblaze_target::low_cannot_fetch_register (int regno) | ||
475 | +{ | ||
476 | + return 0; | ||
477 | +} | ||
478 | + | ||
479 | +CORE_ADDR | ||
480 | +microblaze_target::low_get_pc (struct regcache *regcache) | ||
481 | +{ | ||
482 | + unsigned long pc; | ||
483 | + | ||
484 | + collect_register_by_name (regcache, "pc", &pc); | ||
485 | + return (CORE_ADDR) pc; | ||
486 | +} | ||
487 | + | ||
488 | +void | ||
489 | +microblaze_target::low_set_pc (struct regcache *regcache, CORE_ADDR pc) | ||
490 | +{ | ||
491 | + unsigned long newpc = pc; | ||
492 | + | ||
493 | + supply_register_by_name (regcache, "pc", &newpc); | ||
494 | +} | ||
495 | + | ||
496 | +/* dbtrap insn */ | ||
497 | +/* brki r16, 0x18; */ | ||
498 | +static const unsigned long microblaze_breakpoint = 0xba0c0018; | ||
499 | +#define microblaze_breakpoint_len 4 | ||
500 | + | ||
501 | +/* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */ | ||
502 | + | ||
503 | +const gdb_byte * | ||
504 | +microblaze_target::sw_breakpoint_from_kind (int kind, int *size) | ||
505 | +{ | ||
506 | + *size = microblaze_breakpoint_len; | ||
507 | + return (const gdb_byte *) µblaze_breakpoint; | ||
508 | +} | ||
509 | + | ||
510 | +bool | ||
511 | +microblaze_target::low_breakpoint_at (CORE_ADDR where) | ||
512 | +{ | ||
513 | + unsigned long insn; | ||
514 | + | ||
515 | + read_memory (where, (unsigned char *) &insn, 4); | ||
516 | + if (insn == microblaze_breakpoint) | ||
517 | + return 1; | ||
518 | + /* If necessary, recognize more trap instructions here. GDB only uses the | ||
519 | + one. */ | ||
520 | + return 0; | ||
521 | +} | ||
522 | +#if 0 | ||
523 | +CORE_ADDR | ||
524 | +microblaze_target::microblaze_reinsert_addr (struct regcache *regcache) | ||
525 | +{ | ||
526 | + unsigned long pc; | ||
527 | + collect_register_by_name (regcache, "r15", &pc); | ||
528 | + return pc; | ||
529 | +} | ||
530 | +#endif | ||
531 | +#if 0 | ||
532 | +#ifdef HAVE_PTRACE_GETREGS | ||
533 | + | ||
534 | +static void | ||
535 | +microblaze_collect_ptrace_register (struct regcache *regcache, int regno, char *buf) | ||
536 | +{ | ||
537 | + int size = register_size (regcache->tdesc, regno); | ||
538 | + | ||
539 | + memset (buf, 0, sizeof (long)); | ||
540 | + | ||
541 | + if (size < sizeof (long)) | ||
542 | + collect_register (regcache, regno, buf + sizeof (long) - size); | ||
543 | + else | ||
544 | + collect_register (regcache, regno, buf); | ||
545 | +} | ||
546 | + | ||
547 | +static void | ||
548 | +microblaze_supply_ptrace_register (struct regcache *regcache, | ||
549 | + int regno, const char *buf) | ||
550 | +{ | ||
551 | + int size = register_size (regcache->tdesc, regno); | ||
552 | + | ||
553 | + if (regno == 0) { | ||
554 | + unsigned long regbuf_0 = 0; | ||
555 | + /* clobbering r0 so that it is always 0 as enforced by hardware */ | ||
556 | + supply_register (regcache, regno, (const char*)®buf_0); | ||
557 | + } else { | ||
558 | + if (size < sizeof (long)) | ||
559 | + supply_register (regcache, regno, buf + sizeof (long) - size); | ||
560 | + else | ||
561 | + supply_register (regcache, regno, buf); | ||
562 | + } | ||
563 | +} | ||
564 | + | ||
565 | +/* Provide only a fill function for the general register set. ps_lgetregs | ||
566 | + will use this for NPTL support. */ | ||
567 | + | ||
568 | +static void microblaze_fill_gregset (struct regcache *regcache, void *buf) | ||
569 | +{ | ||
570 | + int i; | ||
571 | + | ||
572 | + for (i = 0; i < 32; i++) | ||
573 | + microblaze_collect_ptrace_register (regcache, i, (char *) buf + microblaze_regmap[i]); | ||
574 | +} | ||
575 | + | ||
576 | +static void | ||
577 | +microblaze_store_gregset (struct regcache *regcache, const void *buf) | ||
578 | +{ | ||
579 | + int i; | ||
580 | + | ||
581 | + for (i = 0; i < 32; i++) | ||
582 | + supply_register (regcache, i, (char *) buf + microblaze_regmap[i]); | ||
583 | +} | ||
584 | + | ||
585 | +#endif /* HAVE_PTRACE_GETREGS */ | ||
586 | +#endif | ||
587 | + | ||
588 | +static struct regset_info microblaze_regsets[] = { | ||
589 | +#if 0 | ||
590 | +#ifdef HAVE_PTRACE_GETREGS | ||
591 | + { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t), GENERAL_REGS, microblaze_fill_gregset, microblaze_store_gregset }, | ||
592 | + { 0, 0, 0, -1, GENERAL_REGS, NULL, NULL }, | ||
593 | +#endif /* HAVE_PTRACE_GETREGS */ | ||
594 | +#endif | ||
595 | + { 0, 0, 0, -1, GENERAL_REGS, NULL, NULL }, | ||
596 | + NULL_REGSET | ||
597 | +}; | ||
598 | + | ||
599 | +static struct usrregs_info microblaze_usrregs_info = | ||
600 | + { | ||
601 | + microblaze_num_regs, | ||
602 | + microblaze_regmap, | ||
603 | + }; | ||
604 | + | ||
605 | +static struct regsets_info microblaze_regsets_info = | ||
606 | + { | ||
607 | + microblaze_regsets, /* regsets */ | ||
608 | + 0, /* num_regsets */ | ||
609 | + NULL, /* disabled_regsets */ | ||
610 | + }; | ||
611 | + | ||
612 | +static struct regs_info microblaze_regs_info = | ||
613 | + { | ||
614 | + NULL, /* regset_bitmap */ | ||
615 | + µblaze_usrregs_info, | ||
616 | + µblaze_regsets_info | ||
617 | + }; | ||
618 | + | ||
619 | +const regs_info * | ||
620 | +microblaze_target::get_regs_info (void) | ||
621 | +{ | ||
622 | + return µblaze_regs_info; | ||
623 | +} | ||
624 | + | ||
625 | +/* Support for hardware single step. */ | ||
626 | + | ||
627 | +static int | ||
628 | +microblaze_supports_hardware_single_step (void) | ||
629 | +{ | ||
630 | + return 1; | ||
631 | +} | ||
632 | + | ||
633 | + | ||
634 | +void | ||
635 | +microblaze_target::low_arch_setup (void) | ||
636 | +{ | ||
637 | + current_process ()->tdesc = tdesc_microblaze_linux; | ||
638 | +} | ||
639 | + | ||
640 | +linux_process_target *the_linux_target = &the_microblaze_target; | ||
641 | + | ||
642 | +void | ||
643 | +initialize_low_arch (void) | ||
644 | +{ | ||
645 | + init_registers_microblaze_linux (); | ||
646 | + initialize_regsets_info (µblaze_regsets_info); | ||
647 | +} | ||
648 | + | ||
503 | -- | 649 | -- |
504 | 2.17.1 | 650 | 2.37.1 (Apple Git-137.1) |
505 | 651 | ||
diff --git a/meta-microblaze/recipes-devtools/gdb/gdb/0002-Initial-port-of-core-reading-support.patch b/meta-microblaze/recipes-devtools/gdb/gdb/0002-Patch-MicroBlaze-Initial-port-of-core-reading-suppor.patch index 352ed92e..a871b582 100644 --- a/meta-microblaze/recipes-devtools/gdb/gdb/0002-Initial-port-of-core-reading-support.patch +++ b/meta-microblaze/recipes-devtools/gdb/gdb/0002-Patch-MicroBlaze-Initial-port-of-core-reading-suppor.patch | |||
@@ -1,30 +1,32 @@ | |||
1 | From da36639f95d23083088a27c27f631d304ae316f1 Mon Sep 17 00:00:00 2001 | 1 | From 7da397cae8c0f8826184d6e12fda9ccd11f92753 Mon Sep 17 00:00:00 2001 |
2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
3 | Date: Tue, 24 Jan 2017 14:55:56 +0530 | 3 | Date: Mon, 10 Oct 2022 16:37:53 +0530 |
4 | Subject: [PATCH 02/10] Initial port of core reading support Added support for | 4 | Subject: [PATCH 2/8] [Patch,MicroBlaze]: Initial port of core reading support |
5 | reading notes in linux core dumps Support for reading of PRSTATUS and PSINFO | 5 | Added support for reading notes in linux core dumps Support for reading of |
6 | information for rebuilding ".reg" sections of core dumps at run time. | 6 | PRSTATUS and PSINFO information for rebuilding ".reg" sections of core dumps |
7 | at run time. | ||
7 | 8 | ||
8 | Signed-off-by: David Holsgrove <david.holsgrove@petalogix.com> | 9 | Signed-off-by: David Holsgrove <david.holsgrove@petalogix.com> |
9 | Signed-off-by: Nathan Rossi <nathan.rossi@petalogix.com> | 10 | Signed-off-by: Nathan Rossi <nathan.rossi@petalogix.com> |
11 | Signed-off-by: Mahesh Bodapati <mbodapat@xilinx.com> | ||
10 | --- | 12 | --- |
11 | bfd/elf32-microblaze.c | 84 +++++++++++++++++++++++++++++++++++++ | 13 | bfd/elf32-microblaze.c | 84 +++++++++++++++++++++++++++++++++++++ |
12 | gdb/configure.tgt | 2 +- | 14 | gdb/configure.tgt | 2 +- |
13 | gdb/microblaze-linux-tdep.c | 17 +++++++- | 15 | gdb/microblaze-linux-tdep.c | 17 +++++++- |
14 | gdb/microblaze-tdep.c | 48 +++++++++++++++++++++ | 16 | gdb/microblaze-tdep.c | 48 +++++++++++++++++++++ |
15 | gdb/microblaze-tdep.h | 27 ++++++++++++ | 17 | gdb/microblaze-tdep.h | 28 +++++++++++++ |
16 | 5 files changed, 176 insertions(+), 2 deletions(-) | 18 | 5 files changed, 177 insertions(+), 2 deletions(-) |
17 | 19 | ||
18 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c | 20 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c |
19 | index 1b5c2efcd6e..cfd70ae9178 100644 | 21 | index d09b3f7095d..d3b3c66cf00 100644 |
20 | --- a/bfd/elf32-microblaze.c | 22 | --- a/bfd/elf32-microblaze.c |
21 | +++ b/bfd/elf32-microblaze.c | 23 | +++ b/bfd/elf32-microblaze.c |
22 | @@ -715,6 +715,87 @@ microblaze_elf_is_local_label_name (bfd *abfd, const char *name) | 24 | @@ -713,6 +713,87 @@ microblaze_elf_is_local_label_name (bfd *abfd, const char *name) |
23 | return _bfd_elf_is_local_label_name (abfd, name); | 25 | return _bfd_elf_is_local_label_name (abfd, name); |
24 | } | 26 | } |
25 | 27 | ||
26 | +/* Support for core dump NOTE sections. */ | 28 | +/* Support for core dump NOTE sections. */ |
27 | +static bfd_boolean | 29 | +static bool |
28 | +microblaze_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) | 30 | +microblaze_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) |
29 | +{ | 31 | +{ |
30 | + int offset; | 32 | + int offset; |
@@ -33,7 +35,7 @@ index 1b5c2efcd6e..cfd70ae9178 100644 | |||
33 | + switch (note->descsz) | 35 | + switch (note->descsz) |
34 | + { | 36 | + { |
35 | + default: | 37 | + default: |
36 | + return FALSE; | 38 | + return false; |
37 | + | 39 | + |
38 | + case 228: /* Linux/MicroBlaze */ | 40 | + case 228: /* Linux/MicroBlaze */ |
39 | + /* pr_cursig */ | 41 | + /* pr_cursig */ |
@@ -54,13 +56,13 @@ index 1b5c2efcd6e..cfd70ae9178 100644 | |||
54 | + size, note->descpos + offset); | 56 | + size, note->descpos + offset); |
55 | +} | 57 | +} |
56 | + | 58 | + |
57 | +static bfd_boolean | 59 | +static bool |
58 | +microblaze_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) | 60 | +microblaze_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) |
59 | +{ | 61 | +{ |
60 | + switch (note->descsz) | 62 | + switch (note->descsz) |
61 | + { | 63 | + { |
62 | + default: | 64 | + default: |
63 | + return FALSE; | 65 | + return false; |
64 | + | 66 | + |
65 | + case 128: /* Linux/MicroBlaze elf_prpsinfo */ | 67 | + case 128: /* Linux/MicroBlaze elf_prpsinfo */ |
66 | + elf_tdata (abfd)->core->program | 68 | + elf_tdata (abfd)->core->program |
@@ -81,7 +83,7 @@ index 1b5c2efcd6e..cfd70ae9178 100644 | |||
81 | + command[n - 1] = '\0'; | 83 | + command[n - 1] = '\0'; |
82 | + } | 84 | + } |
83 | + | 85 | + |
84 | + return TRUE; | 86 | + return true; |
85 | +} | 87 | +} |
86 | + | 88 | + |
87 | +/* The microblaze linker (like many others) needs to keep track of | 89 | +/* The microblaze linker (like many others) needs to keep track of |
@@ -107,7 +109,7 @@ index 1b5c2efcd6e..cfd70ae9178 100644 | |||
107 | /* ELF linker hash entry. */ | 109 | /* ELF linker hash entry. */ |
108 | 110 | ||
109 | struct elf32_mb_link_hash_entry | 111 | struct elf32_mb_link_hash_entry |
110 | @@ -3450,4 +3531,7 @@ microblaze_elf_add_symbol_hook (bfd *abfd, | 112 | @@ -3434,4 +3515,7 @@ microblaze_elf_add_symbol_hook (bfd *abfd, |
111 | #define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections | 113 | #define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections |
112 | #define elf_backend_add_symbol_hook microblaze_elf_add_symbol_hook | 114 | #define elf_backend_add_symbol_hook microblaze_elf_add_symbol_hook |
113 | 115 | ||
@@ -116,7 +118,7 @@ index 1b5c2efcd6e..cfd70ae9178 100644 | |||
116 | + | 118 | + |
117 | #include "elf32-target.h" | 119 | #include "elf32-target.h" |
118 | diff --git a/gdb/configure.tgt b/gdb/configure.tgt | 120 | diff --git a/gdb/configure.tgt b/gdb/configure.tgt |
119 | index a3e11c4b9b8..b8378440b23 100644 | 121 | index 0705ccf32b8..7ea186481f3 100644 |
120 | --- a/gdb/configure.tgt | 122 | --- a/gdb/configure.tgt |
121 | +++ b/gdb/configure.tgt | 123 | +++ b/gdb/configure.tgt |
122 | @@ -400,7 +400,7 @@ mep-*-*) | 124 | @@ -400,7 +400,7 @@ mep-*-*) |
@@ -126,10 +128,10 @@ index a3e11c4b9b8..b8378440b23 100644 | |||
126 | - gdb_target_obs="microblaze-tdep.o microblaze-linux-tdep.o solib-svr4.o \ | 128 | - gdb_target_obs="microblaze-tdep.o microblaze-linux-tdep.o solib-svr4.o \ |
127 | + gdb_target_obs="microblaze-tdep.o microblaze-linux-tdep.o solib-svr4.o glibc-tdep.o \ | 129 | + gdb_target_obs="microblaze-tdep.o microblaze-linux-tdep.o solib-svr4.o glibc-tdep.o \ |
128 | symfile-mem.o linux-tdep.o" | 130 | symfile-mem.o linux-tdep.o" |
129 | gdb_sim=../sim/microblaze/libsim.a | ||
130 | ;; | 131 | ;; |
132 | microblaze*-*-*) | ||
131 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c | 133 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c |
132 | index 0322b4ea813..b8277dfd735 100644 | 134 | index 5748556a556..d6197c49dfd 100644 |
133 | --- a/gdb/microblaze-linux-tdep.c | 135 | --- a/gdb/microblaze-linux-tdep.c |
134 | +++ b/gdb/microblaze-linux-tdep.c | 136 | +++ b/gdb/microblaze-linux-tdep.c |
135 | @@ -36,6 +36,7 @@ | 137 | @@ -36,6 +36,7 @@ |
@@ -149,11 +151,11 @@ index 0322b4ea813..b8277dfd735 100644 | |||
149 | microblaze_linux_init_abi (struct gdbarch_info info, | 151 | microblaze_linux_init_abi (struct gdbarch_info info, |
150 | struct gdbarch *gdbarch) | 152 | struct gdbarch *gdbarch) |
151 | { | 153 | { |
152 | + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | 154 | + struct microblaze_gdbarch_tdep *tdep =(microblaze_gdbarch_tdep *) gdbarch_tdep (gdbarch); |
153 | + | 155 | + |
154 | + tdep->sizeof_gregset = 200; | 156 | + tdep->sizeof_gregset = 200; |
155 | + | 157 | + |
156 | linux_init_abi (info, gdbarch); | 158 | linux_init_abi (info, gdbarch, 0); |
157 | 159 | ||
158 | set_gdbarch_memory_remove_breakpoint (gdbarch, | 160 | set_gdbarch_memory_remove_breakpoint (gdbarch, |
159 | @@ -153,6 +157,17 @@ microblaze_linux_init_abi (struct gdbarch_info info, | 161 | @@ -153,6 +157,17 @@ microblaze_linux_init_abi (struct gdbarch_info info, |
@@ -175,11 +177,11 @@ index 0322b4ea813..b8277dfd735 100644 | |||
175 | set_gdbarch_fetch_tls_load_module_address (gdbarch, | 177 | set_gdbarch_fetch_tls_load_module_address (gdbarch, |
176 | svr4_fetch_objfile_link_map); | 178 | svr4_fetch_objfile_link_map); |
177 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c | 179 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c |
178 | index 28c2ed9a74c..399fa0e3dca 100644 | 180 | index 3e8e8fe35b9..ccd37d085d6 100644 |
179 | --- a/gdb/microblaze-tdep.c | 181 | --- a/gdb/microblaze-tdep.c |
180 | +++ b/gdb/microblaze-tdep.c | 182 | +++ b/gdb/microblaze-tdep.c |
181 | @@ -677,6 +677,43 @@ microblaze_register_g_packet_guesses (struct gdbarch *gdbarch) | 183 | @@ -666,6 +666,43 @@ microblaze_register_g_packet_guesses (struct gdbarch *gdbarch) |
182 | tdesc_microblaze_with_stack_protect); | 184 | tdesc_microblaze_with_stack_protect); |
183 | } | 185 | } |
184 | 186 | ||
185 | +void | 187 | +void |
@@ -210,7 +212,7 @@ index 28c2ed9a74c..399fa0e3dca 100644 | |||
210 | + void *cb_data, | 212 | + void *cb_data, |
211 | + const struct regcache *regcache) | 213 | + const struct regcache *regcache) |
212 | +{ | 214 | +{ |
213 | + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | 215 | + struct microblaze_gdbarch_tdep *tdep =(microblaze_gdbarch_tdep *) gdbarch_tdep (gdbarch); |
214 | + | 216 | + |
215 | + cb(".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, tdep->gregset, NULL, cb_data); | 217 | + cb(".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, tdep->gregset, NULL, cb_data); |
216 | + | 218 | + |
@@ -222,8 +224,8 @@ index 28c2ed9a74c..399fa0e3dca 100644 | |||
222 | static struct gdbarch * | 224 | static struct gdbarch * |
223 | microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 225 | microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
224 | { | 226 | { |
225 | @@ -733,6 +770,10 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 227 | @@ -718,6 +755,10 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
226 | tdep = XCNEW (struct gdbarch_tdep); | 228 | microblaze_gdbarch_tdep *tdep = new microblaze_gdbarch_tdep; |
227 | gdbarch = gdbarch_alloc (&info, tdep); | 229 | gdbarch = gdbarch_alloc (&info, tdep); |
228 | 230 | ||
229 | + tdep->gregset = NULL; | 231 | + tdep->gregset = NULL; |
@@ -233,10 +235,10 @@ index 28c2ed9a74c..399fa0e3dca 100644 | |||
233 | set_gdbarch_long_double_bit (gdbarch, 128); | 235 | set_gdbarch_long_double_bit (gdbarch, 128); |
234 | 236 | ||
235 | set_gdbarch_num_regs (gdbarch, MICROBLAZE_NUM_REGS); | 237 | set_gdbarch_num_regs (gdbarch, MICROBLAZE_NUM_REGS); |
236 | @@ -781,6 +822,13 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 238 | @@ -766,6 +807,13 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
237 | frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer); | 239 | frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer); |
238 | if (tdesc_data != NULL) | 240 | if (tdesc_data != NULL) |
239 | tdesc_use_registers (gdbarch, tdesc, tdesc_data); | 241 | tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data)); |
240 | + //frame_base_append_sniffer (gdbarch, microblaze_frame_sniffer); | 242 | + //frame_base_append_sniffer (gdbarch, microblaze_frame_sniffer); |
241 | + | 243 | + |
242 | + /* If we have register sets, enable the generic core file support. */ | 244 | + /* If we have register sets, enable the generic core file support. */ |
@@ -248,21 +250,22 @@ index 28c2ed9a74c..399fa0e3dca 100644 | |||
248 | return gdbarch; | 250 | return gdbarch; |
249 | } | 251 | } |
250 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h | 252 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h |
251 | index 8a429cbf001..e91991b8dba 100644 | 253 | index 53fcb2297e6..2e853d84d72 100644 |
252 | --- a/gdb/microblaze-tdep.h | 254 | --- a/gdb/microblaze-tdep.h |
253 | +++ b/gdb/microblaze-tdep.h | 255 | +++ b/gdb/microblaze-tdep.h |
254 | @@ -22,8 +22,22 @@ | 256 | @@ -23,8 +23,23 @@ |
255 | 257 | #include "gdbarch.h" | |
256 | 258 | ||
257 | /* Microblaze architecture-specific information. */ | 259 | /* Microblaze architecture-specific information. */ |
258 | +struct microblaze_gregset | 260 | +struct microblaze_gregset |
259 | +{ | 261 | +{ |
262 | + microblaze_gregset() {} | ||
260 | + unsigned int gregs[32]; | 263 | + unsigned int gregs[32]; |
261 | + unsigned int fpregs[32]; | 264 | + unsigned int fpregs[32]; |
262 | + unsigned int pregs[16]; | 265 | + unsigned int pregs[16]; |
263 | +}; | 266 | +}; |
264 | + | 267 | + |
265 | struct gdbarch_tdep | 268 | struct microblaze_gdbarch_tdep : gdbarch_tdep |
266 | { | 269 | { |
267 | + int dummy; // declare something. | 270 | + int dummy; // declare something. |
268 | + | 271 | + |
@@ -274,7 +277,7 @@ index 8a429cbf001..e91991b8dba 100644 | |||
274 | }; | 277 | }; |
275 | 278 | ||
276 | /* Register numbers. */ | 279 | /* Register numbers. */ |
277 | @@ -120,5 +134,18 @@ struct microblaze_frame_cache | 280 | @@ -121,5 +136,18 @@ struct microblaze_frame_cache |
278 | #define MICROBLAZE_BREAKPOINT {0xba, 0x0c, 0x00, 0x18} | 281 | #define MICROBLAZE_BREAKPOINT {0xba, 0x0c, 0x00, 0x18} |
279 | #define MICROBLAZE_BREAKPOINT_LE {0x18, 0x00, 0x0c, 0xba} | 282 | #define MICROBLAZE_BREAKPOINT_LE {0x18, 0x00, 0x0c, 0xba} |
280 | 283 | ||
@@ -294,5 +297,5 @@ index 8a429cbf001..e91991b8dba 100644 | |||
294 | 297 | ||
295 | #endif /* microblaze-tdep.h */ | 298 | #endif /* microblaze-tdep.h */ |
296 | -- | 299 | -- |
297 | 2.17.1 | 300 | 2.37.1 (Apple Git-137.1) |
298 | 301 | ||
diff --git a/meta-microblaze/recipes-devtools/gdb/gdb/0003-Fix-debug-message-when-register-is-unavailable.patch b/meta-microblaze/recipes-devtools/gdb/gdb/0003-Fix-debug-message-when-register-is-unavailable.patch index 255bb9b5..d2d06b54 100644 --- a/meta-microblaze/recipes-devtools/gdb/gdb/0003-Fix-debug-message-when-register-is-unavailable.patch +++ b/meta-microblaze/recipes-devtools/gdb/gdb/0003-Fix-debug-message-when-register-is-unavailable.patch | |||
@@ -1,40 +1,48 @@ | |||
1 | From da93f5715ff333ac4807b73fe678dde21fb3bd6c Mon Sep 17 00:00:00 2001 | 1 | From 6ecb1de66a6a5f55e69c9b108a3d5a85b0ebf315 Mon Sep 17 00:00:00 2001 |
2 | From: Nathan Rossi <nathan.rossi@petalogix.com> | 2 | From: Nathan Rossi <nathan.rossi@petalogix.com> |
3 | Date: Tue, 8 May 2012 18:11:17 +1000 | 3 | Date: Tue, 8 May 2012 18:11:17 +1000 |
4 | Subject: [PATCH 03/10] Fix debug message when register is unavailable | 4 | Subject: [PATCH 3/8] Fix debug message when register is unavailable |
5 | 5 | ||
6 | Signed-off-by: Nathan Rossi <nathan.rossi@petalogix.com> | 6 | Signed-off-by: Nathan Rossi <nathan.rossi@petalogix.com> |
7 | |||
8 | Conflicts: | ||
9 | gdb/frame.c | ||
7 | --- | 10 | --- |
8 | gdb/frame.c | 13 ++++++++++--- | 11 | gdb/frame.c | 21 ++++++++++++++------- |
9 | 1 file changed, 10 insertions(+), 3 deletions(-) | 12 | 1 file changed, 14 insertions(+), 7 deletions(-) |
10 | 13 | ||
11 | diff --git a/gdb/frame.c b/gdb/frame.c | 14 | diff --git a/gdb/frame.c b/gdb/frame.c |
12 | index c1eba5848af..fe4a0dc0dd0 100644 | 15 | index ce95cf8343b..c49ab9feab2 100644 |
13 | --- a/gdb/frame.c | 16 | --- a/gdb/frame.c |
14 | +++ b/gdb/frame.c | 17 | +++ b/gdb/frame.c |
15 | @@ -1305,12 +1305,19 @@ frame_unwind_register_value (frame_info *next_frame, int regnum) | 18 | @@ -1261,13 +1261,20 @@ frame_unwind_register_value (frame_info *next_frame, int regnum) |
16 | else | 19 | else |
17 | { | 20 | { |
18 | int i; | 21 | int i; |
19 | - const gdb_byte *buf = value_contents (value); | 22 | - gdb::array_view<const gdb_byte> buf = value_contents (value); |
23 | - | ||
24 | - fprintf_unfiltered (&debug_file, " bytes="); | ||
25 | - fprintf_unfiltered (&debug_file, "["); | ||
26 | - for (i = 0; i < register_size (gdbarch, regnum); i++) | ||
27 | - fprintf_unfiltered (&debug_file, "%02x", buf[i]); | ||
28 | - fprintf_unfiltered (&debug_file, "]"); | ||
20 | + const gdb_byte *buf = NULL; | 29 | + const gdb_byte *buf = NULL; |
21 | + if (value_entirely_available(value)) { | 30 | + if (value_entirely_available(value)) { |
22 | + buf = value_contents (value); | 31 | + gdb::array_view<const gdb_byte> buf = value_contents (value); |
23 | + } | 32 | + } |
24 | 33 | + | |
25 | fprintf_unfiltered (gdb_stdlog, " bytes="); | 34 | + fprintf_unfiltered (gdb_stdlog, " bytes="); |
26 | fprintf_unfiltered (gdb_stdlog, "["); | 35 | + fprintf_unfiltered (gdb_stdlog, "["); |
27 | - for (i = 0; i < register_size (gdbarch, regnum); i++) | ||
28 | - fprintf_unfiltered (gdb_stdlog, "%02x", buf[i]); | ||
29 | + if (buf != NULL) { | 36 | + if (buf != NULL) { |
30 | + for (i = 0; i < register_size (gdbarch, regnum); i++) | 37 | + for (i = 0; i < register_size (gdbarch, regnum); i++) |
31 | + fprintf_unfiltered (gdb_stdlog, "%02x", buf[i]); | 38 | + fprintf_unfiltered (gdb_stdlog, "%02x", buf[i]); |
32 | + } else { | 39 | + } else { |
33 | + fprintf_unfiltered (gdb_stdlog, "unavailable"); | 40 | + fprintf_unfiltered (gdb_stdlog, "unavailable"); |
34 | + } | 41 | + } |
35 | fprintf_unfiltered (gdb_stdlog, "]"); | 42 | + fprintf_unfiltered (gdb_stdlog, "]"); |
36 | } | 43 | } |
37 | } | 44 | } |
45 | |||
38 | -- | 46 | -- |
39 | 2.17.1 | 47 | 2.37.1 (Apple Git-137.1) |
40 | 48 | ||
diff --git a/meta-microblaze/recipes-devtools/gdb/gdb/0006-Patch-MicroBlaze-MicroBlaze-native-gdb-port.patch b/meta-microblaze/recipes-devtools/gdb/gdb/0004-Patch-MicroBlaze-MicroBlaze-native-gdb-port.patch index 9498e8f7..90944525 100644 --- a/meta-microblaze/recipes-devtools/gdb/gdb/0006-Patch-MicroBlaze-MicroBlaze-native-gdb-port.patch +++ b/meta-microblaze/recipes-devtools/gdb/gdb/0004-Patch-MicroBlaze-MicroBlaze-native-gdb-port.patch | |||
@@ -1,8 +1,9 @@ | |||
1 | From b37df6ced77898e8cb7e1c343af005d5bfe1272f Mon Sep 17 00:00:00 2001 | 1 | From 8d05b79cda7617f228fa4bb6e5147689b662699e Mon Sep 17 00:00:00 2001 |
2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
3 | Date: Wed, 15 Jun 2022 10:29:09 +0530 | 3 | Date: Mon, 10 Oct 2022 18:53:46 +0530 |
4 | Subject: [PATCH 06/10] [Patch,MicroBlaze] : MicroBlaze native gdb port. | 4 | Subject: [PATCH 4/8] [Patch,MicroBlaze] : MicroBlaze native gdb port. |
5 | 5 | ||
6 | signed-off-by : Mahesh Bodapati <mbodapat@amd.com> | ||
6 | --- | 7 | --- |
7 | gdb/Makefile.in | 2 + | 8 | gdb/Makefile.in | 2 + |
8 | gdb/configure.nat | 4 + | 9 | gdb/configure.nat | 4 + |
@@ -18,18 +19,18 @@ Subject: [PATCH 06/10] [Patch,MicroBlaze] : MicroBlaze native gdb port. | |||
18 | create mode 100644 gdb/microblaze-linux-tdep.h | 19 | create mode 100644 gdb/microblaze-linux-tdep.h |
19 | 20 | ||
20 | diff --git a/gdb/Makefile.in b/gdb/Makefile.in | 21 | diff --git a/gdb/Makefile.in b/gdb/Makefile.in |
21 | index ec371fc7e52..0449b8e4c2b 100644 | 22 | index aecab41eeb8..fb63e1662c1 100644 |
22 | --- a/gdb/Makefile.in | 23 | --- a/gdb/Makefile.in |
23 | +++ b/gdb/Makefile.in | 24 | +++ b/gdb/Makefile.in |
24 | @@ -1336,6 +1336,7 @@ HFILES_NO_SRCDIR = \ | 25 | @@ -1374,6 +1374,7 @@ HFILES_NO_SRCDIR = \ |
25 | memory-map.h \ | 26 | memory-map.h \ |
26 | memrange.h \ | 27 | memrange.h \ |
27 | microblaze-tdep.h \ | 28 | microblaze-tdep.h \ |
28 | + microblaze-linux-tdep.h \ | 29 | + microblaze-linux-tdep.h \ |
29 | mips-linux-tdep.h \ | 30 | mips-linux-tdep.h \ |
30 | mips-nbsd-tdep.h \ | 31 | mips-netbsd-tdep.h \ |
31 | mips-tdep.h \ | 32 | mips-tdep.h \ |
32 | @@ -2214,6 +2215,7 @@ ALLDEPFILES = \ | 33 | @@ -2249,6 +2250,7 @@ ALLDEPFILES = \ |
33 | m68k-linux-nat.c \ | 34 | m68k-linux-nat.c \ |
34 | m68k-linux-tdep.c \ | 35 | m68k-linux-tdep.c \ |
35 | m68k-tdep.c \ | 36 | m68k-tdep.c \ |
@@ -38,10 +39,10 @@ index ec371fc7e52..0449b8e4c2b 100644 | |||
38 | microblaze-tdep.c \ | 39 | microblaze-tdep.c \ |
39 | mingw-hdep.c \ | 40 | mingw-hdep.c \ |
40 | diff --git a/gdb/configure.nat b/gdb/configure.nat | 41 | diff --git a/gdb/configure.nat b/gdb/configure.nat |
41 | index bb70e303384..53f19a3d263 100644 | 42 | index b45519fd116..256c666e760 100644 |
42 | --- a/gdb/configure.nat | 43 | --- a/gdb/configure.nat |
43 | +++ b/gdb/configure.nat | 44 | +++ b/gdb/configure.nat |
44 | @@ -261,6 +261,10 @@ case ${gdb_host} in | 45 | @@ -270,6 +270,10 @@ case ${gdb_host} in |
45 | # Host: Motorola m68k running GNU/Linux. | 46 | # Host: Motorola m68k running GNU/Linux. |
46 | NATDEPFILES="${NATDEPFILES} m68k-linux-nat.o" | 47 | NATDEPFILES="${NATDEPFILES} m68k-linux-nat.o" |
47 | ;; | 48 | ;; |
@@ -54,7 +55,7 @@ index bb70e303384..53f19a3d263 100644 | |||
54 | NATDEPFILES="${NATDEPFILES} linux-nat-trad.o \ | 55 | NATDEPFILES="${NATDEPFILES} linux-nat-trad.o \ |
55 | diff --git a/gdb/features/microblaze-linux.c b/gdb/features/microblaze-linux.c | 56 | diff --git a/gdb/features/microblaze-linux.c b/gdb/features/microblaze-linux.c |
56 | new file mode 100755 | 57 | new file mode 100755 |
57 | index 00000000000..29f681bf2ac | 58 | index 00000000000..267e12f6d59 |
58 | --- /dev/null | 59 | --- /dev/null |
59 | +++ b/gdb/features/microblaze-linux.c | 60 | +++ b/gdb/features/microblaze-linux.c |
60 | @@ -0,0 +1,79 @@ | 61 | @@ -0,0 +1,79 @@ |
@@ -69,12 +70,12 @@ index 00000000000..29f681bf2ac | |||
69 | +static void | 70 | +static void |
70 | +initialize_tdesc_microblaze_linux (void) | 71 | +initialize_tdesc_microblaze_linux (void) |
71 | +{ | 72 | +{ |
72 | + struct target_desc *result = allocate_target_description (); | 73 | + target_desc_up result = allocate_target_description (); |
73 | + struct tdesc_feature *feature; | 74 | + struct tdesc_feature *feature; |
74 | + set_tdesc_architecture (result, bfd_scan_arch ("microblaze")); | 75 | + set_tdesc_architecture (result.get(), bfd_scan_arch ("microblaze")); |
75 | + set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux")); | 76 | + set_tdesc_osabi (result.get(), osabi_from_tdesc_string ("GNU/Linux")); |
76 | + | 77 | + |
77 | + feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.core"); | 78 | + feature = tdesc_create_feature (result.get(), "org.gnu.gdb.microblaze.core"); |
78 | + tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int"); | 79 | + tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int"); |
79 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int"); | 80 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int"); |
80 | + tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int"); | 81 | + tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int"); |
@@ -135,7 +136,7 @@ index 00000000000..29f681bf2ac | |||
135 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); | 136 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); |
136 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); | 137 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); |
137 | + | 138 | + |
138 | + tdesc_microblaze_linux = result; | 139 | + tdesc_microblaze_linux = result.release(); |
139 | +} | 140 | +} |
140 | diff --git a/gdb/microblaze-linux-nat.c b/gdb/microblaze-linux-nat.c | 141 | diff --git a/gdb/microblaze-linux-nat.c b/gdb/microblaze-linux-nat.c |
141 | new file mode 100755 | 142 | new file mode 100755 |
@@ -510,7 +511,7 @@ index 00000000000..6b9daa23120 | |||
510 | + add_inf_child_target (linux_target); | 511 | + add_inf_child_target (linux_target); |
511 | +} | 512 | +} |
512 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c | 513 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c |
513 | index b8277dfd735..b77acc9dc61 100644 | 514 | index d6197c49dfd..fc52adffb72 100644 |
514 | --- a/gdb/microblaze-linux-tdep.c | 515 | --- a/gdb/microblaze-linux-tdep.c |
515 | +++ b/gdb/microblaze-linux-tdep.c | 516 | +++ b/gdb/microblaze-linux-tdep.c |
516 | @@ -37,6 +37,7 @@ | 517 | @@ -37,6 +37,7 @@ |
@@ -558,10 +559,10 @@ index 00000000000..a2c744e2961 | |||
558 | + | 559 | + |
559 | +#endif /* MICROBLAZE_LINUX_TDEP_H */ | 560 | +#endif /* MICROBLAZE_LINUX_TDEP_H */ |
560 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c | 561 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c |
561 | index 399fa0e3dca..0a5b5ab59cc 100644 | 562 | index ccd37d085d6..ccb6b730d64 100644 |
562 | --- a/gdb/microblaze-tdep.c | 563 | --- a/gdb/microblaze-tdep.c |
563 | +++ b/gdb/microblaze-tdep.c | 564 | +++ b/gdb/microblaze-tdep.c |
564 | @@ -295,6 +295,7 @@ microblaze_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, | 565 | @@ -285,6 +285,7 @@ microblaze_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, |
565 | cache->frameless_p = 0; /* Frame found. */ | 566 | cache->frameless_p = 0; /* Frame found. */ |
566 | save_hidden_pointer_found = 0; | 567 | save_hidden_pointer_found = 0; |
567 | non_stack_instruction_found = 0; | 568 | non_stack_instruction_found = 0; |
@@ -569,7 +570,7 @@ index 399fa0e3dca..0a5b5ab59cc 100644 | |||
569 | continue; | 570 | continue; |
570 | } | 571 | } |
571 | else if (IS_SPILL_SP(op, rd, ra)) | 572 | else if (IS_SPILL_SP(op, rd, ra)) |
572 | @@ -443,15 +444,17 @@ microblaze_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) | 573 | @@ -431,15 +432,17 @@ microblaze_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) |
573 | if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end)) | 574 | if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end)) |
574 | { | 575 | { |
575 | sal = find_pc_line (func_start, 0); | 576 | sal = find_pc_line (func_start, 0); |
@@ -590,7 +591,7 @@ index 399fa0e3dca..0a5b5ab59cc 100644 | |||
590 | if (ostart_pc > start_pc) | 591 | if (ostart_pc > start_pc) |
591 | return ostart_pc; | 592 | return ostart_pc; |
592 | return start_pc; | 593 | return start_pc; |
593 | @@ -465,6 +468,7 @@ microblaze_frame_cache (struct frame_info *next_frame, void **this_cache) | 594 | @@ -453,6 +456,7 @@ microblaze_frame_cache (struct frame_info *next_frame, void **this_cache) |
594 | struct microblaze_frame_cache *cache; | 595 | struct microblaze_frame_cache *cache; |
595 | struct gdbarch *gdbarch = get_frame_arch (next_frame); | 596 | struct gdbarch *gdbarch = get_frame_arch (next_frame); |
596 | int rn; | 597 | int rn; |
@@ -598,7 +599,7 @@ index 399fa0e3dca..0a5b5ab59cc 100644 | |||
598 | 599 | ||
599 | if (*this_cache) | 600 | if (*this_cache) |
600 | return (struct microblaze_frame_cache *) *this_cache; | 601 | return (struct microblaze_frame_cache *) *this_cache; |
601 | @@ -478,10 +482,17 @@ microblaze_frame_cache (struct frame_info *next_frame, void **this_cache) | 602 | @@ -466,10 +470,17 @@ microblaze_frame_cache (struct frame_info *next_frame, void **this_cache) |
602 | cache->register_offsets[rn] = -1; | 603 | cache->register_offsets[rn] = -1; |
603 | 604 | ||
604 | /* Call for side effects. */ | 605 | /* Call for side effects. */ |
@@ -620,7 +621,7 @@ index 399fa0e3dca..0a5b5ab59cc 100644 | |||
620 | return cache; | 621 | return cache; |
621 | } | 622 | } |
622 | 623 | ||
623 | @@ -506,6 +517,25 @@ microblaze_frame_prev_register (struct frame_info *this_frame, | 624 | @@ -494,6 +505,25 @@ microblaze_frame_prev_register (struct frame_info *this_frame, |
624 | struct microblaze_frame_cache *cache = | 625 | struct microblaze_frame_cache *cache = |
625 | microblaze_frame_cache (this_frame, this_cache); | 626 | microblaze_frame_cache (this_frame, this_cache); |
626 | 627 | ||
@@ -646,7 +647,7 @@ index 399fa0e3dca..0a5b5ab59cc 100644 | |||
646 | if (cache->frameless_p) | 647 | if (cache->frameless_p) |
647 | { | 648 | { |
648 | if (regnum == MICROBLAZE_PC_REGNUM) | 649 | if (regnum == MICROBLAZE_PC_REGNUM) |
649 | @@ -518,7 +548,9 @@ microblaze_frame_prev_register (struct frame_info *this_frame, | 650 | @@ -506,7 +536,9 @@ microblaze_frame_prev_register (struct frame_info *this_frame, |
650 | else | 651 | else |
651 | return trad_frame_get_prev_register (this_frame, cache->saved_regs, | 652 | return trad_frame_get_prev_register (this_frame, cache->saved_regs, |
652 | regnum); | 653 | regnum); |
@@ -657,7 +658,7 @@ index 399fa0e3dca..0a5b5ab59cc 100644 | |||
657 | } | 658 | } |
658 | 659 | ||
659 | static const struct frame_unwind microblaze_frame_unwind = | 660 | static const struct frame_unwind microblaze_frame_unwind = |
660 | @@ -633,7 +665,106 @@ microblaze_stabs_argument_has_addr (struct gdbarch *gdbarch, struct type *type) | 661 | @@ -622,7 +654,106 @@ microblaze_stabs_argument_has_addr (struct gdbarch *gdbarch, struct type *type) |
661 | return (TYPE_LENGTH (type) == 16); | 662 | return (TYPE_LENGTH (type) == 16); |
662 | } | 663 | } |
663 | 664 | ||
@@ -765,7 +766,7 @@ index 399fa0e3dca..0a5b5ab59cc 100644 | |||
765 | static int dwarf2_to_reg_map[78] = | 766 | static int dwarf2_to_reg_map[78] = |
766 | { 0 /* r0 */, 1 /* r1 */, 2 /* r2 */, 3 /* r3 */, /* 0- 3 */ | 767 | { 0 /* r0 */, 1 /* r1 */, 2 /* r2 */, 3 /* r3 */, /* 0- 3 */ |
767 | 4 /* r4 */, 5 /* r5 */, 6 /* r6 */, 7 /* r7 */, /* 4- 7 */ | 768 | 4 /* r4 */, 5 /* r5 */, 6 /* r6 */, 7 /* r7 */, /* 4- 7 */ |
768 | @@ -805,6 +936,8 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 769 | @@ -790,6 +921,8 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
769 | microblaze_breakpoint::bp_from_kind); | 770 | microblaze_breakpoint::bp_from_kind); |
770 | set_gdbarch_memory_remove_breakpoint (gdbarch, microblaze_linux_memory_remove_breakpoint); | 771 | set_gdbarch_memory_remove_breakpoint (gdbarch, microblaze_linux_memory_remove_breakpoint); |
771 | 772 | ||
@@ -775,10 +776,10 @@ index 399fa0e3dca..0a5b5ab59cc 100644 | |||
775 | 776 | ||
776 | set_gdbarch_unwind_pc (gdbarch, microblaze_unwind_pc); | 777 | set_gdbarch_unwind_pc (gdbarch, microblaze_unwind_pc); |
777 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h | 778 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h |
778 | index 872a3931f20..7f75c693b74 100644 | 779 | index 2e853d84d72..2415acfe7b6 100644 |
779 | --- a/gdb/microblaze-tdep.h | 780 | --- a/gdb/microblaze-tdep.h |
780 | +++ b/gdb/microblaze-tdep.h | 781 | +++ b/gdb/microblaze-tdep.h |
781 | @@ -59,11 +59,11 @@ enum microblaze_regnum | 782 | @@ -60,11 +60,11 @@ enum microblaze_regnum |
782 | MICROBLAZE_R12_REGNUM, | 783 | MICROBLAZE_R12_REGNUM, |
783 | MICROBLAZE_R13_REGNUM, | 784 | MICROBLAZE_R13_REGNUM, |
784 | MICROBLAZE_R14_REGNUM, | 785 | MICROBLAZE_R14_REGNUM, |
@@ -792,7 +793,7 @@ index 872a3931f20..7f75c693b74 100644 | |||
792 | MICROBLAZE_R20_REGNUM, | 793 | MICROBLAZE_R20_REGNUM, |
793 | MICROBLAZE_R21_REGNUM, | 794 | MICROBLAZE_R21_REGNUM, |
794 | MICROBLAZE_R22_REGNUM, | 795 | MICROBLAZE_R22_REGNUM, |
795 | @@ -76,7 +76,8 @@ enum microblaze_regnum | 796 | @@ -77,7 +77,8 @@ enum microblaze_regnum |
796 | MICROBLAZE_R29_REGNUM, | 797 | MICROBLAZE_R29_REGNUM, |
797 | MICROBLAZE_R30_REGNUM, | 798 | MICROBLAZE_R30_REGNUM, |
798 | MICROBLAZE_R31_REGNUM, | 799 | MICROBLAZE_R31_REGNUM, |
@@ -802,7 +803,7 @@ index 872a3931f20..7f75c693b74 100644 | |||
802 | MICROBLAZE_MSR_REGNUM, | 803 | MICROBLAZE_MSR_REGNUM, |
803 | MICROBLAZE_EAR_REGNUM, | 804 | MICROBLAZE_EAR_REGNUM, |
804 | MICROBLAZE_ESR_REGNUM, | 805 | MICROBLAZE_ESR_REGNUM, |
805 | @@ -101,17 +102,21 @@ enum microblaze_regnum | 806 | @@ -102,17 +103,21 @@ enum microblaze_regnum |
806 | MICROBLAZE_RTLBSX_REGNUM, | 807 | MICROBLAZE_RTLBSX_REGNUM, |
807 | MICROBLAZE_RTLBLO_REGNUM, | 808 | MICROBLAZE_RTLBLO_REGNUM, |
808 | MICROBLAZE_RTLBHI_REGNUM, | 809 | MICROBLAZE_RTLBHI_REGNUM, |
@@ -827,5 +828,5 @@ index 872a3931f20..7f75c693b74 100644 | |||
827 | int frameless_p; | 828 | int frameless_p; |
828 | 829 | ||
829 | -- | 830 | -- |
830 | 2.17.1 | 831 | 2.37.1 (Apple Git-137.1) |
831 | 832 | ||
diff --git a/meta-microblaze/recipes-devtools/gdb/gdb/0004-microblaze-Add-build_gdbserver-yes-to-top-level-conf.patch b/meta-microblaze/recipes-devtools/gdb/gdb/0004-microblaze-Add-build_gdbserver-yes-to-top-level-conf.patch deleted file mode 100644 index f1555b8a..00000000 --- a/meta-microblaze/recipes-devtools/gdb/gdb/0004-microblaze-Add-build_gdbserver-yes-to-top-level-conf.patch +++ /dev/null | |||
@@ -1,32 +0,0 @@ | |||
1 | From 82ee589db2c1191fb274f4a76e217df318f8d6b2 Mon Sep 17 00:00:00 2001 | ||
2 | From: David Holsgrove <david.holsgrove@xilinx.com> | ||
3 | Date: Mon, 16 Dec 2013 16:37:32 +1000 | ||
4 | Subject: [PATCH 04/10] microblaze: Add build_gdbserver=yes to top level | ||
5 | configure.tgt | ||
6 | |||
7 | For Microblaze linux toolchains, set the build_gdbserver=yes | ||
8 | to allow driving gdbserver configuration from the upper level | ||
9 | |||
10 | This patch has been absorbed into the original patch to add | ||
11 | linux gdbserver support for Microblaze. | ||
12 | |||
13 | Signed-off-by: David Holsgrove <david.holsgrove@xilinx.com> | ||
14 | --- | ||
15 | gdb/configure.tgt | 1 + | ||
16 | 1 file changed, 1 insertion(+) | ||
17 | |||
18 | diff --git a/gdb/configure.tgt b/gdb/configure.tgt | ||
19 | index b8378440b23..8ca2042c7cb 100644 | ||
20 | --- a/gdb/configure.tgt | ||
21 | +++ b/gdb/configure.tgt | ||
22 | @@ -408,6 +408,7 @@ microblaze*-*-*) | ||
23 | # Target: Xilinx MicroBlaze running standalone | ||
24 | gdb_target_obs="microblaze-tdep.o" | ||
25 | gdb_sim=../sim/microblaze/libsim.a | ||
26 | + build_gdbserver=yes | ||
27 | ;; | ||
28 | |||
29 | mips*-*-linux*) | ||
30 | -- | ||
31 | 2.17.1 | ||
32 | |||
diff --git a/meta-microblaze/recipes-devtools/gdb/gdb/0005-Fixing-the-issues-related-to-GDB-7.12.patch b/meta-microblaze/recipes-devtools/gdb/gdb/0005-Fixing-the-issues-related-to-GDB-7.12.patch deleted file mode 100644 index 48e203a9..00000000 --- a/meta-microblaze/recipes-devtools/gdb/gdb/0005-Fixing-the-issues-related-to-GDB-7.12.patch +++ /dev/null | |||
@@ -1,201 +0,0 @@ | |||
1 | From ca1158d19ab9879167ca9fbe2fdf8d19094cc53f Mon Sep 17 00:00:00 2001 | ||
2 | From: Nagaraju Mekala <nmekala@xilix.com> | ||
3 | Date: Fri, 17 Feb 2017 14:09:40 +0530 | ||
4 | Subject: [PATCH 05/10] Fixing the issues related to GDB-7.12 | ||
5 | |||
6 | added all the required function which are new in 7.12 and removed | ||
7 | few deprecated functions from 7.6 | ||
8 | |||
9 | Conflicts: | ||
10 | gdb/config/microblaze/linux.mh | ||
11 | --- | ||
12 | gdb/gdbserver/linux-microblaze-low.c | 97 ++++++++++++++++++++++++---- | ||
13 | gdb/microblaze-tdep.h | 1 + | ||
14 | gdbserver/configure.srv | 3 +- | ||
15 | 3 files changed, 86 insertions(+), 15 deletions(-) | ||
16 | |||
17 | diff --git a/gdb/gdbserver/linux-microblaze-low.c b/gdb/gdbserver/linux-microblaze-low.c | ||
18 | index cba5d6fc585..a2733f3c21c 100644 | ||
19 | --- a/gdb/gdbserver/linux-microblaze-low.c | ||
20 | +++ b/gdb/gdbserver/linux-microblaze-low.c | ||
21 | @@ -39,10 +39,11 @@ static int microblaze_regmap[] = | ||
22 | PT_FSR | ||
23 | }; | ||
24 | |||
25 | -#define microblaze_num_regs (sizeof microblaze_regmap / sizeof microblaze_regmap[0]) | ||
26 | +#define microblaze_num_regs (sizeof (microblaze_regmap) / sizeof (microblaze_regmap[0])) | ||
27 | |||
28 | /* Defined in auto-generated file microblaze-linux.c. */ | ||
29 | void init_registers_microblaze (void); | ||
30 | +extern const struct target_desc *tdesc_microblaze; | ||
31 | |||
32 | static int | ||
33 | microblaze_cannot_store_register (int regno) | ||
34 | @@ -81,6 +82,15 @@ microblaze_set_pc (struct regcache *regcache, CORE_ADDR pc) | ||
35 | static const unsigned long microblaze_breakpoint = 0xba0c0018; | ||
36 | #define microblaze_breakpoint_len 4 | ||
37 | |||
38 | +/* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */ | ||
39 | + | ||
40 | +static const gdb_byte * | ||
41 | +microblaze_sw_breakpoint_from_kind (int kind, int *size) | ||
42 | +{ | ||
43 | + *size = microblaze_breakpoint_len; | ||
44 | + return (const gdb_byte *) µblaze_breakpoint; | ||
45 | +} | ||
46 | + | ||
47 | static int | ||
48 | microblaze_breakpoint_at (CORE_ADDR where) | ||
49 | { | ||
50 | @@ -107,7 +117,7 @@ microblaze_reinsert_addr (struct regcache *regcache) | ||
51 | static void | ||
52 | microblaze_collect_ptrace_register (struct regcache *regcache, int regno, char *buf) | ||
53 | { | ||
54 | - int size = register_size (regno); | ||
55 | + int size = register_size (regcache->tdesc, regno); | ||
56 | |||
57 | memset (buf, 0, sizeof (long)); | ||
58 | |||
59 | @@ -121,7 +131,7 @@ static void | ||
60 | microblaze_supply_ptrace_register (struct regcache *regcache, | ||
61 | int regno, const char *buf) | ||
62 | { | ||
63 | - int size = register_size (regno); | ||
64 | + int size = register_size (regcache->tdesc, regno); | ||
65 | |||
66 | if (regno == 0) { | ||
67 | unsigned long regbuf_0 = 0; | ||
68 | @@ -157,33 +167,94 @@ microblaze_store_gregset (struct regcache *regcache, const void *buf) | ||
69 | |||
70 | #endif /* HAVE_PTRACE_GETREGS */ | ||
71 | |||
72 | -struct regset_info target_regsets[] = { | ||
73 | +static struct regset_info microblaze_regsets[] = { | ||
74 | #ifdef HAVE_PTRACE_GETREGS | ||
75 | { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t), GENERAL_REGS, microblaze_fill_gregset, microblaze_store_gregset }, | ||
76 | - { 0, 0, 0, -1, -1, NULL, NULL }, | ||
77 | + { 0, 0, 0, -1, GENERAL_REGS, NULL, NULL }, | ||
78 | #endif /* HAVE_PTRACE_GETREGS */ | ||
79 | - { 0, 0, 0, -1, -1, NULL, NULL } | ||
80 | + { 0, 0, 0, -1, GENERAL_REGS, NULL, NULL }, | ||
81 | + NULL_REGSET | ||
82 | }; | ||
83 | |||
84 | +static struct usrregs_info microblaze_usrregs_info = | ||
85 | + { | ||
86 | + microblaze_num_regs, | ||
87 | + microblaze_regmap, | ||
88 | + }; | ||
89 | + | ||
90 | +static struct regsets_info microblaze_regsets_info = | ||
91 | + { | ||
92 | + microblaze_regsets, /* regsets */ | ||
93 | + 0, /* num_regsets */ | ||
94 | + NULL, /* disabled_regsets */ | ||
95 | + }; | ||
96 | + | ||
97 | +static struct regs_info regs_info = | ||
98 | + { | ||
99 | + NULL, /* regset_bitmap */ | ||
100 | + µblaze_usrregs_info, | ||
101 | + µblaze_regsets_info | ||
102 | + }; | ||
103 | + | ||
104 | +static const struct regs_info * | ||
105 | +microblaze_regs_info (void) | ||
106 | +{ | ||
107 | + return ®s_info; | ||
108 | +} | ||
109 | + | ||
110 | +/* Support for hardware single step. */ | ||
111 | + | ||
112 | +static int | ||
113 | +microblaze_supports_hardware_single_step (void) | ||
114 | +{ | ||
115 | + return 1; | ||
116 | +} | ||
117 | + | ||
118 | + | ||
119 | +static void | ||
120 | +microblaze_arch_setup (void) | ||
121 | +{ | ||
122 | + current_process ()->tdesc = tdesc_microblaze; | ||
123 | +} | ||
124 | + | ||
125 | struct linux_target_ops the_low_target = { | ||
126 | - init_registers_microblaze, | ||
127 | - microblaze_num_regs, | ||
128 | - microblaze_regmap, | ||
129 | - NULL, | ||
130 | + microblaze_arch_setup, | ||
131 | + microblaze_regs_info, | ||
132 | microblaze_cannot_fetch_register, | ||
133 | microblaze_cannot_store_register, | ||
134 | NULL, /* fetch_register */ | ||
135 | microblaze_get_pc, | ||
136 | microblaze_set_pc, | ||
137 | - (const unsigned char *) µblaze_breakpoint, | ||
138 | - microblaze_breakpoint_len, | ||
139 | - microblaze_reinsert_addr, | ||
140 | + NULL, | ||
141 | + microblaze_sw_breakpoint_from_kind, | ||
142 | + NULL, | ||
143 | 0, | ||
144 | microblaze_breakpoint_at, | ||
145 | NULL, | ||
146 | NULL, | ||
147 | NULL, | ||
148 | NULL, | ||
149 | + NULL, | ||
150 | microblaze_collect_ptrace_register, | ||
151 | microblaze_supply_ptrace_register, | ||
152 | + NULL, /* siginfo_fixup */ | ||
153 | + NULL, /* new_process */ | ||
154 | + NULL, /* new_thread */ | ||
155 | + NULL, /* new_fork */ | ||
156 | + NULL, /* prepare_to_resume */ | ||
157 | + NULL, /* process_qsupported */ | ||
158 | + NULL, /* supports_tracepoints */ | ||
159 | + NULL, /* get_thread_area */ | ||
160 | + NULL, /* install_fast_tracepoint_jump_pad */ | ||
161 | + NULL, /* emit_ops */ | ||
162 | + NULL, /* get_min_fast_tracepoint_insn_len */ | ||
163 | + NULL, /* supports_range_stepping */ | ||
164 | + NULL, /* breakpoint_kind_from_current_state */ | ||
165 | + microblaze_supports_hardware_single_step, | ||
166 | }; | ||
167 | + | ||
168 | +void | ||
169 | +initialize_low_arch (void) | ||
170 | +{ | ||
171 | + init_registers_microblaze (); | ||
172 | +} | ||
173 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h | ||
174 | index e91991b8dba..872a3931f20 100644 | ||
175 | --- a/gdb/microblaze-tdep.h | ||
176 | +++ b/gdb/microblaze-tdep.h | ||
177 | @@ -24,6 +24,7 @@ | ||
178 | /* Microblaze architecture-specific information. */ | ||
179 | struct microblaze_gregset | ||
180 | { | ||
181 | + microblaze_gregset() {} | ||
182 | unsigned int gregs[32]; | ||
183 | unsigned int fpregs[32]; | ||
184 | unsigned int pregs[16]; | ||
185 | diff --git a/gdbserver/configure.srv b/gdbserver/configure.srv | ||
186 | index 9d68c24a92d..af10cb05683 100644 | ||
187 | --- a/gdbserver/configure.srv | ||
188 | +++ b/gdbserver/configure.srv | ||
189 | @@ -167,8 +167,7 @@ case "${gdbserver_host}" in | ||
190 | srv_linux_thread_db=yes | ||
191 | ;; | ||
192 | microblaze*-*-linux*) srv_regobj="microblaze-linux.o" | ||
193 | - srv_tgtobj="linux-low.o linux-osdata.o linux-microblaze-low.o " | ||
194 | - srv_tgtobj="${srv_tgtobj} linux-procfs.o linux-ptrace.o" | ||
195 | + srv_tgtobj="$srv_linux_obj linux-microblaze-low.o " | ||
196 | srv_xmlfiles="microblaze-linux.xml" | ||
197 | srv_linux_regsets=yes | ||
198 | srv_linux_usrregs=yes | ||
199 | -- | ||
200 | 2.17.1 | ||
201 | |||
diff --git a/meta-microblaze/recipes-devtools/gdb/gdb/0007-Patch-microblaze-Adding-64-bit-MB-support.patch b/meta-microblaze/recipes-devtools/gdb/gdb/0005-Patch-microblaze-Adding-64-bit-MB-support.patch index 564562da..caf20303 100644 --- a/meta-microblaze/recipes-devtools/gdb/gdb/0007-Patch-microblaze-Adding-64-bit-MB-support.patch +++ b/meta-microblaze/recipes-devtools/gdb/gdb/0005-Patch-microblaze-Adding-64-bit-MB-support.patch | |||
@@ -1,9 +1,10 @@ | |||
1 | From 0eea9a3f068837d4792719a8f9ba15736938eea4 Mon Sep 17 00:00:00 2001 | 1 | From 6aadc445a00275c37112e431c6a29f5a331e6e16 Mon Sep 17 00:00:00 2001 |
2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
3 | Date: Thu, 31 Jan 2019 14:36:00 +0530 | 3 | Date: Thu, 31 Jan 2019 14:36:00 +0530 |
4 | Subject: [PATCH 07/10] [Patch, microblaze]: Adding 64 bit MB support Added new | 4 | Subject: [PATCH 5/8] [Patch, microblaze]: Adding 64 bit MB support Added new |
5 | architecture to Microblaze 64-bit support to GDB Signed-off-by :Nagaraju | 5 | architecture to Microblaze 64-bit support to GDB Signed-off-by :Nagaraju |
6 | Mekala <nmekala@xilix.com> | 6 | Mekala <nmekala@xilix.com> Signed-off-by :Mahesh Bodapati |
7 | <mbodapat@xilinx.com> | ||
7 | 8 | ||
8 | Conflicts: | 9 | Conflicts: |
9 | gdb/Makefile.in | 10 | gdb/Makefile.in |
@@ -11,14 +12,28 @@ Conflicts: | |||
11 | Conflicts: | 12 | Conflicts: |
12 | bfd/cpu-microblaze.c | 13 | bfd/cpu-microblaze.c |
13 | gdb/microblaze-tdep.c | 14 | gdb/microblaze-tdep.c |
15 | ld/Makefile.am | ||
16 | ld/Makefile.in | ||
14 | opcodes/microblaze-dis.c | 17 | opcodes/microblaze-dis.c |
15 | 18 | ||
16 | Conflicts: | 19 | Conflicts: |
17 | bfd/configure | 20 | bfd/configure |
21 | gas/config/tc-microblaze.c | ||
22 | ld/Makefile.in | ||
18 | opcodes/microblaze-opcm.h | 23 | opcodes/microblaze-opcm.h |
19 | 24 | ||
20 | Conflicts: | 25 | Conflicts: |
21 | gdb/microblaze-tdep.c | 26 | gdb/microblaze-tdep.c |
27 | |||
28 | Conflicts: | ||
29 | bfd/elf32-microblaze.c | ||
30 | gas/config/tc-microblaze.c | ||
31 | gdb/features/Makefile | ||
32 | gdb/features/microblaze-with-stack-protect.c | ||
33 | gdb/microblaze-tdep.c | ||
34 | gdb/regformats/microblaze-with-stack-protect.dat | ||
35 | gdbserver/linux-microblaze-low.c | ||
36 | include/elf/common.h | ||
22 | --- | 37 | --- |
23 | bfd/Makefile.am | 2 + | 38 | bfd/Makefile.am | 2 + |
24 | bfd/Makefile.in | 3 + | 39 | bfd/Makefile.in | 3 + |
@@ -27,12 +42,12 @@ Conflicts: | |||
27 | bfd/config.bfd | 4 + | 42 | bfd/config.bfd | 4 + |
28 | bfd/configure | 2 + | 43 | bfd/configure | 2 + |
29 | bfd/cpu-microblaze.c | 55 +- | 44 | bfd/cpu-microblaze.c | 55 +- |
30 | bfd/elf32-microblaze.c | 243 +- | 45 | bfd/elf32-microblaze.c | 162 +- |
31 | bfd/elf64-microblaze.c | 3711 +++++++++++++++++ | 46 | bfd/elf64-microblaze.c | 3810 +++++++++++++++++ |
32 | bfd/libbfd.h | 3 + | 47 | bfd/libbfd.h | 3 + |
33 | bfd/reloc.c | 20 + | 48 | bfd/reloc.c | 20 + |
34 | bfd/targets.c | 6 + | 49 | bfd/targets.c | 6 + |
35 | gdb/features/Makefile | 3 + | 50 | gdb/features/Makefile | 2 + |
36 | gdb/features/microblaze-core.xml | 6 +- | 51 | gdb/features/microblaze-core.xml | 6 +- |
37 | gdb/features/microblaze-stack-protect.xml | 4 +- | 52 | gdb/features/microblaze-stack-protect.xml | 4 +- |
38 | gdb/features/microblaze-with-stack-protect.c | 8 +- | 53 | gdb/features/microblaze-with-stack-protect.c | 8 +- |
@@ -44,16 +59,14 @@ Conflicts: | |||
44 | gdb/features/microblaze64.c | 77 + | 59 | gdb/features/microblaze64.c | 77 + |
45 | gdb/features/microblaze64.xml | 11 + | 60 | gdb/features/microblaze64.xml | 11 + |
46 | gdb/microblaze-linux-tdep.c | 36 +- | 61 | gdb/microblaze-linux-tdep.c | 36 +- |
47 | gdb/microblaze-tdep.c | 102 +- | 62 | gdb/microblaze-tdep.c | 126 +- |
48 | gdb/microblaze-tdep.h | 4 +- | 63 | gdb/microblaze-tdep.h | 4 +- |
49 | .../microblaze-with-stack-protect.dat | 4 +- | ||
50 | .../linux-microblaze-low.c | 0 | ||
51 | include/elf/common.h | 1 + | 64 | include/elf/common.h | 1 + |
52 | include/elf/microblaze.h | 4 + | 65 | include/elf/microblaze.h | 4 + |
53 | opcodes/microblaze-dis.c | 51 +- | 66 | opcodes/microblaze-dis.c | 51 +- |
54 | opcodes/microblaze-opc.h | 180 +- | 67 | opcodes/microblaze-opc.h | 180 +- |
55 | opcodes/microblaze-opcm.h | 36 +- | 68 | opcodes/microblaze-opcm.h | 36 +- |
56 | 41 files changed, 5345 insertions(+), 245 deletions(-) | 69 | 31 files changed, 4729 insertions(+), 95 deletions(-) |
57 | create mode 100755 bfd/elf64-microblaze.c | 70 | create mode 100755 bfd/elf64-microblaze.c |
58 | create mode 100644 gdb/features/microblaze64-core.xml | 71 | create mode 100644 gdb/features/microblaze64-core.xml |
59 | create mode 100644 gdb/features/microblaze64-stack-protect.xml | 72 | create mode 100644 gdb/features/microblaze64-stack-protect.xml |
@@ -61,13 +74,12 @@ Conflicts: | |||
61 | create mode 100644 gdb/features/microblaze64-with-stack-protect.xml | 74 | create mode 100644 gdb/features/microblaze64-with-stack-protect.xml |
62 | create mode 100644 gdb/features/microblaze64.c | 75 | create mode 100644 gdb/features/microblaze64.c |
63 | create mode 100644 gdb/features/microblaze64.xml | 76 | create mode 100644 gdb/features/microblaze64.xml |
64 | rename {gdb/gdbserver => gdbserver}/linux-microblaze-low.c (100%) | ||
65 | 77 | ||
66 | diff --git a/bfd/Makefile.am b/bfd/Makefile.am | 78 | diff --git a/bfd/Makefile.am b/bfd/Makefile.am |
67 | index d07c9605b6f..11bbf9a4e0d 100644 | 79 | index b9a3f8207ac..2ddd7891661 100644 |
68 | --- a/bfd/Makefile.am | 80 | --- a/bfd/Makefile.am |
69 | +++ b/bfd/Makefile.am | 81 | +++ b/bfd/Makefile.am |
70 | @@ -558,6 +558,7 @@ BFD64_BACKENDS = \ | 82 | @@ -571,6 +571,7 @@ BFD64_BACKENDS = \ |
71 | elf64-riscv.lo \ | 83 | elf64-riscv.lo \ |
72 | elfxx-riscv.lo \ | 84 | elfxx-riscv.lo \ |
73 | elf64-s390.lo \ | 85 | elf64-s390.lo \ |
@@ -75,7 +87,7 @@ index d07c9605b6f..11bbf9a4e0d 100644 | |||
75 | elf64-sparc.lo \ | 87 | elf64-sparc.lo \ |
76 | elf64-tilegx.lo \ | 88 | elf64-tilegx.lo \ |
77 | elf64-x86-64.lo \ | 89 | elf64-x86-64.lo \ |
78 | @@ -592,6 +593,7 @@ BFD64_BACKENDS_CFILES = \ | 90 | @@ -608,6 +609,7 @@ BFD64_BACKENDS_CFILES = \ |
79 | elf64-nfp.c \ | 91 | elf64-nfp.c \ |
80 | elf64-ppc.c \ | 92 | elf64-ppc.c \ |
81 | elf64-s390.c \ | 93 | elf64-s390.c \ |
@@ -84,10 +96,10 @@ index d07c9605b6f..11bbf9a4e0d 100644 | |||
84 | elf64-tilegx.c \ | 96 | elf64-tilegx.c \ |
85 | elf64-x86-64.c \ | 97 | elf64-x86-64.c \ |
86 | diff --git a/bfd/Makefile.in b/bfd/Makefile.in | 98 | diff --git a/bfd/Makefile.in b/bfd/Makefile.in |
87 | index 9cad4da6f8f..72745bb62b1 100644 | 99 | index 934dd4bc066..7efb10f111d 100644 |
88 | --- a/bfd/Makefile.in | 100 | --- a/bfd/Makefile.in |
89 | +++ b/bfd/Makefile.in | 101 | +++ b/bfd/Makefile.in |
90 | @@ -985,6 +985,7 @@ BFD64_BACKENDS = \ | 102 | @@ -1040,6 +1040,7 @@ BFD64_BACKENDS = \ |
91 | elf64-riscv.lo \ | 103 | elf64-riscv.lo \ |
92 | elfxx-riscv.lo \ | 104 | elfxx-riscv.lo \ |
93 | elf64-s390.lo \ | 105 | elf64-s390.lo \ |
@@ -95,7 +107,7 @@ index 9cad4da6f8f..72745bb62b1 100644 | |||
95 | elf64-sparc.lo \ | 107 | elf64-sparc.lo \ |
96 | elf64-tilegx.lo \ | 108 | elf64-tilegx.lo \ |
97 | elf64-x86-64.lo \ | 109 | elf64-x86-64.lo \ |
98 | @@ -1019,6 +1020,7 @@ BFD64_BACKENDS_CFILES = \ | 110 | @@ -1077,6 +1078,7 @@ BFD64_BACKENDS_CFILES = \ |
99 | elf64-nfp.c \ | 111 | elf64-nfp.c \ |
100 | elf64-ppc.c \ | 112 | elf64-ppc.c \ |
101 | elf64-s390.c \ | 113 | elf64-s390.c \ |
@@ -103,7 +115,7 @@ index 9cad4da6f8f..72745bb62b1 100644 | |||
103 | elf64-sparc.c \ | 115 | elf64-sparc.c \ |
104 | elf64-tilegx.c \ | 116 | elf64-tilegx.c \ |
105 | elf64-x86-64.c \ | 117 | elf64-x86-64.c \ |
106 | @@ -1498,6 +1500,7 @@ distclean-compile: | 118 | @@ -1664,6 +1666,7 @@ distclean-compile: |
107 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-ppc.Plo@am__quote@ | 119 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-ppc.Plo@am__quote@ |
108 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-riscv.Plo@am__quote@ | 120 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-riscv.Plo@am__quote@ |
109 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-s390.Plo@am__quote@ | 121 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-s390.Plo@am__quote@ |
@@ -112,10 +124,10 @@ index 9cad4da6f8f..72745bb62b1 100644 | |||
112 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-tilegx.Plo@am__quote@ | 124 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-tilegx.Plo@am__quote@ |
113 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-x86-64.Plo@am__quote@ | 125 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-x86-64.Plo@am__quote@ |
114 | diff --git a/bfd/archures.c b/bfd/archures.c | 126 | diff --git a/bfd/archures.c b/bfd/archures.c |
115 | index 50698648d6a..7ebae017347 100644 | 127 | index fac9fe82a08..1790c741c58 100644 |
116 | --- a/bfd/archures.c | 128 | --- a/bfd/archures.c |
117 | +++ b/bfd/archures.c | 129 | +++ b/bfd/archures.c |
118 | @@ -523,6 +523,8 @@ DESCRIPTION | 130 | @@ -524,6 +524,8 @@ DESCRIPTION |
119 | . bfd_arch_lm32, {* Lattice Mico32. *} | 131 | . bfd_arch_lm32, {* Lattice Mico32. *} |
120 | .#define bfd_mach_lm32 1 | 132 | .#define bfd_mach_lm32 1 |
121 | . bfd_arch_microblaze,{* Xilinx MicroBlaze. *} | 133 | . bfd_arch_microblaze,{* Xilinx MicroBlaze. *} |
@@ -125,10 +137,10 @@ index 50698648d6a..7ebae017347 100644 | |||
125 | . bfd_arch_tilegx, {* Tilera TILE-Gx. *} | 137 | . bfd_arch_tilegx, {* Tilera TILE-Gx. *} |
126 | .#define bfd_mach_tilepro 1 | 138 | .#define bfd_mach_tilepro 1 |
127 | diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h | 139 | diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h |
128 | index 935ba535b54..b9f98fb5f40 100644 | 140 | index c0b563aec02..ccaeecb9476 100644 |
129 | --- a/bfd/bfd-in2.h | 141 | --- a/bfd/bfd-in2.h |
130 | +++ b/bfd/bfd-in2.h | 142 | +++ b/bfd/bfd-in2.h |
131 | @@ -1923,6 +1923,8 @@ enum bfd_architecture | 143 | @@ -1903,6 +1903,8 @@ enum bfd_architecture |
132 | bfd_arch_lm32, /* Lattice Mico32. */ | 144 | bfd_arch_lm32, /* Lattice Mico32. */ |
133 | #define bfd_mach_lm32 1 | 145 | #define bfd_mach_lm32 1 |
134 | bfd_arch_microblaze,/* Xilinx MicroBlaze. */ | 146 | bfd_arch_microblaze,/* Xilinx MicroBlaze. */ |
@@ -137,7 +149,7 @@ index 935ba535b54..b9f98fb5f40 100644 | |||
137 | bfd_arch_tilepro, /* Tilera TILEPro. */ | 149 | bfd_arch_tilepro, /* Tilera TILEPro. */ |
138 | bfd_arch_tilegx, /* Tilera TILE-Gx. */ | 150 | bfd_arch_tilegx, /* Tilera TILE-Gx. */ |
139 | #define bfd_mach_tilepro 1 | 151 | #define bfd_mach_tilepro 1 |
140 | @@ -5433,16 +5435,41 @@ value relative to the read-write small data area anchor */ | 152 | @@ -5443,16 +5445,41 @@ value relative to the read-write small data area anchor */ |
141 | expressions of the form "Symbol Op Symbol" */ | 153 | expressions of the form "Symbol Op Symbol" */ |
142 | BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM, | 154 | BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM, |
143 | 155 | ||
@@ -182,10 +194,10 @@ index 935ba535b54..b9f98fb5f40 100644 | |||
182 | value in two words (with an imm instruction). The relocation is | 194 | value in two words (with an imm instruction). The relocation is |
183 | GOT offset */ | 195 | GOT offset */ |
184 | diff --git a/bfd/config.bfd b/bfd/config.bfd | 196 | diff --git a/bfd/config.bfd b/bfd/config.bfd |
185 | index 6c2919e47eb..0f752de267b 100644 | 197 | index 872685cfb72..5e9ba3d9805 100644 |
186 | --- a/bfd/config.bfd | 198 | --- a/bfd/config.bfd |
187 | +++ b/bfd/config.bfd | 199 | +++ b/bfd/config.bfd |
188 | @@ -827,11 +827,15 @@ case "${targ}" in | 200 | @@ -860,11 +860,15 @@ case "${targ}" in |
189 | microblazeel*-*) | 201 | microblazeel*-*) |
190 | targ_defvec=microblaze_elf32_le_vec | 202 | targ_defvec=microblaze_elf32_le_vec |
191 | targ_selvecs=microblaze_elf32_vec | 203 | targ_selvecs=microblaze_elf32_vec |
@@ -202,10 +214,10 @@ index 6c2919e47eb..0f752de267b 100644 | |||
202 | 214 | ||
203 | #ifdef BFD64 | 215 | #ifdef BFD64 |
204 | diff --git a/bfd/configure b/bfd/configure | 216 | diff --git a/bfd/configure b/bfd/configure |
205 | index a9c4fd93669..ea697865179 100755 | 217 | index 0ef4c206fb0..b7547c6777c 100755 |
206 | --- a/bfd/configure | 218 | --- a/bfd/configure |
207 | +++ b/bfd/configure | 219 | +++ b/bfd/configure |
208 | @@ -14928,6 +14928,8 @@ do | 220 | @@ -13547,6 +13547,8 @@ do |
209 | rx_elf32_linux_le_vec) tb="$tb elf32-rx.lo elf32.lo $elf" ;; | 221 | rx_elf32_linux_le_vec) tb="$tb elf32-rx.lo elf32.lo $elf" ;; |
210 | s390_elf32_vec) tb="$tb elf32-s390.lo elf32.lo $elf" ;; | 222 | s390_elf32_vec) tb="$tb elf32-s390.lo elf32.lo $elf" ;; |
211 | s390_elf64_vec) tb="$tb elf64-s390.lo elf64.lo $elf"; target_size=64 ;; | 223 | s390_elf64_vec) tb="$tb elf64-s390.lo elf64.lo $elf"; target_size=64 ;; |
@@ -215,7 +227,7 @@ index a9c4fd93669..ea697865179 100755 | |||
215 | score_elf32_le_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;; | 227 | score_elf32_le_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;; |
216 | sh_coff_vec) tb="$tb coff-sh.lo $coff" ;; | 228 | sh_coff_vec) tb="$tb coff-sh.lo $coff" ;; |
217 | diff --git a/bfd/cpu-microblaze.c b/bfd/cpu-microblaze.c | 229 | diff --git a/bfd/cpu-microblaze.c b/bfd/cpu-microblaze.c |
218 | index 05a3f767e22..749d4352c5b 100644 | 230 | index 0c1d2b1aa69..106f78229b5 100644 |
219 | --- a/bfd/cpu-microblaze.c | 231 | --- a/bfd/cpu-microblaze.c |
220 | +++ b/bfd/cpu-microblaze.c | 232 | +++ b/bfd/cpu-microblaze.c |
221 | @@ -23,13 +23,30 @@ | 233 | @@ -23,13 +23,30 @@ |
@@ -235,7 +247,7 @@ index 05a3f767e22..749d4352c5b 100644 | |||
235 | + "microblaze", /* Architecture name. */ | 247 | + "microblaze", /* Architecture name. */ |
236 | + "MicroBlaze", /* Printable name. */ | 248 | + "MicroBlaze", /* Printable name. */ |
237 | + 3, /* Section align power. */ | 249 | + 3, /* Section align power. */ |
238 | + FALSE, /* Is this the default architecture ? */ | 250 | + false, /* Is this the default architecture ? */ |
239 | + bfd_default_compatible, /* Architecture comparison function. */ | 251 | + bfd_default_compatible, /* Architecture comparison function. */ |
240 | + bfd_default_scan, /* String to architecture conversion. */ | 252 | + bfd_default_scan, /* String to architecture conversion. */ |
241 | + bfd_arch_default_fill, /* Default fill. */ | 253 | + bfd_arch_default_fill, /* Default fill. */ |
@@ -266,7 +278,7 @@ index 05a3f767e22..749d4352c5b 100644 | |||
266 | + "microblaze", /* Architecture name. */ | 278 | + "microblaze", /* Architecture name. */ |
267 | + "MicroBlaze", /* Printable name. */ | 279 | + "MicroBlaze", /* Printable name. */ |
268 | + 3, /* Section align power. */ | 280 | + 3, /* Section align power. */ |
269 | + TRUE, /* Is this the default architecture ? */ | 281 | + true, /* Is this the default architecture ? */ |
270 | + bfd_default_compatible, /* Architecture comparison function. */ | 282 | + bfd_default_compatible, /* Architecture comparison function. */ |
271 | + bfd_default_scan, /* String to architecture conversion. */ | 283 | + bfd_default_scan, /* String to architecture conversion. */ |
272 | + bfd_arch_default_fill, /* Default fill. */ | 284 | + bfd_arch_default_fill, /* Default fill. */ |
@@ -281,7 +293,7 @@ index 05a3f767e22..749d4352c5b 100644 | |||
281 | + "microblaze", /* Architecture name. */ | 293 | + "microblaze", /* Architecture name. */ |
282 | + "MicroBlaze", /* Printable name. */ | 294 | + "MicroBlaze", /* Printable name. */ |
283 | + 3, /* Section align power. */ | 295 | + 3, /* Section align power. */ |
284 | + FALSE, /* Is this the default architecture ? */ | 296 | + false, /* Is this the default architecture ? */ |
285 | + bfd_default_compatible, /* Architecture comparison function. */ | 297 | + bfd_default_compatible, /* Architecture comparison function. */ |
286 | + bfd_default_scan, /* String to architecture conversion. */ | 298 | + bfd_default_scan, /* String to architecture conversion. */ |
287 | + bfd_arch_default_fill, /* Default fill. */ | 299 | + bfd_arch_default_fill, /* Default fill. */ |
@@ -291,76 +303,76 @@ index 05a3f767e22..749d4352c5b 100644 | |||
291 | +#endif | 303 | +#endif |
292 | }; | 304 | }; |
293 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c | 305 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c |
294 | index cfd70ae9178..9f9e13467d2 100644 | 306 | index d3b3c66cf00..053c1b432f9 100644 |
295 | --- a/bfd/elf32-microblaze.c | 307 | --- a/bfd/elf32-microblaze.c |
296 | +++ b/bfd/elf32-microblaze.c | 308 | +++ b/bfd/elf32-microblaze.c |
297 | @@ -116,6 +116,20 @@ static reloc_howto_type microblaze_elf_howto_raw[] = | 309 | @@ -114,6 +114,20 @@ static reloc_howto_type microblaze_elf_howto_raw[] = |
298 | 0x0000ffff, /* Dest Mask. */ | 310 | 0x0000ffff, /* Dest Mask. */ |
299 | TRUE), /* PC relative offset? */ | 311 | true), /* PC relative offset? */ |
300 | 312 | ||
301 | + HOWTO (R_MICROBLAZE_IMML_64, /* Type. */ | 313 | + HOWTO (R_MICROBLAZE_IMML_64, /* Type. */ |
302 | + 0, /* Rightshift. */ | 314 | + 0, /* Rightshift. */ |
303 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 315 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
304 | + 16, /* Bitsize. */ | 316 | + 16, /* Bitsize. */ |
305 | + TRUE, /* PC_relative. */ | 317 | + true, /* PC_relative. */ |
306 | + 0, /* Bitpos. */ | 318 | + 0, /* Bitpos. */ |
307 | + complain_overflow_dont, /* Complain on overflow. */ | 319 | + complain_overflow_dont, /* Complain on overflow. */ |
308 | + bfd_elf_generic_reloc,/* Special Function. */ | 320 | + bfd_elf_generic_reloc,/* Special Function. */ |
309 | + "R_MICROBLAZE_IMML_64", /* Name. */ | 321 | + "R_MICROBLAZE_IMML_64", /* Name. */ |
310 | + FALSE, /* Partial Inplace. */ | 322 | + false, /* Partial Inplace. */ |
311 | + 0, /* Source Mask. */ | 323 | + 0, /* Source Mask. */ |
312 | + 0x0000ffff, /* Dest Mask. */ | 324 | + 0x0000ffff, /* Dest Mask. */ |
313 | + FALSE), /* PC relative offset? */ | 325 | + false), /* PC relative offset? */ |
314 | + | 326 | + |
315 | /* A 64 bit relocation. Table entry not really used. */ | 327 | /* A 64 bit relocation. Table entry not really used. */ |
316 | HOWTO (R_MICROBLAZE_64, /* Type. */ | 328 | HOWTO (R_MICROBLAZE_64, /* Type. */ |
317 | 0, /* Rightshift. */ | 329 | 0, /* Rightshift. */ |
318 | @@ -176,7 +190,21 @@ static reloc_howto_type microblaze_elf_howto_raw[] = | 330 | @@ -174,7 +188,21 @@ static reloc_howto_type microblaze_elf_howto_raw[] = |
319 | 0x0000ffff, /* Dest Mask. */ | 331 | 0x0000ffff, /* Dest Mask. */ |
320 | FALSE), /* PC relative offset? */ | 332 | false), /* PC relative offset? */ |
321 | 333 | ||
322 | - /* This reloc does nothing. Used for relaxation. */ | 334 | - /* This reloc does nothing. Used for relaxation. */ |
323 | + HOWTO (R_MICROBLAZE_32_NONE, /* Type. */ | 335 | + HOWTO (R_MICROBLAZE_32_NONE, /* Type. */ |
324 | + 0, /* Rightshift. */ | 336 | + 0, /* Rightshift. */ |
325 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 337 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
326 | + 32, /* Bitsize. */ | 338 | + 32, /* Bitsize. */ |
327 | + TRUE, /* PC_relative. */ | 339 | + true, /* PC_relative. */ |
328 | + 0, /* Bitpos. */ | 340 | + 0, /* Bitpos. */ |
329 | + complain_overflow_bitfield, /* Complain on overflow. */ | 341 | + complain_overflow_bitfield, /* Complain on overflow. */ |
330 | + NULL, /* Special Function. */ | 342 | + NULL, /* Special Function. */ |
331 | + "R_MICROBLAZE_32_NONE",/* Name. */ | 343 | + "R_MICROBLAZE_32_NONE",/* Name. */ |
332 | + FALSE, /* Partial Inplace. */ | 344 | + false, /* Partial Inplace. */ |
333 | + 0, /* Source Mask. */ | 345 | + 0, /* Source Mask. */ |
334 | + 0, /* Dest Mask. */ | 346 | + 0, /* Dest Mask. */ |
335 | + FALSE), /* PC relative offset? */ | 347 | + false), /* PC relative offset? */ |
336 | + | 348 | + |
337 | + /* This reloc does nothing. Used for relaxation. */ | 349 | + /* This reloc does nothing. Used for relaxation. */ |
338 | HOWTO (R_MICROBLAZE_64_NONE, /* Type. */ | 350 | HOWTO (R_MICROBLAZE_64_NONE, /* Type. */ |
339 | 0, /* Rightshift. */ | 351 | 0, /* Rightshift. */ |
340 | 3, /* Size (0 = byte, 1 = short, 2 = long). */ | 352 | 3, /* Size (0 = byte, 1 = short, 2 = long). */ |
341 | @@ -266,6 +294,21 @@ static reloc_howto_type microblaze_elf_howto_raw[] = | 353 | @@ -264,6 +292,21 @@ static reloc_howto_type microblaze_elf_howto_raw[] = |
342 | 0x0000ffff, /* Dest Mask. */ | 354 | 0x0000ffff, /* Dest Mask. */ |
343 | TRUE), /* PC relative offset? */ | 355 | true), /* PC relative offset? */ |
344 | 356 | ||
345 | + /* A 64 bit GOTPC relocation. Table-entry not really used. */ | 357 | + /* A 64 bit GOTPC relocation. Table-entry not really used. */ |
346 | + HOWTO (R_MICROBLAZE_GPC_64, /* Type. */ | 358 | + HOWTO (R_MICROBLAZE_GPC_64, /* Type. */ |
347 | + 0, /* Rightshift. */ | 359 | + 0, /* Rightshift. */ |
348 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 360 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
349 | + 16, /* Bitsize. */ | 361 | + 16, /* Bitsize. */ |
350 | + TRUE, /* PC_relative. */ | 362 | + true, /* PC_relative. */ |
351 | + 0, /* Bitpos. */ | 363 | + 0, /* Bitpos. */ |
352 | + complain_overflow_dont, /* Complain on overflow. */ | 364 | + complain_overflow_dont, /* Complain on overflow. */ |
353 | + bfd_elf_generic_reloc, /* Special Function. */ | 365 | + bfd_elf_generic_reloc, /* Special Function. */ |
354 | + "R_MICROBLAZE_GPC_64", /* Name. */ | 366 | + "R_MICROBLAZE_GPC_64", /* Name. */ |
355 | + FALSE, /* Partial Inplace. */ | 367 | + false, /* Partial Inplace. */ |
356 | + 0, /* Source Mask. */ | 368 | + 0, /* Source Mask. */ |
357 | + 0x0000ffff, /* Dest Mask. */ | 369 | + 0x0000ffff, /* Dest Mask. */ |
358 | + TRUE), /* PC relative offset? */ | 370 | + true), /* PC relative offset? */ |
359 | + | 371 | + |
360 | /* A 64 bit GOT relocation. Table-entry not really used. */ | 372 | /* A 64 bit GOT relocation. Table-entry not really used. */ |
361 | HOWTO (R_MICROBLAZE_GOT_64, /* Type. */ | 373 | HOWTO (R_MICROBLAZE_GOT_64, /* Type. */ |
362 | 0, /* Rightshift. */ | 374 | 0, /* Rightshift. */ |
363 | @@ -562,6 +605,9 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, | 375 | @@ -560,6 +603,9 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, |
364 | case BFD_RELOC_NONE: | 376 | case BFD_RELOC_NONE: |
365 | microblaze_reloc = R_MICROBLAZE_NONE; | 377 | microblaze_reloc = R_MICROBLAZE_NONE; |
366 | break; | 378 | break; |
@@ -370,7 +382,7 @@ index cfd70ae9178..9f9e13467d2 100644 | |||
370 | case BFD_RELOC_MICROBLAZE_64_NONE: | 382 | case BFD_RELOC_MICROBLAZE_64_NONE: |
371 | microblaze_reloc = R_MICROBLAZE_64_NONE; | 383 | microblaze_reloc = R_MICROBLAZE_64_NONE; |
372 | break; | 384 | break; |
373 | @@ -602,9 +648,15 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, | 385 | @@ -600,9 +646,15 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, |
374 | case BFD_RELOC_VTABLE_ENTRY: | 386 | case BFD_RELOC_VTABLE_ENTRY: |
375 | microblaze_reloc = R_MICROBLAZE_GNU_VTENTRY; | 387 | microblaze_reloc = R_MICROBLAZE_GNU_VTENTRY; |
376 | break; | 388 | break; |
@@ -386,95 +398,7 @@ index cfd70ae9178..9f9e13467d2 100644 | |||
386 | case BFD_RELOC_MICROBLAZE_64_GOT: | 398 | case BFD_RELOC_MICROBLAZE_64_GOT: |
387 | microblaze_reloc = R_MICROBLAZE_GOT_64; | 399 | microblaze_reloc = R_MICROBLAZE_GOT_64; |
388 | break; | 400 | break; |
389 | @@ -715,87 +767,6 @@ microblaze_elf_is_local_label_name (bfd *abfd, const char *name) | 401 | @@ -1507,9 +1559,9 @@ microblaze_elf_relocate_section (bfd *output_bfd, |
390 | return _bfd_elf_is_local_label_name (abfd, name); | ||
391 | } | ||
392 | |||
393 | -/* Support for core dump NOTE sections. */ | ||
394 | -static bfd_boolean | ||
395 | -microblaze_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) | ||
396 | -{ | ||
397 | - int offset; | ||
398 | - unsigned int size; | ||
399 | - | ||
400 | - switch (note->descsz) | ||
401 | - { | ||
402 | - default: | ||
403 | - return FALSE; | ||
404 | - | ||
405 | - case 228: /* Linux/MicroBlaze */ | ||
406 | - /* pr_cursig */ | ||
407 | - elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12); | ||
408 | - | ||
409 | - /* pr_pid */ | ||
410 | - elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24); | ||
411 | - | ||
412 | - /* pr_reg */ | ||
413 | - offset = 72; | ||
414 | - size = 50 * 4; | ||
415 | - | ||
416 | - break; | ||
417 | - } | ||
418 | - | ||
419 | - /* Make a ".reg/999" section. */ | ||
420 | - return _bfd_elfcore_make_pseudosection (abfd, ".reg", | ||
421 | - size, note->descpos + offset); | ||
422 | -} | ||
423 | - | ||
424 | -static bfd_boolean | ||
425 | -microblaze_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) | ||
426 | -{ | ||
427 | - switch (note->descsz) | ||
428 | - { | ||
429 | - default: | ||
430 | - return FALSE; | ||
431 | - | ||
432 | - case 128: /* Linux/MicroBlaze elf_prpsinfo */ | ||
433 | - elf_tdata (abfd)->core->program | ||
434 | - = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16); | ||
435 | - elf_tdata (abfd)->core->command | ||
436 | - = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80); | ||
437 | - } | ||
438 | - | ||
439 | - /* Note that for some reason, a spurious space is tacked | ||
440 | - onto the end of the args in some (at least one anyway) | ||
441 | - implementations, so strip it off if it exists. */ | ||
442 | - | ||
443 | - { | ||
444 | - char *command = elf_tdata (abfd)->core->command; | ||
445 | - int n = strlen (command); | ||
446 | - | ||
447 | - if (0 < n && command[n - 1] == ' ') | ||
448 | - command[n - 1] = '\0'; | ||
449 | - } | ||
450 | - | ||
451 | - return TRUE; | ||
452 | -} | ||
453 | - | ||
454 | -/* The microblaze linker (like many others) needs to keep track of | ||
455 | - the number of relocs that it decides to copy as dynamic relocs in | ||
456 | - check_relocs for each symbol. This is so that it can later discard | ||
457 | - them if they are found to be unnecessary. We store the information | ||
458 | - in a field extending the regular ELF linker hash table. */ | ||
459 | - | ||
460 | -struct elf32_mb_dyn_relocs | ||
461 | -{ | ||
462 | - struct elf32_mb_dyn_relocs *next; | ||
463 | - | ||
464 | - /* The input section of the reloc. */ | ||
465 | - asection *sec; | ||
466 | - | ||
467 | - /* Total number of relocs copied for the input section. */ | ||
468 | - bfd_size_type count; | ||
469 | - | ||
470 | - /* Number of pc-relative relocs copied for the input section. */ | ||
471 | - bfd_size_type pc_count; | ||
472 | -}; | ||
473 | - | ||
474 | /* ELF linker hash entry. */ | ||
475 | |||
476 | struct elf32_mb_link_hash_entry | ||
477 | @@ -1509,9 +1480,9 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
478 | relocation += addend; | 402 | relocation += addend; |
479 | relocation -= dtprel_base(info); | 403 | relocation -= dtprel_base(info); |
480 | bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | 404 | bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, |
@@ -486,7 +410,7 @@ index cfd70ae9178..9f9e13467d2 100644 | |||
486 | break; | 410 | break; |
487 | case (int) R_MICROBLAZE_TEXTREL_64: | 411 | case (int) R_MICROBLAZE_TEXTREL_64: |
488 | case (int) R_MICROBLAZE_TEXTREL_32_LO: | 412 | case (int) R_MICROBLAZE_TEXTREL_32_LO: |
489 | @@ -1525,7 +1496,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, | 413 | @@ -1523,7 +1575,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, |
490 | if (r_symndx == STN_UNDEF || (input_section->flags & SEC_ALLOC) == 0) | 414 | if (r_symndx == STN_UNDEF || (input_section->flags & SEC_ALLOC) == 0) |
491 | { | 415 | { |
492 | relocation += addend; | 416 | relocation += addend; |
@@ -495,7 +419,7 @@ index cfd70ae9178..9f9e13467d2 100644 | |||
495 | bfd_put_32 (input_bfd, relocation, contents + offset); | 419 | bfd_put_32 (input_bfd, relocation, contents + offset); |
496 | else | 420 | else |
497 | { | 421 | { |
498 | @@ -1927,8 +1898,7 @@ microblaze_elf_relax_section (bfd *abfd, | 422 | @@ -1925,8 +1977,7 @@ microblaze_elf_relax_section (bfd *abfd, |
499 | else | 423 | else |
500 | symval += irel->r_addend; | 424 | symval += irel->r_addend; |
501 | 425 | ||
@@ -505,7 +429,7 @@ index cfd70ae9178..9f9e13467d2 100644 | |||
505 | { | 429 | { |
506 | /* We can delete this instruction. */ | 430 | /* We can delete this instruction. */ |
507 | sec->relax[sec->relax_count].addr = irel->r_offset; | 431 | sec->relax[sec->relax_count].addr = irel->r_offset; |
508 | @@ -1992,21 +1962,51 @@ microblaze_elf_relax_section (bfd *abfd, | 432 | @@ -1990,21 +2041,51 @@ microblaze_elf_relax_section (bfd *abfd, |
509 | irel->r_addend -= calc_fixup (irel->r_addend, 0, sec); | 433 | irel->r_addend -= calc_fixup (irel->r_addend, 0, sec); |
510 | } | 434 | } |
511 | break; | 435 | break; |
@@ -559,7 +483,7 @@ index cfd70ae9178..9f9e13467d2 100644 | |||
559 | case R_MICROBLAZE_64_NONE: | 483 | case R_MICROBLAZE_64_NONE: |
560 | { | 484 | { |
561 | /* This was a PC-relative 64-bit instruction that was | 485 | /* This was a PC-relative 64-bit instruction that was |
562 | @@ -2017,8 +2017,8 @@ microblaze_elf_relax_section (bfd *abfd, | 486 | @@ -2015,8 +2096,8 @@ microblaze_elf_relax_section (bfd *abfd, |
563 | sfix = calc_fixup (irel->r_offset + INST_WORD_SIZE, 0, sec); | 487 | sfix = calc_fixup (irel->r_offset + INST_WORD_SIZE, 0, sec); |
564 | efix = calc_fixup (target_address, 0, sec); | 488 | efix = calc_fixup (target_address, 0, sec); |
565 | irel->r_addend -= (efix - sfix); | 489 | irel->r_addend -= (efix - sfix); |
@@ -570,7 +494,7 @@ index cfd70ae9178..9f9e13467d2 100644 | |||
570 | } | 494 | } |
571 | break; | 495 | break; |
572 | } | 496 | } |
573 | @@ -2048,9 +2048,50 @@ microblaze_elf_relax_section (bfd *abfd, | 497 | @@ -2046,9 +2127,50 @@ microblaze_elf_relax_section (bfd *abfd, |
574 | irelscanend = irelocs + o->reloc_count; | 498 | irelscanend = irelocs + o->reloc_count; |
575 | for (irelscan = irelocs; irelscan < irelscanend; irelscan++) | 499 | for (irelscan = irelocs; irelscan < irelscanend; irelscan++) |
576 | { | 500 | { |
@@ -624,7 +548,7 @@ index cfd70ae9178..9f9e13467d2 100644 | |||
624 | 548 | ||
625 | /* Look at the reloc only if the value has been resolved. */ | 549 | /* Look at the reloc only if the value has been resolved. */ |
626 | if (isym->st_shndx == shndx | 550 | if (isym->st_shndx == shndx |
627 | @@ -2107,7 +2148,7 @@ microblaze_elf_relax_section (bfd *abfd, | 551 | @@ -2105,7 +2227,7 @@ microblaze_elf_relax_section (bfd *abfd, |
628 | elf_section_data (o)->this_hdr.contents = ocontents; | 552 | elf_section_data (o)->this_hdr.contents = ocontents; |
629 | } | 553 | } |
630 | } | 554 | } |
@@ -633,12 +557,12 @@ index cfd70ae9178..9f9e13467d2 100644 | |||
633 | + isym->st_value, | 557 | + isym->st_value, |
634 | 0, | 558 | 0, |
635 | sec); | 559 | sec); |
636 | @@ -3461,6 +3502,14 @@ microblaze_elf_finish_dynamic_sections (bfd *output_bfd, | 560 | @@ -3445,6 +3567,14 @@ microblaze_elf_finish_dynamic_sections (bfd *output_bfd, |
637 | return TRUE; | 561 | return true; |
638 | } | 562 | } |
639 | 563 | ||
640 | + | 564 | + |
641 | +static bfd_boolean | 565 | +static bool |
642 | +elf_microblaze_object_p (bfd *abfd) | 566 | +elf_microblaze_object_p (bfd *abfd) |
643 | +{ | 567 | +{ |
644 | + /* Set the right machine number for an s390 elf32 file. */ | 568 | + /* Set the right machine number for an s390 elf32 file. */ |
@@ -648,7 +572,7 @@ index cfd70ae9178..9f9e13467d2 100644 | |||
648 | /* Hook called by the linker routine which adds symbols from an object | 572 | /* Hook called by the linker routine which adds symbols from an object |
649 | file. We use it to put .comm items in .sbss, and not .bss. */ | 573 | file. We use it to put .comm items in .sbss, and not .bss. */ |
650 | 574 | ||
651 | @@ -3530,8 +3579,6 @@ microblaze_elf_add_symbol_hook (bfd *abfd, | 575 | @@ -3514,8 +3644,6 @@ microblaze_elf_add_symbol_hook (bfd *abfd, |
652 | #define elf_backend_finish_dynamic_symbol microblaze_elf_finish_dynamic_symbol | 576 | #define elf_backend_finish_dynamic_symbol microblaze_elf_finish_dynamic_symbol |
653 | #define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections | 577 | #define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections |
654 | #define elf_backend_add_symbol_hook microblaze_elf_add_symbol_hook | 578 | #define elf_backend_add_symbol_hook microblaze_elf_add_symbol_hook |
@@ -660,13 +584,13 @@ index cfd70ae9178..9f9e13467d2 100644 | |||
660 | #include "elf32-target.h" | 584 | #include "elf32-target.h" |
661 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c | 585 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c |
662 | new file mode 100755 | 586 | new file mode 100755 |
663 | index 00000000000..bf58b4b0a67 | 587 | index 00000000000..6cd9753a592 |
664 | --- /dev/null | 588 | --- /dev/null |
665 | +++ b/bfd/elf64-microblaze.c | 589 | +++ b/bfd/elf64-microblaze.c |
666 | @@ -0,0 +1,3711 @@ | 590 | @@ -0,0 +1,3810 @@ |
667 | +/* Xilinx MicroBlaze-specific support for 32-bit ELF | 591 | +/* Xilinx MicroBlaze-specific support for 32-bit ELF |
668 | + | 592 | + |
669 | + Copyright (C) 2009-2016 Free Software Foundation, Inc. | 593 | + Copyright (C) 2009-2021 Free Software Foundation, Inc. |
670 | + | 594 | + |
671 | + This file is part of BFD, the Binary File Descriptor library. | 595 | + This file is part of BFD, the Binary File Descriptor library. |
672 | + | 596 | + |
@@ -686,8 +610,6 @@ index 00000000000..bf58b4b0a67 | |||
686 | + Boston, MA 02110-1301, USA. */ | 610 | + Boston, MA 02110-1301, USA. */ |
687 | + | 611 | + |
688 | + | 612 | + |
689 | +int dbg1 = 0; | ||
690 | + | ||
691 | +#include "sysdep.h" | 613 | +#include "sysdep.h" |
692 | +#include "bfd.h" | 614 | +#include "bfd.h" |
693 | +#include "bfdlink.h" | 615 | +#include "bfdlink.h" |
@@ -709,420 +631,450 @@ index 00000000000..bf58b4b0a67 | |||
709 | +{ | 631 | +{ |
710 | + /* This reloc does nothing. */ | 632 | + /* This reloc does nothing. */ |
711 | + HOWTO (R_MICROBLAZE_NONE, /* Type. */ | 633 | + HOWTO (R_MICROBLAZE_NONE, /* Type. */ |
712 | + 0, /* Rightshift. */ | 634 | + 0, /* Rightshift. */ |
713 | + 3, /* Size (0 = byte, 1 = short, 2 = long). */ | 635 | + 0, /* Size. */ |
714 | + 0, /* Bitsize. */ | 636 | + 0, /* Bitsize. */ |
715 | + FALSE, /* PC_relative. */ | 637 | + false, /* PC_relative. */ |
716 | + 0, /* Bitpos. */ | 638 | + 0, /* Bitpos. */ |
717 | + complain_overflow_dont, /* Complain on overflow. */ | 639 | + complain_overflow_dont, /* Complain on overflow. */ |
718 | + NULL, /* Special Function. */ | 640 | + NULL, /* Special Function. */ |
719 | + "R_MICROBLAZE_NONE", /* Name. */ | 641 | + "R_MICROBLAZE_NONE", /* Name. */ |
720 | + FALSE, /* Partial Inplace. */ | 642 | + false, /* Partial Inplace. */ |
721 | + 0, /* Source Mask. */ | 643 | + 0, /* Source Mask. */ |
722 | + 0, /* Dest Mask. */ | 644 | + 0, /* Dest Mask. */ |
723 | + FALSE), /* PC relative offset? */ | 645 | + false), /* PC relative offset? */ |
724 | + | 646 | + |
725 | + /* A standard 32 bit relocation. */ | 647 | + /* A standard 32 bit relocation. */ |
726 | + HOWTO (R_MICROBLAZE_32, /* Type. */ | 648 | + HOWTO (R_MICROBLAZE_32, /* Type. */ |
727 | + 0, /* Rightshift. */ | 649 | + 0, /* Rightshift. */ |
728 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 650 | + 4, /* Size. */ |
729 | + 32, /* Bitsize. */ | 651 | + 32, /* Bitsize. */ |
730 | + FALSE, /* PC_relative. */ | 652 | + false, /* PC_relative. */ |
731 | + 0, /* Bitpos. */ | 653 | + 0, /* Bitpos. */ |
732 | + complain_overflow_bitfield, /* Complain on overflow. */ | 654 | + complain_overflow_bitfield, /* Complain on overflow. */ |
733 | + bfd_elf_generic_reloc,/* Special Function. */ | 655 | + bfd_elf_generic_reloc,/* Special Function. */ |
734 | + "R_MICROBLAZE_32", /* Name. */ | 656 | + "R_MICROBLAZE_32", /* Name. */ |
735 | + FALSE, /* Partial Inplace. */ | 657 | + false, /* Partial Inplace. */ |
736 | + 0, /* Source Mask. */ | 658 | + 0, /* Source Mask. */ |
737 | + 0xffffffff, /* Dest Mask. */ | 659 | + 0xffffffff, /* Dest Mask. */ |
738 | + FALSE), /* PC relative offset? */ | 660 | + false), /* PC relative offset? */ |
739 | + | 661 | + |
740 | + /* A standard PCREL 32 bit relocation. */ | 662 | + /* A standard PCREL 32 bit relocation. */ |
741 | + HOWTO (R_MICROBLAZE_32_PCREL,/* Type. */ | 663 | + HOWTO (R_MICROBLAZE_32_PCREL,/* Type. */ |
742 | + 0, /* Rightshift. */ | 664 | + 0, /* Rightshift. */ |
743 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 665 | + 4, /* Size. */ |
744 | + 32, /* Bitsize. */ | 666 | + 32, /* Bitsize. */ |
745 | + TRUE, /* PC_relative. */ | 667 | + true, /* PC_relative. */ |
746 | + 0, /* Bitpos. */ | 668 | + 0, /* Bitpos. */ |
747 | + complain_overflow_bitfield, /* Complain on overflow. */ | 669 | + complain_overflow_bitfield, /* Complain on overflow. */ |
748 | + bfd_elf_generic_reloc,/* Special Function. */ | 670 | + bfd_elf_generic_reloc,/* Special Function. */ |
749 | + "R_MICROBLAZE_32_PCREL", /* Name. */ | 671 | + "R_MICROBLAZE_32_PCREL", /* Name. */ |
750 | + TRUE, /* Partial Inplace. */ | 672 | + true, /* Partial Inplace. */ |
751 | + 0, /* Source Mask. */ | 673 | + 0, /* Source Mask. */ |
752 | + 0xffffffff, /* Dest Mask. */ | 674 | + 0xffffffff, /* Dest Mask. */ |
753 | + TRUE), /* PC relative offset? */ | 675 | + true), /* PC relative offset? */ |
754 | + | 676 | + |
755 | + /* A 64 bit PCREL relocation. Table-entry not really used. */ | 677 | + /* A 64 bit PCREL relocation. Table-entry not really used. */ |
756 | + HOWTO (R_MICROBLAZE_64_PCREL,/* Type. */ | 678 | + HOWTO (R_MICROBLAZE_64_PCREL,/* Type. */ |
757 | + 0, /* Rightshift. */ | 679 | + 0, /* Rightshift. */ |
758 | + 4, /* Size (0 = byte, 1 = short, 2 = long). */ | 680 | + 4, /* Size. */ |
759 | + 64, /* Bitsize. */ | 681 | + 16, /* Bitsize. */ |
760 | + TRUE, /* PC_relative. */ | 682 | + true, /* PC_relative. */ |
761 | + 0, /* Bitpos. */ | 683 | + 0, /* Bitpos. */ |
762 | + complain_overflow_dont, /* Complain on overflow. */ | 684 | + complain_overflow_dont, /* Complain on overflow. */ |
763 | + bfd_elf_generic_reloc,/* Special Function. */ | 685 | + bfd_elf_generic_reloc,/* Special Function. */ |
764 | + "R_MICROBLAZE_64_PCREL", /* Name. */ | 686 | + "R_MICROBLAZE_64_PCREL", /* Name. */ |
765 | + FALSE, /* Partial Inplace. */ | 687 | + false, /* Partial Inplace. */ |
766 | + 0, /* Source Mask. */ | 688 | + 0, /* Source Mask. */ |
767 | + 0x0000ffff, /* Dest Mask. */ | 689 | + 0x0000ffff, /* Dest Mask. */ |
768 | + TRUE), /* PC relative offset? */ | 690 | + true), /* PC relative offset? */ |
769 | + | 691 | + |
770 | + /* The low half of a PCREL 32 bit relocation. */ | 692 | + /* The low half of a PCREL 32 bit relocation. */ |
771 | + HOWTO (R_MICROBLAZE_32_PCREL_LO, /* Type. */ | 693 | + HOWTO (R_MICROBLAZE_32_PCREL_LO, /* Type. */ |
772 | + 0, /* Rightshift. */ | 694 | + 0, /* Rightshift. */ |
773 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 695 | + 4, /* Size. */ |
774 | + 16, /* Bitsize. */ | 696 | + 16, /* Bitsize. */ |
775 | + TRUE, /* PC_relative. */ | 697 | + true, /* PC_relative. */ |
776 | + 0, /* Bitpos. */ | 698 | + 0, /* Bitpos. */ |
777 | + complain_overflow_signed, /* Complain on overflow. */ | 699 | + complain_overflow_signed, /* Complain on overflow. */ |
778 | + bfd_elf_generic_reloc, /* Special Function. */ | 700 | + bfd_elf_generic_reloc, /* Special Function. */ |
779 | + "R_MICROBLAZE_32_PCREL_LO", /* Name. */ | 701 | + "R_MICROBLAZE_32_PCREL_LO", /* Name. */ |
780 | + FALSE, /* Partial Inplace. */ | 702 | + false, /* Partial Inplace. */ |
781 | + 0, /* Source Mask. */ | 703 | + 0, /* Source Mask. */ |
782 | + 0x0000ffff, /* Dest Mask. */ | 704 | + 0x0000ffff, /* Dest Mask. */ |
783 | + TRUE), /* PC relative offset? */ | 705 | + true), /* PC relative offset? */ |
784 | + | 706 | + |
785 | + /* A 64 bit relocation. Table entry not really used. */ | ||
786 | + HOWTO (R_MICROBLAZE_IMML_64, /* Type. */ | 707 | + HOWTO (R_MICROBLAZE_IMML_64, /* Type. */ |
787 | + 0, /* Rightshift. */ | 708 | + 0, /* Rightshift. */ |
788 | + 4, /* Size (0 = byte, 1 = short, 2 = long). */ | 709 | + 4, /* Size (0 = byte, 1 = short, 2 = long). */ |
789 | + 64, /* Bitsize. */ | 710 | + 64, /* Bitsize. */ |
790 | + FALSE, /* PC_relative. */ | 711 | + false, /* PC_relative. */ |
791 | + 0, /* Bitpos. */ | 712 | + 0, /* Bitpos. */ |
792 | + complain_overflow_dont, /* Complain on overflow. */ | 713 | + complain_overflow_dont, /* Complain on overflow. */ |
793 | + bfd_elf_generic_reloc,/* Special Function. */ | 714 | + bfd_elf_generic_reloc,/* Special Function. */ |
794 | + "R_MICROBLAZE_IMML_64", /* Name. */ | 715 | + "R_MICROBLAZE_IMML_64", /* Name. */ |
795 | + FALSE, /* Partial Inplace. */ | 716 | + false, /* Partial Inplace. */ |
796 | + 0, /* Source Mask. */ | 717 | + 0, /* Source Mask. */ |
797 | + 0xffffffffffffff, /* Dest Mask. */ | 718 | + 0xffffffffffffff, /* Dest Mask. */ |
798 | + FALSE), /* PC relative offset? */ | 719 | + false), /* PC relative offset? */ |
799 | + | 720 | + |
800 | + /* A 64 bit relocation. Table entry not really used. */ | 721 | + /* A 64 bit relocation. Table entry not really used. */ |
801 | + HOWTO (R_MICROBLAZE_64, /* Type. */ | 722 | + HOWTO (R_MICROBLAZE_64, /* Type. */ |
802 | + 0, /* Rightshift. */ | 723 | + 0, /* Rightshift. */ |
803 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 724 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
804 | + 16, /* Bitsize. */ | 725 | + 16, /* Bitsize. */ |
805 | + FALSE, /* PC_relative. */ | 726 | + false, /* PC_relative. */ |
806 | + 0, /* Bitpos. */ | 727 | + 0, /* Bitpos. */ |
807 | + complain_overflow_dont, /* Complain on overflow. */ | 728 | + complain_overflow_dont, /* Complain on overflow. */ |
808 | + bfd_elf_generic_reloc,/* Special Function. */ | 729 | + bfd_elf_generic_reloc,/* Special Function. */ |
809 | + "R_MICROBLAZE_64", /* Name. */ | 730 | + "R_MICROBLAZE_64", /* Name. */ |
810 | + FALSE, /* Partial Inplace. */ | 731 | + false, /* Partial Inplace. */ |
811 | + 0, /* Source Mask. */ | 732 | + 0, /* Source Mask. */ |
812 | + 0x0000ffff, /* Dest Mask. */ | 733 | + 0x0000ffff, /* Dest Mask. */ |
813 | + FALSE), /* PC relative offset? */ | 734 | + false), /* PC relative offset? */ |
814 | + | 735 | + |
815 | + /* The low half of a 32 bit relocation. */ | 736 | + /* The low half of a 32 bit relocation. */ |
816 | + HOWTO (R_MICROBLAZE_32_LO, /* Type. */ | 737 | + HOWTO (R_MICROBLAZE_32_LO, /* Type. */ |
817 | + 0, /* Rightshift. */ | 738 | + 0, /* Rightshift. */ |
818 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 739 | + 4, /* Size. */ |
819 | + 16, /* Bitsize. */ | 740 | + 16, /* Bitsize. */ |
820 | + FALSE, /* PC_relative. */ | 741 | + false, /* PC_relative. */ |
821 | + 0, /* Bitpos. */ | 742 | + 0, /* Bitpos. */ |
822 | + complain_overflow_signed, /* Complain on overflow. */ | 743 | + complain_overflow_signed, /* Complain on overflow. */ |
823 | + bfd_elf_generic_reloc,/* Special Function. */ | 744 | + bfd_elf_generic_reloc,/* Special Function. */ |
824 | + "R_MICROBLAZE_32_LO", /* Name. */ | 745 | + "R_MICROBLAZE_32_LO", /* Name. */ |
825 | + FALSE, /* Partial Inplace. */ | 746 | + false, /* Partial Inplace. */ |
826 | + 0, /* Source Mask. */ | 747 | + 0, /* Source Mask. */ |
827 | + 0x0000ffff, /* Dest Mask. */ | 748 | + 0x0000ffff, /* Dest Mask. */ |
828 | + FALSE), /* PC relative offset? */ | 749 | + false), /* PC relative offset? */ |
829 | + | 750 | + |
830 | + /* Read-only small data section relocation. */ | 751 | + /* Read-only small data section relocation. */ |
831 | + HOWTO (R_MICROBLAZE_SRO32, /* Type. */ | 752 | + HOWTO (R_MICROBLAZE_SRO32, /* Type. */ |
832 | + 0, /* Rightshift. */ | 753 | + 0, /* Rightshift. */ |
833 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 754 | + 4, /* Size. */ |
834 | + 16, /* Bitsize. */ | 755 | + 16, /* Bitsize. */ |
835 | + FALSE, /* PC_relative. */ | 756 | + false, /* PC_relative. */ |
836 | + 0, /* Bitpos. */ | 757 | + 0, /* Bitpos. */ |
837 | + complain_overflow_bitfield, /* Complain on overflow. */ | 758 | + complain_overflow_bitfield, /* Complain on overflow. */ |
838 | + bfd_elf_generic_reloc,/* Special Function. */ | 759 | + bfd_elf_generic_reloc,/* Special Function. */ |
839 | + "R_MICROBLAZE_SRO32", /* Name. */ | 760 | + "R_MICROBLAZE_SRO32", /* Name. */ |
840 | + FALSE, /* Partial Inplace. */ | 761 | + false, /* Partial Inplace. */ |
841 | + 0, /* Source Mask. */ | 762 | + 0, /* Source Mask. */ |
842 | + 0x0000ffff, /* Dest Mask. */ | 763 | + 0x0000ffff, /* Dest Mask. */ |
843 | + FALSE), /* PC relative offset? */ | 764 | + false), /* PC relative offset? */ |
844 | + | 765 | + |
845 | + /* Read-write small data area relocation. */ | 766 | + /* Read-write small data area relocation. */ |
846 | + HOWTO (R_MICROBLAZE_SRW32, /* Type. */ | 767 | + HOWTO (R_MICROBLAZE_SRW32, /* Type. */ |
768 | + 0, /* Rightshift. */ | ||
769 | + 4, /* Size. */ | ||
770 | + 16, /* Bitsize. */ | ||
771 | + false, /* PC_relative. */ | ||
772 | + 0, /* Bitpos. */ | ||
773 | + complain_overflow_bitfield, /* Complain on overflow. */ | ||
774 | + bfd_elf_generic_reloc,/* Special Function. */ | ||
775 | + "R_MICROBLAZE_SRW32", /* Name. */ | ||
776 | + false, /* Partial Inplace. */ | ||
777 | + 0, /* Source Mask. */ | ||
778 | + 0x0000ffff, /* Dest Mask. */ | ||
779 | + false), /* PC relative offset? */ | ||
780 | + | ||
781 | + /* This reloc does nothing. Used for relaxation. */ | ||
782 | + HOWTO (R_MICROBLAZE_32_NONE, /* Type. */ | ||
847 | + 0, /* Rightshift. */ | 783 | + 0, /* Rightshift. */ |
848 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 784 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
849 | + 16, /* Bitsize. */ | 785 | + 32, /* Bitsize. */ |
850 | + FALSE, /* PC_relative. */ | 786 | + true, /* PC_relative. */ |
851 | + 0, /* Bitpos. */ | 787 | + 0, /* Bitpos. */ |
852 | + complain_overflow_bitfield, /* Complain on overflow. */ | ||
853 | + bfd_elf_generic_reloc,/* Special Function. */ | ||
854 | + "R_MICROBLAZE_SRW32", /* Name. */ | ||
855 | + FALSE, /* Partial Inplace. */ | ||
856 | + 0, /* Source Mask. */ | ||
857 | + 0x0000ffff, /* Dest Mask. */ | ||
858 | + FALSE), /* PC relative offset? */ | ||
859 | + | ||
860 | + HOWTO (R_MICROBLAZE_32_NONE, /* Type. */ | ||
861 | + 0, /* Rightshift. */ | ||
862 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
863 | + 32, /* Bitsize. */ | ||
864 | + TRUE, /* PC_relative. */ | ||
865 | + 0, /* Bitpos. */ | ||
866 | + complain_overflow_bitfield, /* Complain on overflow. */ | 788 | + complain_overflow_bitfield, /* Complain on overflow. */ |
867 | + NULL, /* Special Function. */ | 789 | + NULL, /* Special Function. */ |
868 | + "R_MICROBLAZE_32_NONE",/* Name. */ | 790 | + "R_MICROBLAZE_32_NONE",/* Name. */ |
869 | + FALSE, /* Partial Inplace. */ | 791 | + false, /* Partial Inplace. */ |
870 | + 0, /* Source Mask. */ | 792 | + 0, /* Source Mask. */ |
871 | + 0, /* Dest Mask. */ | 793 | + 0, /* Dest Mask. */ |
872 | + FALSE), /* PC relative offset? */ | 794 | + false), /* PC relative offset? */ |
873 | + | 795 | + |
874 | + /* This reloc does nothing. Used for relaxation. */ | 796 | + /* This reloc does nothing. Used for relaxation. */ |
875 | + HOWTO (R_MICROBLAZE_64_NONE, /* Type. */ | 797 | + HOWTO (R_MICROBLAZE_64_NONE, /* Type. */ |
876 | + 0, /* Rightshift. */ | 798 | + 0, /* Rightshift. */ |
877 | + 3, /* Size (0 = byte, 1 = short, 2 = long). */ | 799 | + 0, /* Size. */ |
878 | + 0, /* Bitsize. */ | 800 | + 0, /* Bitsize. */ |
879 | + TRUE, /* PC_relative. */ | 801 | + true, /* PC_relative. */ |
880 | + 0, /* Bitpos. */ | 802 | + 0, /* Bitpos. */ |
881 | + complain_overflow_dont, /* Complain on overflow. */ | 803 | + complain_overflow_dont, /* Complain on overflow. */ |
882 | + NULL, /* Special Function. */ | 804 | + NULL, /* Special Function. */ |
883 | + "R_MICROBLAZE_64_NONE",/* Name. */ | 805 | + "R_MICROBLAZE_64_NONE",/* Name. */ |
884 | + FALSE, /* Partial Inplace. */ | 806 | + false, /* Partial Inplace. */ |
885 | + 0, /* Source Mask. */ | 807 | + 0, /* Source Mask. */ |
886 | + 0, /* Dest Mask. */ | 808 | + 0, /* Dest Mask. */ |
887 | + FALSE), /* PC relative offset? */ | 809 | + false), /* PC relative offset? */ |
888 | + | 810 | + |
889 | + /* Symbol Op Symbol relocation. */ | 811 | + /* Symbol Op Symbol relocation. */ |
890 | + HOWTO (R_MICROBLAZE_32_SYM_OP_SYM, /* Type. */ | 812 | + HOWTO (R_MICROBLAZE_32_SYM_OP_SYM, /* Type. */ |
891 | + 0, /* Rightshift. */ | 813 | + 0, /* Rightshift. */ |
892 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 814 | + 4, /* Size. */ |
893 | + 32, /* Bitsize. */ | 815 | + 32, /* Bitsize. */ |
894 | + FALSE, /* PC_relative. */ | 816 | + false, /* PC_relative. */ |
895 | + 0, /* Bitpos. */ | 817 | + 0, /* Bitpos. */ |
896 | + complain_overflow_bitfield, /* Complain on overflow. */ | 818 | + complain_overflow_bitfield, /* Complain on overflow. */ |
897 | + bfd_elf_generic_reloc,/* Special Function. */ | 819 | + bfd_elf_generic_reloc,/* Special Function. */ |
898 | + "R_MICROBLAZE_32_SYM_OP_SYM", /* Name. */ | 820 | + "R_MICROBLAZE_32_SYM_OP_SYM", /* Name. */ |
899 | + FALSE, /* Partial Inplace. */ | 821 | + false, /* Partial Inplace. */ |
900 | + 0, /* Source Mask. */ | 822 | + 0, /* Source Mask. */ |
901 | + 0xffffffff, /* Dest Mask. */ | 823 | + 0xffffffff, /* Dest Mask. */ |
902 | + FALSE), /* PC relative offset? */ | 824 | + false), /* PC relative offset? */ |
903 | + | 825 | + |
904 | + /* GNU extension to record C++ vtable hierarchy. */ | 826 | + /* GNU extension to record C++ vtable hierarchy. */ |
905 | + HOWTO (R_MICROBLAZE_GNU_VTINHERIT, /* Type. */ | 827 | + HOWTO (R_MICROBLAZE_GNU_VTINHERIT, /* Type. */ |
906 | + 0, /* Rightshift. */ | 828 | + 0, /* Rightshift. */ |
907 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 829 | + 4, /* Size. */ |
908 | + 0, /* Bitsize. */ | 830 | + 0, /* Bitsize. */ |
909 | + FALSE, /* PC_relative. */ | 831 | + false, /* PC_relative. */ |
910 | + 0, /* Bitpos. */ | 832 | + 0, /* Bitpos. */ |
911 | + complain_overflow_dont,/* Complain on overflow. */ | 833 | + complain_overflow_dont,/* Complain on overflow. */ |
912 | + NULL, /* Special Function. */ | 834 | + NULL, /* Special Function. */ |
913 | + "R_MICROBLAZE_GNU_VTINHERIT", /* Name. */ | 835 | + "R_MICROBLAZE_GNU_VTINHERIT", /* Name. */ |
914 | + FALSE, /* Partial Inplace. */ | 836 | + false, /* Partial Inplace. */ |
915 | + 0, /* Source Mask. */ | 837 | + 0, /* Source Mask. */ |
916 | + 0, /* Dest Mask. */ | 838 | + 0, /* Dest Mask. */ |
917 | + FALSE), /* PC relative offset? */ | 839 | + false), /* PC relative offset? */ |
918 | + | 840 | + |
919 | + /* GNU extension to record C++ vtable member usage. */ | 841 | + /* GNU extension to record C++ vtable member usage. */ |
920 | + HOWTO (R_MICROBLAZE_GNU_VTENTRY, /* Type. */ | 842 | + HOWTO (R_MICROBLAZE_GNU_VTENTRY, /* Type. */ |
921 | + 0, /* Rightshift. */ | 843 | + 0, /* Rightshift. */ |
922 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 844 | + 4, /* Size. */ |
923 | + 0, /* Bitsize. */ | 845 | + 0, /* Bitsize. */ |
924 | + FALSE, /* PC_relative. */ | 846 | + false, /* PC_relative. */ |
925 | + 0, /* Bitpos. */ | 847 | + 0, /* Bitpos. */ |
926 | + complain_overflow_dont,/* Complain on overflow. */ | 848 | + complain_overflow_dont,/* Complain on overflow. */ |
927 | + _bfd_elf_rel_vtable_reloc_fn, /* Special Function. */ | 849 | + _bfd_elf_rel_vtable_reloc_fn, /* Special Function. */ |
928 | + "R_MICROBLAZE_GNU_VTENTRY", /* Name. */ | 850 | + "R_MICROBLAZE_GNU_VTENTRY", /* Name. */ |
929 | + FALSE, /* Partial Inplace. */ | 851 | + false, /* Partial Inplace. */ |
930 | + 0, /* Source Mask. */ | 852 | + 0, /* Source Mask. */ |
931 | + 0, /* Dest Mask. */ | 853 | + 0, /* Dest Mask. */ |
932 | + FALSE), /* PC relative offset? */ | 854 | + false), /* PC relative offset? */ |
933 | + | 855 | + |
934 | + /* A 64 bit GOTPC relocation. Table-entry not really used. */ | 856 | + /* A 64 bit GOTPC relocation. Table-entry not really used. */ |
935 | + HOWTO (R_MICROBLAZE_GOTPC_64, /* Type. */ | 857 | + HOWTO (R_MICROBLAZE_GOTPC_64, /* Type. */ |
936 | + 0, /* Rightshift. */ | 858 | + 0, /* Rightshift. */ |
937 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 859 | + 4, /* Size. */ |
938 | + 16, /* Bitsize. */ | 860 | + 16, /* Bitsize. */ |
939 | + TRUE, /* PC_relative. */ | 861 | + true, /* PC_relative. */ |
940 | + 0, /* Bitpos. */ | 862 | + 0, /* Bitpos. */ |
941 | + complain_overflow_dont, /* Complain on overflow. */ | 863 | + complain_overflow_dont, /* Complain on overflow. */ |
942 | + bfd_elf_generic_reloc, /* Special Function. */ | 864 | + bfd_elf_generic_reloc, /* Special Function. */ |
943 | + "R_MICROBLAZE_GOTPC_64", /* Name. */ | 865 | + "R_MICROBLAZE_GOTPC_64", /* Name. */ |
944 | + FALSE, /* Partial Inplace. */ | 866 | + false, /* Partial Inplace. */ |
945 | + 0, /* Source Mask. */ | 867 | + 0, /* Source Mask. */ |
946 | + 0x0000ffff, /* Dest Mask. */ | 868 | + 0x0000ffff, /* Dest Mask. */ |
947 | + TRUE), /* PC relative offset? */ | 869 | + true), /* PC relative offset? */ |
870 | + | ||
871 | + /* A 64 bit TEXTPCREL relocation. Table-entry not really used. */ | ||
872 | + HOWTO (R_MICROBLAZE_TEXTPCREL_64, /* Type. */ | ||
873 | + 0, /* Rightshift. */ | ||
874 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
875 | + 16, /* Bitsize. */ | ||
876 | + true, /* PC_relative. */ | ||
877 | + 0, /* Bitpos. */ | ||
878 | + complain_overflow_dont, /* Complain on overflow. */ | ||
879 | + bfd_elf_generic_reloc, /* Special Function. */ | ||
880 | + "R_MICROBLAZE_TEXTPCREL_64", /* Name. */ | ||
881 | + false, /* Partial Inplace. */ | ||
882 | + 0, /* Source Mask. */ | ||
883 | + 0x0000ffff, /* Dest Mask. */ | ||
884 | + true), /* PC relative offset? */ | ||
948 | + | 885 | + |
949 | + /* A 64 bit GOTPC relocation. Table-entry not really used. */ | 886 | + /* A 64 bit GOTPC relocation. Table-entry not really used. */ |
950 | + HOWTO (R_MICROBLAZE_GPC_64, /* Type. */ | 887 | + HOWTO (R_MICROBLAZE_GPC_64, /* Type. */ |
951 | + 0, /* Rightshift. */ | 888 | + 0, /* Rightshift. */ |
952 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 889 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
953 | + 16, /* Bitsize. */ | 890 | + 16, /* Bitsize. */ |
954 | + TRUE, /* PC_relative. */ | 891 | + true, /* PC_relative. */ |
955 | + 0, /* Bitpos. */ | 892 | + 0, /* Bitpos. */ |
956 | + complain_overflow_dont, /* Complain on overflow. */ | 893 | + complain_overflow_dont, /* Complain on overflow. */ |
957 | + bfd_elf_generic_reloc, /* Special Function. */ | 894 | + bfd_elf_generic_reloc, /* Special Function. */ |
958 | + "R_MICROBLAZE_GPC_64", /* Name. */ | 895 | + "R_MICROBLAZE_GPC_64", /* Name. */ |
959 | + FALSE, /* Partial Inplace. */ | 896 | + false, /* Partial Inplace. */ |
960 | + 0, /* Source Mask. */ | 897 | + 0, /* Source Mask. */ |
961 | + 0x0000ffff, /* Dest Mask. */ | 898 | + 0x0000ffff, /* Dest Mask. */ |
962 | + TRUE), /* PC relative offset? */ | 899 | + true), /* PC relative offset? */ |
963 | + | 900 | + |
964 | + /* A 64 bit GOT relocation. Table-entry not really used. */ | 901 | + /* A 64 bit GOT relocation. Table-entry not really used. */ |
965 | + HOWTO (R_MICROBLAZE_GOT_64, /* Type. */ | 902 | + HOWTO (R_MICROBLAZE_GOT_64, /* Type. */ |
966 | + 0, /* Rightshift. */ | 903 | + 0, /* Rightshift. */ |
967 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 904 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
968 | + 16, /* Bitsize. */ | 905 | + 16, /* Bitsize. */ |
969 | + FALSE, /* PC_relative. */ | 906 | + false, /* PC_relative. */ |
970 | + 0, /* Bitpos. */ | 907 | + 0, /* Bitpos. */ |
971 | + complain_overflow_dont, /* Complain on overflow. */ | 908 | + complain_overflow_dont, /* Complain on overflow. */ |
972 | + bfd_elf_generic_reloc,/* Special Function. */ | 909 | + bfd_elf_generic_reloc,/* Special Function. */ |
973 | + "R_MICROBLAZE_GOT_64",/* Name. */ | 910 | + "R_MICROBLAZE_GOT_64",/* Name. */ |
974 | + FALSE, /* Partial Inplace. */ | 911 | + false, /* Partial Inplace. */ |
975 | + 0, /* Source Mask. */ | 912 | + 0, /* Source Mask. */ |
976 | + 0x0000ffff, /* Dest Mask. */ | 913 | + 0x0000ffff, /* Dest Mask. */ |
977 | + FALSE), /* PC relative offset? */ | 914 | + false), /* PC relative offset? */ |
915 | + | ||
916 | + /* A 64 bit TEXTREL relocation. Table-entry not really used. */ | ||
917 | + HOWTO (R_MICROBLAZE_TEXTREL_64, /* Type. */ | ||
918 | + 0, /* Rightshift. */ | ||
919 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
920 | + 16, /* Bitsize. */ | ||
921 | + false, /* PC_relative. */ | ||
922 | + 0, /* Bitpos. */ | ||
923 | + complain_overflow_dont, /* Complain on overflow. */ | ||
924 | + bfd_elf_generic_reloc,/* Special Function. */ | ||
925 | + "R_MICROBLAZE_TEXTREL_64",/* Name. */ | ||
926 | + false, /* Partial Inplace. */ | ||
927 | + 0, /* Source Mask. */ | ||
928 | + 0x0000ffff, /* Dest Mask. */ | ||
929 | + false), /* PC relative offset? */ | ||
978 | + | 930 | + |
979 | + /* A 64 bit PLT relocation. Table-entry not really used. */ | 931 | + /* A 64 bit PLT relocation. Table-entry not really used. */ |
980 | + HOWTO (R_MICROBLAZE_PLT_64, /* Type. */ | 932 | + HOWTO (R_MICROBLAZE_PLT_64, /* Type. */ |
981 | + 0, /* Rightshift. */ | 933 | + 0, /* Rightshift. */ |
982 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 934 | + 4, /* Size. */ |
983 | + 16, /* Bitsize. */ | 935 | + 16, /* Bitsize. */ |
984 | + TRUE, /* PC_relative. */ | 936 | + true, /* PC_relative. */ |
985 | + 0, /* Bitpos. */ | 937 | + 0, /* Bitpos. */ |
986 | + complain_overflow_dont, /* Complain on overflow. */ | 938 | + complain_overflow_dont, /* Complain on overflow. */ |
987 | + bfd_elf_generic_reloc,/* Special Function. */ | 939 | + bfd_elf_generic_reloc,/* Special Function. */ |
988 | + "R_MICROBLAZE_PLT_64",/* Name. */ | 940 | + "R_MICROBLAZE_PLT_64",/* Name. */ |
989 | + FALSE, /* Partial Inplace. */ | 941 | + false, /* Partial Inplace. */ |
990 | + 0, /* Source Mask. */ | 942 | + 0, /* Source Mask. */ |
991 | + 0x0000ffff, /* Dest Mask. */ | 943 | + 0x0000ffff, /* Dest Mask. */ |
992 | + TRUE), /* PC relative offset? */ | 944 | + true), /* PC relative offset? */ |
993 | + | 945 | + |
994 | + /* Table-entry not really used. */ | 946 | + /* Table-entry not really used. */ |
995 | + HOWTO (R_MICROBLAZE_REL, /* Type. */ | 947 | + HOWTO (R_MICROBLAZE_REL, /* Type. */ |
996 | + 0, /* Rightshift. */ | 948 | + 0, /* Rightshift. */ |
997 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 949 | + 4, /* Size. */ |
998 | + 16, /* Bitsize. */ | 950 | + 16, /* Bitsize. */ |
999 | + TRUE, /* PC_relative. */ | 951 | + true, /* PC_relative. */ |
1000 | + 0, /* Bitpos. */ | 952 | + 0, /* Bitpos. */ |
1001 | + complain_overflow_dont, /* Complain on overflow. */ | 953 | + complain_overflow_dont, /* Complain on overflow. */ |
1002 | + bfd_elf_generic_reloc,/* Special Function. */ | 954 | + bfd_elf_generic_reloc,/* Special Function. */ |
1003 | + "R_MICROBLAZE_REL", /* Name. */ | 955 | + "R_MICROBLAZE_REL", /* Name. */ |
1004 | + FALSE, /* Partial Inplace. */ | 956 | + false, /* Partial Inplace. */ |
1005 | + 0, /* Source Mask. */ | 957 | + 0, /* Source Mask. */ |
1006 | + 0x0000ffff, /* Dest Mask. */ | 958 | + 0x0000ffff, /* Dest Mask. */ |
1007 | + TRUE), /* PC relative offset? */ | 959 | + true), /* PC relative offset? */ |
1008 | + | 960 | + |
1009 | + /* Table-entry not really used. */ | 961 | + /* Table-entry not really used. */ |
1010 | + HOWTO (R_MICROBLAZE_JUMP_SLOT,/* Type. */ | 962 | + HOWTO (R_MICROBLAZE_JUMP_SLOT,/* Type. */ |
1011 | + 0, /* Rightshift. */ | 963 | + 0, /* Rightshift. */ |
1012 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 964 | + 4, /* Size. */ |
1013 | + 16, /* Bitsize. */ | 965 | + 16, /* Bitsize. */ |
1014 | + TRUE, /* PC_relative. */ | 966 | + true, /* PC_relative. */ |
1015 | + 0, /* Bitpos. */ | 967 | + 0, /* Bitpos. */ |
1016 | + complain_overflow_dont, /* Complain on overflow. */ | 968 | + complain_overflow_dont, /* Complain on overflow. */ |
1017 | + bfd_elf_generic_reloc,/* Special Function. */ | 969 | + bfd_elf_generic_reloc,/* Special Function. */ |
1018 | + "R_MICROBLAZE_JUMP_SLOT", /* Name. */ | 970 | + "R_MICROBLAZE_JUMP_SLOT", /* Name. */ |
1019 | + FALSE, /* Partial Inplace. */ | 971 | + false, /* Partial Inplace. */ |
1020 | + 0, /* Source Mask. */ | 972 | + 0, /* Source Mask. */ |
1021 | + 0x0000ffff, /* Dest Mask. */ | 973 | + 0x0000ffff, /* Dest Mask. */ |
1022 | + TRUE), /* PC relative offset? */ | 974 | + true), /* PC relative offset? */ |
1023 | + | 975 | + |
1024 | + /* Table-entry not really used. */ | 976 | + /* Table-entry not really used. */ |
1025 | + HOWTO (R_MICROBLAZE_GLOB_DAT,/* Type. */ | 977 | + HOWTO (R_MICROBLAZE_GLOB_DAT,/* Type. */ |
1026 | + 0, /* Rightshift. */ | 978 | + 0, /* Rightshift. */ |
1027 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 979 | + 4, /* Size. */ |
1028 | + 16, /* Bitsize. */ | 980 | + 16, /* Bitsize. */ |
1029 | + TRUE, /* PC_relative. */ | 981 | + true, /* PC_relative. */ |
1030 | + 0, /* Bitpos. */ | 982 | + 0, /* Bitpos. */ |
1031 | + complain_overflow_dont, /* Complain on overflow. */ | 983 | + complain_overflow_dont, /* Complain on overflow. */ |
1032 | + bfd_elf_generic_reloc,/* Special Function. */ | 984 | + bfd_elf_generic_reloc,/* Special Function. */ |
1033 | + "R_MICROBLAZE_GLOB_DAT", /* Name. */ | 985 | + "R_MICROBLAZE_GLOB_DAT", /* Name. */ |
1034 | + FALSE, /* Partial Inplace. */ | 986 | + false, /* Partial Inplace. */ |
1035 | + 0, /* Source Mask. */ | 987 | + 0, /* Source Mask. */ |
1036 | + 0x0000ffff, /* Dest Mask. */ | 988 | + 0x0000ffff, /* Dest Mask. */ |
1037 | + TRUE), /* PC relative offset? */ | 989 | + true), /* PC relative offset? */ |
1038 | + | 990 | + |
1039 | + /* A 64 bit GOT relative relocation. Table-entry not really used. */ | 991 | + /* A 64 bit GOT relative relocation. Table-entry not really used. */ |
1040 | + HOWTO (R_MICROBLAZE_GOTOFF_64, /* Type. */ | 992 | + HOWTO (R_MICROBLAZE_GOTOFF_64, /* Type. */ |
1041 | + 0, /* Rightshift. */ | 993 | + 0, /* Rightshift. */ |
1042 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 994 | + 4, /* Size. */ |
1043 | + 16, /* Bitsize. */ | 995 | + 16, /* Bitsize. */ |
1044 | + FALSE, /* PC_relative. */ | 996 | + false, /* PC_relative. */ |
1045 | + 0, /* Bitpos. */ | 997 | + 0, /* Bitpos. */ |
1046 | + complain_overflow_dont, /* Complain on overflow. */ | 998 | + complain_overflow_dont, /* Complain on overflow. */ |
1047 | + bfd_elf_generic_reloc,/* Special Function. */ | 999 | + bfd_elf_generic_reloc,/* Special Function. */ |
1048 | + "R_MICROBLAZE_GOTOFF_64", /* Name. */ | 1000 | + "R_MICROBLAZE_GOTOFF_64", /* Name. */ |
1049 | + FALSE, /* Partial Inplace. */ | 1001 | + false, /* Partial Inplace. */ |
1050 | + 0, /* Source Mask. */ | 1002 | + 0, /* Source Mask. */ |
1051 | + 0x0000ffff, /* Dest Mask. */ | 1003 | + 0x0000ffff, /* Dest Mask. */ |
1052 | + FALSE), /* PC relative offset? */ | 1004 | + false), /* PC relative offset? */ |
1053 | + | 1005 | + |
1054 | + /* A 32 bit GOT relative relocation. Table-entry not really used. */ | 1006 | + /* A 32 bit GOT relative relocation. Table-entry not really used. */ |
1055 | + HOWTO (R_MICROBLAZE_GOTOFF_32, /* Type. */ | 1007 | + HOWTO (R_MICROBLAZE_GOTOFF_32, /* Type. */ |
1056 | + 0, /* Rightshift. */ | 1008 | + 0, /* Rightshift. */ |
1057 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 1009 | + 4, /* Size. */ |
1058 | + 16, /* Bitsize. */ | 1010 | + 16, /* Bitsize. */ |
1059 | + FALSE, /* PC_relative. */ | 1011 | + false, /* PC_relative. */ |
1060 | + 0, /* Bitpos. */ | 1012 | + 0, /* Bitpos. */ |
1061 | + complain_overflow_dont, /* Complain on overflow. */ | 1013 | + complain_overflow_dont, /* Complain on overflow. */ |
1062 | + bfd_elf_generic_reloc, /* Special Function. */ | 1014 | + bfd_elf_generic_reloc, /* Special Function. */ |
1063 | + "R_MICROBLAZE_GOTOFF_32", /* Name. */ | 1015 | + "R_MICROBLAZE_GOTOFF_32", /* Name. */ |
1064 | + FALSE, /* Partial Inplace. */ | 1016 | + false, /* Partial Inplace. */ |
1065 | + 0, /* Source Mask. */ | 1017 | + 0, /* Source Mask. */ |
1066 | + 0x0000ffff, /* Dest Mask. */ | 1018 | + 0x0000ffff, /* Dest Mask. */ |
1067 | + FALSE), /* PC relative offset? */ | 1019 | + false), /* PC relative offset? */ |
1068 | + | 1020 | + |
1069 | + /* COPY relocation. Table-entry not really used. */ | 1021 | + /* COPY relocation. Table-entry not really used. */ |
1070 | + HOWTO (R_MICROBLAZE_COPY, /* Type. */ | 1022 | + HOWTO (R_MICROBLAZE_COPY, /* Type. */ |
1071 | + 0, /* Rightshift. */ | 1023 | + 0, /* Rightshift. */ |
1072 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 1024 | + 4, /* Size. */ |
1073 | + 16, /* Bitsize. */ | 1025 | + 16, /* Bitsize. */ |
1074 | + FALSE, /* PC_relative. */ | 1026 | + false, /* PC_relative. */ |
1075 | + 0, /* Bitpos. */ | 1027 | + 0, /* Bitpos. */ |
1076 | + complain_overflow_dont, /* Complain on overflow. */ | 1028 | + complain_overflow_dont, /* Complain on overflow. */ |
1077 | + bfd_elf_generic_reloc,/* Special Function. */ | 1029 | + bfd_elf_generic_reloc,/* Special Function. */ |
1078 | + "R_MICROBLAZE_COPY", /* Name. */ | 1030 | + "R_MICROBLAZE_COPY", /* Name. */ |
1079 | + FALSE, /* Partial Inplace. */ | 1031 | + false, /* Partial Inplace. */ |
1080 | + 0, /* Source Mask. */ | 1032 | + 0, /* Source Mask. */ |
1081 | + 0x0000ffff, /* Dest Mask. */ | 1033 | + 0x0000ffff, /* Dest Mask. */ |
1082 | + FALSE), /* PC relative offset? */ | 1034 | + false), /* PC relative offset? */ |
1083 | + | 1035 | + |
1084 | + /* Marker relocs for TLS. */ | 1036 | + /* Marker relocs for TLS. */ |
1085 | + HOWTO (R_MICROBLAZE_TLS, | 1037 | + HOWTO (R_MICROBLAZE_TLS, |
1086 | + 0, /* rightshift */ | 1038 | + 0, /* rightshift */ |
1087 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 1039 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ |
1088 | + 32, /* bitsize */ | 1040 | + 32, /* bitsize */ |
1089 | + FALSE, /* pc_relative */ | 1041 | + false, /* pc_relative */ |
1090 | + 0, /* bitpos */ | 1042 | + 0, /* bitpos */ |
1091 | + complain_overflow_dont, /* complain_on_overflow */ | 1043 | + complain_overflow_dont, /* complain_on_overflow */ |
1092 | + bfd_elf_generic_reloc, /* special_function */ | 1044 | + bfd_elf_generic_reloc, /* special_function */ |
1093 | + "R_MICROBLAZE_TLS", /* name */ | 1045 | + "R_MICROBLAZE_TLS", /* name */ |
1094 | + FALSE, /* partial_inplace */ | 1046 | + false, /* partial_inplace */ |
1095 | + 0, /* src_mask */ | 1047 | + 0, /* src_mask */ |
1096 | + 0x0000ffff, /* dst_mask */ | 1048 | + 0x0000ffff, /* dst_mask */ |
1097 | + FALSE), /* pcrel_offset */ | 1049 | + false), /* pcrel_offset */ |
1098 | + | 1050 | + |
1099 | + HOWTO (R_MICROBLAZE_TLSGD, | 1051 | + HOWTO (R_MICROBLAZE_TLSGD, |
1100 | + 0, /* rightshift */ | 1052 | + 0, /* rightshift */ |
1101 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 1053 | + 4, /* size */ |
1102 | + 32, /* bitsize */ | 1054 | + 32, /* bitsize */ |
1103 | + FALSE, /* pc_relative */ | 1055 | + false, /* pc_relative */ |
1104 | + 0, /* bitpos */ | 1056 | + 0, /* bitpos */ |
1105 | + complain_overflow_dont, /* complain_on_overflow */ | 1057 | + complain_overflow_dont, /* complain_on_overflow */ |
1106 | + bfd_elf_generic_reloc, /* special_function */ | 1058 | + bfd_elf_generic_reloc, /* special_function */ |
1107 | + "R_MICROBLAZE_TLSGD", /* name */ | 1059 | + "R_MICROBLAZE_TLSGD", /* name */ |
1108 | + FALSE, /* partial_inplace */ | 1060 | + false, /* partial_inplace */ |
1109 | + 0, /* src_mask */ | 1061 | + 0, /* src_mask */ |
1110 | + 0x0000ffff, /* dst_mask */ | 1062 | + 0x0000ffff, /* dst_mask */ |
1111 | + FALSE), /* pcrel_offset */ | 1063 | + false), /* pcrel_offset */ |
1112 | + | 1064 | + |
1113 | + HOWTO (R_MICROBLAZE_TLSLD, | 1065 | + HOWTO (R_MICROBLAZE_TLSLD, |
1114 | + 0, /* rightshift */ | 1066 | + 0, /* rightshift */ |
1115 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 1067 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ |
1116 | + 32, /* bitsize */ | 1068 | + 32, /* bitsize */ |
1117 | + FALSE, /* pc_relative */ | 1069 | + false, /* pc_relative */ |
1118 | + 0, /* bitpos */ | 1070 | + 0, /* bitpos */ |
1119 | + complain_overflow_dont, /* complain_on_overflow */ | 1071 | + complain_overflow_dont, /* complain_on_overflow */ |
1120 | + bfd_elf_generic_reloc, /* special_function */ | 1072 | + bfd_elf_generic_reloc, /* special_function */ |
1121 | + "R_MICROBLAZE_TLSLD", /* name */ | 1073 | + "R_MICROBLAZE_TLSLD", /* name */ |
1122 | + FALSE, /* partial_inplace */ | 1074 | + false, /* partial_inplace */ |
1123 | + 0, /* src_mask */ | 1075 | + 0, /* src_mask */ |
1124 | + 0x0000ffff, /* dst_mask */ | 1076 | + 0x0000ffff, /* dst_mask */ |
1125 | + FALSE), /* pcrel_offset */ | 1077 | + false), /* pcrel_offset */ |
1126 | + | 1078 | + |
1127 | + /* Computes the load module index of the load module that contains the | 1079 | + /* Computes the load module index of the load module that contains the |
1128 | + definition of its TLS sym. */ | 1080 | + definition of its TLS sym. */ |
@@ -1130,81 +1082,81 @@ index 00000000000..bf58b4b0a67 | |||
1130 | + 0, /* rightshift */ | 1082 | + 0, /* rightshift */ |
1131 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 1083 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ |
1132 | + 32, /* bitsize */ | 1084 | + 32, /* bitsize */ |
1133 | + FALSE, /* pc_relative */ | 1085 | + false, /* pc_relative */ |
1134 | + 0, /* bitpos */ | 1086 | + 0, /* bitpos */ |
1135 | + complain_overflow_dont, /* complain_on_overflow */ | 1087 | + complain_overflow_dont, /* complain_on_overflow */ |
1136 | + bfd_elf_generic_reloc, /* special_function */ | 1088 | + bfd_elf_generic_reloc, /* special_function */ |
1137 | + "R_MICROBLAZE_TLSDTPMOD32", /* name */ | 1089 | + "R_MICROBLAZE_TLSDTPMOD32", /* name */ |
1138 | + FALSE, /* partial_inplace */ | 1090 | + false, /* partial_inplace */ |
1139 | + 0, /* src_mask */ | 1091 | + 0, /* src_mask */ |
1140 | + 0x0000ffff, /* dst_mask */ | 1092 | + 0x0000ffff, /* dst_mask */ |
1141 | + FALSE), /* pcrel_offset */ | 1093 | + false), /* pcrel_offset */ |
1142 | + | 1094 | + |
1143 | + /* Computes a dtv-relative displacement, the difference between the value | 1095 | + /* Computes a dtv-relative displacement, the difference between the value |
1144 | + of sym+add and the base address of the thread-local storage block that | 1096 | + of sym+add and the base address of the thread-local storage block that |
1145 | + contains the definition of sym, minus 0x8000. Used for initializing GOT */ | 1097 | + contains the definition of sym, minus 0x8000. Used for initializing GOT */ |
1146 | + HOWTO (R_MICROBLAZE_TLSDTPREL32, | 1098 | + HOWTO (R_MICROBLAZE_TLSDTPREL32, |
1147 | + 0, /* rightshift */ | 1099 | + 0, /* rightshift */ |
1148 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 1100 | + 4, /* size */ |
1149 | + 32, /* bitsize */ | 1101 | + 32, /* bitsize */ |
1150 | + FALSE, /* pc_relative */ | 1102 | + false, /* pc_relative */ |
1151 | + 0, /* bitpos */ | 1103 | + 0, /* bitpos */ |
1152 | + complain_overflow_dont, /* complain_on_overflow */ | 1104 | + complain_overflow_dont, /* complain_on_overflow */ |
1153 | + bfd_elf_generic_reloc, /* special_function */ | 1105 | + bfd_elf_generic_reloc, /* special_function */ |
1154 | + "R_MICROBLAZE_TLSDTPREL32", /* name */ | 1106 | + "R_MICROBLAZE_TLSDTPREL32", /* name */ |
1155 | + FALSE, /* partial_inplace */ | 1107 | + false, /* partial_inplace */ |
1156 | + 0, /* src_mask */ | 1108 | + 0, /* src_mask */ |
1157 | + 0x0000ffff, /* dst_mask */ | 1109 | + 0x0000ffff, /* dst_mask */ |
1158 | + FALSE), /* pcrel_offset */ | 1110 | + false), /* pcrel_offset */ |
1159 | + | 1111 | + |
1160 | + /* Computes a dtv-relative displacement, the difference between the value | 1112 | + /* Computes a dtv-relative displacement, the difference between the value |
1161 | + of sym+add and the base address of the thread-local storage block that | 1113 | + of sym+add and the base address of the thread-local storage block that |
1162 | + contains the definition of sym, minus 0x8000. */ | 1114 | + contains the definition of sym, minus 0x8000. */ |
1163 | + HOWTO (R_MICROBLAZE_TLSDTPREL64, | 1115 | + HOWTO (R_MICROBLAZE_TLSDTPREL64, |
1164 | + 0, /* rightshift */ | 1116 | + 0, /* rightshift */ |
1165 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 1117 | + 4, /* size */ |
1166 | + 32, /* bitsize */ | 1118 | + 32, /* bitsize */ |
1167 | + FALSE, /* pc_relative */ | 1119 | + false, /* pc_relative */ |
1168 | + 0, /* bitpos */ | 1120 | + 0, /* bitpos */ |
1169 | + complain_overflow_dont, /* complain_on_overflow */ | 1121 | + complain_overflow_dont, /* complain_on_overflow */ |
1170 | + bfd_elf_generic_reloc, /* special_function */ | 1122 | + bfd_elf_generic_reloc, /* special_function */ |
1171 | + "R_MICROBLAZE_TLSDTPREL64", /* name */ | 1123 | + "R_MICROBLAZE_TLSDTPREL64", /* name */ |
1172 | + FALSE, /* partial_inplace */ | 1124 | + false, /* partial_inplace */ |
1173 | + 0, /* src_mask */ | 1125 | + 0, /* src_mask */ |
1174 | + 0x0000ffff, /* dst_mask */ | 1126 | + 0x0000ffff, /* dst_mask */ |
1175 | + FALSE), /* pcrel_offset */ | 1127 | + false), /* pcrel_offset */ |
1176 | + | 1128 | + |
1177 | + /* Computes a tp-relative displacement, the difference between the value of | 1129 | + /* Computes a tp-relative displacement, the difference between the value of |
1178 | + sym+add and the value of the thread pointer (r13). */ | 1130 | + sym+add and the value of the thread pointer (r13). */ |
1179 | + HOWTO (R_MICROBLAZE_TLSGOTTPREL32, | 1131 | + HOWTO (R_MICROBLAZE_TLSGOTTPREL32, |
1180 | + 0, /* rightshift */ | 1132 | + 0, /* rightshift */ |
1181 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 1133 | + 4, /* size */ |
1182 | + 32, /* bitsize */ | 1134 | + 32, /* bitsize */ |
1183 | + FALSE, /* pc_relative */ | 1135 | + false, /* pc_relative */ |
1184 | + 0, /* bitpos */ | 1136 | + 0, /* bitpos */ |
1185 | + complain_overflow_dont, /* complain_on_overflow */ | 1137 | + complain_overflow_dont, /* complain_on_overflow */ |
1186 | + bfd_elf_generic_reloc, /* special_function */ | 1138 | + bfd_elf_generic_reloc, /* special_function */ |
1187 | + "R_MICROBLAZE_TLSGOTTPREL32", /* name */ | 1139 | + "R_MICROBLAZE_TLSGOTTPREL32", /* name */ |
1188 | + FALSE, /* partial_inplace */ | 1140 | + false, /* partial_inplace */ |
1189 | + 0, /* src_mask */ | 1141 | + 0, /* src_mask */ |
1190 | + 0x0000ffff, /* dst_mask */ | 1142 | + 0x0000ffff, /* dst_mask */ |
1191 | + FALSE), /* pcrel_offset */ | 1143 | + false), /* pcrel_offset */ |
1192 | + | 1144 | + |
1193 | + /* Computes a tp-relative displacement, the difference between the value of | 1145 | + /* Computes a tp-relative displacement, the difference between the value of |
1194 | + sym+add and the value of the thread pointer (r13). */ | 1146 | + sym+add and the value of the thread pointer (r13). */ |
1195 | + HOWTO (R_MICROBLAZE_TLSTPREL32, | 1147 | + HOWTO (R_MICROBLAZE_TLSTPREL32, |
1196 | + 0, /* rightshift */ | 1148 | + 0, /* rightshift */ |
1197 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 1149 | + 4, /* size */ |
1198 | + 32, /* bitsize */ | 1150 | + 32, /* bitsize */ |
1199 | + FALSE, /* pc_relative */ | 1151 | + false, /* pc_relative */ |
1200 | + 0, /* bitpos */ | 1152 | + 0, /* bitpos */ |
1201 | + complain_overflow_dont, /* complain_on_overflow */ | 1153 | + complain_overflow_dont, /* complain_on_overflow */ |
1202 | + bfd_elf_generic_reloc, /* special_function */ | 1154 | + bfd_elf_generic_reloc, /* special_function */ |
1203 | + "R_MICROBLAZE_TLSTPREL32", /* name */ | 1155 | + "R_MICROBLAZE_TLSTPREL32", /* name */ |
1204 | + FALSE, /* partial_inplace */ | 1156 | + false, /* partial_inplace */ |
1205 | + 0, /* src_mask */ | 1157 | + 0, /* src_mask */ |
1206 | + 0x0000ffff, /* dst_mask */ | 1158 | + 0x0000ffff, /* dst_mask */ |
1207 | + FALSE), /* pcrel_offset */ | 1159 | + false), /* pcrel_offset */ |
1208 | + | 1160 | + |
1209 | +}; | 1161 | +}; |
1210 | + | 1162 | + |
@@ -1297,6 +1249,12 @@ index 00000000000..bf58b4b0a67 | |||
1297 | + case BFD_RELOC_MICROBLAZE_64_GOT: | 1249 | + case BFD_RELOC_MICROBLAZE_64_GOT: |
1298 | + microblaze_reloc = R_MICROBLAZE_GOT_64; | 1250 | + microblaze_reloc = R_MICROBLAZE_GOT_64; |
1299 | + break; | 1251 | + break; |
1252 | + case BFD_RELOC_MICROBLAZE_64_TEXTPCREL: | ||
1253 | + microblaze_reloc = R_MICROBLAZE_TEXTPCREL_64; | ||
1254 | + break; | ||
1255 | + case BFD_RELOC_MICROBLAZE_64_TEXTREL: | ||
1256 | + microblaze_reloc = R_MICROBLAZE_TEXTREL_64; | ||
1257 | + break; | ||
1300 | + case BFD_RELOC_MICROBLAZE_64_PLT: | 1258 | + case BFD_RELOC_MICROBLAZE_64_PLT: |
1301 | + microblaze_reloc = R_MICROBLAZE_PLT_64; | 1259 | + microblaze_reloc = R_MICROBLAZE_PLT_64; |
1302 | + break; | 1260 | + break; |
@@ -1357,8 +1315,8 @@ index 00000000000..bf58b4b0a67 | |||
1357 | + | 1315 | + |
1358 | +/* Set the howto pointer for a RCE ELF reloc. */ | 1316 | +/* Set the howto pointer for a RCE ELF reloc. */ |
1359 | + | 1317 | + |
1360 | +static void | 1318 | +static bool |
1361 | +microblaze_elf_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED, | 1319 | +microblaze_elf_info_to_howto (bfd * abfd, |
1362 | + arelent * cache_ptr, | 1320 | + arelent * cache_ptr, |
1363 | + Elf_Internal_Rela * dst) | 1321 | + Elf_Internal_Rela * dst) |
1364 | +{ | 1322 | +{ |
@@ -1371,25 +1329,56 @@ index 00000000000..bf58b4b0a67 | |||
1371 | + r_type = ELF64_R_TYPE (dst->r_info); | 1329 | + r_type = ELF64_R_TYPE (dst->r_info); |
1372 | + if (r_type >= R_MICROBLAZE_max) | 1330 | + if (r_type >= R_MICROBLAZE_max) |
1373 | + { | 1331 | + { |
1374 | + (*_bfd_error_handler) (_("%B: unrecognised MicroBlaze reloc number: %d"), | 1332 | + /* xgettext:c-format */ |
1375 | + abfd, r_type); | 1333 | + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), |
1334 | + abfd, r_type); | ||
1376 | + bfd_set_error (bfd_error_bad_value); | 1335 | + bfd_set_error (bfd_error_bad_value); |
1377 | + r_type = R_MICROBLAZE_NONE; | 1336 | + return false; |
1378 | + } | 1337 | + } |
1379 | + | 1338 | + |
1380 | + cache_ptr->howto = microblaze_elf_howto_table [r_type]; | 1339 | + cache_ptr->howto = microblaze_elf_howto_table [r_type]; |
1340 | + return true; | ||
1341 | +} | ||
1342 | + | ||
1343 | +struct _microblaze_elf_section_data | ||
1344 | +{ | ||
1345 | + struct bfd_elf_section_data elf; | ||
1346 | + /* Count of used relaxation table entries. */ | ||
1347 | + size_t relax_count; | ||
1348 | + /* Relaxation table. */ | ||
1349 | + struct relax_table *relax; | ||
1350 | +}; | ||
1351 | + | ||
1352 | +#define microblaze_elf_section_data(sec) \ | ||
1353 | + ((struct _microblaze_elf_section_data *) elf_section_data (sec)) | ||
1354 | + | ||
1355 | +static bool | ||
1356 | +microblaze_elf_new_section_hook (bfd *abfd, asection *sec) | ||
1357 | +{ | ||
1358 | + if (!sec->used_by_bfd) | ||
1359 | + { | ||
1360 | + struct _microblaze_elf_section_data *sdata; | ||
1361 | + size_t amt = sizeof (*sdata); | ||
1362 | + | ||
1363 | + sdata = bfd_zalloc (abfd, amt); | ||
1364 | + if (sdata == NULL) | ||
1365 | + return false; | ||
1366 | + sec->used_by_bfd = sdata; | ||
1367 | + } | ||
1368 | + | ||
1369 | + return _bfd_elf_new_section_hook (abfd, sec); | ||
1381 | +} | 1370 | +} |
1382 | + | 1371 | + |
1383 | +/* Microblaze ELF local labels start with 'L.' or '$L', not '.L'. */ | 1372 | +/* Microblaze ELF local labels start with 'L.' or '$L', not '.L'. */ |
1384 | + | 1373 | + |
1385 | +static bfd_boolean | 1374 | +static bool |
1386 | +microblaze_elf_is_local_label_name (bfd *abfd, const char *name) | 1375 | +microblaze_elf_is_local_label_name (bfd *abfd, const char *name) |
1387 | +{ | 1376 | +{ |
1388 | + if (name[0] == 'L' && name[1] == '.') | 1377 | + if (name[0] == 'L' && name[1] == '.') |
1389 | + return TRUE; | 1378 | + return true; |
1390 | + | 1379 | + |
1391 | + if (name[0] == '$' && name[1] == 'L') | 1380 | + if (name[0] == '$' && name[1] == 'L') |
1392 | + return TRUE; | 1381 | + return true; |
1393 | + | 1382 | + |
1394 | + /* With gcc, the labels go back to starting with '.', so we accept | 1383 | + /* With gcc, the labels go back to starting with '.', so we accept |
1395 | + the generic ELF local label syntax as well. */ | 1384 | + the generic ELF local label syntax as well. */ |
@@ -1472,9 +1461,10 @@ index 00000000000..bf58b4b0a67 | |||
1472 | + | 1461 | + |
1473 | +/* Get the ELF linker hash table from a link_info structure. */ | 1462 | +/* Get the ELF linker hash table from a link_info structure. */ |
1474 | + | 1463 | + |
1475 | +#define elf64_mb_hash_table(p) \ | 1464 | +#define elf64_mb_hash_table(p) \ |
1476 | + (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \ | 1465 | + ((is_elf_hash_table ((p)->hash) \ |
1477 | + == MICROBLAZE_ELF_DATA ? ((struct elf64_mb_link_hash_table *) ((p)->hash)) : NULL) | 1466 | + && elf_hash_table_id (elf_hash_table (p)) == MICROBLAZE_ELF_DATA) \ |
1467 | + ? (struct elf64_mb_link_hash_table *) (p)->hash : NULL) | ||
1478 | + | 1468 | + |
1479 | +/* Create an entry in a microblaze ELF linker hash table. */ | 1469 | +/* Create an entry in a microblaze ELF linker hash table. */ |
1480 | + | 1470 | + |
@@ -1500,7 +1490,6 @@ index 00000000000..bf58b4b0a67 | |||
1500 | + struct elf64_mb_link_hash_entry *eh; | 1490 | + struct elf64_mb_link_hash_entry *eh; |
1501 | + | 1491 | + |
1502 | + eh = (struct elf64_mb_link_hash_entry *) entry; | 1492 | + eh = (struct elf64_mb_link_hash_entry *) entry; |
1503 | + eh->dyn_relocs = NULL; | ||
1504 | + eh->tls_mask = 0; | 1493 | + eh->tls_mask = 0; |
1505 | + } | 1494 | + } |
1506 | + | 1495 | + |
@@ -1513,7 +1502,7 @@ index 00000000000..bf58b4b0a67 | |||
1513 | +microblaze_elf_link_hash_table_create (bfd *abfd) | 1502 | +microblaze_elf_link_hash_table_create (bfd *abfd) |
1514 | +{ | 1503 | +{ |
1515 | + struct elf64_mb_link_hash_table *ret; | 1504 | + struct elf64_mb_link_hash_table *ret; |
1516 | + bfd_size_type amt = sizeof (struct elf64_mb_link_hash_table); | 1505 | + size_t amt = sizeof (struct elf64_mb_link_hash_table); |
1517 | + | 1506 | + |
1518 | + ret = (struct elf64_mb_link_hash_table *) bfd_zmalloc (amt); | 1507 | + ret = (struct elf64_mb_link_hash_table *) bfd_zmalloc (amt); |
1519 | + if (ret == NULL) | 1508 | + if (ret == NULL) |
@@ -1537,19 +1526,19 @@ index 00000000000..bf58b4b0a67 | |||
1537 | +{ | 1526 | +{ |
1538 | + struct bfd_link_hash_entry *h; | 1527 | + struct bfd_link_hash_entry *h; |
1539 | + | 1528 | + |
1540 | + h = bfd_link_hash_lookup (info->hash, RO_SDA_ANCHOR_NAME, FALSE, FALSE, TRUE); | 1529 | + h = bfd_link_hash_lookup (info->hash, RO_SDA_ANCHOR_NAME, false, false, true); |
1541 | + if (h != (struct bfd_link_hash_entry *) NULL | 1530 | + if (h != (struct bfd_link_hash_entry *) NULL |
1542 | + && h->type == bfd_link_hash_defined) | 1531 | + && h->type == bfd_link_hash_defined) |
1543 | + ro_small_data_pointer = (h->u.def.value | 1532 | + ro_small_data_pointer = (h->u.def.value |
1544 | + + h->u.def.section->output_section->vma | 1533 | + + h->u.def.section->output_section->vma |
1545 | + + h->u.def.section->output_offset); | 1534 | + + h->u.def.section->output_offset); |
1546 | + | 1535 | + |
1547 | + h = bfd_link_hash_lookup (info->hash, RW_SDA_ANCHOR_NAME, FALSE, FALSE, TRUE); | 1536 | + h = bfd_link_hash_lookup (info->hash, RW_SDA_ANCHOR_NAME, false, false, true); |
1548 | + if (h != (struct bfd_link_hash_entry *) NULL | 1537 | + if (h != (struct bfd_link_hash_entry *) NULL |
1549 | + && h->type == bfd_link_hash_defined) | 1538 | + && h->type == bfd_link_hash_defined) |
1550 | + rw_small_data_pointer = (h->u.def.value | 1539 | + rw_small_data_pointer = (h->u.def.value |
1551 | + + h->u.def.section->output_section->vma | 1540 | + + h->u.def.section->output_section->vma |
1552 | + + h->u.def.section->output_offset); | 1541 | + + h->u.def.section->output_offset); |
1553 | +} | 1542 | +} |
1554 | + | 1543 | + |
1555 | +static bfd_vma | 1544 | +static bfd_vma |
@@ -1620,7 +1609,7 @@ index 00000000000..bf58b4b0a67 | |||
1620 | + section, which means that the addend must be adjusted | 1609 | + section, which means that the addend must be adjusted |
1621 | + accordingly. */ | 1610 | + accordingly. */ |
1622 | + | 1611 | + |
1623 | +static bfd_boolean | 1612 | +static int |
1624 | +microblaze_elf_relocate_section (bfd *output_bfd, | 1613 | +microblaze_elf_relocate_section (bfd *output_bfd, |
1625 | + struct bfd_link_info *info, | 1614 | + struct bfd_link_info *info, |
1626 | + bfd *input_bfd, | 1615 | + bfd *input_bfd, |
@@ -1636,7 +1625,7 @@ index 00000000000..bf58b4b0a67 | |||
1636 | + Elf_Internal_Rela *rel, *relend; | 1625 | + Elf_Internal_Rela *rel, *relend; |
1637 | + int endian = (bfd_little_endian (output_bfd)) ? 0 : 2; | 1626 | + int endian = (bfd_little_endian (output_bfd)) ? 0 : 2; |
1638 | + /* Assume success. */ | 1627 | + /* Assume success. */ |
1639 | + bfd_boolean ret = TRUE; | 1628 | + bool ret = true; |
1640 | + asection *sreloc; | 1629 | + asection *sreloc; |
1641 | + bfd_vma *local_got_offsets; | 1630 | + bfd_vma *local_got_offsets; |
1642 | + unsigned int tls_type; | 1631 | + unsigned int tls_type; |
@@ -1646,7 +1635,7 @@ index 00000000000..bf58b4b0a67 | |||
1646 | + | 1635 | + |
1647 | + htab = elf64_mb_hash_table (info); | 1636 | + htab = elf64_mb_hash_table (info); |
1648 | + if (htab == NULL) | 1637 | + if (htab == NULL) |
1649 | + return FALSE; | 1638 | + return false; |
1650 | + | 1639 | + |
1651 | + local_got_offsets = elf_local_got_offsets (input_bfd); | 1640 | + local_got_offsets = elf_local_got_offsets (input_bfd); |
1652 | + | 1641 | + |
@@ -1667,7 +1656,7 @@ index 00000000000..bf58b4b0a67 | |||
1667 | + const char *sym_name; | 1656 | + const char *sym_name; |
1668 | + bfd_reloc_status_type r = bfd_reloc_ok; | 1657 | + bfd_reloc_status_type r = bfd_reloc_ok; |
1669 | + const char *errmsg = NULL; | 1658 | + const char *errmsg = NULL; |
1670 | + bfd_boolean unresolved_reloc = FALSE; | 1659 | + bool unresolved_reloc = false; |
1671 | + | 1660 | + |
1672 | + h = NULL; | 1661 | + h = NULL; |
1673 | + r_type = ELF64_R_TYPE (rel->r_info); | 1662 | + r_type = ELF64_R_TYPE (rel->r_info); |
@@ -1675,10 +1664,11 @@ index 00000000000..bf58b4b0a67 | |||
1675 | + | 1664 | + |
1676 | + if (r_type < 0 || r_type >= (int) R_MICROBLAZE_max) | 1665 | + if (r_type < 0 || r_type >= (int) R_MICROBLAZE_max) |
1677 | + { | 1666 | + { |
1678 | + (*_bfd_error_handler) (_("%s: unknown relocation type %d"), | 1667 | + /* xgettext:c-format */ |
1679 | + bfd_get_filename (input_bfd), (int) r_type); | 1668 | + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), |
1669 | + input_bfd, (int) r_type); | ||
1680 | + bfd_set_error (bfd_error_bad_value); | 1670 | + bfd_set_error (bfd_error_bad_value); |
1681 | + ret = FALSE; | 1671 | + ret = false; |
1682 | + continue; | 1672 | + continue; |
1683 | + } | 1673 | + } |
1684 | + | 1674 | + |
@@ -1728,11 +1718,12 @@ index 00000000000..bf58b4b0a67 | |||
1728 | + else | 1718 | + else |
1729 | + { | 1719 | + { |
1730 | + bfd_vma relocation; | 1720 | + bfd_vma relocation; |
1721 | + bool resolved_to_zero; | ||
1731 | + | 1722 | + |
1732 | + /* This is a final link. */ | 1723 | + /* This is a final link. */ |
1733 | + sym = NULL; | 1724 | + sym = NULL; |
1734 | + sec = NULL; | 1725 | + sec = NULL; |
1735 | + unresolved_reloc = FALSE; | 1726 | + unresolved_reloc = false; |
1736 | + | 1727 | + |
1737 | + if (r_symndx < symtab_hdr->sh_info) | 1728 | + if (r_symndx < symtab_hdr->sh_info) |
1738 | + { | 1729 | + { |
@@ -1750,8 +1741,8 @@ index 00000000000..bf58b4b0a67 | |||
1750 | + else | 1741 | + else |
1751 | + { | 1742 | + { |
1752 | + /* External symbol. */ | 1743 | + /* External symbol. */ |
1753 | + bfd_boolean warned ATTRIBUTE_UNUSED; | 1744 | + bool warned ATTRIBUTE_UNUSED; |
1754 | + bfd_boolean ignored ATTRIBUTE_UNUSED; | 1745 | + bool ignored ATTRIBUTE_UNUSED; |
1755 | + | 1746 | + |
1756 | + RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, | 1747 | + RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, |
1757 | + r_symndx, symtab_hdr, sym_hashes, | 1748 | + r_symndx, symtab_hdr, sym_hashes, |
@@ -1767,6 +1758,9 @@ index 00000000000..bf58b4b0a67 | |||
1767 | + goto check_reloc; | 1758 | + goto check_reloc; |
1768 | + } | 1759 | + } |
1769 | + | 1760 | + |
1761 | + resolved_to_zero = (h != NULL | ||
1762 | + && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)); | ||
1763 | + | ||
1770 | + switch ((int) r_type) | 1764 | + switch ((int) r_type) |
1771 | + { | 1765 | + { |
1772 | + case (int) R_MICROBLAZE_SRO32 : | 1766 | + case (int) R_MICROBLAZE_SRO32 : |
@@ -1785,7 +1779,7 @@ index 00000000000..bf58b4b0a67 | |||
1785 | + microblaze_elf_final_sdp (info); | 1779 | + microblaze_elf_final_sdp (info); |
1786 | + if (ro_small_data_pointer == 0) | 1780 | + if (ro_small_data_pointer == 0) |
1787 | + { | 1781 | + { |
1788 | + ret = FALSE; | 1782 | + ret = false; |
1789 | + r = bfd_reloc_undefined; | 1783 | + r = bfd_reloc_undefined; |
1790 | + goto check_reloc; | 1784 | + goto check_reloc; |
1791 | + } | 1785 | + } |
@@ -1801,13 +1795,16 @@ index 00000000000..bf58b4b0a67 | |||
1801 | + } | 1795 | + } |
1802 | + else | 1796 | + else |
1803 | + { | 1797 | + { |
1804 | + (*_bfd_error_handler) (_("%s: The target (%s) of an %s relocation is in the wrong section (%s)"), | 1798 | + _bfd_error_handler |
1805 | + bfd_get_filename (input_bfd), | 1799 | + /* xgettext:c-format */ |
1806 | + sym_name, | 1800 | + (_("%pB: the target (%s) of an %s relocation" |
1807 | + microblaze_elf_howto_table[(int) r_type]->name, | 1801 | + " is in the wrong section (%pA)"), |
1808 | + bfd_section_name (sec)); | 1802 | + input_bfd, |
1803 | + sym_name, | ||
1804 | + microblaze_elf_howto_table[(int) r_type]->name, | ||
1805 | + sec); | ||
1809 | + /*bfd_set_error (bfd_error_bad_value); ??? why? */ | 1806 | + /*bfd_set_error (bfd_error_bad_value); ??? why? */ |
1810 | + ret = FALSE; | 1807 | + ret = false; |
1811 | + continue; | 1808 | + continue; |
1812 | + } | 1809 | + } |
1813 | + } | 1810 | + } |
@@ -1830,7 +1827,7 @@ index 00000000000..bf58b4b0a67 | |||
1830 | + microblaze_elf_final_sdp (info); | 1827 | + microblaze_elf_final_sdp (info); |
1831 | + if (rw_small_data_pointer == 0) | 1828 | + if (rw_small_data_pointer == 0) |
1832 | + { | 1829 | + { |
1833 | + ret = FALSE; | 1830 | + ret = false; |
1834 | + r = bfd_reloc_undefined; | 1831 | + r = bfd_reloc_undefined; |
1835 | + goto check_reloc; | 1832 | + goto check_reloc; |
1836 | + } | 1833 | + } |
@@ -1846,13 +1843,16 @@ index 00000000000..bf58b4b0a67 | |||
1846 | + } | 1843 | + } |
1847 | + else | 1844 | + else |
1848 | + { | 1845 | + { |
1849 | + (*_bfd_error_handler) (_("%s: The target (%s) of an %s relocation is in the wrong section (%s)"), | 1846 | + _bfd_error_handler |
1850 | + bfd_get_filename (input_bfd), | 1847 | + /* xgettext:c-format */ |
1851 | + sym_name, | 1848 | + (_("%pB: the target (%s) of an %s relocation" |
1852 | + microblaze_elf_howto_table[(int) r_type]->name, | 1849 | + " is in the wrong section (%pA)"), |
1853 | + bfd_section_name (sec)); | 1850 | + input_bfd, |
1851 | + sym_name, | ||
1852 | + microblaze_elf_howto_table[(int) r_type]->name, | ||
1853 | + sec); | ||
1854 | + /*bfd_set_error (bfd_error_bad_value); ??? why? */ | 1854 | + /*bfd_set_error (bfd_error_bad_value); ??? why? */ |
1855 | + ret = FALSE; | 1855 | + ret = false; |
1856 | + continue; | 1856 | + continue; |
1857 | + } | 1857 | + } |
1858 | + } | 1858 | + } |
@@ -1863,36 +1863,47 @@ index 00000000000..bf58b4b0a67 | |||
1863 | + break; /* Do nothing. */ | 1863 | + break; /* Do nothing. */ |
1864 | + | 1864 | + |
1865 | + case (int) R_MICROBLAZE_GOTPC_64: | 1865 | + case (int) R_MICROBLAZE_GOTPC_64: |
1866 | + case (int) R_MICROBLAZE_GPC_64: | 1866 | + relocation = (htab->elf.sgotplt->output_section->vma |
1867 | + relocation = htab->sgotplt->output_section->vma | 1867 | + + htab->elf.sgotplt->output_offset); |
1868 | + + htab->sgotplt->output_offset; | ||
1869 | + relocation -= (input_section->output_section->vma | 1868 | + relocation -= (input_section->output_section->vma |
1870 | + + input_section->output_offset | 1869 | + + input_section->output_offset |
1871 | + + offset + INST_WORD_SIZE); | 1870 | + + offset + INST_WORD_SIZE); |
1872 | + relocation += addend; | 1871 | + relocation += addend; |
1873 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | 1872 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, |
1874 | + contents + offset + endian); | 1873 | + contents + offset + endian); |
1875 | + bfd_put_16 (input_bfd, relocation & 0xffff, | 1874 | + bfd_put_16 (input_bfd, relocation & 0xffff, |
1876 | + contents + offset + endian + INST_WORD_SIZE); | 1875 | + contents + offset + endian + INST_WORD_SIZE); |
1876 | + break; | ||
1877 | + | ||
1878 | + case (int) R_MICROBLAZE_TEXTPCREL_64: | ||
1879 | + relocation = input_section->output_section->vma; | ||
1880 | + relocation -= (input_section->output_section->vma | ||
1881 | + + input_section->output_offset | ||
1882 | + + offset + INST_WORD_SIZE); | ||
1883 | + relocation += addend; | ||
1884 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | ||
1885 | + contents + offset + endian); | ||
1886 | + bfd_put_16 (input_bfd, relocation & 0xffff, | ||
1887 | + contents + offset + endian + INST_WORD_SIZE); | ||
1877 | + break; | 1888 | + break; |
1878 | + | 1889 | + |
1879 | + case (int) R_MICROBLAZE_PLT_64: | 1890 | + case (int) R_MICROBLAZE_PLT_64: |
1880 | + { | 1891 | + { |
1881 | + bfd_vma immediate; | 1892 | + bfd_vma immediate; |
1882 | + if (htab->splt != NULL && h != NULL | 1893 | + if (htab->elf.splt != NULL && h != NULL |
1883 | + && h->plt.offset != (bfd_vma) -1) | 1894 | + && h->plt.offset != (bfd_vma) -1) |
1884 | + { | 1895 | + { |
1885 | + relocation = (htab->splt->output_section->vma | 1896 | + relocation = (htab->elf.splt->output_section->vma |
1886 | + + htab->splt->output_offset | 1897 | + + htab->elf.splt->output_offset |
1887 | + + h->plt.offset); | 1898 | + + h->plt.offset); |
1888 | + unresolved_reloc = FALSE; | 1899 | + unresolved_reloc = false; |
1889 | + immediate = relocation - (input_section->output_section->vma | 1900 | + immediate = relocation - (input_section->output_section->vma |
1890 | + + input_section->output_offset | 1901 | + + input_section->output_offset |
1891 | + + offset + INST_WORD_SIZE); | 1902 | + + offset + INST_WORD_SIZE); |
1892 | + bfd_put_16 (input_bfd, (immediate >> 16) & 0xffff, | 1903 | + bfd_put_16 (input_bfd, (immediate >> 16) & 0xffff, |
1893 | + contents + offset + endian); | 1904 | + contents + offset + endian); |
1894 | + bfd_put_16 (input_bfd, immediate & 0xffff, | 1905 | + bfd_put_16 (input_bfd, immediate & 0xffff, |
1895 | + contents + offset + endian + INST_WORD_SIZE); | 1906 | + contents + offset + endian + INST_WORD_SIZE); |
1896 | + } | 1907 | + } |
1897 | + else | 1908 | + else |
1898 | + { | 1909 | + { |
@@ -1901,9 +1912,9 @@ index 00000000000..bf58b4b0a67 | |||
1901 | + + offset + INST_WORD_SIZE); | 1912 | + + offset + INST_WORD_SIZE); |
1902 | + immediate = relocation; | 1913 | + immediate = relocation; |
1903 | + bfd_put_16 (input_bfd, (immediate >> 16) & 0xffff, | 1914 | + bfd_put_16 (input_bfd, (immediate >> 16) & 0xffff, |
1904 | + contents + offset + endian); | 1915 | + contents + offset + endian); |
1905 | + bfd_put_16 (input_bfd, immediate & 0xffff, | 1916 | + bfd_put_16 (input_bfd, immediate & 0xffff, |
1906 | + contents + offset + endian + INST_WORD_SIZE); | 1917 | + contents + offset + endian + INST_WORD_SIZE); |
1907 | + } | 1918 | + } |
1908 | + break; | 1919 | + break; |
1909 | + } | 1920 | + } |
@@ -1913,6 +1924,7 @@ index 00000000000..bf58b4b0a67 | |||
1913 | + goto dogot; | 1924 | + goto dogot; |
1914 | + case (int) R_MICROBLAZE_TLSLD: | 1925 | + case (int) R_MICROBLAZE_TLSLD: |
1915 | + tls_type = (TLS_TLS | TLS_LD); | 1926 | + tls_type = (TLS_TLS | TLS_LD); |
1927 | + /* Fall through. */ | ||
1916 | + dogot: | 1928 | + dogot: |
1917 | + case (int) R_MICROBLAZE_GOT_64: | 1929 | + case (int) R_MICROBLAZE_GOT_64: |
1918 | + { | 1930 | + { |
@@ -1921,8 +1933,8 @@ index 00000000000..bf58b4b0a67 | |||
1921 | + unsigned long indx; | 1933 | + unsigned long indx; |
1922 | + bfd_vma static_value; | 1934 | + bfd_vma static_value; |
1923 | + | 1935 | + |
1924 | + bfd_boolean need_relocs = FALSE; | 1936 | + bool need_relocs = false; |
1925 | + if (htab->sgot == NULL) | 1937 | + if (htab->elf.sgot == NULL) |
1926 | + abort (); | 1938 | + abort (); |
1927 | + | 1939 | + |
1928 | + indx = 0; | 1940 | + indx = 0; |
@@ -1938,10 +1950,11 @@ index 00000000000..bf58b4b0a67 | |||
1938 | + offp = &htab->tlsld_got.offset; | 1950 | + offp = &htab->tlsld_got.offset; |
1939 | + else if (h != NULL) | 1951 | + else if (h != NULL) |
1940 | + { | 1952 | + { |
1941 | + if (htab->sgotplt != NULL && h->got.offset != (bfd_vma) -1) | 1953 | + if (htab->elf.sgotplt != NULL |
1942 | + offp = &h->got.offset; | 1954 | + && h->got.offset != (bfd_vma) -1) |
1955 | + offp = &h->got.offset; | ||
1943 | + else | 1956 | + else |
1944 | + abort (); | 1957 | + abort (); |
1945 | + } | 1958 | + } |
1946 | + else | 1959 | + else |
1947 | + { | 1960 | + { |
@@ -1962,7 +1975,7 @@ index 00000000000..bf58b4b0a67 | |||
1962 | + /* Symbol index to use for relocs */ | 1975 | + /* Symbol index to use for relocs */ |
1963 | + if (h != NULL) | 1976 | + if (h != NULL) |
1964 | + { | 1977 | + { |
1965 | + bfd_boolean dyn = | 1978 | + bool dyn = |
1966 | + elf_hash_table (info)->dynamic_sections_created; | 1979 | + elf_hash_table (info)->dynamic_sections_created; |
1967 | + | 1980 | + |
1968 | + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, | 1981 | + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, |
@@ -1978,7 +1991,7 @@ index 00000000000..bf58b4b0a67 | |||
1978 | + && (h == NULL | 1991 | + && (h == NULL |
1979 | + || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT | 1992 | + || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT |
1980 | + || h->root.type != bfd_link_hash_undefweak)) | 1993 | + || h->root.type != bfd_link_hash_undefweak)) |
1981 | + need_relocs = TRUE; | 1994 | + need_relocs = true; |
1982 | + | 1995 | + |
1983 | + /* 2. Compute/Emit Static value of r-expression */ | 1996 | + /* 2. Compute/Emit Static value of r-expression */ |
1984 | + static_value = relocation + addend; | 1997 | + static_value = relocation + addend; |
@@ -1988,105 +2001,103 @@ index 00000000000..bf58b4b0a67 | |||
1988 | + { | 2001 | + { |
1989 | + bfd_vma got_offset; | 2002 | + bfd_vma got_offset; |
1990 | + | 2003 | + |
1991 | + got_offset = (htab->sgot->output_section->vma | 2004 | + got_offset = (htab->elf.sgot->output_section->vma |
1992 | + + htab->sgot->output_offset | 2005 | + + htab->elf.sgot->output_offset |
1993 | + + off); | 2006 | + + off); |
1994 | + | 2007 | + |
1995 | + /* Process module-id */ | 2008 | + /* Process module-id */ |
1996 | + if (IS_TLS_LD(tls_type)) | 2009 | + if (IS_TLS_LD(tls_type)) |
1997 | + { | 2010 | + { |
1998 | + if (! bfd_link_pic (info)) | 2011 | + if (! bfd_link_pic (info)) |
1999 | + { | 2012 | + bfd_put_32 (output_bfd, 1, |
2000 | + bfd_put_32 (output_bfd, 1, htab->sgot->contents + off); | 2013 | + htab->elf.sgot->contents + off); |
2001 | + } | ||
2002 | + else | 2014 | + else |
2003 | + { | 2015 | + microblaze_elf_output_dynamic_relocation |
2004 | + microblaze_elf_output_dynamic_relocation (output_bfd, | 2016 | + (output_bfd, |
2005 | + htab->srelgot, htab->srelgot->reloc_count++, | 2017 | + htab->elf.srelgot, |
2006 | + /* symindex= */ 0, R_MICROBLAZE_TLSDTPMOD32, | 2018 | + htab->elf.srelgot->reloc_count++, |
2007 | + got_offset, 0); | 2019 | + /* symindex= */ 0, R_MICROBLAZE_TLSDTPMOD32, |
2008 | + } | 2020 | + got_offset, 0); |
2009 | + } | 2021 | + } |
2010 | + else if (IS_TLS_GD(tls_type)) | 2022 | + else if (IS_TLS_GD(tls_type)) |
2011 | + { | 2023 | + { |
2012 | + if (! need_relocs) | 2024 | + if (! need_relocs) |
2013 | + { | 2025 | + bfd_put_32 (output_bfd, 1, |
2014 | + bfd_put_32 (output_bfd, 1, htab->sgot->contents + off); | 2026 | + htab->elf.sgot->contents + off); |
2015 | + } | 2027 | + else |
2016 | + else | 2028 | + microblaze_elf_output_dynamic_relocation |
2017 | + { | 2029 | + (output_bfd, |
2018 | + microblaze_elf_output_dynamic_relocation (output_bfd, | 2030 | + htab->elf.srelgot, |
2019 | + htab->srelgot, | 2031 | + htab->elf.srelgot->reloc_count++, |
2020 | + htab->srelgot->reloc_count++, | 2032 | + /* symindex= */ indx, R_MICROBLAZE_TLSDTPMOD32, |
2021 | + /* symindex= */ indx, R_MICROBLAZE_TLSDTPMOD32, | 2033 | + got_offset, indx ? 0 : static_value); |
2022 | + got_offset, indx ? 0 : static_value); | ||
2023 | + } | ||
2024 | + } | 2034 | + } |
2025 | + | 2035 | + |
2026 | + /* Process Offset */ | 2036 | + /* Process Offset */ |
2027 | + if (htab->srelgot == NULL) | 2037 | + if (htab->elf.srelgot == NULL) |
2028 | + abort (); | 2038 | + abort (); |
2029 | + | 2039 | + |
2030 | + got_offset = (htab->sgot->output_section->vma | 2040 | + got_offset = (htab->elf.sgot->output_section->vma |
2031 | + + htab->sgot->output_offset | 2041 | + + htab->elf.sgot->output_offset |
2032 | + + off2); | 2042 | + + off2); |
2033 | + if (IS_TLS_LD(tls_type)) | 2043 | + if (IS_TLS_LD(tls_type)) |
2034 | + { | 2044 | + { |
2035 | + /* For LD, offset should be 0 */ | 2045 | + /* For LD, offset should be 0 */ |
2036 | + *offp |= 1; | 2046 | + *offp |= 1; |
2037 | + bfd_put_32 (output_bfd, 0, htab->sgot->contents + off2); | 2047 | + bfd_put_32 (output_bfd, 0, |
2048 | + htab->elf.sgot->contents + off2); | ||
2038 | + } | 2049 | + } |
2039 | + else if (IS_TLS_GD(tls_type)) | 2050 | + else if (IS_TLS_GD(tls_type)) |
2040 | + { | 2051 | + { |
2041 | + *offp |= 1; | 2052 | + *offp |= 1; |
2042 | + static_value -= dtprel_base(info); | 2053 | + static_value -= dtprel_base(info); |
2043 | + if (need_relocs) | 2054 | + if (need_relocs) |
2044 | + { | 2055 | + microblaze_elf_output_dynamic_relocation |
2045 | + microblaze_elf_output_dynamic_relocation (output_bfd, | 2056 | + (output_bfd, |
2046 | + htab->srelgot, htab->srelgot->reloc_count++, | 2057 | + htab->elf.srelgot, |
2047 | + /* symindex= */ indx, R_MICROBLAZE_TLSDTPREL32, | 2058 | + htab->elf.srelgot->reloc_count++, |
2048 | + got_offset, indx ? 0 : static_value); | 2059 | + /* symindex= */ indx, R_MICROBLAZE_TLSDTPREL32, |
2049 | + } | 2060 | + got_offset, indx ? 0 : static_value); |
2050 | + else | 2061 | + else |
2051 | + { | 2062 | + bfd_put_32 (output_bfd, static_value, |
2052 | + bfd_put_32 (output_bfd, static_value, | 2063 | + htab->elf.sgot->contents + off2); |
2053 | + htab->sgot->contents + off2); | ||
2054 | + } | ||
2055 | + } | 2064 | + } |
2056 | + else | 2065 | + else |
2057 | + { | 2066 | + { |
2058 | + bfd_put_32 (output_bfd, static_value, | 2067 | + bfd_put_32 (output_bfd, static_value, |
2059 | + htab->sgot->contents + off2); | 2068 | + htab->elf.sgot->contents + off2); |
2060 | + | 2069 | + |
2061 | + /* Relocs for dyn symbols generated by | 2070 | + /* Relocs for dyn symbols generated by |
2062 | + finish_dynamic_symbols */ | 2071 | + finish_dynamic_symbols */ |
2063 | + if (bfd_link_pic (info) && h == NULL) | 2072 | + if (bfd_link_pic (info) && h == NULL) |
2064 | + { | 2073 | + { |
2065 | + *offp |= 1; | 2074 | + *offp |= 1; |
2066 | + microblaze_elf_output_dynamic_relocation (output_bfd, | 2075 | + microblaze_elf_output_dynamic_relocation |
2067 | + htab->srelgot, htab->srelgot->reloc_count++, | 2076 | + (output_bfd, |
2068 | + /* symindex= */ indx, R_MICROBLAZE_REL, | 2077 | + htab->elf.srelgot, |
2069 | + got_offset, static_value); | 2078 | + htab->elf.srelgot->reloc_count++, |
2070 | + } | 2079 | + /* symindex= */ indx, R_MICROBLAZE_REL, |
2080 | + got_offset, static_value); | ||
2081 | + } | ||
2071 | + } | 2082 | + } |
2072 | + } | 2083 | + } |
2073 | + | 2084 | + |
2074 | + /* 4. Fixup Relocation with GOT offset value | 2085 | + /* 4. Fixup Relocation with GOT offset value |
2075 | + Compute relative address of GOT entry for applying | 2086 | + Compute relative address of GOT entry for applying |
2076 | + the current relocation */ | 2087 | + the current relocation */ |
2077 | + relocation = htab->sgot->output_section->vma | 2088 | + relocation = htab->elf.sgot->output_section->vma |
2078 | + + htab->sgot->output_offset | 2089 | + + htab->elf.sgot->output_offset |
2079 | + + off | 2090 | + + off |
2080 | + - htab->sgotplt->output_section->vma | 2091 | + - htab->elf.sgotplt->output_section->vma |
2081 | + - htab->sgotplt->output_offset; | 2092 | + - htab->elf.sgotplt->output_offset; |
2082 | + | 2093 | + |
2083 | + /* Apply Current Relocation */ | 2094 | + /* Apply Current Relocation */ |
2084 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | 2095 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, |
2085 | + contents + offset + endian); | 2096 | + contents + offset + endian); |
2086 | + bfd_put_16 (input_bfd, relocation & 0xffff, | 2097 | + bfd_put_16 (input_bfd, relocation & 0xffff, |
2087 | + contents + offset + endian + INST_WORD_SIZE); | 2098 | + contents + offset + endian + INST_WORD_SIZE); |
2088 | + | 2099 | + |
2089 | + unresolved_reloc = FALSE; | 2100 | + unresolved_reloc = false; |
2090 | + break; | 2101 | + break; |
2091 | + } | 2102 | + } |
2092 | + | 2103 | + |
@@ -2095,22 +2106,23 @@ index 00000000000..bf58b4b0a67 | |||
2095 | + bfd_vma immediate; | 2106 | + bfd_vma immediate; |
2096 | + unsigned short lo, high; | 2107 | + unsigned short lo, high; |
2097 | + relocation += addend; | 2108 | + relocation += addend; |
2098 | + relocation -= htab->sgotplt->output_section->vma | 2109 | + relocation -= (htab->elf.sgotplt->output_section->vma |
2099 | + + htab->sgotplt->output_offset; | 2110 | + + htab->elf.sgotplt->output_offset); |
2100 | + /* Write this value into correct location. */ | 2111 | + /* Write this value into correct location. */ |
2101 | + immediate = relocation; | 2112 | + immediate = relocation; |
2102 | + lo = immediate & 0x0000ffff; | 2113 | + lo = immediate & 0x0000ffff; |
2103 | + high = (immediate >> 16) & 0x0000ffff; | 2114 | + high = (immediate >> 16) & 0x0000ffff; |
2104 | + bfd_put_16 (input_bfd, high, contents + offset + endian); | 2115 | + bfd_put_16 (input_bfd, high, contents + offset + endian); |
2105 | + bfd_put_16 (input_bfd, lo, contents + offset + INST_WORD_SIZE + endian); | 2116 | + bfd_put_16 (input_bfd, lo, |
2117 | + contents + offset + INST_WORD_SIZE + endian); | ||
2106 | + break; | 2118 | + break; |
2107 | + } | 2119 | + } |
2108 | + | 2120 | + |
2109 | + case (int) R_MICROBLAZE_GOTOFF_32: | 2121 | + case (int) R_MICROBLAZE_GOTOFF_32: |
2110 | + { | 2122 | + { |
2111 | + relocation += addend; | 2123 | + relocation += addend; |
2112 | + relocation -= htab->sgotplt->output_section->vma | 2124 | + relocation -= (htab->elf.sgotplt->output_section->vma |
2113 | + + htab->sgotplt->output_offset; | 2125 | + + htab->elf.sgotplt->output_offset); |
2114 | + /* Write this value into correct location. */ | 2126 | + /* Write this value into correct location. */ |
2115 | + bfd_put_32 (input_bfd, relocation, contents + offset); | 2127 | + bfd_put_32 (input_bfd, relocation, contents + offset); |
2116 | + break; | 2128 | + break; |
@@ -2124,6 +2136,8 @@ index 00000000000..bf58b4b0a67 | |||
2124 | + bfd_put_16 (input_bfd, relocation & 0xffff, | 2136 | + bfd_put_16 (input_bfd, relocation & 0xffff, |
2125 | + contents + offset + endian + INST_WORD_SIZE); | 2137 | + contents + offset + endian + INST_WORD_SIZE); |
2126 | + break; | 2138 | + break; |
2139 | + case (int) R_MICROBLAZE_TEXTREL_64: | ||
2140 | + case (int) R_MICROBLAZE_TEXTREL_32_LO: | ||
2127 | + case (int) R_MICROBLAZE_64_PCREL : | 2141 | + case (int) R_MICROBLAZE_64_PCREL : |
2128 | + case (int) R_MICROBLAZE_64: | 2142 | + case (int) R_MICROBLAZE_64: |
2129 | + case (int) R_MICROBLAZE_32: | 2143 | + case (int) R_MICROBLAZE_32: |
@@ -2145,6 +2159,14 @@ index 00000000000..bf58b4b0a67 | |||
2145 | + relocation -= (input_section->output_section->vma | 2159 | + relocation -= (input_section->output_section->vma |
2146 | + + input_section->output_offset | 2160 | + + input_section->output_offset |
2147 | + + offset + INST_WORD_SIZE); | 2161 | + + offset + INST_WORD_SIZE); |
2162 | + else if (r_type == R_MICROBLAZE_TEXTREL_64 | ||
2163 | + || r_type == R_MICROBLAZE_TEXTREL_32_LO) | ||
2164 | + relocation -= input_section->output_section->vma; | ||
2165 | + | ||
2166 | + if (r_type == R_MICROBLAZE_TEXTREL_32_LO) | ||
2167 | + bfd_put_16 (input_bfd, relocation & 0xffff, | ||
2168 | + contents + offset + endian); | ||
2169 | + | ||
2148 | + unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian); | 2170 | + unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian); |
2149 | + if ((insn & 0xff000000) == 0xb2000000) | 2171 | + if ((insn & 0xff000000) == 0xb2000000) |
2150 | + { | 2172 | + { |
@@ -2164,7 +2186,8 @@ index 00000000000..bf58b4b0a67 | |||
2164 | + | 2186 | + |
2165 | + if ((bfd_link_pic (info) | 2187 | + if ((bfd_link_pic (info) |
2166 | + && (h == NULL | 2188 | + && (h == NULL |
2167 | + || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT | 2189 | + || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT |
2190 | + && !resolved_to_zero) | ||
2168 | + || h->root.type != bfd_link_hash_undefweak) | 2191 | + || h->root.type != bfd_link_hash_undefweak) |
2169 | + && (!howto->pc_relative | 2192 | + && (!howto->pc_relative |
2170 | + || (h != NULL | 2193 | + || (h != NULL |
@@ -2182,7 +2205,7 @@ index 00000000000..bf58b4b0a67 | |||
2182 | + { | 2205 | + { |
2183 | + Elf_Internal_Rela outrel; | 2206 | + Elf_Internal_Rela outrel; |
2184 | + bfd_byte *loc; | 2207 | + bfd_byte *loc; |
2185 | + bfd_boolean skip; | 2208 | + bool skip; |
2186 | + | 2209 | + |
2187 | + /* When generating a shared object, these relocations | 2210 | + /* When generating a shared object, these relocations |
2188 | + are copied into the output file to be resolved at run | 2211 | + are copied into the output file to be resolved at run |
@@ -2190,15 +2213,15 @@ index 00000000000..bf58b4b0a67 | |||
2190 | + | 2213 | + |
2191 | + BFD_ASSERT (sreloc != NULL); | 2214 | + BFD_ASSERT (sreloc != NULL); |
2192 | + | 2215 | + |
2193 | + skip = FALSE; | 2216 | + skip = false; |
2194 | + | 2217 | + |
2195 | + outrel.r_offset = | 2218 | + outrel.r_offset = |
2196 | + _bfd_elf_section_offset (output_bfd, info, input_section, | 2219 | + _bfd_elf_section_offset (output_bfd, info, input_section, |
2197 | + rel->r_offset); | 2220 | + rel->r_offset); |
2198 | + if (outrel.r_offset == (bfd_vma) -1) | 2221 | + if (outrel.r_offset == (bfd_vma) -1) |
2199 | + skip = TRUE; | 2222 | + skip = true; |
2200 | + else if (outrel.r_offset == (bfd_vma) -2) | 2223 | + else if (outrel.r_offset == (bfd_vma) -2) |
2201 | + skip = TRUE; | 2224 | + skip = true; |
2202 | + outrel.r_offset += (input_section->output_section->vma | 2225 | + outrel.r_offset += (input_section->output_section->vma |
2203 | + + input_section->output_offset); | 2226 | + + input_section->output_offset); |
2204 | + | 2227 | + |
@@ -2224,11 +2247,11 @@ index 00000000000..bf58b4b0a67 | |||
2224 | + else | 2247 | + else |
2225 | + { | 2248 | + { |
2226 | + BFD_FAIL (); | 2249 | + BFD_FAIL (); |
2227 | + (*_bfd_error_handler) | 2250 | + _bfd_error_handler |
2228 | + (_("%B: probably compiled without -fPIC?"), | 2251 | + (_("%pB: probably compiled without -fPIC?"), |
2229 | + input_bfd); | 2252 | + input_bfd); |
2230 | + bfd_set_error (bfd_error_bad_value); | 2253 | + bfd_set_error (bfd_error_bad_value); |
2231 | + return FALSE; | 2254 | + return false; |
2232 | + } | 2255 | + } |
2233 | + } | 2256 | + } |
2234 | + | 2257 | + |
@@ -2247,25 +2270,33 @@ index 00000000000..bf58b4b0a67 | |||
2247 | + else | 2270 | + else |
2248 | + { | 2271 | + { |
2249 | + if (r_type == R_MICROBLAZE_64_PCREL) | 2272 | + if (r_type == R_MICROBLAZE_64_PCREL) |
2250 | + { | 2273 | + { |
2251 | + if (!input_section->output_section->vma && | 2274 | + if (!input_section->output_section->vma && |
2252 | + !input_section->output_offset && !offset) | 2275 | + !input_section->output_offset && !offset) |
2253 | + relocation -= (input_section->output_section->vma | 2276 | + relocation -= (input_section->output_section->vma |
2254 | + + input_section->output_offset | 2277 | + + input_section->output_offset |
2255 | + + offset); | 2278 | + + offset); |
2256 | + else | 2279 | + else |
2257 | + relocation -= (input_section->output_section->vma | 2280 | + relocation -= (input_section->output_section->vma |
2258 | + + input_section->output_offset | 2281 | + + input_section->output_offset + offset + INST_WORD_SIZE); |
2259 | + + offset + INST_WORD_SIZE); | 2282 | + } |
2283 | + else if (r_type == R_MICROBLAZE_TEXTREL_64 | ||
2284 | + || r_type == R_MICROBLAZE_TEXTREL_32_LO) | ||
2285 | + relocation -= input_section->output_section->vma; | ||
2286 | + | ||
2287 | + if (r_type == R_MICROBLAZE_TEXTREL_32_LO) | ||
2288 | + { | ||
2289 | + bfd_put_16 (input_bfd, relocation & 0xffff, | ||
2290 | + contents + offset + endian); | ||
2260 | + } | 2291 | + } |
2261 | + unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian); | 2292 | + unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian); |
2262 | + if ((insn & 0xff000000) == 0xb2000000) | 2293 | + if ((insn & 0xff000000) == 0xb2000000) |
2263 | + { | 2294 | + { |
2264 | + insn &= ~0x00ffffff; | 2295 | + insn &= ~0x00ffffff; |
2265 | + insn |= (relocation >> 16) & 0xffffff; | 2296 | + insn |= (relocation >> 16) & 0xffffff; |
2266 | + bfd_put_32 (input_bfd, insn, | 2297 | + bfd_put_32 (input_bfd, insn, |
2267 | + contents + offset + endian); | 2298 | + contents + offset + endian); |
2268 | + } | 2299 | + } |
2269 | + else | 2300 | + else |
2270 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | 2301 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, |
2271 | + contents + offset + endian); | 2302 | + contents + offset + endian); |
@@ -2314,7 +2345,7 @@ index 00000000000..bf58b4b0a67 | |||
2314 | + | 2345 | + |
2315 | + case bfd_reloc_undefined: | 2346 | + case bfd_reloc_undefined: |
2316 | + (*info->callbacks->undefined_symbol) | 2347 | + (*info->callbacks->undefined_symbol) |
2317 | + (info, name, input_bfd, input_section, offset, TRUE); | 2348 | + (info, name, input_bfd, input_section, offset, true); |
2318 | + break; | 2349 | + break; |
2319 | + | 2350 | + |
2320 | + case bfd_reloc_outofrange: | 2351 | + case bfd_reloc_outofrange: |
@@ -2347,36 +2378,37 @@ index 00000000000..bf58b4b0a67 | |||
2347 | + object file when linking. | 2378 | + object file when linking. |
2348 | + | 2379 | + |
2349 | + Note: We only use this hook to catch endian mismatches. */ | 2380 | + Note: We only use this hook to catch endian mismatches. */ |
2350 | +static bfd_boolean | 2381 | +static bool |
2351 | +microblaze_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd) | 2382 | +microblaze_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd) |
2352 | +{ | 2383 | +{ |
2353 | + /* Check if we have the same endianess. */ | 2384 | + /* Check if we have the same endianess. */ |
2354 | + if (! _bfd_generic_verify_endian_match (ibfd, obfd)) | 2385 | + if (! _bfd_generic_verify_endian_match (ibfd, obfd)) |
2355 | + return FALSE; | 2386 | + return false; |
2356 | + | 2387 | + |
2357 | + return TRUE; | 2388 | + return true; |
2358 | +} | 2389 | +} |
2359 | + | 2390 | + |
2360 | + | 2391 | + |
2361 | +/* Calculate fixup value for reference. */ | 2392 | +/* Calculate fixup value for reference. */ |
2362 | + | 2393 | + |
2363 | +static int | 2394 | +static size_t |
2364 | +calc_fixup (bfd_vma start, bfd_vma size, asection *sec) | 2395 | +calc_fixup (bfd_vma start, bfd_vma size, asection *sec) |
2365 | +{ | 2396 | +{ |
2366 | + bfd_vma end = start + size; | 2397 | + bfd_vma end = start + size; |
2367 | + int i, fixup = 0; | 2398 | + size_t i, fixup = 0; |
2399 | + struct _microblaze_elf_section_data *sdata; | ||
2368 | + | 2400 | + |
2369 | + if (sec == NULL || sec->relax == NULL) | 2401 | + if (sec == NULL || (sdata = microblaze_elf_section_data (sec)) == NULL) |
2370 | + return 0; | 2402 | + return 0; |
2371 | + | 2403 | + |
2372 | + /* Look for addr in relax table, total fixup value. */ | 2404 | + /* Look for addr in relax table, total fixup value. */ |
2373 | + for (i = 0; i < sec->relax_count; i++) | 2405 | + for (i = 0; i < sdata->relax_count; i++) |
2374 | + { | 2406 | + { |
2375 | + if (end <= sec->relax[i].addr) | 2407 | + if (end <= sdata->relax[i].addr) |
2376 | + break; | 2408 | + break; |
2377 | + if ((end != start) && (start > sec->relax[i].addr)) | 2409 | + if (end != start && start > sdata->relax[i].addr) |
2378 | + continue; | 2410 | + continue; |
2379 | + fixup += sec->relax[i].size; | 2411 | + fixup += sdata->relax[i].size; |
2380 | + } | 2412 | + } |
2381 | + return fixup; | 2413 | + return fixup; |
2382 | +} | 2414 | +} |
@@ -2429,39 +2461,39 @@ index 00000000000..bf58b4b0a67 | |||
2429 | + bfd_put_32 (abfd, instr_lo, bfd_addr + INST_WORD_SIZE); | 2461 | + bfd_put_32 (abfd, instr_lo, bfd_addr + INST_WORD_SIZE); |
2430 | +} | 2462 | +} |
2431 | + | 2463 | + |
2432 | +static bfd_boolean | 2464 | +static bool |
2433 | +microblaze_elf_relax_section (bfd *abfd, | 2465 | +microblaze_elf_relax_section (bfd *abfd, |
2434 | + asection *sec, | 2466 | + asection *sec, |
2435 | + struct bfd_link_info *link_info, | 2467 | + struct bfd_link_info *link_info, |
2436 | + bfd_boolean *again) | 2468 | + bool *again) |
2437 | +{ | 2469 | +{ |
2438 | + Elf_Internal_Shdr *symtab_hdr; | 2470 | + Elf_Internal_Shdr *symtab_hdr; |
2439 | + Elf_Internal_Rela *internal_relocs; | 2471 | + Elf_Internal_Rela *internal_relocs; |
2440 | + Elf_Internal_Rela *free_relocs = NULL; | ||
2441 | + Elf_Internal_Rela *irel, *irelend; | 2472 | + Elf_Internal_Rela *irel, *irelend; |
2442 | + bfd_byte *contents = NULL; | 2473 | + bfd_byte *contents = NULL; |
2443 | + bfd_byte *free_contents = NULL; | ||
2444 | + int rel_count; | 2474 | + int rel_count; |
2445 | + unsigned int shndx; | 2475 | + unsigned int shndx; |
2446 | + int i, sym_index; | 2476 | + size_t i, sym_index; |
2447 | + asection *o; | 2477 | + asection *o; |
2448 | + struct elf_link_hash_entry *sym_hash; | 2478 | + struct elf_link_hash_entry *sym_hash; |
2449 | + Elf_Internal_Sym *isymbuf, *isymend; | 2479 | + Elf_Internal_Sym *isymbuf, *isymend; |
2450 | + Elf_Internal_Sym *isym; | 2480 | + Elf_Internal_Sym *isym; |
2451 | + int symcount; | 2481 | + size_t symcount; |
2452 | + int offset; | 2482 | + size_t offset; |
2453 | + bfd_vma src, dest; | 2483 | + bfd_vma src, dest; |
2484 | + struct _microblaze_elf_section_data *sdata; | ||
2454 | + | 2485 | + |
2455 | + /* We only do this once per section. We may be able to delete some code | 2486 | + /* We only do this once per section. We may be able to delete some code |
2456 | + by running multiple passes, but it is not worth it. */ | 2487 | + by running multiple passes, but it is not worth it. */ |
2457 | + *again = FALSE; | 2488 | + *again = false; |
2458 | + | 2489 | + |
2459 | + /* Only do this for a text section. */ | 2490 | + /* Only do this for a text section. */ |
2460 | + if (bfd_link_relocatable (link_info) | 2491 | + if (bfd_link_relocatable (link_info) |
2461 | + || (sec->flags & SEC_RELOC) == 0 | 2492 | + || (sec->flags & SEC_RELOC) == 0 |
2462 | + || (sec->reloc_count == 0) | 2493 | + || (sec->flags & SEC_CODE) == 0 |
2463 | + || (sec->flags & SEC_CODE) == 0) | 2494 | + || sec->reloc_count == 0 |
2464 | + return TRUE; | 2495 | + || (sdata = microblaze_elf_section_data (sec)) == NULL) |
2496 | + return true; | ||
2465 | + | 2497 | + |
2466 | + BFD_ASSERT ((sec->size > 0) || (sec->rawsize > 0)); | 2498 | + BFD_ASSERT ((sec->size > 0) || (sec->rawsize > 0)); |
2467 | + | 2499 | + |
@@ -2482,14 +2514,12 @@ index 00000000000..bf58b4b0a67 | |||
2482 | + internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, link_info->keep_memory); | 2514 | + internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, link_info->keep_memory); |
2483 | + if (internal_relocs == NULL) | 2515 | + if (internal_relocs == NULL) |
2484 | + goto error_return; | 2516 | + goto error_return; |
2485 | + if (! link_info->keep_memory) | ||
2486 | + free_relocs = internal_relocs; | ||
2487 | + | 2517 | + |
2488 | + sec->relax = (struct relax_table *) bfd_malloc ((sec->reloc_count + 1) | 2518 | + sdata->relax_count = 0; |
2489 | + * sizeof (struct relax_table)); | 2519 | + sdata->relax = (struct relax_table *) bfd_malloc ((sec->reloc_count + 1) |
2490 | + if (sec->relax == NULL) | 2520 | + * sizeof (*sdata->relax)); |
2521 | + if (sdata->relax == NULL) | ||
2491 | + goto error_return; | 2522 | + goto error_return; |
2492 | + sec->relax_count = 0; | ||
2493 | + | 2523 | + |
2494 | + irelend = internal_relocs + sec->reloc_count; | 2524 | + irelend = internal_relocs + sec->reloc_count; |
2495 | + rel_count = 0; | 2525 | + rel_count = 0; |
@@ -2497,7 +2527,8 @@ index 00000000000..bf58b4b0a67 | |||
2497 | + { | 2527 | + { |
2498 | + bfd_vma symval; | 2528 | + bfd_vma symval; |
2499 | + if ((ELF64_R_TYPE (irel->r_info) != (int) R_MICROBLAZE_64_PCREL) | 2529 | + if ((ELF64_R_TYPE (irel->r_info) != (int) R_MICROBLAZE_64_PCREL) |
2500 | + && (ELF64_R_TYPE (irel->r_info) != (int) R_MICROBLAZE_64 )) | 2530 | + && (ELF64_R_TYPE (irel->r_info) != (int) R_MICROBLAZE_64 ) |
2531 | +&& (ELF64_R_TYPE (irel->r_info) != (int) R_MICROBLAZE_TEXTREL_64)) | ||
2501 | + continue; /* Can't delete this reloc. */ | 2532 | + continue; /* Can't delete this reloc. */ |
2502 | + | 2533 | + |
2503 | + /* Get the section contents. */ | 2534 | + /* Get the section contents. */ |
@@ -2510,8 +2541,6 @@ index 00000000000..bf58b4b0a67 | |||
2510 | + contents = (bfd_byte *) bfd_malloc (sec->size); | 2541 | + contents = (bfd_byte *) bfd_malloc (sec->size); |
2511 | + if (contents == NULL) | 2542 | + if (contents == NULL) |
2512 | + goto error_return; | 2543 | + goto error_return; |
2513 | + free_contents = contents; | ||
2514 | + | ||
2515 | + if (!bfd_get_section_contents (abfd, sec, contents, | 2544 | + if (!bfd_get_section_contents (abfd, sec, contents, |
2516 | + (file_ptr) 0, sec->size)) | 2545 | + (file_ptr) 0, sec->size)) |
2517 | + goto error_return; | 2546 | + goto error_return; |
@@ -2567,15 +2596,20 @@ index 00000000000..bf58b4b0a67 | |||
2567 | + + sec->output_section->vma | 2596 | + + sec->output_section->vma |
2568 | + + sec->output_offset); | 2597 | + + sec->output_offset); |
2569 | + } | 2598 | + } |
2599 | + else if (ELF64_R_TYPE (irel->r_info) == (int) R_MICROBLAZE_TEXTREL_64) | ||
2600 | + { | ||
2601 | + symval = symval + irel->r_addend - (sec->output_section->vma); | ||
2602 | + } | ||
2570 | + else | 2603 | + else |
2571 | + symval += irel->r_addend; | 2604 | + symval += irel->r_addend; |
2572 | + | 2605 | + |
2573 | + if ((symval & 0xffff8000) == 0) | 2606 | + if ((symval & 0xffff8000) == 0 |
2607 | + || (symval & 0xffff8000) == 0xffff8000) | ||
2574 | + { | 2608 | + { |
2575 | + /* We can delete this instruction. */ | 2609 | + /* We can delete this instruction. */ |
2576 | + sec->relax[sec->relax_count].addr = irel->r_offset; | 2610 | + sdata->relax[sdata->relax_count].addr = irel->r_offset; |
2577 | + sec->relax[sec->relax_count].size = INST_WORD_SIZE; | 2611 | + sdata->relax[sdata->relax_count].size = INST_WORD_SIZE; |
2578 | + sec->relax_count++; | 2612 | + sdata->relax_count++; |
2579 | + | 2613 | + |
2580 | + /* Rewrite relocation type. */ | 2614 | + /* Rewrite relocation type. */ |
2581 | + switch ((enum elf_microblaze_reloc_type) ELF64_R_TYPE (irel->r_info)) | 2615 | + switch ((enum elf_microblaze_reloc_type) ELF64_R_TYPE (irel->r_info)) |
@@ -2588,19 +2622,23 @@ index 00000000000..bf58b4b0a67 | |||
2588 | + irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), | 2622 | + irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), |
2589 | + (int) R_MICROBLAZE_32_LO); | 2623 | + (int) R_MICROBLAZE_32_LO); |
2590 | + break; | 2624 | + break; |
2625 | + case R_MICROBLAZE_TEXTREL_64: | ||
2626 | + irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), | ||
2627 | + (int) R_MICROBLAZE_TEXTREL_32_LO); | ||
2628 | + break; | ||
2591 | + default: | 2629 | + default: |
2592 | + /* Cannot happen. */ | 2630 | + /* Cannot happen. */ |
2593 | + BFD_ASSERT (FALSE); | 2631 | + BFD_ASSERT (false); |
2594 | + } | 2632 | + } |
2595 | + } | 2633 | + } |
2596 | + } /* Loop through all relocations. */ | 2634 | + } /* Loop through all relocations. */ |
2597 | + | 2635 | + |
2598 | + /* Loop through the relocs again, and see if anything needs to change. */ | 2636 | + /* Loop through the relocs again, and see if anything needs to change. */ |
2599 | + if (sec->relax_count > 0) | 2637 | + if (sdata->relax_count > 0) |
2600 | + { | 2638 | + { |
2601 | + shndx = _bfd_elf_section_from_bfd_section (abfd, sec); | 2639 | + shndx = _bfd_elf_section_from_bfd_section (abfd, sec); |
2602 | + rel_count = 0; | 2640 | + rel_count = 0; |
2603 | + sec->relax[sec->relax_count].addr = sec->size; | 2641 | + sdata->relax[sdata->relax_count].addr = sec->size; |
2604 | + | 2642 | + |
2605 | + for (irel = internal_relocs; irel < irelend; irel++, rel_count++) | 2643 | + for (irel = internal_relocs; irel < irelend; irel++, rel_count++) |
2606 | + { | 2644 | + { |
@@ -2653,14 +2691,14 @@ index 00000000000..bf58b4b0a67 | |||
2653 | + case R_MICROBLAZE_NONE: | 2691 | + case R_MICROBLAZE_NONE: |
2654 | + case R_MICROBLAZE_32_NONE: | 2692 | + case R_MICROBLAZE_32_NONE: |
2655 | + { | 2693 | + { |
2656 | + /* This was a PC-relative instruction that was | 2694 | + /* This was a PC-relative instruction that was |
2657 | + completely resolved. */ | 2695 | + completely resolved. */ |
2658 | + int sfix, efix; | 2696 | + size_t sfix, efix; |
2659 | + unsigned int val; | 2697 | + unsigned int val; |
2660 | + bfd_vma target_address; | 2698 | + bfd_vma target_address; |
2661 | + target_address = irel->r_addend + irel->r_offset; | 2699 | + target_address = irel->r_addend + irel->r_offset; |
2662 | + sfix = calc_fixup (irel->r_offset, 0, sec); | 2700 | + sfix = calc_fixup (irel->r_offset, 0, sec); |
2663 | + efix = calc_fixup (target_address, 0, sec); | 2701 | + efix = calc_fixup (target_address, 0, sec); |
2664 | + | 2702 | + |
2665 | + /* Validate the in-band val. */ | 2703 | + /* Validate the in-band val. */ |
2666 | + val = bfd_get_32 (abfd, contents + irel->r_offset); | 2704 | + val = bfd_get_32 (abfd, contents + irel->r_offset); |
@@ -2675,10 +2713,10 @@ index 00000000000..bf58b4b0a67 | |||
2675 | + break; | 2713 | + break; |
2676 | + case R_MICROBLAZE_64_NONE: | 2714 | + case R_MICROBLAZE_64_NONE: |
2677 | + { | 2715 | + { |
2678 | + /* This was a PC-relative 64-bit instruction that was | 2716 | + /* This was a PC-relative 64-bit instruction that was |
2679 | + completely resolved. */ | 2717 | + completely resolved. */ |
2680 | + int sfix, efix; | 2718 | + size_t sfix, efix; |
2681 | + bfd_vma target_address; | 2719 | + bfd_vma target_address; |
2682 | + target_address = irel->r_addend + irel->r_offset + INST_WORD_SIZE; | 2720 | + target_address = irel->r_addend + irel->r_offset + INST_WORD_SIZE; |
2683 | + sfix = calc_fixup (irel->r_offset + INST_WORD_SIZE, 0, sec); | 2721 | + sfix = calc_fixup (irel->r_offset + INST_WORD_SIZE, 0, sec); |
2684 | + efix = calc_fixup (target_address, 0, sec); | 2722 | + efix = calc_fixup (target_address, 0, sec); |
@@ -2704,9 +2742,9 @@ index 00000000000..bf58b4b0a67 | |||
2704 | + continue; | 2742 | + continue; |
2705 | + | 2743 | + |
2706 | + /* We always cache the relocs. Perhaps, if info->keep_memory is | 2744 | + /* We always cache the relocs. Perhaps, if info->keep_memory is |
2707 | + FALSE, we should free them, if we are permitted to. */ | 2745 | + false, we should free them, if we are permitted to. */ |
2708 | + | 2746 | + |
2709 | + irelocs = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL, TRUE); | 2747 | + irelocs = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL, true); |
2710 | + if (irelocs == NULL) | 2748 | + if (irelocs == NULL) |
2711 | + goto error_return; | 2749 | + goto error_return; |
2712 | + | 2750 | + |
@@ -2717,6 +2755,8 @@ index 00000000000..bf58b4b0a67 | |||
2717 | + if (1 && ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32_NONE) | 2755 | + if (1 && ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32_NONE) |
2718 | + { | 2756 | + { |
2719 | + unsigned int val; | 2757 | + unsigned int val; |
2758 | + if (ELF64_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info) | ||
2759 | + continue; | ||
2720 | + | 2760 | + |
2721 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); | 2761 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); |
2722 | + | 2762 | + |
@@ -2732,7 +2772,7 @@ index 00000000000..bf58b4b0a67 | |||
2732 | + else | 2772 | + else |
2733 | + { | 2773 | + { |
2734 | + /* We always cache the section contents. | 2774 | + /* We always cache the section contents. |
2735 | + Perhaps, if info->keep_memory is FALSE, we | 2775 | + Perhaps, if info->keep_memory is false, we |
2736 | + should free them, if we are permitted to. */ | 2776 | + should free them, if we are permitted to. */ |
2737 | + | 2777 | + |
2738 | + if (o->rawsize == 0) | 2778 | + if (o->rawsize == 0) |
@@ -2759,6 +2799,9 @@ index 00000000000..bf58b4b0a67 | |||
2759 | + if (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32 | 2799 | + if (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32 |
2760 | + || ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_IMML_64) | 2800 | + || ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_IMML_64) |
2761 | + { | 2801 | + { |
2802 | + if (ELF64_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info) | ||
2803 | + continue; | ||
2804 | + | ||
2762 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); | 2805 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); |
2763 | + | 2806 | + |
2764 | + /* Look at the reloc only if the value has been resolved. */ | 2807 | + /* Look at the reloc only if the value has been resolved. */ |
@@ -2772,7 +2815,7 @@ index 00000000000..bf58b4b0a67 | |||
2772 | + else | 2815 | + else |
2773 | + { | 2816 | + { |
2774 | + /* We always cache the section contents. | 2817 | + /* We always cache the section contents. |
2775 | + Perhaps, if info->keep_memory is FALSE, we | 2818 | + Perhaps, if info->keep_memory is false, we |
2776 | + should free them, if we are permitted to. */ | 2819 | + should free them, if we are permitted to. */ |
2777 | + if (o->rawsize == 0) | 2820 | + if (o->rawsize == 0) |
2778 | + o->rawsize = o->size; | 2821 | + o->rawsize = o->size; |
@@ -2791,6 +2834,9 @@ index 00000000000..bf58b4b0a67 | |||
2791 | + } | 2834 | + } |
2792 | + else if (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32_SYM_OP_SYM) | 2835 | + else if (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32_SYM_OP_SYM) |
2793 | + { | 2836 | + { |
2837 | + if (ELF64_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info) | ||
2838 | + continue; | ||
2839 | + | ||
2794 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); | 2840 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); |
2795 | + | 2841 | + |
2796 | + /* Look at the reloc only if the value has been resolved. */ | 2842 | + /* Look at the reloc only if the value has been resolved. */ |
@@ -2801,7 +2847,7 @@ index 00000000000..bf58b4b0a67 | |||
2801 | + else | 2847 | + else |
2802 | + { | 2848 | + { |
2803 | + /* We always cache the section contents. | 2849 | + /* We always cache the section contents. |
2804 | + Perhaps, if info->keep_memory is FALSE, we | 2850 | + Perhaps, if info->keep_memory is false, we |
2805 | + should free them, if we are permitted to. */ | 2851 | + should free them, if we are permitted to. */ |
2806 | + | 2852 | + |
2807 | + if (o->rawsize == 0) | 2853 | + if (o->rawsize == 0) |
@@ -2822,9 +2868,15 @@ index 00000000000..bf58b4b0a67 | |||
2822 | + sec); | 2868 | + sec); |
2823 | + } | 2869 | + } |
2824 | + } | 2870 | + } |
2825 | + else if ((ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32_PCREL_LO) | 2871 | + else if ((ELF32_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32_PCREL_LO) |
2826 | + || (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32_LO)) | 2872 | + || (ELF32_R_TYPE (irelscan->r_info) |
2873 | + == (int) R_MICROBLAZE_32_LO) | ||
2874 | + || (ELF32_R_TYPE (irelscan->r_info) | ||
2875 | + == (int) R_MICROBLAZE_TEXTREL_32_LO)) | ||
2827 | + { | 2876 | + { |
2877 | + if (ELF64_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info) | ||
2878 | + continue; | ||
2879 | + | ||
2828 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); | 2880 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); |
2829 | + | 2881 | + |
2830 | + /* Look at the reloc only if the value has been resolved. */ | 2882 | + /* Look at the reloc only if the value has been resolved. */ |
@@ -2841,7 +2893,7 @@ index 00000000000..bf58b4b0a67 | |||
2841 | + else | 2893 | + else |
2842 | + { | 2894 | + { |
2843 | + /* We always cache the section contents. | 2895 | + /* We always cache the section contents. |
2844 | + Perhaps, if info->keep_memory is FALSE, we | 2896 | + Perhaps, if info->keep_memory is false, we |
2845 | + should free them, if we are permitted to. */ | 2897 | + should free them, if we are permitted to. */ |
2846 | + if (o->rawsize == 0) | 2898 | + if (o->rawsize == 0) |
2847 | + o->rawsize = o->size; | 2899 | + o->rawsize = o->size; |
@@ -2867,8 +2919,12 @@ index 00000000000..bf58b4b0a67 | |||
2867 | + } | 2919 | + } |
2868 | + } | 2920 | + } |
2869 | + | 2921 | + |
2870 | + if (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_64) | 2922 | + if (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_64 |
2923 | + || (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_TEXTREL_64)) | ||
2871 | + { | 2924 | + { |
2925 | + if (ELF64_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info) | ||
2926 | + continue; | ||
2927 | + | ||
2872 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); | 2928 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); |
2873 | + | 2929 | + |
2874 | + /* Look at the reloc only if the value has been resolved. */ | 2930 | + /* Look at the reloc only if the value has been resolved. */ |
@@ -2884,7 +2940,7 @@ index 00000000000..bf58b4b0a67 | |||
2884 | + else | 2940 | + else |
2885 | + { | 2941 | + { |
2886 | + /* We always cache the section contents. | 2942 | + /* We always cache the section contents. |
2887 | + Perhaps, if info->keep_memory is FALSE, we | 2943 | + Perhaps, if info->keep_memory is false, we |
2888 | + should free them, if we are permitted to. */ | 2944 | + should free them, if we are permitted to. */ |
2889 | + | 2945 | + |
2890 | + if (o->rawsize == 0) | 2946 | + if (o->rawsize == 0) |
@@ -2899,23 +2955,27 @@ index 00000000000..bf58b4b0a67 | |||
2899 | + elf_section_data (o)->this_hdr.contents = ocontents; | 2955 | + elf_section_data (o)->this_hdr.contents = ocontents; |
2900 | + } | 2956 | + } |
2901 | + } | 2957 | + } |
2902 | + unsigned long instr_hi = bfd_get_32 (abfd, ocontents | 2958 | + unsigned long instr_hi = bfd_get_32 (abfd, ocontents |
2903 | + + irelscan->r_offset); | 2959 | + + irelscan->r_offset); |
2904 | + unsigned long instr_lo = bfd_get_32 (abfd, ocontents | 2960 | + unsigned long instr_lo = bfd_get_32 (abfd, ocontents |
2905 | + + irelscan->r_offset | 2961 | + + irelscan->r_offset |
2906 | + + INST_WORD_SIZE); | 2962 | + + INST_WORD_SIZE); |
2907 | + if ((instr_hi & 0xff000000) == 0xb2000000) | 2963 | + if ((instr_hi & 0xff000000) == 0xb2000000) |
2908 | + immediate = (instr_hi & 0x00ffffff) << 24; | 2964 | + immediate = (instr_hi & 0x00ffffff) << 24; |
2909 | + else | 2965 | + else |
2910 | + immediate = (instr_hi & 0x0000ffff) << 16; | 2966 | + immediate = (instr_hi & 0x0000ffff) << 16; |
2911 | + immediate |= (instr_lo & 0x0000ffff); | 2967 | + immediate |= (instr_lo & 0x0000ffff); |
2912 | + offset = calc_fixup (irelscan->r_addend, 0, sec); | 2968 | + offset = calc_fixup (irelscan->r_addend, 0, sec); |
2913 | + immediate -= offset; | 2969 | + immediate -= offset; |
2914 | + irelscan->r_addend -= offset; | 2970 | + irelscan->r_addend -= offset; |
2971 | + | ||
2915 | + } | 2972 | + } |
2916 | + } | 2973 | + } |
2917 | + else if (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_64_PCREL) | 2974 | + else if (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_64_PCREL) |
2918 | + { | 2975 | + { |
2976 | + if (ELF64_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info) | ||
2977 | + continue; | ||
2978 | + | ||
2919 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); | 2979 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); |
2920 | + | 2980 | + |
2921 | + /* Look at the reloc only if the value has been resolved. */ | 2981 | + /* Look at the reloc only if the value has been resolved. */ |
@@ -2932,7 +2992,7 @@ index 00000000000..bf58b4b0a67 | |||
2932 | + else | 2992 | + else |
2933 | + { | 2993 | + { |
2934 | + /* We always cache the section contents. | 2994 | + /* We always cache the section contents. |
2935 | + Perhaps, if info->keep_memory is FALSE, we | 2995 | + Perhaps, if info->keep_memory is false, we |
2936 | + should free them, if we are permitted to. */ | 2996 | + should free them, if we are permitted to. */ |
2937 | + if (o->rawsize == 0) | 2997 | + if (o->rawsize == 0) |
2938 | + o->rawsize = o->size; | 2998 | + o->rawsize = o->size; |
@@ -2998,65 +3058,66 @@ index 00000000000..bf58b4b0a67 | |||
2998 | + } | 3058 | + } |
2999 | + | 3059 | + |
3000 | + /* Physically move the code and change the cooked size. */ | 3060 | + /* Physically move the code and change the cooked size. */ |
3001 | + dest = sec->relax[0].addr; | 3061 | + dest = sdata->relax[0].addr; |
3002 | + for (i = 0; i < sec->relax_count; i++) | 3062 | + for (i = 0; i < sdata->relax_count; i++) |
3003 | + { | 3063 | + { |
3004 | + int len; | 3064 | + size_t len; |
3005 | + src = sec->relax[i].addr + sec->relax[i].size; | 3065 | + src = sdata->relax[i].addr + sdata->relax[i].size; |
3006 | + len = sec->relax[i+1].addr - sec->relax[i].addr - sec->relax[i].size; | 3066 | + len = (sdata->relax[i+1].addr - sdata->relax[i].addr |
3007 | + | 3067 | + - sdata->relax[i].size); |
3008 | + memmove (contents + dest, contents + src, len); | 3068 | + |
3009 | + sec->size -= sec->relax[i].size; | 3069 | + memmove (contents + dest, contents + src, len); |
3010 | + dest += len; | 3070 | + sec->size -= sdata->relax[i].size; |
3011 | + } | 3071 | + dest += len; |
3072 | + } | ||
3012 | + | 3073 | + |
3013 | + elf_section_data (sec)->relocs = internal_relocs; | 3074 | + elf_section_data (sec)->relocs = internal_relocs; |
3014 | + free_relocs = NULL; | ||
3015 | + | 3075 | + |
3016 | + elf_section_data (sec)->this_hdr.contents = contents; | 3076 | + elf_section_data (sec)->this_hdr.contents = contents; |
3017 | + free_contents = NULL; | ||
3018 | + | 3077 | + |
3019 | + symtab_hdr->contents = (bfd_byte *) isymbuf; | 3078 | + symtab_hdr->contents = (bfd_byte *) isymbuf; |
3020 | + } | 3079 | + } |
3021 | + | 3080 | + |
3022 | + if (free_relocs != NULL) | 3081 | + if (internal_relocs != NULL |
3023 | + { | 3082 | + && elf_section_data (sec)->relocs != internal_relocs) |
3024 | + free (free_relocs); | 3083 | + free (internal_relocs); |
3025 | + free_relocs = NULL; | ||
3026 | + } | ||
3027 | + | 3084 | + |
3028 | + if (free_contents != NULL) | 3085 | + if (contents != NULL |
3086 | + && elf_section_data (sec)->this_hdr.contents != contents) | ||
3029 | + { | 3087 | + { |
3030 | + if (!link_info->keep_memory) | 3088 | + if (! link_info->keep_memory) |
3031 | + free (free_contents); | 3089 | + free (contents); |
3032 | + else | 3090 | + else |
3033 | + /* Cache the section contents for elf_link_input_bfd. */ | 3091 | + { |
3034 | + elf_section_data (sec)->this_hdr.contents = contents; | 3092 | + /* Cache the section contents for elf_link_input_bfd. */ |
3035 | + free_contents = NULL; | 3093 | + elf_section_data (sec)->this_hdr.contents = contents; |
3094 | + } | ||
3036 | + } | 3095 | + } |
3037 | + | 3096 | + |
3038 | + if (sec->relax_count == 0) | 3097 | + if (sdata->relax_count == 0) |
3039 | + { | 3098 | + { |
3040 | + *again = FALSE; | 3099 | + *again = false; |
3041 | + free (sec->relax); | 3100 | + free (sdata->relax); |
3042 | + sec->relax = NULL; | 3101 | + sdata->relax = NULL; |
3043 | + } | 3102 | + } |
3044 | + else | 3103 | + else |
3045 | + *again = TRUE; | 3104 | + *again = true; |
3046 | + return TRUE; | 3105 | + return true; |
3047 | + | 3106 | + |
3048 | + error_return: | 3107 | + error_return: |
3049 | + if (free_relocs != NULL) | 3108 | + if (isymbuf != NULL |
3050 | + free (free_relocs); | 3109 | + && symtab_hdr->contents != (unsigned char *) isymbuf) |
3051 | + if (free_contents != NULL) | 3110 | + free (isymbuf); |
3052 | + free (free_contents); | 3111 | + if (internal_relocs != NULL |
3053 | + if (sec->relax != NULL) | 3112 | + && elf_section_data (sec)->relocs != internal_relocs) |
3054 | + { | 3113 | + free (internal_relocs); |
3055 | + free (sec->relax); | 3114 | + if (contents != NULL |
3056 | + sec->relax = NULL; | 3115 | + && elf_section_data (sec)->this_hdr.contents != contents) |
3057 | + sec->relax_count = 0; | 3116 | + free (contents); |
3058 | + } | 3117 | + free (sdata->relax); |
3059 | + return FALSE; | 3118 | + sdata->relax = NULL; |
3119 | + sdata->relax_count = 0; | ||
3120 | + return false; | ||
3060 | +} | 3121 | +} |
3061 | + | 3122 | + |
3062 | +/* Return the section that should be marked against GC for a given | 3123 | +/* Return the section that should be marked against GC for a given |
@@ -3082,13 +3143,13 @@ index 00000000000..bf58b4b0a67 | |||
3082 | + | 3143 | + |
3083 | +/* Update the got entry reference counts for the section being removed. */ | 3144 | +/* Update the got entry reference counts for the section being removed. */ |
3084 | + | 3145 | + |
3085 | +static bfd_boolean | 3146 | +static bool |
3086 | +microblaze_elf_gc_sweep_hook (bfd * abfd ATTRIBUTE_UNUSED, | 3147 | +microblaze_elf_gc_sweep_hook (bfd * abfd ATTRIBUTE_UNUSED, |
3087 | + struct bfd_link_info * info ATTRIBUTE_UNUSED, | 3148 | + struct bfd_link_info * info ATTRIBUTE_UNUSED, |
3088 | + asection * sec ATTRIBUTE_UNUSED, | 3149 | + asection * sec ATTRIBUTE_UNUSED, |
3089 | + const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED) | 3150 | + const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED) |
3090 | +{ | 3151 | +{ |
3091 | + return TRUE; | 3152 | + return true; |
3092 | +} | 3153 | +} |
3093 | + | 3154 | + |
3094 | +/* PIC support. */ | 3155 | +/* PIC support. */ |
@@ -3104,37 +3165,7 @@ index 00000000000..bf58b4b0a67 | |||
3104 | +/* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up | 3165 | +/* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up |
3105 | + shortcuts to them in our hash table. */ | 3166 | + shortcuts to them in our hash table. */ |
3106 | + | 3167 | + |
3107 | +static bfd_boolean | 3168 | +static bool |
3108 | +create_got_section (bfd *dynobj, struct bfd_link_info *info) | ||
3109 | +{ | ||
3110 | + struct elf64_mb_link_hash_table *htab; | ||
3111 | + | ||
3112 | + if (! _bfd_elf_create_got_section (dynobj, info)) | ||
3113 | + return FALSE; | ||
3114 | + htab = elf64_mb_hash_table (info); | ||
3115 | + if (htab == NULL) | ||
3116 | + return FALSE; | ||
3117 | + | ||
3118 | + htab->sgot = bfd_get_linker_section (dynobj, ".got"); | ||
3119 | + htab->sgotplt = bfd_get_linker_section (dynobj, ".got.plt"); | ||
3120 | + if (!htab->sgot || !htab->sgotplt) | ||
3121 | + return FALSE; | ||
3122 | + | ||
3123 | + if ((htab->srelgot = bfd_get_linker_section (dynobj, ".rela.got")) == NULL) | ||
3124 | + htab->srelgot = bfd_make_section_anyway (dynobj, ".rela.got"); | ||
3125 | + if (htab->srelgot == NULL | ||
3126 | + || ! bfd_set_section_flags (htab->srelgot, SEC_ALLOC | ||
3127 | + | SEC_LOAD | ||
3128 | + | SEC_HAS_CONTENTS | ||
3129 | + | SEC_IN_MEMORY | ||
3130 | + | SEC_LINKER_CREATED | ||
3131 | + | SEC_READONLY) | ||
3132 | + || ! bfd_set_section_alignment (htab->srelgot, 2)) | ||
3133 | + return FALSE; | ||
3134 | + return TRUE; | ||
3135 | +} | ||
3136 | + | ||
3137 | +static bfd_boolean | ||
3138 | +update_local_sym_info (bfd *abfd, | 3169 | +update_local_sym_info (bfd *abfd, |
3139 | + Elf_Internal_Shdr *symtab_hdr, | 3170 | + Elf_Internal_Shdr *symtab_hdr, |
3140 | + unsigned long r_symndx, | 3171 | + unsigned long r_symndx, |
@@ -3150,7 +3181,7 @@ index 00000000000..bf58b4b0a67 | |||
3150 | + size *= (sizeof (*local_got_refcounts) + sizeof (*local_got_tls_masks)); | 3181 | + size *= (sizeof (*local_got_refcounts) + sizeof (*local_got_tls_masks)); |
3151 | + local_got_refcounts = bfd_zalloc (abfd, size); | 3182 | + local_got_refcounts = bfd_zalloc (abfd, size); |
3152 | + if (local_got_refcounts == NULL) | 3183 | + if (local_got_refcounts == NULL) |
3153 | + return FALSE; | 3184 | + return false; |
3154 | + elf_local_got_refcounts (abfd) = local_got_refcounts; | 3185 | + elf_local_got_refcounts (abfd) = local_got_refcounts; |
3155 | + } | 3186 | + } |
3156 | + | 3187 | + |
@@ -3159,11 +3190,11 @@ index 00000000000..bf58b4b0a67 | |||
3159 | + local_got_tls_masks[r_symndx] |= tls_type; | 3190 | + local_got_tls_masks[r_symndx] |= tls_type; |
3160 | + local_got_refcounts[r_symndx] += 1; | 3191 | + local_got_refcounts[r_symndx] += 1; |
3161 | + | 3192 | + |
3162 | + return TRUE; | 3193 | + return true; |
3163 | +} | 3194 | +} |
3164 | +/* Look through the relocs for a section during the first phase. */ | 3195 | +/* Look through the relocs for a section during the first phase. */ |
3165 | + | 3196 | + |
3166 | +static bfd_boolean | 3197 | +static bool |
3167 | +microblaze_elf_check_relocs (bfd * abfd, | 3198 | +microblaze_elf_check_relocs (bfd * abfd, |
3168 | + struct bfd_link_info * info, | 3199 | + struct bfd_link_info * info, |
3169 | + asection * sec, | 3200 | + asection * sec, |
@@ -3178,11 +3209,11 @@ index 00000000000..bf58b4b0a67 | |||
3178 | + asection *sreloc = NULL; | 3209 | + asection *sreloc = NULL; |
3179 | + | 3210 | + |
3180 | + if (bfd_link_relocatable (info)) | 3211 | + if (bfd_link_relocatable (info)) |
3181 | + return TRUE; | 3212 | + return true; |
3182 | + | 3213 | + |
3183 | + htab = elf64_mb_hash_table (info); | 3214 | + htab = elf64_mb_hash_table (info); |
3184 | + if (htab == NULL) | 3215 | + if (htab == NULL) |
3185 | + return FALSE; | 3216 | + return false; |
3186 | + | 3217 | + |
3187 | + symtab_hdr = & elf_tdata (abfd)->symtab_hdr; | 3218 | + symtab_hdr = & elf_tdata (abfd)->symtab_hdr; |
3188 | + sym_hashes = elf_sym_hashes (abfd); | 3219 | + sym_hashes = elf_sym_hashes (abfd); |
@@ -3207,7 +3238,9 @@ index 00000000000..bf58b4b0a67 | |||
3207 | + else | 3238 | + else |
3208 | + { | 3239 | + { |
3209 | + h = sym_hashes [r_symndx - symtab_hdr->sh_info]; | 3240 | + h = sym_hashes [r_symndx - symtab_hdr->sh_info]; |
3210 | + | 3241 | + while (h->root.type == bfd_link_hash_indirect |
3242 | + || h->root.type == bfd_link_hash_warning) | ||
3243 | + h = (struct elf_link_hash_entry *) h->root.u.i.link; | ||
3211 | + /* PR15323, ref flags aren't set for references in the same | 3244 | + /* PR15323, ref flags aren't set for references in the same |
3212 | + object. */ | 3245 | + object. */ |
3213 | + h->root.non_ir_ref_regular = 1; | 3246 | + h->root.non_ir_ref_regular = 1; |
@@ -3219,14 +3252,14 @@ index 00000000000..bf58b4b0a67 | |||
3219 | + Reconstruct it for later use during GC. */ | 3252 | + Reconstruct it for later use during GC. */ |
3220 | + case R_MICROBLAZE_GNU_VTINHERIT: | 3253 | + case R_MICROBLAZE_GNU_VTINHERIT: |
3221 | + if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) | 3254 | + if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) |
3222 | + return FALSE; | 3255 | + return false; |
3223 | + break; | 3256 | + break; |
3224 | + | 3257 | + |
3225 | + /* This relocation describes which C++ vtable entries are actually | 3258 | + /* This relocation describes which C++ vtable entries are actually |
3226 | + used. Record for later use during GC. */ | 3259 | + used. Record for later use during GC. */ |
3227 | + case R_MICROBLAZE_GNU_VTENTRY: | 3260 | + case R_MICROBLAZE_GNU_VTENTRY: |
3228 | + if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) | 3261 | + if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) |
3229 | + return FALSE; | 3262 | + return false; |
3230 | + break; | 3263 | + break; |
3231 | + | 3264 | + |
3232 | + /* This relocation requires .plt entry. */ | 3265 | + /* This relocation requires .plt entry. */ |
@@ -3239,22 +3272,24 @@ index 00000000000..bf58b4b0a67 | |||
3239 | + break; | 3272 | + break; |
3240 | + | 3273 | + |
3241 | + /* This relocation requires .got entry. */ | 3274 | + /* This relocation requires .got entry. */ |
3242 | + case R_MICROBLAZE_TLSGD: | 3275 | + case R_MICROBLAZE_TLSGD: |
3243 | + tls_type |= (TLS_TLS | TLS_GD); | 3276 | + tls_type |= (TLS_TLS | TLS_GD); |
3244 | + goto dogottls; | 3277 | + goto dogottls; |
3245 | + case R_MICROBLAZE_TLSLD: | 3278 | + case R_MICROBLAZE_TLSLD: |
3246 | + tls_type |= (TLS_TLS | TLS_LD); | 3279 | + tls_type |= (TLS_TLS | TLS_LD); |
3247 | + dogottls: | 3280 | + /* Fall through. */ |
3248 | + sec->has_tls_reloc = 1; | 3281 | + dogottls: |
3249 | + case R_MICROBLAZE_GOT_64: | 3282 | + sec->has_tls_reloc = 1; |
3250 | + if (htab->sgot == NULL) | 3283 | + /* Fall through. */ |
3251 | + { | 3284 | + case R_MICROBLAZE_GOT_64: |
3252 | + if (htab->elf.dynobj == NULL) | 3285 | + if (htab->elf.sgot == NULL) |
3253 | + htab->elf.dynobj = abfd; | 3286 | + { |
3254 | + if (!create_got_section (htab->elf.dynobj, info)) | 3287 | + if (htab->elf.dynobj == NULL) |
3255 | + return FALSE; | 3288 | + htab->elf.dynobj = abfd; |
3256 | + } | 3289 | + if (!_bfd_elf_create_got_section (htab->elf.dynobj, info)) |
3257 | + if (h != NULL) | 3290 | + return false; |
3291 | + } | ||
3292 | + if (h != NULL) | ||
3258 | + { | 3293 | + { |
3259 | + h->got.refcount += 1; | 3294 | + h->got.refcount += 1; |
3260 | + elf64_mb_hash_entry (h)->tls_mask |= tls_type; | 3295 | + elf64_mb_hash_entry (h)->tls_mask |= tls_type; |
@@ -3262,7 +3297,18 @@ index 00000000000..bf58b4b0a67 | |||
3262 | + else | 3297 | + else |
3263 | + { | 3298 | + { |
3264 | + if (! update_local_sym_info(abfd, symtab_hdr, r_symndx, tls_type) ) | 3299 | + if (! update_local_sym_info(abfd, symtab_hdr, r_symndx, tls_type) ) |
3265 | + return FALSE; | 3300 | + return false; |
3301 | + } | ||
3302 | + break; | ||
3303 | + | ||
3304 | + case R_MICROBLAZE_GOTOFF_64: | ||
3305 | + case R_MICROBLAZE_GOTOFF_32: | ||
3306 | + if (htab->elf.sgot == NULL) | ||
3307 | + { | ||
3308 | + if (htab->elf.dynobj == NULL) | ||
3309 | + htab->elf.dynobj = abfd; | ||
3310 | + if (!_bfd_elf_create_got_section (htab->elf.dynobj, info)) | ||
3311 | + return false; | ||
3266 | + } | 3312 | + } |
3267 | + break; | 3313 | + break; |
3268 | + | 3314 | + |
@@ -3336,13 +3382,13 @@ index 00000000000..bf58b4b0a67 | |||
3336 | + sreloc = _bfd_elf_make_dynamic_reloc_section (sec, dynobj, | 3382 | + sreloc = _bfd_elf_make_dynamic_reloc_section (sec, dynobj, |
3337 | + 2, abfd, 1); | 3383 | + 2, abfd, 1); |
3338 | + if (sreloc == NULL) | 3384 | + if (sreloc == NULL) |
3339 | + return FALSE; | 3385 | + return false; |
3340 | + } | 3386 | + } |
3341 | + | 3387 | + |
3342 | + /* If this is a global symbol, we count the number of | 3388 | + /* If this is a global symbol, we count the number of |
3343 | + relocations we need for this symbol. */ | 3389 | + relocations we need for this symbol. */ |
3344 | + if (h != NULL) | 3390 | + if (h != NULL) |
3345 | + head = &((struct elf64_mb_link_hash_entry *) h)->dyn_relocs; | 3391 | + head = &h->dyn_relocs; |
3346 | + else | 3392 | + else |
3347 | + { | 3393 | + { |
3348 | + /* Track dynamic relocs needed for local syms too. | 3394 | + /* Track dynamic relocs needed for local syms too. |
@@ -3353,14 +3399,14 @@ index 00000000000..bf58b4b0a67 | |||
3353 | + Elf_Internal_Sym *isym; | 3399 | + Elf_Internal_Sym *isym; |
3354 | + void *vpp; | 3400 | + void *vpp; |
3355 | + | 3401 | + |
3356 | + isym = bfd_sym_from_r_symndx (&htab->sym_sec, | 3402 | + isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, |
3357 | + abfd, r_symndx); | 3403 | + abfd, r_symndx); |
3358 | + if (isym == NULL) | 3404 | + if (isym == NULL) |
3359 | + return FALSE; | 3405 | + return false; |
3360 | + | 3406 | + |
3361 | + s = bfd_section_from_elf_index (abfd, isym->st_shndx); | 3407 | + s = bfd_section_from_elf_index (abfd, isym->st_shndx); |
3362 | + if (s == NULL) | 3408 | + if (s == NULL) |
3363 | + return FALSE; | 3409 | + return false; |
3364 | + | 3410 | + |
3365 | + vpp = &elf_section_data (s)->local_dynrel; | 3411 | + vpp = &elf_section_data (s)->local_dynrel; |
3366 | + head = (struct elf64_mb_dyn_relocs **) vpp; | 3412 | + head = (struct elf64_mb_dyn_relocs **) vpp; |
@@ -3369,11 +3415,11 @@ index 00000000000..bf58b4b0a67 | |||
3369 | + p = *head; | 3415 | + p = *head; |
3370 | + if (p == NULL || p->sec != sec) | 3416 | + if (p == NULL || p->sec != sec) |
3371 | + { | 3417 | + { |
3372 | + bfd_size_type amt = sizeof *p; | 3418 | + size_t amt = sizeof *p; |
3373 | + p = ((struct elf64_mb_dyn_relocs *) | 3419 | + p = ((struct elf64_mb_dyn_relocs *) |
3374 | + bfd_alloc (htab->elf.dynobj, amt)); | 3420 | + bfd_alloc (htab->elf.dynobj, amt)); |
3375 | + if (p == NULL) | 3421 | + if (p == NULL) |
3376 | + return FALSE; | 3422 | + return false; |
3377 | + p->next = *head; | 3423 | + p->next = *head; |
3378 | + *head = p; | 3424 | + *head = p; |
3379 | + p->sec = sec; | 3425 | + p->sec = sec; |
@@ -3390,23 +3436,23 @@ index 00000000000..bf58b4b0a67 | |||
3390 | + } | 3436 | + } |
3391 | + } | 3437 | + } |
3392 | + | 3438 | + |
3393 | + return TRUE; | 3439 | + return true; |
3394 | +} | 3440 | +} |
3395 | + | 3441 | + |
3396 | +static bfd_boolean | 3442 | +static bool |
3397 | +microblaze_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) | 3443 | +microblaze_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) |
3398 | +{ | 3444 | +{ |
3399 | + struct elf64_mb_link_hash_table *htab; | 3445 | + struct elf64_mb_link_hash_table *htab; |
3400 | + | 3446 | + |
3401 | + htab = elf64_mb_hash_table (info); | 3447 | + htab = elf64_mb_hash_table (info); |
3402 | + if (htab == NULL) | 3448 | + if (htab == NULL) |
3403 | + return FALSE; | 3449 | + return false; |
3404 | + | 3450 | + |
3405 | + if (!htab->sgot && !create_got_section (dynobj, info)) | 3451 | + if (!htab->sgot && !_bfd_elf_create_got_section (dynobj, info)) |
3406 | + return FALSE; | 3452 | + return false; |
3407 | + | 3453 | + |
3408 | + if (!_bfd_elf_create_dynamic_sections (dynobj, info)) | 3454 | + if (!_bfd_elf_create_dynamic_sections (dynobj, info)) |
3409 | + return FALSE; | 3455 | + return false; |
3410 | + | 3456 | + |
3411 | + htab->splt = bfd_get_linker_section (dynobj, ".plt"); | 3457 | + htab->splt = bfd_get_linker_section (dynobj, ".plt"); |
3412 | + htab->srelplt = bfd_get_linker_section (dynobj, ".rela.plt"); | 3458 | + htab->srelplt = bfd_get_linker_section (dynobj, ".rela.plt"); |
@@ -3418,7 +3464,7 @@ index 00000000000..bf58b4b0a67 | |||
3418 | + || (!bfd_link_pic (info) && !htab->srelbss)) | 3464 | + || (!bfd_link_pic (info) && !htab->srelbss)) |
3419 | + abort (); | 3465 | + abort (); |
3420 | + | 3466 | + |
3421 | + return TRUE; | 3467 | + return true; |
3422 | +} | 3468 | +} |
3423 | + | 3469 | + |
3424 | +/* Copy the extra info we tack onto an elf_link_hash_entry. */ | 3470 | +/* Copy the extra info we tack onto an elf_link_hash_entry. */ |
@@ -3472,20 +3518,21 @@ index 00000000000..bf58b4b0a67 | |||
3472 | + _bfd_elf_link_hash_copy_indirect (info, dir, ind); | 3518 | + _bfd_elf_link_hash_copy_indirect (info, dir, ind); |
3473 | +} | 3519 | +} |
3474 | + | 3520 | + |
3475 | +static bfd_boolean | 3521 | +static bool |
3476 | +microblaze_elf_adjust_dynamic_symbol (struct bfd_link_info *info, | 3522 | +microblaze_elf_adjust_dynamic_symbol (struct bfd_link_info *info, |
3477 | + struct elf_link_hash_entry *h) | 3523 | + struct elf_link_hash_entry *h) |
3478 | +{ | 3524 | +{ |
3479 | + struct elf64_mb_link_hash_table *htab; | 3525 | + struct elf64_mb_link_hash_table *htab; |
3480 | + struct elf64_mb_link_hash_entry * eh; | 3526 | + struct elf64_mb_link_hash_entry * eh; |
3481 | + struct elf64_mb_dyn_relocs *p; | 3527 | + struct elf64_mb_dyn_relocs *p; |
3482 | + asection *sdynbss, *s; | 3528 | + asection *sdynbss; |
3529 | + asection *s, *srel; | ||
3483 | + unsigned int power_of_two; | 3530 | + unsigned int power_of_two; |
3484 | + bfd *dynobj; | 3531 | + bfd *dynobj; |
3485 | + | 3532 | + |
3486 | + htab = elf64_mb_hash_table (info); | 3533 | + htab = elf64_mb_hash_table (info); |
3487 | + if (htab == NULL) | 3534 | + if (htab == NULL) |
3488 | + return FALSE; | 3535 | + return false; |
3489 | + | 3536 | + |
3490 | + /* If this is a function, put it in the procedure linkage table. We | 3537 | + /* If this is a function, put it in the procedure linkage table. We |
3491 | + will fill in the contents of the procedure linkage table later, | 3538 | + will fill in the contents of the procedure linkage table later, |
@@ -3507,7 +3554,7 @@ index 00000000000..bf58b4b0a67 | |||
3507 | + h->needs_plt = 0; | 3554 | + h->needs_plt = 0; |
3508 | + } | 3555 | + } |
3509 | + | 3556 | + |
3510 | + return TRUE; | 3557 | + return true; |
3511 | + } | 3558 | + } |
3512 | + else | 3559 | + else |
3513 | + /* It's possible that we incorrectly decided a .plt reloc was | 3560 | + /* It's possible that we incorrectly decided a .plt reloc was |
@@ -3526,8 +3573,8 @@ index 00000000000..bf58b4b0a67 | |||
3526 | + BFD_ASSERT (def->root.type == bfd_link_hash_defined); | 3573 | + BFD_ASSERT (def->root.type == bfd_link_hash_defined); |
3527 | + h->root.u.def.section = def->root.u.def.section; | 3574 | + h->root.u.def.section = def->root.u.def.section; |
3528 | + h->root.u.def.value = def->root.u.def.value; | 3575 | + h->root.u.def.value = def->root.u.def.value; |
3529 | + return TRUE; | 3576 | + return true; |
3530 | + } | 3577 | + } |
3531 | + | 3578 | + |
3532 | + /* This is a reference to a symbol defined by a dynamic object which | 3579 | + /* This is a reference to a symbol defined by a dynamic object which |
3533 | + is not a function. */ | 3580 | + is not a function. */ |
@@ -3537,18 +3584,18 @@ index 00000000000..bf58b4b0a67 | |||
3537 | + For such cases we need not do anything here; the relocations will | 3584 | + For such cases we need not do anything here; the relocations will |
3538 | + be handled correctly by relocate_section. */ | 3585 | + be handled correctly by relocate_section. */ |
3539 | + if (bfd_link_pic (info)) | 3586 | + if (bfd_link_pic (info)) |
3540 | + return TRUE; | 3587 | + return true; |
3541 | + | 3588 | + |
3542 | + /* If there are no references to this symbol that do not use the | 3589 | + /* If there are no references to this symbol that do not use the |
3543 | + GOT, we don't need to generate a copy reloc. */ | 3590 | + GOT, we don't need to generate a copy reloc. */ |
3544 | + if (!h->non_got_ref) | 3591 | + if (!h->non_got_ref) |
3545 | + return TRUE; | 3592 | + return true; |
3546 | + | 3593 | + |
3547 | + /* If -z nocopyreloc was given, we won't generate them either. */ | 3594 | + /* If -z nocopyreloc was given, we won't generate them either. */ |
3548 | + if (info->nocopyreloc) | 3595 | + if (info->nocopyreloc) |
3549 | + { | 3596 | + { |
3550 | + h->non_got_ref = 0; | 3597 | + h->non_got_ref = 0; |
3551 | + return TRUE; | 3598 | + return true; |
3552 | + } | 3599 | + } |
3553 | + | 3600 | + |
3554 | + eh = (struct elf64_mb_link_hash_entry *) h; | 3601 | + eh = (struct elf64_mb_link_hash_entry *) h; |
@@ -3564,7 +3611,7 @@ index 00000000000..bf58b4b0a67 | |||
3564 | + if (p == NULL) | 3611 | + if (p == NULL) |
3565 | + { | 3612 | + { |
3566 | + h->non_got_ref = 0; | 3613 | + h->non_got_ref = 0; |
3567 | + return TRUE; | 3614 | + return true; |
3568 | + } | 3615 | + } |
3569 | + | 3616 | + |
3570 | + /* We must allocate the symbol in our .dynbss section, which will | 3617 | + /* We must allocate the symbol in our .dynbss section, which will |
@@ -3597,25 +3644,25 @@ index 00000000000..bf58b4b0a67 | |||
3597 | + sdynbss = htab->sdynbss; | 3644 | + sdynbss = htab->sdynbss; |
3598 | + /* Apply the required alignment. */ | 3645 | + /* Apply the required alignment. */ |
3599 | + sdynbss->size = BFD_ALIGN (sdynbss->size, (bfd_size_type) (1 << power_of_two)); | 3646 | + sdynbss->size = BFD_ALIGN (sdynbss->size, (bfd_size_type) (1 << power_of_two)); |
3600 | + if (power_of_two > bfd_section_alignment (sdynbss)) | 3647 | + if (power_of_two > sdynbss->alignment_power) |
3601 | + { | 3648 | + { |
3602 | + if (! bfd_set_section_alignment (sdynbss, power_of_two)) | 3649 | + if (! bfd_set_section_alignment (sdynbss, power_of_two)) |
3603 | + return FALSE; | 3650 | + return false; |
3604 | + } | 3651 | + } |
3605 | + | 3652 | + |
3606 | + /* Define the symbol as being at this point in the section. */ | 3653 | + /* Define the symbol as being at this point in the section. */ |
3607 | + h->root.u.def.section = sdynbss; | 3654 | + h->root.u.def.section = s; |
3608 | + h->root.u.def.value = sdynbss->size; | 3655 | + h->root.u.def.value = s->size; |
3609 | + | 3656 | + |
3610 | + /* Increment the section size to make room for the symbol. */ | 3657 | + /* Increment the section size to make room for the symbol. */ |
3611 | + sdynbss->size += h->size; | 3658 | + s->size += h->size; |
3612 | + return TRUE; | 3659 | + return true; |
3613 | +} | 3660 | +} |
3614 | + | 3661 | + |
3615 | +/* Allocate space in .plt, .got and associated reloc sections for | 3662 | +/* Allocate space in .plt, .got and associated reloc sections for |
3616 | + dynamic relocs. */ | 3663 | + dynamic relocs. */ |
3617 | + | 3664 | + |
3618 | +static bfd_boolean | 3665 | +static bool |
3619 | +allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat) | 3666 | +allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat) |
3620 | +{ | 3667 | +{ |
3621 | + struct bfd_link_info *info; | 3668 | + struct bfd_link_info *info; |
@@ -3624,12 +3671,12 @@ index 00000000000..bf58b4b0a67 | |||
3624 | + struct elf64_mb_dyn_relocs *p; | 3671 | + struct elf64_mb_dyn_relocs *p; |
3625 | + | 3672 | + |
3626 | + if (h->root.type == bfd_link_hash_indirect) | 3673 | + if (h->root.type == bfd_link_hash_indirect) |
3627 | + return TRUE; | 3674 | + return true; |
3628 | + | 3675 | + |
3629 | + info = (struct bfd_link_info *) dat; | 3676 | + info = (struct bfd_link_info *) dat; |
3630 | + htab = elf64_mb_hash_table (info); | 3677 | + htab = elf64_mb_hash_table (info); |
3631 | + if (htab == NULL) | 3678 | + if (htab == NULL) |
3632 | + return FALSE; | 3679 | + return false; |
3633 | + | 3680 | + |
3634 | + if (htab->elf.dynamic_sections_created | 3681 | + if (htab->elf.dynamic_sections_created |
3635 | + && h->plt.refcount > 0) | 3682 | + && h->plt.refcount > 0) |
@@ -3640,12 +3687,12 @@ index 00000000000..bf58b4b0a67 | |||
3640 | + && !h->forced_local) | 3687 | + && !h->forced_local) |
3641 | + { | 3688 | + { |
3642 | + if (! bfd_elf_link_record_dynamic_symbol (info, h)) | 3689 | + if (! bfd_elf_link_record_dynamic_symbol (info, h)) |
3643 | + return FALSE; | 3690 | + return false; |
3644 | + } | 3691 | + } |
3645 | + | 3692 | + |
3646 | + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h)) | 3693 | + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h)) |
3647 | + { | 3694 | + { |
3648 | + asection *s = htab->splt; | 3695 | + asection *s = htab->elf.splt; |
3649 | + | 3696 | + |
3650 | + /* The first entry in .plt is reserved. */ | 3697 | + /* The first entry in .plt is reserved. */ |
3651 | + if (s->size == 0) | 3698 | + if (s->size == 0) |
@@ -3668,13 +3715,13 @@ index 00000000000..bf58b4b0a67 | |||
3668 | + /* Make room for this entry. */ | 3715 | + /* Make room for this entry. */ |
3669 | + s->size += PLT_ENTRY_SIZE; | 3716 | + s->size += PLT_ENTRY_SIZE; |
3670 | + | 3717 | + |
3671 | + /* We also need to make an entry in the .got.plt section, which | 3718 | + /* We also need to make an entry in the .got.plt section, which |
3672 | + will be placed in the .got section by the linker script. */ | 3719 | + will be placed in the .got section by the linker script. */ |
3673 | + htab->sgotplt->size += 4; | 3720 | + htab->elf.sgotplt->size += 4; |
3674 | + | 3721 | + |
3675 | + /* We also need to make an entry in the .rel.plt section. */ | 3722 | + /* We also need to make an entry in the .rel.plt section. */ |
3676 | + htab->srelplt->size += sizeof (Elf64_External_Rela); | 3723 | + htab->elf.srelplt->size += sizeof (Elf64_External_Rela); |
3677 | + } | 3724 | + } |
3678 | + else | 3725 | + else |
3679 | + { | 3726 | + { |
3680 | + h->plt.offset = (bfd_vma) -1; | 3727 | + h->plt.offset = (bfd_vma) -1; |
@@ -3699,7 +3746,7 @@ index 00000000000..bf58b4b0a67 | |||
3699 | + && !h->forced_local) | 3746 | + && !h->forced_local) |
3700 | + { | 3747 | + { |
3701 | + if (! bfd_elf_link_record_dynamic_symbol (info, h)) | 3748 | + if (! bfd_elf_link_record_dynamic_symbol (info, h)) |
3702 | + return FALSE; | 3749 | + return false; |
3703 | + } | 3750 | + } |
3704 | + | 3751 | + |
3705 | + need = 0; | 3752 | + need = 0; |
@@ -3729,18 +3776,18 @@ index 00000000000..bf58b4b0a67 | |||
3729 | + h->got.offset = (bfd_vma) -1; | 3776 | + h->got.offset = (bfd_vma) -1; |
3730 | + } | 3777 | + } |
3731 | + else | 3778 | + else |
3732 | + { | 3779 | + { |
3733 | + s = htab->sgot; | 3780 | + s = htab->elf.sgot; |
3734 | + h->got.offset = s->size; | 3781 | + h->got.offset = s->size; |
3735 | + s->size += need; | 3782 | + s->size += need; |
3736 | + htab->srelgot->size += need * (sizeof (Elf64_External_Rela) / 4); | 3783 | + htab->elf.srelgot->size += need * (sizeof (Elf64_External_Rela) / 4); |
3737 | + } | 3784 | + } |
3738 | + } | 3785 | + } |
3739 | + else | 3786 | + else |
3740 | + h->got.offset = (bfd_vma) -1; | 3787 | + h->got.offset = (bfd_vma) -1; |
3741 | + | 3788 | + |
3742 | + if (eh->dyn_relocs == NULL) | 3789 | + if (eh->dyn_relocs == NULL) |
3743 | + return TRUE; | 3790 | + return true; |
3744 | + | 3791 | + |
3745 | + /* In the shared -Bsymbolic case, discard space allocated for | 3792 | + /* In the shared -Bsymbolic case, discard space allocated for |
3746 | + dynamic pc-relative relocs against symbols which turn out to be | 3793 | + dynamic pc-relative relocs against symbols which turn out to be |
@@ -3766,6 +3813,8 @@ index 00000000000..bf58b4b0a67 | |||
3766 | + pp = &p->next; | 3813 | + pp = &p->next; |
3767 | + } | 3814 | + } |
3768 | + } | 3815 | + } |
3816 | + else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) | ||
3817 | + h->dyn_relocs = NULL; | ||
3769 | + } | 3818 | + } |
3770 | + else | 3819 | + else |
3771 | + { | 3820 | + { |
@@ -3786,7 +3835,7 @@ index 00000000000..bf58b4b0a67 | |||
3786 | + && !h->forced_local) | 3835 | + && !h->forced_local) |
3787 | + { | 3836 | + { |
3788 | + if (! bfd_elf_link_record_dynamic_symbol (info, h)) | 3837 | + if (! bfd_elf_link_record_dynamic_symbol (info, h)) |
3789 | + return FALSE; | 3838 | + return false; |
3790 | + } | 3839 | + } |
3791 | + | 3840 | + |
3792 | + /* If that succeeded, we know we'll be keeping all the | 3841 | + /* If that succeeded, we know we'll be keeping all the |
@@ -3795,24 +3844,24 @@ index 00000000000..bf58b4b0a67 | |||
3795 | + goto keep; | 3844 | + goto keep; |
3796 | + } | 3845 | + } |
3797 | + | 3846 | + |
3798 | + eh->dyn_relocs = NULL; | 3847 | + h->dyn_relocs = NULL; |
3799 | + | 3848 | + |
3800 | + keep: ; | 3849 | + keep: ; |
3801 | + } | 3850 | + } |
3802 | + | 3851 | + |
3803 | + /* Finally, allocate space. */ | 3852 | + /* Finally, allocate space. */ |
3804 | + for (p = eh->dyn_relocs; p != NULL; p = p->next) | 3853 | + for (p = h->dyn_relocs; p != NULL; p = p->next) |
3805 | + { | 3854 | + { |
3806 | + asection *sreloc = elf_section_data (p->sec)->sreloc; | 3855 | + asection *sreloc = elf_section_data (p->sec)->sreloc; |
3807 | + sreloc->size += p->count * sizeof (Elf64_External_Rela); | 3856 | + sreloc->size += p->count * sizeof (Elf64_External_Rela); |
3808 | + } | 3857 | + } |
3809 | + | 3858 | + |
3810 | + return TRUE; | 3859 | + return true; |
3811 | +} | 3860 | +} |
3812 | + | 3861 | + |
3813 | +/* Set the sizes of the dynamic sections. */ | 3862 | +/* Set the sizes of the dynamic sections. */ |
3814 | + | 3863 | + |
3815 | +static bfd_boolean | 3864 | +static bool |
3816 | +microblaze_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, | 3865 | +microblaze_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, |
3817 | + struct bfd_link_info *info) | 3866 | + struct bfd_link_info *info) |
3818 | +{ | 3867 | +{ |
@@ -3823,7 +3872,7 @@ index 00000000000..bf58b4b0a67 | |||
3823 | + | 3872 | + |
3824 | + htab = elf64_mb_hash_table (info); | 3873 | + htab = elf64_mb_hash_table (info); |
3825 | + if (htab == NULL) | 3874 | + if (htab == NULL) |
3826 | + return FALSE; | 3875 | + return false; |
3827 | + | 3876 | + |
3828 | + dynobj = htab->elf.dynobj; | 3877 | + dynobj = htab->elf.dynobj; |
3829 | + BFD_ASSERT (dynobj != NULL); | 3878 | + BFD_ASSERT (dynobj != NULL); |
@@ -3844,7 +3893,7 @@ index 00000000000..bf58b4b0a67 | |||
3844 | + | 3893 | + |
3845 | + for (s = ibfd->sections; s != NULL; s = s->next) | 3894 | + for (s = ibfd->sections; s != NULL; s = s->next) |
3846 | + { | 3895 | + { |
3847 | + struct elf64_mb_dyn_relocs *p; | 3896 | + struct elf_dyn_relocs *p; |
3848 | + | 3897 | + |
3849 | + for (p = ((struct elf64_mb_dyn_relocs *) | 3898 | + for (p = ((struct elf64_mb_dyn_relocs *) |
3850 | + elf_section_data (s)->local_dynrel); | 3899 | + elf_section_data (s)->local_dynrel); |
@@ -3877,8 +3926,8 @@ index 00000000000..bf58b4b0a67 | |||
3877 | + locsymcount = symtab_hdr->sh_info; | 3926 | + locsymcount = symtab_hdr->sh_info; |
3878 | + end_local_got = local_got + locsymcount; | 3927 | + end_local_got = local_got + locsymcount; |
3879 | + lgot_masks = (unsigned char *) end_local_got; | 3928 | + lgot_masks = (unsigned char *) end_local_got; |
3880 | + s = htab->sgot; | 3929 | + s = htab->elf.sgot; |
3881 | + srel = htab->srelgot; | 3930 | + srel = htab->elf.srelgot; |
3882 | + | 3931 | + |
3883 | + for (; local_got < end_local_got; ++local_got, ++lgot_masks) | 3932 | + for (; local_got < end_local_got; ++local_got, ++lgot_masks) |
3884 | + { | 3933 | + { |
@@ -3918,10 +3967,10 @@ index 00000000000..bf58b4b0a67 | |||
3918 | + | 3967 | + |
3919 | + if (htab->tlsld_got.refcount > 0) | 3968 | + if (htab->tlsld_got.refcount > 0) |
3920 | + { | 3969 | + { |
3921 | + htab->tlsld_got.offset = htab->sgot->size; | 3970 | + htab->tlsld_got.offset = htab->elf.sgot->size; |
3922 | + htab->sgot->size += 8; | 3971 | + htab->elf.sgot->size += 8; |
3923 | + if (bfd_link_pic (info)) | 3972 | + if (bfd_link_pic (info)) |
3924 | + htab->srelgot->size += sizeof (Elf64_External_Rela); | 3973 | + htab->elf.srelgot->size += sizeof (Elf64_External_Rela); |
3925 | + } | 3974 | + } |
3926 | + else | 3975 | + else |
3927 | + htab->tlsld_got.offset = (bfd_vma) -1; | 3976 | + htab->tlsld_got.offset = (bfd_vma) -1; |
@@ -3929,8 +3978,8 @@ index 00000000000..bf58b4b0a67 | |||
3929 | + if (elf_hash_table (info)->dynamic_sections_created) | 3978 | + if (elf_hash_table (info)->dynamic_sections_created) |
3930 | + { | 3979 | + { |
3931 | + /* Make space for the trailing nop in .plt. */ | 3980 | + /* Make space for the trailing nop in .plt. */ |
3932 | + if (htab->splt->size > 0) | 3981 | + if (htab->elf.splt->size > 0) |
3933 | + htab->splt->size += 4; | 3982 | + htab->elf.splt->size += 4; |
3934 | + } | 3983 | + } |
3935 | + | 3984 | + |
3936 | + /* The check_relocs and adjust_dynamic_symbol entry points have | 3985 | + /* The check_relocs and adjust_dynamic_symbol entry points have |
@@ -3939,105 +3988,73 @@ index 00000000000..bf58b4b0a67 | |||
3939 | + for (s = dynobj->sections; s != NULL; s = s->next) | 3988 | + for (s = dynobj->sections; s != NULL; s = s->next) |
3940 | + { | 3989 | + { |
3941 | + const char *name; | 3990 | + const char *name; |
3942 | + bfd_boolean strip = FALSE; | 3991 | + bool strip = false; |
3943 | + | 3992 | + |
3944 | + if ((s->flags & SEC_LINKER_CREATED) == 0) | 3993 | + if ((s->flags & SEC_LINKER_CREATED) == 0) |
3945 | + continue; | 3994 | + continue; |
3946 | + | 3995 | + |
3947 | + /* It's OK to base decisions on the section name, because none | 3996 | + /* It's OK to base decisions on the section name, because none |
3948 | + of the dynobj section names depend upon the input files. */ | 3997 | + of the dynobj section names depend upon the input files. */ |
3949 | + name = bfd_section_name (s); | 3998 | + name = bfd_section_name (s); |
3950 | + | 3999 | + |
3951 | + if (strncmp (name, ".rela", 5) == 0) | 4000 | + if (startswith (name, ".rela")) |
3952 | + { | 4001 | + { |
3953 | + if (s->size == 0) | 4002 | + if (s->size == 0) |
3954 | + { | 4003 | + { |
3955 | + /* If we don't need this section, strip it from the | 4004 | + /* If we don't need this section, strip it from the |
3956 | + output file. This is to handle .rela.bss and | 4005 | + output file. This is to handle .rela.bss and |
3957 | + .rela.plt. We must create it in | 4006 | + .rela.plt. We must create it in |
3958 | + create_dynamic_sections, because it must be created | 4007 | + create_dynamic_sections, because it must be created |
3959 | + before the linker maps input sections to output | 4008 | + before the linker maps input sections to output |
3960 | + sections. The linker does that before | 4009 | + sections. The linker does that before |
3961 | + adjust_dynamic_symbol is called, and it is that | 4010 | + adjust_dynamic_symbol is called, and it is that |
3962 | + function which decides whether anything needs to go | 4011 | + function which decides whether anything needs to go |
3963 | + into these sections. */ | 4012 | + into these sections. */ |
3964 | + strip = TRUE; | 4013 | + strip = true; |
3965 | + } | 4014 | + } |
3966 | + else | 4015 | + else |
3967 | + { | 4016 | + { |
3968 | + /* We use the reloc_count field as a counter if we need | 4017 | + /* We use the reloc_count field as a counter if we need |
3969 | + to copy relocs into the output file. */ | 4018 | + to copy relocs into the output file. */ |
3970 | + s->reloc_count = 0; | 4019 | + s->reloc_count = 0; |
3971 | + } | 4020 | + } |
3972 | + } | 4021 | + } |
3973 | + else if (s != htab->splt && s != htab->sgot && s != htab->sgotplt) | 4022 | + else if (s != htab->elf.splt |
3974 | + { | 4023 | + && s != htab->elf.sgot |
3975 | + /* It's not one of our sections, so don't allocate space. */ | 4024 | + && s != htab->elf.sgotplt |
3976 | + continue; | 4025 | + && s != htab->elf.sdynbss |
3977 | + } | 4026 | + && s != htab->elf.sdynrelro) |
4027 | + { | ||
4028 | + /* It's not one of our sections, so don't allocate space. */ | ||
4029 | + continue; | ||
4030 | + } | ||
3978 | + | 4031 | + |
3979 | + if (strip) | 4032 | + if (strip) |
3980 | + { | 4033 | + { |
3981 | + s->flags |= SEC_EXCLUDE; | 4034 | + s->flags |= SEC_EXCLUDE; |
3982 | + continue; | 4035 | + continue; |
3983 | + } | 4036 | + } |
3984 | + | 4037 | + |
3985 | + /* Allocate memory for the section contents. */ | 4038 | + /* Allocate memory for the section contents. */ |
3986 | + /* FIXME: This should be a call to bfd_alloc not bfd_zalloc. | 4039 | + /* FIXME: This should be a call to bfd_alloc not bfd_zalloc. |
3987 | + Unused entries should be reclaimed before the section's contents | 4040 | + Unused entries should be reclaimed before the section's contents |
3988 | + are written out, but at the moment this does not happen. Thus in | 4041 | + are written out, but at the moment this does not happen. Thus in |
3989 | + order to prevent writing out garbage, we initialise the section's | 4042 | + order to prevent writing out garbage, we initialise the section's |
3990 | + contents to zero. */ | 4043 | + contents to zero. */ |
3991 | + s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); | 4044 | + s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); |
3992 | + if (s->contents == NULL && s->size != 0) | 4045 | + if (s->contents == NULL && s->size != 0) |
3993 | + return FALSE; | 4046 | + return false; |
3994 | + } | 4047 | + } |
3995 | + | 4048 | + |
3996 | + if (elf_hash_table (info)->dynamic_sections_created) | 4049 | + /* ??? Force DF_BIND_NOW? */ |
3997 | + { | 4050 | + info->flags |= DF_BIND_NOW; |
3998 | + /* Add some entries to the .dynamic section. We fill in the | 4051 | + return _bfd_elf_add_dynamic_tags (output_bfd, info, true); |
3999 | + values later, in microblaze_elf_finish_dynamic_sections, but we | ||
4000 | + must add the entries now so that we get the correct size for | ||
4001 | + the .dynamic section. The DT_DEBUG entry is filled in by the | ||
4002 | + dynamic linker and used by the debugger. */ | ||
4003 | +#define add_dynamic_entry(TAG, VAL) \ | ||
4004 | + _bfd_elf_add_dynamic_entry (info, TAG, VAL) | ||
4005 | + | ||
4006 | + if (bfd_link_executable (info)) | ||
4007 | + { | ||
4008 | + if (!add_dynamic_entry (DT_DEBUG, 0)) | ||
4009 | + return FALSE; | ||
4010 | + } | ||
4011 | + | ||
4012 | + if (!add_dynamic_entry (DT_RELA, 0) | ||
4013 | + || !add_dynamic_entry (DT_RELASZ, 0) | ||
4014 | + || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela))) | ||
4015 | + return FALSE; | ||
4016 | + | ||
4017 | + if (htab->splt->size != 0) | ||
4018 | + { | ||
4019 | + if (!add_dynamic_entry (DT_PLTGOT, 0) | ||
4020 | + || !add_dynamic_entry (DT_PLTRELSZ, 0) | ||
4021 | + || !add_dynamic_entry (DT_PLTREL, DT_RELA) | ||
4022 | + || !add_dynamic_entry (DT_JMPREL, 0) | ||
4023 | + || !add_dynamic_entry (DT_BIND_NOW, 1)) | ||
4024 | + return FALSE; | ||
4025 | + } | ||
4026 | + | ||
4027 | + if (info->flags & DF_TEXTREL) | ||
4028 | + { | ||
4029 | + if (!add_dynamic_entry (DT_TEXTREL, 0)) | ||
4030 | + return FALSE; | ||
4031 | + } | ||
4032 | + } | ||
4033 | +#undef add_dynamic_entry | ||
4034 | + return TRUE; | ||
4035 | +} | 4052 | +} |
4036 | + | 4053 | + |
4037 | +/* Finish up dynamic symbol handling. We set the contents of various | 4054 | +/* Finish up dynamic symbol handling. We set the contents of various |
4038 | + dynamic sections here. */ | 4055 | + dynamic sections here. */ |
4039 | + | 4056 | + |
4040 | +static bfd_boolean | 4057 | +static bool |
4041 | +microblaze_elf_finish_dynamic_symbol (bfd *output_bfd, | 4058 | +microblaze_elf_finish_dynamic_symbol (bfd *output_bfd, |
4042 | + struct bfd_link_info *info, | 4059 | + struct bfd_link_info *info, |
4043 | + struct elf_link_hash_entry *h, | 4060 | + struct elf_link_hash_entry *h, |
@@ -4048,7 +4065,7 @@ index 00000000000..bf58b4b0a67 | |||
4048 | + | 4065 | + |
4049 | + htab = elf64_mb_hash_table (info); | 4066 | + htab = elf64_mb_hash_table (info); |
4050 | + if (htab == NULL) | 4067 | + if (htab == NULL) |
4051 | + return FALSE; | 4068 | + return false; |
4052 | + | 4069 | + |
4053 | + if (h->plt.offset != (bfd_vma) -1) | 4070 | + if (h->plt.offset != (bfd_vma) -1) |
4054 | + { | 4071 | + { |
@@ -4065,9 +4082,9 @@ index 00000000000..bf58b4b0a67 | |||
4065 | + it up. */ | 4082 | + it up. */ |
4066 | + BFD_ASSERT (h->dynindx != -1); | 4083 | + BFD_ASSERT (h->dynindx != -1); |
4067 | + | 4084 | + |
4068 | + splt = htab->splt; | 4085 | + splt = htab->elf.splt; |
4069 | + srela = htab->srelplt; | 4086 | + srela = htab->elf.srelplt; |
4070 | + sgotplt = htab->sgotplt; | 4087 | + sgotplt = htab->elf.sgotplt; |
4071 | + BFD_ASSERT (splt != NULL && srela != NULL && sgotplt != NULL); | 4088 | + BFD_ASSERT (splt != NULL && srela != NULL && sgotplt != NULL); |
4072 | + | 4089 | + |
4073 | + plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1; /* first entry reserved. */ | 4090 | + plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1; /* first entry reserved. */ |
@@ -4076,7 +4093,7 @@ index 00000000000..bf58b4b0a67 | |||
4076 | + | 4093 | + |
4077 | + /* For non-PIC objects we need absolute address of the GOT entry. */ | 4094 | + /* For non-PIC objects we need absolute address of the GOT entry. */ |
4078 | + if (!bfd_link_pic (info)) | 4095 | + if (!bfd_link_pic (info)) |
4079 | + got_addr += htab->sgotplt->output_section->vma + sgotplt->output_offset; | 4096 | + got_addr += sgotplt->output_section->vma + sgotplt->output_offset; |
4080 | + | 4097 | + |
4081 | + /* Fill in the entry in the procedure linkage table. */ | 4098 | + /* Fill in the entry in the procedure linkage table. */ |
4082 | + bfd_put_32 (output_bfd, PLT_ENTRY_WORD_0 + ((got_addr >> 16) & 0xffff), | 4099 | + bfd_put_32 (output_bfd, PLT_ENTRY_WORD_0 + ((got_addr >> 16) & 0xffff), |
@@ -4128,8 +4145,8 @@ index 00000000000..bf58b4b0a67 | |||
4128 | + /* This symbol has an entry in the global offset table. Set it | 4145 | + /* This symbol has an entry in the global offset table. Set it |
4129 | + up. */ | 4146 | + up. */ |
4130 | + | 4147 | + |
4131 | + sgot = htab->sgot; | 4148 | + sgot = htab->elf.sgot; |
4132 | + srela = htab->srelgot; | 4149 | + srela = htab->elf.srelgot; |
4133 | + BFD_ASSERT (sgot != NULL && srela != NULL); | 4150 | + BFD_ASSERT (sgot != NULL && srela != NULL); |
4134 | + | 4151 | + |
4135 | + offset = (sgot->output_section->vma + sgot->output_offset | 4152 | + offset = (sgot->output_section->vma + sgot->output_offset |
@@ -4143,16 +4160,23 @@ index 00000000000..bf58b4b0a67 | |||
4143 | + if (bfd_link_pic (info) | 4160 | + if (bfd_link_pic (info) |
4144 | + && ((info->symbolic && h->def_regular) | 4161 | + && ((info->symbolic && h->def_regular) |
4145 | + || h->dynindx == -1)) | 4162 | + || h->dynindx == -1)) |
4146 | + { | 4163 | + { |
4147 | + asection *sec = h->root.u.def.section; | 4164 | + asection *sec = h->root.u.def.section; |
4148 | + microblaze_elf_output_dynamic_relocation (output_bfd, | 4165 | + bfd_vma value; |
4149 | + srela, srela->reloc_count++, | 4166 | + |
4150 | + /* symindex= */ 0, | 4167 | + value = h->root.u.def.value; |
4151 | + R_MICROBLAZE_REL, offset, | 4168 | + if (sec->output_section != NULL) |
4152 | + h->root.u.def.value | 4169 | + /* PR 21180: If the output section is NULL, then the symbol is no |
4153 | + + sec->output_section->vma | 4170 | + longer needed, and in theory the GOT entry is redundant. But |
4154 | + + sec->output_offset); | 4171 | + it is too late to change our minds now... */ |
4155 | + } | 4172 | + value += sec->output_section->vma + sec->output_offset; |
4173 | + | ||
4174 | + microblaze_elf_output_dynamic_relocation (output_bfd, | ||
4175 | + srela, srela->reloc_count++, | ||
4176 | + /* symindex= */ 0, | ||
4177 | + R_MICROBLAZE_REL, offset, | ||
4178 | + value); | ||
4179 | + } | ||
4156 | + else | 4180 | + else |
4157 | + { | 4181 | + { |
4158 | + microblaze_elf_output_dynamic_relocation (output_bfd, | 4182 | + microblaze_elf_output_dynamic_relocation (output_bfd, |
@@ -4176,16 +4200,17 @@ index 00000000000..bf58b4b0a67 | |||
4176 | + | 4200 | + |
4177 | + BFD_ASSERT (h->dynindx != -1); | 4201 | + BFD_ASSERT (h->dynindx != -1); |
4178 | + | 4202 | + |
4179 | + s = bfd_get_linker_section (htab->elf.dynobj, ".rela.bss"); | ||
4180 | + BFD_ASSERT (s != NULL); | ||
4181 | + | ||
4182 | + rela.r_offset = (h->root.u.def.value | 4203 | + rela.r_offset = (h->root.u.def.value |
4183 | + + h->root.u.def.section->output_section->vma | 4204 | + + h->root.u.def.section->output_section->vma |
4184 | + + h->root.u.def.section->output_offset); | 4205 | + + h->root.u.def.section->output_offset); |
4185 | + rela.r_info = ELF64_R_INFO (h->dynindx, R_MICROBLAZE_COPY); | 4206 | + rela.r_info = ELF64_R_INFO (h->dynindx, R_MICROBLAZE_COPY); |
4186 | + rela.r_addend = 0; | 4207 | + rela.r_addend = 0; |
4187 | + loc = s->contents + s->reloc_count++ * sizeof (Elf64_External_Rela); | 4208 | + if (h->root.u.def.section == htab->elf.sdynrelro) |
4188 | + bfd_elf64_swap_reloca_out (output_bfd, &rela, loc); | 4209 | + s = htab->elf.sreldynrelro; |
4210 | + else | ||
4211 | + s = htab->elf.srelbss; | ||
4212 | + loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela); | ||
4213 | + bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); | ||
4189 | + } | 4214 | + } |
4190 | + | 4215 | + |
4191 | + /* Mark some specially defined symbols as absolute. */ | 4216 | + /* Mark some specially defined symbols as absolute. */ |
@@ -4194,13 +4219,13 @@ index 00000000000..bf58b4b0a67 | |||
4194 | + || h == htab->elf.hplt) | 4219 | + || h == htab->elf.hplt) |
4195 | + sym->st_shndx = SHN_ABS; | 4220 | + sym->st_shndx = SHN_ABS; |
4196 | + | 4221 | + |
4197 | + return TRUE; | 4222 | + return true; |
4198 | +} | 4223 | +} |
4199 | + | 4224 | + |
4200 | + | 4225 | + |
4201 | +/* Finish up the dynamic sections. */ | 4226 | +/* Finish up the dynamic sections. */ |
4202 | + | 4227 | + |
4203 | +static bfd_boolean | 4228 | +static bool |
4204 | +microblaze_elf_finish_dynamic_sections (bfd *output_bfd, | 4229 | +microblaze_elf_finish_dynamic_sections (bfd *output_bfd, |
4205 | + struct bfd_link_info *info) | 4230 | + struct bfd_link_info *info) |
4206 | +{ | 4231 | +{ |
@@ -4210,7 +4235,7 @@ index 00000000000..bf58b4b0a67 | |||
4210 | + | 4235 | + |
4211 | + htab = elf64_mb_hash_table (info); | 4236 | + htab = elf64_mb_hash_table (info); |
4212 | + if (htab == NULL) | 4237 | + if (htab == NULL) |
4213 | + return FALSE; | 4238 | + return false; |
4214 | + | 4239 | + |
4215 | + dynobj = htab->elf.dynobj; | 4240 | + dynobj = htab->elf.dynobj; |
4216 | + | 4241 | + |
@@ -4221,62 +4246,68 @@ index 00000000000..bf58b4b0a67 | |||
4221 | + asection *splt; | 4246 | + asection *splt; |
4222 | + Elf64_External_Dyn *dyncon, *dynconend; | 4247 | + Elf64_External_Dyn *dyncon, *dynconend; |
4223 | + | 4248 | + |
4224 | + splt = bfd_get_linker_section (dynobj, ".plt"); | ||
4225 | + BFD_ASSERT (splt != NULL && sdyn != NULL); | ||
4226 | + | ||
4227 | + dyncon = (Elf64_External_Dyn *) sdyn->contents; | 4249 | + dyncon = (Elf64_External_Dyn *) sdyn->contents; |
4228 | + dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size); | 4250 | + dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size); |
4229 | + for (; dyncon < dynconend; dyncon++) | 4251 | + for (; dyncon < dynconend; dyncon++) |
4230 | + { | 4252 | + { |
4231 | + Elf_Internal_Dyn dyn; | 4253 | + Elf_Internal_Dyn dyn; |
4232 | + const char *name; | 4254 | + asection *s; |
4233 | + bfd_boolean size; | 4255 | + bool size; |
4234 | + | 4256 | + |
4235 | + bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn); | 4257 | + bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn); |
4236 | + | 4258 | + |
4237 | + switch (dyn.d_tag) | 4259 | + switch (dyn.d_tag) |
4238 | + { | 4260 | + { |
4239 | + case DT_PLTGOT: name = ".got.plt"; size = FALSE; break; | 4261 | + case DT_PLTGOT: |
4240 | + case DT_PLTRELSZ: name = ".rela.plt"; size = TRUE; break; | 4262 | + s = htab->elf.sgotplt; |
4241 | + case DT_JMPREL: name = ".rela.plt"; size = FALSE; break; | 4263 | + size = false; |
4242 | + case DT_RELA: name = ".rela.dyn"; size = FALSE; break; | 4264 | + break; |
4243 | + case DT_RELASZ: name = ".rela.dyn"; size = TRUE; break; | ||
4244 | + default: name = NULL; size = FALSE; break; | ||
4245 | + } | ||
4246 | + | 4265 | + |
4247 | + if (name != NULL) | 4266 | + case DT_PLTRELSZ: |
4248 | + { | 4267 | + s = htab->elf.srelplt; |
4249 | + asection *s; | 4268 | + size = true; |
4269 | + break; | ||
4250 | + | 4270 | + |
4251 | + s = bfd_get_section_by_name (output_bfd, name); | 4271 | + case DT_JMPREL: |
4252 | + if (s == NULL) | 4272 | + s = htab->elf.srelplt; |
4253 | + dyn.d_un.d_val = 0; | 4273 | + size = false; |
4254 | + else | 4274 | + break; |
4255 | + { | 4275 | + |
4256 | + if (! size) | 4276 | + default: |
4257 | + dyn.d_un.d_ptr = s->vma; | 4277 | + continue; |
4258 | + else | 4278 | + } |
4259 | + dyn.d_un.d_val = s->size; | 4279 | + |
4260 | + } | 4280 | + if (s == NULL) |
4261 | + bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); | 4281 | + dyn.d_un.d_val = 0; |
4262 | + } | 4282 | + else |
4263 | + } | 4283 | + { |
4284 | + if (!size) | ||
4285 | + dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; | ||
4286 | + else | ||
4287 | + dyn.d_un.d_val = s->size; | ||
4288 | + } | ||
4289 | + bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); | ||
4290 | + } | ||
4291 | + | ||
4292 | + splt = htab->elf.splt; | ||
4293 | + BFD_ASSERT (splt != NULL && sdyn != NULL); | ||
4264 | + | 4294 | + |
4265 | + /* Clear the first entry in the procedure linkage table, | 4295 | + /* Clear the first entry in the procedure linkage table, |
4266 | + and put a nop in the last four bytes. */ | 4296 | + and put a nop in the last four bytes. */ |
4267 | + if (splt->size > 0) | 4297 | + if (splt->size > 0) |
4268 | + { | 4298 | + { |
4269 | + memset (splt->contents, 0, PLT_ENTRY_SIZE); | 4299 | + memset (splt->contents, 0, PLT_ENTRY_SIZE); |
4270 | + bfd_put_32 (output_bfd, (bfd_vma) 0x80000000 /* nop. */, | 4300 | + bfd_put_32 (output_bfd, (bfd_vma) 0x80000000 /* nop. */, |
4271 | + splt->contents + splt->size - 4); | 4301 | + splt->contents + splt->size - 4); |
4272 | + } | ||
4273 | + | 4302 | + |
4274 | + elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4; | 4303 | + if (splt->output_section != bfd_abs_section_ptr) |
4304 | + elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4; | ||
4305 | + } | ||
4275 | + } | 4306 | + } |
4276 | + | 4307 | + |
4277 | + /* Set the first entry in the global offset table to the address of | 4308 | + /* Set the first entry in the global offset table to the address of |
4278 | + the dynamic section. */ | 4309 | + the dynamic section. */ |
4279 | + sgot = bfd_get_linker_section (dynobj, ".got.plt"); | 4310 | + sgot = htab->elf.sgotplt; |
4280 | + if (sgot && sgot->size > 0) | 4311 | + if (sgot && sgot->size > 0) |
4281 | + { | 4312 | + { |
4282 | + if (sdyn == NULL) | 4313 | + if (sdyn == NULL) |
@@ -4288,26 +4319,16 @@ index 00000000000..bf58b4b0a67 | |||
4288 | + elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4; | 4319 | + elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4; |
4289 | + } | 4320 | + } |
4290 | + | 4321 | + |
4291 | + if (htab->sgot && htab->sgot->size > 0) | 4322 | + if (htab->elf.sgot && htab->elf.sgot->size > 0) |
4292 | + elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 4; | 4323 | + elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4; |
4293 | + | ||
4294 | + return TRUE; | ||
4295 | +} | ||
4296 | + | 4324 | + |
4297 | +static bfd_boolean | 4325 | + return true; |
4298 | +microblaze_elf_object_p (bfd *abfd) | ||
4299 | +{ | ||
4300 | + bfd_default_set_arch_mach (abfd, bfd_arch_microblaze, | ||
4301 | + bfd_mach_microblaze64); | ||
4302 | + return TRUE; | ||
4303 | +} | 4326 | +} |
4304 | + | ||
4305 | + | ||
4306 | + | 4327 | + |
4307 | +/* Hook called by the linker routine which adds symbols from an object | 4328 | +/* Hook called by the linker routine which adds symbols from an object |
4308 | + file. We use it to put .comm items in .sbss, and not .bss. */ | 4329 | + file. We use it to put .comm items in .sbss, and not .bss. */ |
4309 | + | 4330 | + |
4310 | +static bfd_boolean | 4331 | +static bool |
4311 | +microblaze_elf_add_symbol_hook (bfd *abfd, | 4332 | +microblaze_elf_add_symbol_hook (bfd *abfd, |
4312 | + struct bfd_link_info *info, | 4333 | + struct bfd_link_info *info, |
4313 | + Elf_Internal_Sym *sym, | 4334 | + Elf_Internal_Sym *sym, |
@@ -4324,13 +4345,13 @@ index 00000000000..bf58b4b0a67 | |||
4324 | + put into .sbss. */ | 4345 | + put into .sbss. */ |
4325 | + *secp = bfd_make_section_old_way (abfd, ".sbss"); | 4346 | + *secp = bfd_make_section_old_way (abfd, ".sbss"); |
4326 | + if (*secp == NULL | 4347 | + if (*secp == NULL |
4327 | + || ! bfd_set_section_flags (*secp, SEC_IS_COMMON)) | 4348 | + || !bfd_set_section_flags (*secp, SEC_IS_COMMON | SEC_SMALL_DATA)) |
4328 | + return FALSE; | 4349 | + return false; |
4329 | + | 4350 | + |
4330 | + *valp = sym->st_size; | 4351 | + *valp = sym->st_size; |
4331 | + } | 4352 | + } |
4332 | + | 4353 | + |
4333 | + return TRUE; | 4354 | + return true; |
4334 | +} | 4355 | +} |
4335 | + | 4356 | + |
4336 | +#define TARGET_LITTLE_SYM microblaze_elf64_le_vec | 4357 | +#define TARGET_LITTLE_SYM microblaze_elf64_le_vec |
@@ -4349,6 +4370,7 @@ index 00000000000..bf58b4b0a67 | |||
4349 | + | 4370 | + |
4350 | +#define bfd_elf64_bfd_reloc_type_lookup microblaze_elf_reloc_type_lookup | 4371 | +#define bfd_elf64_bfd_reloc_type_lookup microblaze_elf_reloc_type_lookup |
4351 | +#define bfd_elf64_bfd_is_local_label_name microblaze_elf_is_local_label_name | 4372 | +#define bfd_elf64_bfd_is_local_label_name microblaze_elf_is_local_label_name |
4373 | +#define bfd_elf64_new_section_hook microblaze_elf_new_section_hook | ||
4352 | +#define elf_backend_relocate_section microblaze_elf_relocate_section | 4374 | +#define elf_backend_relocate_section microblaze_elf_relocate_section |
4353 | +#define bfd_elf64_bfd_relax_section microblaze_elf_relax_section | 4375 | +#define bfd_elf64_bfd_relax_section microblaze_elf_relax_section |
4354 | +#define bfd_elf64_bfd_merge_private_bfd_data microblaze_elf_merge_private_bfd_data | 4376 | +#define bfd_elf64_bfd_merge_private_bfd_data microblaze_elf_merge_private_bfd_data |
@@ -4360,11 +4382,13 @@ index 00000000000..bf58b4b0a67 | |||
4360 | +#define elf_backend_copy_indirect_symbol microblaze_elf_copy_indirect_symbol | 4382 | +#define elf_backend_copy_indirect_symbol microblaze_elf_copy_indirect_symbol |
4361 | +#define bfd_elf64_bfd_link_hash_table_create microblaze_elf_link_hash_table_create | 4383 | +#define bfd_elf64_bfd_link_hash_table_create microblaze_elf_link_hash_table_create |
4362 | +#define elf_backend_can_gc_sections 1 | 4384 | +#define elf_backend_can_gc_sections 1 |
4363 | +#define elf_backend_can_refcount 1 | 4385 | +#define elf_backend_can_refcount 1 |
4364 | +#define elf_backend_want_got_plt 1 | 4386 | +#define elf_backend_want_got_plt 1 |
4365 | +#define elf_backend_plt_readonly 1 | 4387 | +#define elf_backend_plt_readonly 1 |
4366 | +#define elf_backend_got_header_size 12 | 4388 | +#define elf_backend_got_header_size 12 |
4367 | +#define elf_backend_rela_normal 1 | 4389 | +#define elf_backend_want_dynrelro 1 |
4390 | +#define elf_backend_rela_normal 1 | ||
4391 | +#define elf_backend_dtrel_excludes_plt 1 | ||
4368 | + | 4392 | + |
4369 | +#define elf_backend_adjust_dynamic_symbol microblaze_elf_adjust_dynamic_symbol | 4393 | +#define elf_backend_adjust_dynamic_symbol microblaze_elf_adjust_dynamic_symbol |
4370 | +#define elf_backend_create_dynamic_sections microblaze_elf_create_dynamic_sections | 4394 | +#define elf_backend_create_dynamic_sections microblaze_elf_create_dynamic_sections |
@@ -4372,14 +4396,13 @@ index 00000000000..bf58b4b0a67 | |||
4372 | +#define elf_backend_finish_dynamic_symbol microblaze_elf_finish_dynamic_symbol | 4396 | +#define elf_backend_finish_dynamic_symbol microblaze_elf_finish_dynamic_symbol |
4373 | +#define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections | 4397 | +#define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections |
4374 | +#define elf_backend_add_symbol_hook microblaze_elf_add_symbol_hook | 4398 | +#define elf_backend_add_symbol_hook microblaze_elf_add_symbol_hook |
4375 | +#define elf_backend_object_p microblaze_elf_object_p | ||
4376 | + | 4399 | + |
4377 | +#include "elf64-target.h" | 4400 | +#include "elf64-target.h" |
4378 | diff --git a/bfd/libbfd.h b/bfd/libbfd.h | 4401 | diff --git a/bfd/libbfd.h b/bfd/libbfd.h |
4379 | index 74d7e4111d3..311fec7f2e8 100644 | 4402 | index 6e62e556962..ef5568a78b0 100644 |
4380 | --- a/bfd/libbfd.h | 4403 | --- a/bfd/libbfd.h |
4381 | +++ b/bfd/libbfd.h | 4404 | +++ b/bfd/libbfd.h |
4382 | @@ -2971,6 +2971,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", | 4405 | @@ -2992,6 +2992,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", |
4383 | "BFD_RELOC_MICROBLAZE_32_ROSDA", | 4406 | "BFD_RELOC_MICROBLAZE_32_ROSDA", |
4384 | "BFD_RELOC_MICROBLAZE_32_RWSDA", | 4407 | "BFD_RELOC_MICROBLAZE_32_RWSDA", |
4385 | "BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM", | 4408 | "BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM", |
@@ -4387,7 +4410,7 @@ index 74d7e4111d3..311fec7f2e8 100644 | |||
4387 | "BFD_RELOC_MICROBLAZE_64_NONE", | 4410 | "BFD_RELOC_MICROBLAZE_64_NONE", |
4388 | "BFD_RELOC_MICROBLAZE_64_GOTPC", | 4411 | "BFD_RELOC_MICROBLAZE_64_GOTPC", |
4389 | "BFD_RELOC_MICROBLAZE_64_GOT", | 4412 | "BFD_RELOC_MICROBLAZE_64_GOT", |
4390 | @@ -2978,6 +2979,8 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", | 4413 | @@ -2999,6 +3000,8 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", |
4391 | "BFD_RELOC_MICROBLAZE_64_GOTOFF", | 4414 | "BFD_RELOC_MICROBLAZE_64_GOTOFF", |
4392 | "BFD_RELOC_MICROBLAZE_32_GOTOFF", | 4415 | "BFD_RELOC_MICROBLAZE_32_GOTOFF", |
4393 | "BFD_RELOC_MICROBLAZE_COPY", | 4416 | "BFD_RELOC_MICROBLAZE_COPY", |
@@ -4397,10 +4420,10 @@ index 74d7e4111d3..311fec7f2e8 100644 | |||
4397 | "BFD_RELOC_MICROBLAZE_64_TLSGD", | 4420 | "BFD_RELOC_MICROBLAZE_64_TLSGD", |
4398 | "BFD_RELOC_MICROBLAZE_64_TLSLD", | 4421 | "BFD_RELOC_MICROBLAZE_64_TLSLD", |
4399 | diff --git a/bfd/reloc.c b/bfd/reloc.c | 4422 | diff --git a/bfd/reloc.c b/bfd/reloc.c |
4400 | index dc923fe39c2..d2204ded537 100644 | 4423 | index 164060361a9..e733e2397f4 100644 |
4401 | --- a/bfd/reloc.c | 4424 | --- a/bfd/reloc.c |
4402 | +++ b/bfd/reloc.c | 4425 | +++ b/bfd/reloc.c |
4403 | @@ -6867,6 +6867,12 @@ ENUM | 4426 | @@ -6898,6 +6898,12 @@ ENUM |
4404 | ENUMDOC | 4427 | ENUMDOC |
4405 | This is a 32 bit reloc for the microblaze to handle | 4428 | This is a 32 bit reloc for the microblaze to handle |
4406 | expressions of the form "Symbol Op Symbol" | 4429 | expressions of the form "Symbol Op Symbol" |
@@ -4413,7 +4436,7 @@ index dc923fe39c2..d2204ded537 100644 | |||
4413 | ENUM | 4436 | ENUM |
4414 | BFD_RELOC_MICROBLAZE_64_NONE | 4437 | BFD_RELOC_MICROBLAZE_64_NONE |
4415 | ENUMDOC | 4438 | ENUMDOC |
4416 | @@ -6960,6 +6966,20 @@ ENUMDOC | 4439 | @@ -6991,6 +6997,20 @@ ENUMDOC |
4417 | value in two words (with an imm instruction). The relocation is | 4440 | value in two words (with an imm instruction). The relocation is |
4418 | relative offset from start of TEXT. | 4441 | relative offset from start of TEXT. |
4419 | 4442 | ||
@@ -4435,10 +4458,10 @@ index dc923fe39c2..d2204ded537 100644 | |||
4435 | BFD_RELOC_AARCH64_RELOC_START | 4458 | BFD_RELOC_AARCH64_RELOC_START |
4436 | ENUMDOC | 4459 | ENUMDOC |
4437 | diff --git a/bfd/targets.c b/bfd/targets.c | 4460 | diff --git a/bfd/targets.c b/bfd/targets.c |
4438 | index 35492b92bbe..99fbfdf6cd8 100644 | 4461 | index 417743efc0e..333f05c55f4 100644 |
4439 | --- a/bfd/targets.c | 4462 | --- a/bfd/targets.c |
4440 | +++ b/bfd/targets.c | 4463 | +++ b/bfd/targets.c |
4441 | @@ -782,6 +782,8 @@ extern const bfd_target mep_elf32_le_vec; | 4464 | @@ -795,6 +795,8 @@ extern const bfd_target mep_elf32_le_vec; |
4442 | extern const bfd_target metag_elf32_vec; | 4465 | extern const bfd_target metag_elf32_vec; |
4443 | extern const bfd_target microblaze_elf32_vec; | 4466 | extern const bfd_target microblaze_elf32_vec; |
4444 | extern const bfd_target microblaze_elf32_le_vec; | 4467 | extern const bfd_target microblaze_elf32_le_vec; |
@@ -4447,7 +4470,7 @@ index 35492b92bbe..99fbfdf6cd8 100644 | |||
4447 | extern const bfd_target mips_ecoff_be_vec; | 4470 | extern const bfd_target mips_ecoff_be_vec; |
4448 | extern const bfd_target mips_ecoff_le_vec; | 4471 | extern const bfd_target mips_ecoff_le_vec; |
4449 | extern const bfd_target mips_ecoff_bele_vec; | 4472 | extern const bfd_target mips_ecoff_bele_vec; |
4450 | @@ -1146,6 +1148,10 @@ static const bfd_target * const _bfd_target_vector[] = | 4473 | @@ -1165,6 +1167,10 @@ static const bfd_target * const _bfd_target_vector[] = |
4451 | 4474 | ||
4452 | &metag_elf32_vec, | 4475 | &metag_elf32_vec, |
4453 | 4476 | ||
@@ -4459,18 +4482,10 @@ index 35492b92bbe..99fbfdf6cd8 100644 | |||
4459 | 4482 | ||
4460 | &mips_ecoff_be_vec, | 4483 | &mips_ecoff_be_vec, |
4461 | diff --git a/gdb/features/Makefile b/gdb/features/Makefile | 4484 | diff --git a/gdb/features/Makefile b/gdb/features/Makefile |
4462 | index 67c3ae17a77..131fc14adbf 100644 | 4485 | index fc3196864c9..1bb198abfd3 100644 |
4463 | --- a/gdb/features/Makefile | 4486 | --- a/gdb/features/Makefile |
4464 | +++ b/gdb/features/Makefile | 4487 | +++ b/gdb/features/Makefile |
4465 | @@ -46,6 +46,7 @@ | 4488 | @@ -101,7 +101,9 @@ OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH)) |
4466 | # List of .dat files to create in ../regformats/ | ||
4467 | WHICH = mips-linux mips-dsp-linux \ | ||
4468 | microblaze-with-stack-protect \ | ||
4469 | + microblaze64-with-stack-protect \ | ||
4470 | mips64-linux mips64-dsp-linux \ | ||
4471 | nios2-linux \ | ||
4472 | rs6000/powerpc-32 \ | ||
4473 | @@ -107,7 +108,9 @@ OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH)) | ||
4474 | # to make on the command line. | 4489 | # to make on the command line. |
4475 | XMLTOC = \ | 4490 | XMLTOC = \ |
4476 | microblaze-with-stack-protect.xml \ | 4491 | microblaze-with-stack-protect.xml \ |
@@ -4481,7 +4496,7 @@ index 67c3ae17a77..131fc14adbf 100644 | |||
4481 | mips-linux.xml \ | 4496 | mips-linux.xml \ |
4482 | mips64-dsp-linux.xml \ | 4497 | mips64-dsp-linux.xml \ |
4483 | diff --git a/gdb/features/microblaze-core.xml b/gdb/features/microblaze-core.xml | 4498 | diff --git a/gdb/features/microblaze-core.xml b/gdb/features/microblaze-core.xml |
4484 | index 47fb4fb4b51..b2ee4f11bc2 100644 | 4499 | index 29fdd6c0a2f..a5c3cce069d 100644 |
4485 | --- a/gdb/features/microblaze-core.xml | 4500 | --- a/gdb/features/microblaze-core.xml |
4486 | +++ b/gdb/features/microblaze-core.xml | 4501 | +++ b/gdb/features/microblaze-core.xml |
4487 | @@ -8,7 +8,7 @@ | 4502 | @@ -8,7 +8,7 @@ |
@@ -4510,7 +4525,7 @@ index 47fb4fb4b51..b2ee4f11bc2 100644 | |||
4510 | + <reg name="shr" bitsize="32"/> | 4525 | + <reg name="shr" bitsize="32"/> |
4511 | </feature> | 4526 | </feature> |
4512 | diff --git a/gdb/features/microblaze-stack-protect.xml b/gdb/features/microblaze-stack-protect.xml | 4527 | diff --git a/gdb/features/microblaze-stack-protect.xml b/gdb/features/microblaze-stack-protect.xml |
4513 | index 2b95c2f2bcf..9efe6114128 100644 | 4528 | index aac51ea471c..722a51f0df5 100644 |
4514 | --- a/gdb/features/microblaze-stack-protect.xml | 4529 | --- a/gdb/features/microblaze-stack-protect.xml |
4515 | +++ b/gdb/features/microblaze-stack-protect.xml | 4530 | +++ b/gdb/features/microblaze-stack-protect.xml |
4516 | @@ -7,6 +7,6 @@ | 4531 | @@ -7,6 +7,6 @@ |
@@ -4523,12 +4538,12 @@ index 2b95c2f2bcf..9efe6114128 100644 | |||
4523 | + <reg name="shr" bitsize="32"/> | 4538 | + <reg name="shr" bitsize="32"/> |
4524 | </feature> | 4539 | </feature> |
4525 | diff --git a/gdb/features/microblaze-with-stack-protect.c b/gdb/features/microblaze-with-stack-protect.c | 4540 | diff --git a/gdb/features/microblaze-with-stack-protect.c b/gdb/features/microblaze-with-stack-protect.c |
4526 | index b39aa198874..609934e2b41 100644 | 4541 | index aa180bf35d5..6a9e74c7a6f 100644 |
4527 | --- a/gdb/features/microblaze-with-stack-protect.c | 4542 | --- a/gdb/features/microblaze-with-stack-protect.c |
4528 | +++ b/gdb/features/microblaze-with-stack-protect.c | 4543 | +++ b/gdb/features/microblaze-with-stack-protect.c |
4529 | @@ -14,7 +14,7 @@ initialize_tdesc_microblaze_with_stack_protect (void) | 4544 | @@ -14,7 +14,7 @@ initialize_tdesc_microblaze_with_stack_protect (void) |
4530 | 4545 | ||
4531 | feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.core"); | 4546 | feature = tdesc_create_feature (result.get (), "org.gnu.gdb.microblaze.core"); |
4532 | tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int"); | 4547 | tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int"); |
4533 | - tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "data_ptr"); | 4548 | - tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "data_ptr"); |
4534 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int"); | 4549 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int"); |
@@ -4547,21 +4562,21 @@ index b39aa198874..609934e2b41 100644 | |||
4547 | @@ -72,8 +72,8 @@ initialize_tdesc_microblaze_with_stack_protect (void) | 4562 | @@ -72,8 +72,8 @@ initialize_tdesc_microblaze_with_stack_protect (void) |
4548 | tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | 4563 | tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); |
4549 | 4564 | ||
4550 | feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.stack-protect"); | 4565 | feature = tdesc_create_feature (result.get (), "org.gnu.gdb.microblaze.stack-protect"); |
4551 | - tdesc_create_reg (feature, "rslr", 57, 1, NULL, 32, "int"); | 4566 | - tdesc_create_reg (feature, "rslr", 57, 1, NULL, 32, "int"); |
4552 | - tdesc_create_reg (feature, "rshr", 58, 1, NULL, 32, "int"); | 4567 | - tdesc_create_reg (feature, "rshr", 58, 1, NULL, 32, "int"); |
4553 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 32, "int"); | 4568 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 32, "int"); |
4554 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 32, "int"); | 4569 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 32, "int"); |
4555 | 4570 | ||
4556 | tdesc_microblaze_with_stack_protect = result; | 4571 | tdesc_microblaze_with_stack_protect = result.release (); |
4557 | } | 4572 | } |
4558 | diff --git a/gdb/features/microblaze.c b/gdb/features/microblaze.c | 4573 | diff --git a/gdb/features/microblaze.c b/gdb/features/microblaze.c |
4559 | index 6c86fc07700..ceb98ca8b82 100644 | 4574 | index ef2c64c720e..201232dff83 100644 |
4560 | --- a/gdb/features/microblaze.c | 4575 | --- a/gdb/features/microblaze.c |
4561 | +++ b/gdb/features/microblaze.c | 4576 | +++ b/gdb/features/microblaze.c |
4562 | @@ -14,7 +14,7 @@ initialize_tdesc_microblaze (void) | 4577 | @@ -14,7 +14,7 @@ initialize_tdesc_microblaze (void) |
4563 | 4578 | ||
4564 | feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.core"); | 4579 | feature = tdesc_create_feature (result.get (), "org.gnu.gdb.microblaze.core"); |
4565 | tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int"); | 4580 | tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int"); |
4566 | - tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "data_ptr"); | 4581 | - tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "data_ptr"); |
4567 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int"); | 4582 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int"); |
@@ -4584,7 +4599,7 @@ index 6c86fc07700..ceb98ca8b82 100644 | |||
4584 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); | 4599 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); |
4585 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); | 4600 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); |
4586 | 4601 | ||
4587 | tdesc_microblaze = result; | 4602 | tdesc_microblaze = result.release (); |
4588 | } | 4603 | } |
4589 | diff --git a/gdb/features/microblaze64-core.xml b/gdb/features/microblaze64-core.xml | 4604 | diff --git a/gdb/features/microblaze64-core.xml b/gdb/features/microblaze64-core.xml |
4590 | new file mode 100644 | 4605 | new file mode 100644 |
@@ -4681,7 +4696,7 @@ index 00000000000..1bbf5fc3cea | |||
4681 | +</feature> | 4696 | +</feature> |
4682 | diff --git a/gdb/features/microblaze64-with-stack-protect.c b/gdb/features/microblaze64-with-stack-protect.c | 4697 | diff --git a/gdb/features/microblaze64-with-stack-protect.c b/gdb/features/microblaze64-with-stack-protect.c |
4683 | new file mode 100644 | 4698 | new file mode 100644 |
4684 | index 00000000000..f448c9a749c | 4699 | index 00000000000..a4de4666c76 |
4685 | --- /dev/null | 4700 | --- /dev/null |
4686 | +++ b/gdb/features/microblaze64-with-stack-protect.c | 4701 | +++ b/gdb/features/microblaze64-with-stack-protect.c |
4687 | @@ -0,0 +1,79 @@ | 4702 | @@ -0,0 +1,79 @@ |
@@ -4696,10 +4711,10 @@ index 00000000000..f448c9a749c | |||
4696 | +static void | 4711 | +static void |
4697 | +initialize_tdesc_microblaze64_with_stack_protect (void) | 4712 | +initialize_tdesc_microblaze64_with_stack_protect (void) |
4698 | +{ | 4713 | +{ |
4699 | + struct target_desc *result = allocate_target_description (); | 4714 | + target_desc_up result = allocate_target_description (); |
4700 | + struct tdesc_feature *feature; | 4715 | + struct tdesc_feature *feature; |
4701 | + | 4716 | + |
4702 | + feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze64.core"); | 4717 | + feature = tdesc_create_feature (result.get() , "org.gnu.gdb.microblaze64.core"); |
4703 | + tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64"); | 4718 | + tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64"); |
4704 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64"); | 4719 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64"); |
4705 | + tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64"); | 4720 | + tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64"); |
@@ -4758,11 +4773,11 @@ index 00000000000..f448c9a749c | |||
4758 | + tdesc_create_reg (feature, "rtlblo", 55, 1, NULL, 32, "int"); | 4773 | + tdesc_create_reg (feature, "rtlblo", 55, 1, NULL, 32, "int"); |
4759 | + tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | 4774 | + tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); |
4760 | + | 4775 | + |
4761 | + feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze64.stack-protect"); | 4776 | + feature = tdesc_create_feature (result.get(), "org.gnu.gdb.microblaze64.stack-protect"); |
4762 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); | 4777 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); |
4763 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); | 4778 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); |
4764 | + | 4779 | + |
4765 | + tdesc_microblaze64_with_stack_protect = result; | 4780 | + tdesc_microblaze64_with_stack_protect = result.release(); |
4766 | +} | 4781 | +} |
4767 | diff --git a/gdb/features/microblaze64-with-stack-protect.xml b/gdb/features/microblaze64-with-stack-protect.xml | 4782 | diff --git a/gdb/features/microblaze64-with-stack-protect.xml b/gdb/features/microblaze64-with-stack-protect.xml |
4768 | new file mode 100644 | 4783 | new file mode 100644 |
@@ -4784,7 +4799,7 @@ index 00000000000..0e9f01611f3 | |||
4784 | +</target> | 4799 | +</target> |
4785 | diff --git a/gdb/features/microblaze64.c b/gdb/features/microblaze64.c | 4800 | diff --git a/gdb/features/microblaze64.c b/gdb/features/microblaze64.c |
4786 | new file mode 100644 | 4801 | new file mode 100644 |
4787 | index 00000000000..1aa37c45129 | 4802 | index 00000000000..8ab7a90dd95 |
4788 | --- /dev/null | 4803 | --- /dev/null |
4789 | +++ b/gdb/features/microblaze64.c | 4804 | +++ b/gdb/features/microblaze64.c |
4790 | @@ -0,0 +1,77 @@ | 4805 | @@ -0,0 +1,77 @@ |
@@ -4799,10 +4814,10 @@ index 00000000000..1aa37c45129 | |||
4799 | +static void | 4814 | +static void |
4800 | +initialize_tdesc_microblaze64 (void) | 4815 | +initialize_tdesc_microblaze64 (void) |
4801 | +{ | 4816 | +{ |
4802 | + struct target_desc *result = allocate_target_description (); | 4817 | + target_desc_up result = allocate_target_description (); |
4803 | + struct tdesc_feature *feature; | 4818 | + struct tdesc_feature *feature; |
4804 | + | 4819 | + |
4805 | + feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze64.core"); | 4820 | + feature = tdesc_create_feature (result.get(), "org.gnu.gdb.microblaze64.core"); |
4806 | + tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64"); | 4821 | + tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64"); |
4807 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64"); | 4822 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64"); |
4808 | + tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64"); | 4823 | + tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64"); |
@@ -4863,7 +4878,7 @@ index 00000000000..1aa37c45129 | |||
4863 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); | 4878 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); |
4864 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); | 4879 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); |
4865 | + | 4880 | + |
4866 | + tdesc_microblaze64 = result; | 4881 | + tdesc_microblaze64 = result.release(); |
4867 | +} | 4882 | +} |
4868 | diff --git a/gdb/features/microblaze64.xml b/gdb/features/microblaze64.xml | 4883 | diff --git a/gdb/features/microblaze64.xml b/gdb/features/microblaze64.xml |
4869 | new file mode 100644 | 4884 | new file mode 100644 |
@@ -4883,7 +4898,7 @@ index 00000000000..515d18e65cf | |||
4883 | + <xi:include href="microblaze64-core.xml"/> | 4898 | + <xi:include href="microblaze64-core.xml"/> |
4884 | +</target> | 4899 | +</target> |
4885 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c | 4900 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c |
4886 | index b77acc9dc61..ba87d0bbd63 100644 | 4901 | index fc52adffb72..f2db32f0087 100644 |
4887 | --- a/gdb/microblaze-linux-tdep.c | 4902 | --- a/gdb/microblaze-linux-tdep.c |
4888 | +++ b/gdb/microblaze-linux-tdep.c | 4903 | +++ b/gdb/microblaze-linux-tdep.c |
4889 | @@ -40,6 +40,7 @@ | 4904 | @@ -40,6 +40,7 @@ |
@@ -4913,7 +4928,7 @@ index b77acc9dc61..ba87d0bbd63 100644 | |||
4913 | struct trad_frame_cache *this_cache, | 4928 | struct trad_frame_cache *this_cache, |
4914 | @@ -147,8 +151,8 @@ microblaze_linux_init_abi (struct gdbarch_info info, | 4929 | @@ -147,8 +151,8 @@ microblaze_linux_init_abi (struct gdbarch_info info, |
4915 | 4930 | ||
4916 | linux_init_abi (info, gdbarch); | 4931 | linux_init_abi (info, gdbarch, 0); |
4917 | 4932 | ||
4918 | - set_gdbarch_memory_remove_breakpoint (gdbarch, | 4933 | - set_gdbarch_memory_remove_breakpoint (gdbarch, |
4919 | - microblaze_linux_memory_remove_breakpoint); | 4934 | - microblaze_linux_memory_remove_breakpoint); |
@@ -4967,7 +4982,7 @@ index b77acc9dc61..ba87d0bbd63 100644 | |||
4967 | initialize_tdesc_microblaze_linux (); | 4982 | initialize_tdesc_microblaze_linux (); |
4968 | } | 4983 | } |
4969 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c | 4984 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c |
4970 | index 0a5b5ab59cc..667d658adfd 100644 | 4985 | index ccb6b730d64..c347bb9516b 100644 |
4971 | --- a/gdb/microblaze-tdep.c | 4986 | --- a/gdb/microblaze-tdep.c |
4972 | +++ b/gdb/microblaze-tdep.c | 4987 | +++ b/gdb/microblaze-tdep.c |
4973 | @@ -40,7 +40,9 @@ | 4988 | @@ -40,7 +40,9 @@ |
@@ -4980,7 +4995,7 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
4980 | 4995 | ||
4981 | /* Instruction macros used for analyzing the prologue. */ | 4996 | /* Instruction macros used for analyzing the prologue. */ |
4982 | /* This set of instruction macros need to be changed whenever the | 4997 | /* This set of instruction macros need to be changed whenever the |
4983 | @@ -75,12 +77,13 @@ static const char *microblaze_register_names[] = | 4998 | @@ -75,12 +77,13 @@ static const char * const microblaze_register_names[] = |
4984 | "rpvr0", "rpvr1", "rpvr2", "rpvr3", "rpvr4", "rpvr5", "rpvr6", | 4999 | "rpvr0", "rpvr1", "rpvr2", "rpvr3", "rpvr4", "rpvr5", "rpvr6", |
4985 | "rpvr7", "rpvr8", "rpvr9", "rpvr10", "rpvr11", | 5000 | "rpvr7", "rpvr8", "rpvr9", "rpvr10", "rpvr11", |
4986 | "redr", "rpid", "rzpr", "rtlbx", "rtlbsx", "rtlblo", "rtlbhi", | 5001 | "redr", "rpid", "rzpr", "rtlbx", "rtlbsx", "rtlblo", "rtlbhi", |
@@ -4993,9 +5008,9 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
4993 | static unsigned int microblaze_debug_flag = 0; | 5008 | static unsigned int microblaze_debug_flag = 0; |
4994 | +int reg_size = 4; | 5009 | +int reg_size = 4; |
4995 | 5010 | ||
4996 | static void ATTRIBUTE_PRINTF (1, 2) | 5011 | #define microblaze_debug(fmt, ...) \ |
4997 | microblaze_debug (const char *fmt, ...) | 5012 | debug_prefixed_printf_cond_nofunc (microblaze_debug_flag, "MICROBLAZE", \ |
4998 | @@ -137,6 +140,15 @@ microblaze_fetch_instruction (CORE_ADDR pc) | 5013 | @@ -128,6 +131,15 @@ microblaze_fetch_instruction (CORE_ADDR pc) |
4999 | constexpr gdb_byte microblaze_break_insn[] = MICROBLAZE_BREAKPOINT; | 5014 | constexpr gdb_byte microblaze_break_insn[] = MICROBLAZE_BREAKPOINT; |
5000 | 5015 | ||
5001 | typedef BP_MANIPULATION (microblaze_break_insn) microblaze_breakpoint; | 5016 | typedef BP_MANIPULATION (microblaze_break_insn) microblaze_breakpoint; |
@@ -5011,7 +5026,7 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5011 | static int | 5026 | static int |
5012 | microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | 5027 | microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, |
5013 | struct bp_target_info *bp_tgt) | 5028 | struct bp_target_info *bp_tgt) |
5014 | @@ -155,7 +167,6 @@ microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | 5029 | @@ -146,7 +158,6 @@ microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, |
5015 | /* Make sure we see the memory breakpoints. */ | 5030 | /* Make sure we see the memory breakpoints. */ |
5016 | scoped_restore restore_memory | 5031 | scoped_restore restore_memory |
5017 | = make_scoped_restore_show_memory_breakpoints (1); | 5032 | = make_scoped_restore_show_memory_breakpoints (1); |
@@ -5019,7 +5034,7 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5019 | val = target_read_memory (addr, old_contents, bplen); | 5034 | val = target_read_memory (addr, old_contents, bplen); |
5020 | 5035 | ||
5021 | /* If our breakpoint is no longer at the address, this means that the | 5036 | /* If our breakpoint is no longer at the address, this means that the |
5022 | @@ -170,6 +181,7 @@ microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | 5037 | @@ -161,6 +172,7 @@ microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, |
5023 | return val; | 5038 | return val; |
5024 | } | 5039 | } |
5025 | 5040 | ||
@@ -5027,7 +5042,7 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5027 | /* Allocate and initialize a frame cache. */ | 5042 | /* Allocate and initialize a frame cache. */ |
5028 | 5043 | ||
5029 | static struct microblaze_frame_cache * | 5044 | static struct microblaze_frame_cache * |
5030 | @@ -588,17 +600,16 @@ microblaze_extract_return_value (struct type *type, struct regcache *regcache, | 5045 | @@ -577,17 +589,16 @@ microblaze_extract_return_value (struct type *type, struct regcache *regcache, |
5031 | gdb_byte *valbuf) | 5046 | gdb_byte *valbuf) |
5032 | { | 5047 | { |
5033 | gdb_byte buf[8]; | 5048 | gdb_byte buf[8]; |
@@ -5047,7 +5062,7 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5047 | return; | 5062 | return; |
5048 | case 4: /* for sizes 4 or 8, copy the required length. */ | 5063 | case 4: /* for sizes 4 or 8, copy the required length. */ |
5049 | case 8: | 5064 | case 8: |
5050 | @@ -765,6 +776,12 @@ microblaze_software_single_step (struct regcache *regcache) | 5065 | @@ -754,6 +765,12 @@ microblaze_software_single_step (struct regcache *regcache) |
5051 | } | 5066 | } |
5052 | #endif | 5067 | #endif |
5053 | 5068 | ||
@@ -5060,25 +5075,24 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5060 | static int dwarf2_to_reg_map[78] = | 5075 | static int dwarf2_to_reg_map[78] = |
5061 | { 0 /* r0 */, 1 /* r1 */, 2 /* r2 */, 3 /* r3 */, /* 0- 3 */ | 5076 | { 0 /* r0 */, 1 /* r1 */, 2 /* r2 */, 3 /* r3 */, /* 0- 3 */ |
5062 | 4 /* r4 */, 5 /* r5 */, 6 /* r6 */, 7 /* r7 */, /* 4- 7 */ | 5077 | 4 /* r4 */, 5 /* r5 */, 6 /* r6 */, 7 /* r7 */, /* 4- 7 */ |
5063 | @@ -799,13 +816,14 @@ microblaze_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int reg) | 5078 | @@ -788,13 +805,14 @@ microblaze_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int reg) |
5064 | static void | 5079 | static void |
5065 | microblaze_register_g_packet_guesses (struct gdbarch *gdbarch) | 5080 | microblaze_register_g_packet_guesses (struct gdbarch *gdbarch) |
5066 | { | 5081 | { |
5067 | + | 5082 | + |
5068 | register_remote_g_packet_guess (gdbarch, | 5083 | register_remote_g_packet_guess (gdbarch, |
5069 | - 4 * MICROBLAZE_NUM_CORE_REGS, | 5084 | 4 * MICROBLAZE_NUM_CORE_REGS, |
5070 | - tdesc_microblaze); | 5085 | - tdesc_microblaze); |
5071 | + 4 * MICROBLAZE_NUM_REGS, | 5086 | + tdesc_microblaze64); |
5072 | + tdesc_microblaze64); | ||
5073 | 5087 | ||
5074 | register_remote_g_packet_guess (gdbarch, | 5088 | register_remote_g_packet_guess (gdbarch, |
5075 | 4 * MICROBLAZE_NUM_REGS, | 5089 | 4 * MICROBLAZE_NUM_REGS, |
5076 | - tdesc_microblaze_with_stack_protect); | 5090 | - tdesc_microblaze_with_stack_protect); |
5077 | + tdesc_microblaze64_with_stack_protect); | 5091 | + tdesc_microblaze64_with_stack_protect); |
5078 | } | 5092 | } |
5079 | 5093 | ||
5080 | void | 5094 | void |
5081 | @@ -813,7 +831,7 @@ microblaze_supply_gregset (const struct regset *regset, | 5095 | @@ -802,7 +820,7 @@ microblaze_supply_gregset (const struct regset *regset, |
5082 | struct regcache *regcache, | 5096 | struct regcache *regcache, |
5083 | int regnum, const void *gregs) | 5097 | int regnum, const void *gregs) |
5084 | { | 5098 | { |
@@ -5087,7 +5101,7 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5087 | if (regnum >= 0) | 5101 | if (regnum >= 0) |
5088 | regcache->raw_supply (regnum, regs + regnum); | 5102 | regcache->raw_supply (regnum, regs + regnum); |
5089 | 5103 | ||
5090 | @@ -821,7 +839,7 @@ microblaze_supply_gregset (const struct regset *regset, | 5104 | @@ -810,7 +828,7 @@ microblaze_supply_gregset (const struct regset *regset, |
5091 | int i; | 5105 | int i; |
5092 | 5106 | ||
5093 | for (i = 0; i < 50; i++) { | 5107 | for (i = 0; i < 50; i++) { |
@@ -5096,7 +5110,7 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5096 | } | 5110 | } |
5097 | } | 5111 | } |
5098 | } | 5112 | } |
5099 | @@ -844,6 +862,17 @@ microblaze_iterate_over_regset_sections (struct gdbarch *gdbarch, | 5113 | @@ -833,6 +851,17 @@ microblaze_iterate_over_regset_sections (struct gdbarch *gdbarch, |
5100 | } | 5114 | } |
5101 | 5115 | ||
5102 | 5116 | ||
@@ -5114,7 +5128,7 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5114 | 5128 | ||
5115 | static struct gdbarch * | 5129 | static struct gdbarch * |
5116 | microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 5130 | microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
5117 | @@ -858,8 +887,15 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 5131 | @@ -846,8 +875,15 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
5118 | if (arches != NULL) | 5132 | if (arches != NULL) |
5119 | return arches->gdbarch; | 5133 | return arches->gdbarch; |
5120 | if (tdesc == NULL) | 5134 | if (tdesc == NULL) |
@@ -5132,56 +5146,67 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5132 | /* Check any target description for validity. */ | 5146 | /* Check any target description for validity. */ |
5133 | if (tdesc_has_registers (tdesc)) | 5147 | if (tdesc_has_registers (tdesc)) |
5134 | { | 5148 | { |
5135 | @@ -867,27 +903,35 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 5149 | @@ -855,31 +891,42 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
5136 | int valid_p; | 5150 | int valid_p; |
5137 | int i; | 5151 | int i; |
5138 | 5152 | ||
5139 | - feature = tdesc_find_feature (tdesc, | 5153 | - feature = tdesc_find_feature (tdesc, |
5154 | - "org.gnu.gdb.microblaze.core"); | ||
5140 | + if (info.bfd_arch_info->mach == bfd_mach_microblaze64) | 5155 | + if (info.bfd_arch_info->mach == bfd_mach_microblaze64) |
5141 | + feature = tdesc_find_feature (tdesc, | 5156 | + feature = tdesc_find_feature (tdesc, |
5142 | + "org.gnu.gdb.microblaze64.core"); | 5157 | + "org.gnu.gdb.microblaze64.core"); |
5143 | + else | 5158 | + else |
5144 | + feature = tdesc_find_feature (tdesc, | 5159 | + feature = tdesc_find_feature (tdesc, |
5145 | "org.gnu.gdb.microblaze.core"); | 5160 | + "org.gnu.gdb.microblaze.core"); |
5146 | if (feature == NULL) | 5161 | if (feature == NULL) |
5147 | return NULL; | 5162 | return NULL; |
5148 | tdesc_data = tdesc_data_alloc (); | 5163 | tdesc_data = tdesc_data_alloc (); |
5149 | 5164 | ||
5150 | valid_p = 1; | 5165 | valid_p = 1; |
5151 | - for (i = 0; i < MICROBLAZE_NUM_CORE_REGS; i++) | 5166 | - for (i = 0; i < MICROBLAZE_NUM_CORE_REGS; i++) |
5152 | + for (i = 0; i < MICROBLAZE_NUM_REGS; i++) | 5167 | - valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i, |
5153 | valid_p &= tdesc_numbered_register (feature, tdesc_data, i, | 5168 | - microblaze_register_names[i]); |
5154 | microblaze_register_names[i]); | ||
5155 | - feature = tdesc_find_feature (tdesc, | 5169 | - feature = tdesc_find_feature (tdesc, |
5170 | - "org.gnu.gdb.microblaze.stack-protect"); | ||
5171 | + for (i = 0; i < MICROBLAZE_NUM_REGS; i++) | ||
5172 | + valid_p &= tdesc_numbered_register (feature, tdesc_data.get(), i, | ||
5173 | + microblaze_register_names[i]); | ||
5156 | + if (info.bfd_arch_info->mach == bfd_mach_microblaze64) | 5174 | + if (info.bfd_arch_info->mach == bfd_mach_microblaze64) |
5157 | + feature = tdesc_find_feature (tdesc, | 5175 | + feature = tdesc_find_feature (tdesc, |
5158 | + "org.gnu.gdb.microblaze64.stack-protect"); | 5176 | + "org.gnu.gdb.microblaze64.stack-protect"); |
5159 | + else | 5177 | + else |
5160 | + feature = tdesc_find_feature (tdesc, | 5178 | + feature = tdesc_find_feature (tdesc, |
5161 | "org.gnu.gdb.microblaze.stack-protect"); | 5179 | + "org.gnu.gdb.microblaze.stack-protect"); |
5162 | if (feature != NULL) | 5180 | if (feature != NULL) |
5163 | { | 5181 | - { |
5164 | valid_p = 1; | 5182 | - valid_p = 1; |
5165 | valid_p &= tdesc_numbered_register (feature, tdesc_data, | 5183 | - valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), |
5166 | MICROBLAZE_SLR_REGNUM, | 5184 | - MICROBLAZE_SLR_REGNUM, |
5167 | - "rslr"); | 5185 | - "rslr"); |
5186 | - valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), | ||
5187 | - MICROBLAZE_SHR_REGNUM, | ||
5188 | - "rshr"); | ||
5189 | - } | ||
5190 | + { | ||
5191 | + valid_p = 1; | ||
5192 | + valid_p &= tdesc_numbered_register (feature, tdesc_data.get(), | ||
5193 | + MICROBLAZE_SLR_REGNUM, | ||
5168 | + "slr"); | 5194 | + "slr"); |
5169 | valid_p &= tdesc_numbered_register (feature, tdesc_data, | 5195 | + valid_p &= tdesc_numbered_register (feature, tdesc_data.get(), |
5170 | MICROBLAZE_SHR_REGNUM, | 5196 | + MICROBLAZE_SHR_REGNUM, |
5171 | - "rshr"); | ||
5172 | + "shr"); | 5197 | + "shr"); |
5173 | } | 5198 | + } |
5174 | 5199 | ||
5175 | if (!valid_p) | 5200 | if (!valid_p) |
5176 | @@ -895,6 +939,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 5201 | - return NULL; |
5177 | tdesc_data_cleanup (tdesc_data); | 5202 | + { |
5178 | return NULL; | 5203 | + // tdesc_data_cleanup (tdesc_data.get ()); |
5179 | } | 5204 | + return NULL; |
5180 | + | 5205 | + } |
5181 | } | 5206 | } |
5182 | 5207 | ||
5183 | /* Allocate space for the new architecture. */ | 5208 | /* Allocate space for the new architecture. */ |
5184 | @@ -914,7 +959,17 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 5209 | @@ -899,7 +946,17 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
5185 | /* Register numbers of various important registers. */ | 5210 | /* Register numbers of various important registers. */ |
5186 | set_gdbarch_sp_regnum (gdbarch, MICROBLAZE_SP_REGNUM); | 5211 | set_gdbarch_sp_regnum (gdbarch, MICROBLAZE_SP_REGNUM); |
5187 | set_gdbarch_pc_regnum (gdbarch, MICROBLAZE_PC_REGNUM); | 5212 | set_gdbarch_pc_regnum (gdbarch, MICROBLAZE_PC_REGNUM); |
@@ -5199,7 +5224,7 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5199 | /* Map Dwarf2 registers to GDB registers. */ | 5224 | /* Map Dwarf2 registers to GDB registers. */ |
5200 | set_gdbarch_dwarf2_reg_to_regnum (gdbarch, microblaze_dwarf2_reg_to_regnum); | 5225 | set_gdbarch_dwarf2_reg_to_regnum (gdbarch, microblaze_dwarf2_reg_to_regnum); |
5201 | 5226 | ||
5202 | @@ -934,7 +989,9 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 5227 | @@ -919,7 +976,9 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
5203 | microblaze_breakpoint::kind_from_pc); | 5228 | microblaze_breakpoint::kind_from_pc); |
5204 | set_gdbarch_sw_breakpoint_from_kind (gdbarch, | 5229 | set_gdbarch_sw_breakpoint_from_kind (gdbarch, |
5205 | microblaze_breakpoint::bp_from_kind); | 5230 | microblaze_breakpoint::bp_from_kind); |
@@ -5210,7 +5235,7 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5210 | 5235 | ||
5211 | set_gdbarch_software_single_step (gdbarch, microblaze_software_single_step); | 5236 | set_gdbarch_software_single_step (gdbarch, microblaze_software_single_step); |
5212 | 5237 | ||
5213 | @@ -942,7 +999,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 5238 | @@ -927,7 +986,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
5214 | 5239 | ||
5215 | set_gdbarch_unwind_pc (gdbarch, microblaze_unwind_pc); | 5240 | set_gdbarch_unwind_pc (gdbarch, microblaze_unwind_pc); |
5216 | 5241 | ||
@@ -5219,8 +5244,8 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5219 | 5244 | ||
5220 | frame_base_set_default (gdbarch, µblaze_frame_base); | 5245 | frame_base_set_default (gdbarch, µblaze_frame_base); |
5221 | 5246 | ||
5222 | @@ -957,12 +1014,11 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 5247 | @@ -942,12 +1001,11 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
5223 | tdesc_use_registers (gdbarch, tdesc, tdesc_data); | 5248 | tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data)); |
5224 | //frame_base_append_sniffer (gdbarch, microblaze_frame_sniffer); | 5249 | //frame_base_append_sniffer (gdbarch, microblaze_frame_sniffer); |
5225 | 5250 | ||
5226 | - /* If we have register sets, enable the generic core file support. */ | 5251 | - /* If we have register sets, enable the generic core file support. */ |
@@ -5234,7 +5259,7 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5234 | return gdbarch; | 5259 | return gdbarch; |
5235 | } | 5260 | } |
5236 | 5261 | ||
5237 | @@ -974,6 +1030,8 @@ _initialize_microblaze_tdep () | 5262 | @@ -959,6 +1017,8 @@ _initialize_microblaze_tdep () |
5238 | 5263 | ||
5239 | initialize_tdesc_microblaze_with_stack_protect (); | 5264 | initialize_tdesc_microblaze_with_stack_protect (); |
5240 | initialize_tdesc_microblaze (); | 5265 | initialize_tdesc_microblaze (); |
@@ -5244,10 +5269,10 @@ index 0a5b5ab59cc..667d658adfd 100644 | |||
5244 | add_setshow_zuinteger_cmd ("microblaze", class_maintenance, | 5269 | add_setshow_zuinteger_cmd ("microblaze", class_maintenance, |
5245 | µblaze_debug_flag, _("\ | 5270 | µblaze_debug_flag, _("\ |
5246 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h | 5271 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h |
5247 | index 7f75c693b74..e0fa7ef9b12 100644 | 5272 | index 2415acfe7b6..f4d810303ca 100644 |
5248 | --- a/gdb/microblaze-tdep.h | 5273 | --- a/gdb/microblaze-tdep.h |
5249 | +++ b/gdb/microblaze-tdep.h | 5274 | +++ b/gdb/microblaze-tdep.h |
5250 | @@ -27,7 +27,7 @@ struct microblaze_gregset | 5275 | @@ -28,7 +28,7 @@ struct microblaze_gregset |
5251 | microblaze_gregset() {} | 5276 | microblaze_gregset() {} |
5252 | unsigned int gregs[32]; | 5277 | unsigned int gregs[32]; |
5253 | unsigned int fpregs[32]; | 5278 | unsigned int fpregs[32]; |
@@ -5255,8 +5280,8 @@ index 7f75c693b74..e0fa7ef9b12 100644 | |||
5255 | + unsigned int pregs[18]; | 5280 | + unsigned int pregs[18]; |
5256 | }; | 5281 | }; |
5257 | 5282 | ||
5258 | struct gdbarch_tdep | 5283 | struct microblaze_gdbarch_tdep : gdbarch_tdep |
5259 | @@ -133,7 +133,7 @@ struct microblaze_frame_cache | 5284 | @@ -134,7 +134,7 @@ struct microblaze_frame_cache |
5260 | struct trad_frame_saved_reg *saved_regs; | 5285 | struct trad_frame_saved_reg *saved_regs; |
5261 | }; | 5286 | }; |
5262 | /* All registers are 32 bits. */ | 5287 | /* All registers are 32 bits. */ |
@@ -5265,36 +5290,20 @@ index 7f75c693b74..e0fa7ef9b12 100644 | |||
5265 | 5290 | ||
5266 | /* MICROBLAZE_BREAKPOINT defines the breakpoint that should be used. | 5291 | /* MICROBLAZE_BREAKPOINT defines the breakpoint that should be used. |
5267 | Only used for native debugging. */ | 5292 | Only used for native debugging. */ |
5268 | diff --git a/gdb/regformats/microblaze-with-stack-protect.dat b/gdb/regformats/microblaze-with-stack-protect.dat | ||
5269 | index 8040a7b3fd0..450e321d49e 100644 | ||
5270 | --- a/gdb/regformats/microblaze-with-stack-protect.dat | ||
5271 | +++ b/gdb/regformats/microblaze-with-stack-protect.dat | ||
5272 | @@ -60,5 +60,5 @@ expedite:r1,rpc | ||
5273 | 32:rtlbsx | ||
5274 | 32:rtlblo | ||
5275 | 32:rtlbhi | ||
5276 | -32:rslr | ||
5277 | -32:rshr | ||
5278 | +32:slr | ||
5279 | +32:shr | ||
5280 | diff --git a/gdb/gdbserver/linux-microblaze-low.c b/gdbserver/linux-microblaze-low.c | ||
5281 | similarity index 100% | ||
5282 | rename from gdb/gdbserver/linux-microblaze-low.c | ||
5283 | rename to gdbserver/linux-microblaze-low.c | ||
5284 | diff --git a/include/elf/common.h b/include/elf/common.h | 5293 | diff --git a/include/elf/common.h b/include/elf/common.h |
5285 | index 571e21af29a..fa10064712a 100644 | 5294 | index 70d63e3299c..8aa330d6631 100644 |
5286 | --- a/include/elf/common.h | 5295 | --- a/include/elf/common.h |
5287 | +++ b/include/elf/common.h | 5296 | +++ b/include/elf/common.h |
5288 | @@ -340,6 +340,7 @@ | 5297 | @@ -360,6 +360,7 @@ |
5289 | #define EM_RISCV 243 /* RISC-V */ | 5298 | #define EM_U16_U8CORE 260 /* LAPIS nX-U16/U8 */ |
5290 | #define EM_LANAI 244 /* Lanai 32-bit processor. */ | 5299 | #define EM_TACHYUM 261 /* Tachyum */ |
5291 | #define EM_BPF 247 /* Linux BPF – in-kernel virtual machine. */ | 5300 | #define EM_56800EF 262 /* NXP 56800EF Digital Signal Controller (DSC) */ |
5292 | +#define EM_MB_64 248 /* Xilinx MicroBlaze 32-bit RISC soft processor core */ | 5301 | +#define EM_MB_64 263 /* Xilinx MicroBlaze 32-bit RISC soft processor core */ |
5293 | #define EM_NFP 250 /* Netronome Flow Processor. */ | ||
5294 | #define EM_CSKY 252 /* C-SKY processor family. */ | ||
5295 | 5302 | ||
5303 | /* If it is necessary to assign new unofficial EM_* values, please pick large | ||
5304 | random numbers (0x8523, 0xa7f2, etc.) to minimize the chances of collision | ||
5296 | diff --git a/include/elf/microblaze.h b/include/elf/microblaze.h | 5305 | diff --git a/include/elf/microblaze.h b/include/elf/microblaze.h |
5297 | index 2fec296967b..938841b2408 100644 | 5306 | index 43ad3ad3904..79799b86a49 100644 |
5298 | --- a/include/elf/microblaze.h | 5307 | --- a/include/elf/microblaze.h |
5299 | +++ b/include/elf/microblaze.h | 5308 | +++ b/include/elf/microblaze.h |
5300 | @@ -61,6 +61,10 @@ START_RELOC_NUMBERS (elf_microblaze_reloc_type) | 5309 | @@ -61,6 +61,10 @@ START_RELOC_NUMBERS (elf_microblaze_reloc_type) |
@@ -5309,7 +5318,7 @@ index 2fec296967b..938841b2408 100644 | |||
5309 | 5318 | ||
5310 | /* Global base address names. */ | 5319 | /* Global base address names. */ |
5311 | diff --git a/opcodes/microblaze-dis.c b/opcodes/microblaze-dis.c | 5320 | diff --git a/opcodes/microblaze-dis.c b/opcodes/microblaze-dis.c |
5312 | index be1534c257c..564c810a6c7 100644 | 5321 | index b057492ba93..283d87c04a2 100644 |
5313 | --- a/opcodes/microblaze-dis.c | 5322 | --- a/opcodes/microblaze-dis.c |
5314 | +++ b/opcodes/microblaze-dis.c | 5323 | +++ b/opcodes/microblaze-dis.c |
5315 | @@ -33,6 +33,7 @@ | 5324 | @@ -33,6 +33,7 @@ |
@@ -5410,7 +5419,7 @@ index be1534c257c..564c810a6c7 100644 | |||
5410 | print_func (stream, "\t%s", get_field_rd (&buf, inst)); | 5419 | print_func (stream, "\t%s", get_field_rd (&buf, inst)); |
5411 | break; | 5420 | break; |
5412 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h | 5421 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h |
5413 | index 27d8684df04..f9709412097 100644 | 5422 | index ffb0f08c692..5e45df995de 100644 |
5414 | --- a/opcodes/microblaze-opc.h | 5423 | --- a/opcodes/microblaze-opc.h |
5415 | +++ b/opcodes/microblaze-opc.h | 5424 | +++ b/opcodes/microblaze-opc.h |
5416 | @@ -40,7 +40,7 @@ | 5425 | @@ -40,7 +40,7 @@ |
@@ -5461,17 +5470,17 @@ index 27d8684df04..f9709412097 100644 | |||
5461 | -#define MAX_OPCODES 289 | 5470 | -#define MAX_OPCODES 289 |
5462 | +#define MAX_OPCODES 412 | 5471 | +#define MAX_OPCODES 412 |
5463 | 5472 | ||
5464 | struct op_code_struct | 5473 | const struct op_code_struct |
5465 | { | 5474 | { |
5466 | @@ -119,6 +132,7 @@ struct op_code_struct | 5475 | @@ -119,6 +132,7 @@ const struct op_code_struct |
5467 | /* More info about output format here. */ | 5476 | /* More info about output format here. */ |
5468 | } opcodes[MAX_OPCODES] = | 5477 | } microblaze_opcodes[MAX_OPCODES] = |
5469 | { | 5478 | { |
5470 | + /* 32-bit instructions */ | 5479 | + /* 32-bit instructions */ |
5471 | {"add", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x00000000, OPCODE_MASK_H4, add, arithmetic_inst }, | 5480 | {"add", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x00000000, OPCODE_MASK_H4, add, arithmetic_inst }, |
5472 | {"rsub", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x04000000, OPCODE_MASK_H4, rsub, arithmetic_inst }, | 5481 | {"rsub", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x04000000, OPCODE_MASK_H4, rsub, arithmetic_inst }, |
5473 | {"addc", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x08000000, OPCODE_MASK_H4, addc, arithmetic_inst }, | 5482 | {"addc", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x08000000, OPCODE_MASK_H4, addc, arithmetic_inst }, |
5474 | @@ -155,9 +169,11 @@ struct op_code_struct | 5483 | @@ -155,9 +169,11 @@ const struct op_code_struct |
5475 | {"ncget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C006000, OPCODE_MASK_H32, ncget, anyware_inst }, | 5484 | {"ncget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C006000, OPCODE_MASK_H32, ncget, anyware_inst }, |
5476 | {"ncput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00E000, OPCODE_MASK_H32, ncput, anyware_inst }, | 5485 | {"ncput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00E000, OPCODE_MASK_H32, ncput, anyware_inst }, |
5477 | {"muli", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x60000000, OPCODE_MASK_H, muli, mult_inst }, | 5486 | {"muli", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x60000000, OPCODE_MASK_H, muli, mult_inst }, |
@@ -5486,7 +5495,7 @@ index 27d8684df04..f9709412097 100644 | |||
5486 | {"or", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x80000000, OPCODE_MASK_H4, microblaze_or, logical_inst }, | 5495 | {"or", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x80000000, OPCODE_MASK_H4, microblaze_or, logical_inst }, |
5487 | {"and", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x84000000, OPCODE_MASK_H4, microblaze_and, logical_inst }, | 5496 | {"and", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x84000000, OPCODE_MASK_H4, microblaze_and, logical_inst }, |
5488 | {"xor", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x88000000, OPCODE_MASK_H4, microblaze_xor, logical_inst }, | 5497 | {"xor", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x88000000, OPCODE_MASK_H4, microblaze_xor, logical_inst }, |
5489 | @@ -174,9 +190,14 @@ struct op_code_struct | 5498 | @@ -174,9 +190,14 @@ const struct op_code_struct |
5490 | {"wic", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000068, OPCODE_MASK_H34B, wic, special_inst }, | 5499 | {"wic", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000068, OPCODE_MASK_H34B, wic, special_inst }, |
5491 | {"wdc", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000064, OPCODE_MASK_H34B, wdc, special_inst }, | 5500 | {"wdc", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000064, OPCODE_MASK_H34B, wdc, special_inst }, |
5492 | {"wdc.clear", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000066, OPCODE_MASK_H34B, wdcclear, special_inst }, | 5501 | {"wdc.clear", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000066, OPCODE_MASK_H34B, wdcclear, special_inst }, |
@@ -5501,7 +5510,7 @@ index 27d8684df04..f9709412097 100644 | |||
5501 | {"br", INST_TYPE_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98000000, OPCODE_MASK_H124, br, branch_inst }, | 5510 | {"br", INST_TYPE_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98000000, OPCODE_MASK_H124, br, branch_inst }, |
5502 | {"brd", INST_TYPE_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98100000, OPCODE_MASK_H124, brd, branch_inst }, | 5511 | {"brd", INST_TYPE_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98100000, OPCODE_MASK_H124, brd, branch_inst }, |
5503 | {"brld", INST_TYPE_RD_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98140000, OPCODE_MASK_H24, brld, branch_inst }, | 5512 | {"brld", INST_TYPE_RD_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98140000, OPCODE_MASK_H24, brld, branch_inst }, |
5504 | @@ -226,18 +247,24 @@ struct op_code_struct | 5513 | @@ -226,18 +247,24 @@ const struct op_code_struct |
5505 | {"bgeid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBEA00000, OPCODE_MASK_H1, bgeid, branch_inst }, | 5514 | {"bgeid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBEA00000, OPCODE_MASK_H1, bgeid, branch_inst }, |
5506 | {"lbu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC0000000, OPCODE_MASK_H4, lbu, memory_load_inst }, | 5515 | {"lbu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC0000000, OPCODE_MASK_H4, lbu, memory_load_inst }, |
5507 | {"lbur", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC0000200, OPCODE_MASK_H4, lbur, memory_load_inst }, | 5516 | {"lbur", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC0000200, OPCODE_MASK_H4, lbur, memory_load_inst }, |
@@ -5526,7 +5535,7 @@ index 27d8684df04..f9709412097 100644 | |||
5526 | {"lbui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE0000000, OPCODE_MASK_H, lbui, memory_load_inst }, | 5535 | {"lbui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE0000000, OPCODE_MASK_H, lbui, memory_load_inst }, |
5527 | {"lhui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE4000000, OPCODE_MASK_H, lhui, memory_load_inst }, | 5536 | {"lhui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE4000000, OPCODE_MASK_H, lhui, memory_load_inst }, |
5528 | {"lwi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, lwi, memory_load_inst }, | 5537 | {"lwi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, lwi, memory_load_inst }, |
5529 | @@ -248,9 +275,7 @@ struct op_code_struct | 5538 | @@ -248,9 +275,7 @@ const struct op_code_struct |
5530 | {"la", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x30000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* la translates to addik. */ | 5539 | {"la", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x30000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* la translates to addik. */ |
5531 | {"tuqula",INST_TYPE_RD, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x3000002A, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* tuqula rd translates to addik rd, r0, 42. */ | 5540 | {"tuqula",INST_TYPE_RD, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x3000002A, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* tuqula rd translates to addik rd, r0, 42. */ |
5532 | {"not", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA800FFFF, OPCODE_MASK_H34, invalid_inst, logical_inst }, /* not translates to xori rd,ra,-1. */ | 5541 | {"not", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA800FFFF, OPCODE_MASK_H34, invalid_inst, logical_inst }, /* not translates to xori rd,ra,-1. */ |
@@ -5536,7 +5545,7 @@ index 27d8684df04..f9709412097 100644 | |||
5536 | {"lmi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, invalid_inst, memory_load_inst }, | 5545 | {"lmi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, invalid_inst, memory_load_inst }, |
5537 | {"smi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF8000000, OPCODE_MASK_H, invalid_inst, memory_store_inst }, | 5546 | {"smi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF8000000, OPCODE_MASK_H, invalid_inst, memory_store_inst }, |
5538 | {"msrset",INST_TYPE_RD_IMM15, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x94100000, OPCODE_MASK_H23N, msrset, special_inst }, | 5547 | {"msrset",INST_TYPE_RD_IMM15, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x94100000, OPCODE_MASK_H23N, msrset, special_inst }, |
5539 | @@ -402,8 +427,135 @@ struct op_code_struct | 5548 | @@ -402,8 +427,135 @@ const struct op_code_struct |
5540 | {"clz", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x900000E0, OPCODE_MASK_H34, clz, special_inst }, | 5549 | {"clz", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x900000E0, OPCODE_MASK_H34, clz, special_inst }, |
5541 | {"mbar", INST_TYPE_IMM5, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8020004, OPCODE_MASK_HN, mbar, special_inst }, | 5550 | {"mbar", INST_TYPE_IMM5, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8020004, OPCODE_MASK_HN, mbar, special_inst }, |
5542 | {"sleep", INST_TYPE_NONE, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBA020004, OPCODE_MASK_HN, invalid_inst, special_inst }, /* translates to mbar 16. */ | 5551 | {"sleep", INST_TYPE_NONE, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBA020004, OPCODE_MASK_HN, invalid_inst, special_inst }, /* translates to mbar 16. */ |
@@ -5691,7 +5700,7 @@ index 27d8684df04..f9709412097 100644 | |||
5691 | #endif /* MICROBLAZE_OPC */ | 5700 | #endif /* MICROBLAZE_OPC */ |
5692 | 5701 | ||
5693 | diff --git a/opcodes/microblaze-opcm.h b/opcodes/microblaze-opcm.h | 5702 | diff --git a/opcodes/microblaze-opcm.h b/opcodes/microblaze-opcm.h |
5694 | index aa53dfe6bb5..ad8b8ce345b 100644 | 5703 | index 8e293465fec..254d9fe911e 100644 |
5695 | --- a/opcodes/microblaze-opcm.h | 5704 | --- a/opcodes/microblaze-opcm.h |
5696 | +++ b/opcodes/microblaze-opcm.h | 5705 | +++ b/opcodes/microblaze-opcm.h |
5697 | @@ -25,22 +25,23 @@ | 5706 | @@ -25,22 +25,23 @@ |
@@ -5723,9 +5732,9 @@ index aa53dfe6bb5..ad8b8ce345b 100644 | |||
5723 | + sb, sbea, sbr, sh, shea, shr, sw, swea, swr, swx, lbui, lhui, lwi, lli, | 5732 | + sb, sbea, sbr, sh, shea, shr, sw, swea, swr, swx, lbui, lhui, lwi, lli, |
5724 | + sbi, shi, sli, swi, msrset, msrclr, tuqula, mbi_fadd, frsub, mbi_fmul, mbi_fdiv, | 5733 | + sbi, shi, sli, swi, msrset, msrclr, tuqula, mbi_fadd, frsub, mbi_fmul, mbi_fdiv, |
5725 | fcmp_lt, fcmp_eq, fcmp_le, fcmp_gt, fcmp_ne, fcmp_ge, fcmp_un, flt, | 5734 | fcmp_lt, fcmp_eq, fcmp_le, fcmp_gt, fcmp_ne, fcmp_ge, fcmp_un, flt, |
5726 | fint, fsqrt, | 5735 | /* 'fsqrt' is a glibc:math.h symbol. */ |
5727 | tget, tcget, tnget, tncget, tput, tcput, tnput, tncput, | 5736 | fint, microblaze_fsqrt, |
5728 | @@ -58,6 +59,18 @@ enum microblaze_instr | 5737 | @@ -59,6 +60,18 @@ enum microblaze_instr |
5729 | aputd, taputd, caputd, tcaputd, naputd, tnaputd, ncaputd, tncaputd, | 5738 | aputd, taputd, caputd, tcaputd, naputd, tnaputd, ncaputd, tncaputd, |
5730 | eagetd, teagetd, ecagetd, tecagetd, neagetd, tneagetd, necagetd, tnecagetd, | 5739 | eagetd, teagetd, ecagetd, tecagetd, neagetd, tneagetd, necagetd, tnecagetd, |
5731 | eaputd, teaputd, ecaputd, tecaputd, neaputd, tneaputd, necaputd, tnecaputd, | 5740 | eaputd, teaputd, ecaputd, tecaputd, neaputd, tneaputd, necaputd, tnecaputd, |
@@ -5744,7 +5753,7 @@ index aa53dfe6bb5..ad8b8ce345b 100644 | |||
5744 | invalid_inst | 5753 | invalid_inst |
5745 | }; | 5754 | }; |
5746 | 5755 | ||
5747 | @@ -129,18 +142,25 @@ enum microblaze_instr_type | 5756 | @@ -130,18 +143,25 @@ enum microblaze_instr_type |
5748 | #define RB_LOW 11 /* Low bit for RB. */ | 5757 | #define RB_LOW 11 /* Low bit for RB. */ |
5749 | #define IMM_LOW 0 /* Low bit for immediate. */ | 5758 | #define IMM_LOW 0 /* Low bit for immediate. */ |
5750 | #define IMM_MBAR 21 /* low bit for mbar instruction. */ | 5759 | #define IMM_MBAR 21 /* low bit for mbar instruction. */ |
@@ -5772,5 +5781,5 @@ index aa53dfe6bb5..ad8b8ce345b 100644 | |||
5772 | #define RFSL_MASK 0x000000F | 5781 | #define RFSL_MASK 0x000000F |
5773 | 5782 | ||
5774 | -- | 5783 | -- |
5775 | 2.17.1 | 5784 | 2.37.1 (Apple Git-137.1) |
5776 | 5785 | ||
diff --git a/meta-microblaze/recipes-devtools/gdb/gdb/0008-Patch-MicroBlaze-these-changes-will-make-64-bit-vect.patch b/meta-microblaze/recipes-devtools/gdb/gdb/0006-Patch-MicroBlaze-these-changes-will-make-64-bit-vect.patch index abbea266..402d7fe1 100644 --- a/meta-microblaze/recipes-devtools/gdb/gdb/0008-Patch-MicroBlaze-these-changes-will-make-64-bit-vect.patch +++ b/meta-microblaze/recipes-devtools/gdb/gdb/0006-Patch-MicroBlaze-these-changes-will-make-64-bit-vect.patch | |||
@@ -1,7 +1,7 @@ | |||
1 | From cc8ee172b9145ce488c556a2eb50f931f0676eea Mon Sep 17 00:00:00 2001 | 1 | From ef411b49f3b2c9e4048eb273f43ab4ee96f96b7e Mon Sep 17 00:00:00 2001 |
2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
3 | Date: Mon, 19 Apr 2021 14:33:27 +0530 | 3 | Date: Mon, 19 Apr 2021 14:33:27 +0530 |
4 | Subject: [PATCH 08/10] [Patch,MicroBlaze] : these changes will make 64 bit | 4 | Subject: [PATCH 6/8] [Patch,MicroBlaze] : these changes will make 64 bit |
5 | vectors as default target types when we built gdb with microblaze 64 bit type | 5 | vectors as default target types when we built gdb with microblaze 64 bit type |
6 | targets,for instance microblaze-xilinx-elf64/microblazeel-xilinx-elf64 | 6 | targets,for instance microblaze-xilinx-elf64/microblazeel-xilinx-elf64 |
7 | 7 | ||
@@ -10,10 +10,10 @@ Subject: [PATCH 08/10] [Patch,MicroBlaze] : these changes will make 64 bit | |||
10 | 1 file changed, 8 insertions(+) | 10 | 1 file changed, 8 insertions(+) |
11 | 11 | ||
12 | diff --git a/bfd/config.bfd b/bfd/config.bfd | 12 | diff --git a/bfd/config.bfd b/bfd/config.bfd |
13 | index 0f752de267b..4945e7fa3b5 100644 | 13 | index 5e9ba3d9805..deb3d078439 100644 |
14 | --- a/bfd/config.bfd | 14 | --- a/bfd/config.bfd |
15 | +++ b/bfd/config.bfd | 15 | +++ b/bfd/config.bfd |
16 | @@ -823,7 +823,15 @@ case "${targ}" in | 16 | @@ -856,7 +856,15 @@ case "${targ}" in |
17 | targ_defvec=metag_elf32_vec | 17 | targ_defvec=metag_elf32_vec |
18 | targ_underscore=yes | 18 | targ_underscore=yes |
19 | ;; | 19 | ;; |
@@ -30,5 +30,5 @@ index 0f752de267b..4945e7fa3b5 100644 | |||
30 | targ_defvec=microblaze_elf32_le_vec | 30 | targ_defvec=microblaze_elf32_le_vec |
31 | targ_selvecs=microblaze_elf32_vec | 31 | targ_selvecs=microblaze_elf32_vec |
32 | -- | 32 | -- |
33 | 2.17.1 | 33 | 2.37.1 (Apple Git-137.1) |
34 | 34 | ||
diff --git a/meta-microblaze/recipes-devtools/gdb/gdb/0009-Patch-MicroBlaze-Added-m64-abi-for-64-bit-target-des.patch b/meta-microblaze/recipes-devtools/gdb/gdb/0007-Patch-MicroBlaze-Added-m64-abi-for-64-bit-target-des.patch index 35466e8f..59449bfa 100644 --- a/meta-microblaze/recipes-devtools/gdb/gdb/0009-Patch-MicroBlaze-Added-m64-abi-for-64-bit-target-des.patch +++ b/meta-microblaze/recipes-devtools/gdb/gdb/0007-Patch-MicroBlaze-Added-m64-abi-for-64-bit-target-des.patch | |||
@@ -1,14 +1,17 @@ | |||
1 | From a721a7063f829ccaf6cf8273be04b763b53a735d Mon Sep 17 00:00:00 2001 | 1 | From d2f145ec8e4e149e055adc74e92016447af91806 Mon Sep 17 00:00:00 2001 |
2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
3 | Date: Tue, 9 Nov 2021 16:19:17 +0530 | 3 | Date: Tue, 9 Nov 2021 16:19:17 +0530 |
4 | Subject: [PATCH 09/10] [Patch,MicroBlaze] : Added m64 abi for 64 bit target | 4 | Subject: [PATCH 7/8] [Patch,MicroBlaze] : Added m64 abi for 64 bit target |
5 | descriptions. set m64 abi for 64 bit elf. | 5 | descriptions. set m64 abi for 64 bit elf. |
6 | 6 | ||
7 | Conflicts: | ||
8 | gdb/microblaze-tdep.c | ||
9 | gdb/microblaze-tdep.h | ||
7 | --- | 10 | --- |
8 | gdb/features/microblaze64.xml | 1 + | 11 | gdb/features/microblaze64.xml | 1 + |
9 | gdb/microblaze-tdep.c | 150 ++++++++++++++++++++++++++++++++-- | 12 | gdb/microblaze-tdep.c | 159 ++++++++++++++++++++++++++++++++-- |
10 | gdb/microblaze-tdep.h | 11 +++ | 13 | gdb/microblaze-tdep.h | 13 ++- |
11 | 3 files changed, 155 insertions(+), 7 deletions(-) | 14 | 3 files changed, 165 insertions(+), 8 deletions(-) |
12 | 15 | ||
13 | diff --git a/gdb/features/microblaze64.xml b/gdb/features/microblaze64.xml | 16 | diff --git a/gdb/features/microblaze64.xml b/gdb/features/microblaze64.xml |
14 | index 515d18e65cf..9c1b7d22003 100644 | 17 | index 515d18e65cf..9c1b7d22003 100644 |
@@ -22,10 +25,10 @@ index 515d18e65cf..9c1b7d22003 100644 | |||
22 | <xi:include href="microblaze64-core.xml"/> | 25 | <xi:include href="microblaze64-core.xml"/> |
23 | </target> | 26 | </target> |
24 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c | 27 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c |
25 | index 667d658adfd..aad6a9cae6e 100644 | 28 | index c347bb9516b..d83072cdaef 100644 |
26 | --- a/gdb/microblaze-tdep.c | 29 | --- a/gdb/microblaze-tdep.c |
27 | +++ b/gdb/microblaze-tdep.c | 30 | +++ b/gdb/microblaze-tdep.c |
28 | @@ -65,8 +65,94 @@ | 31 | @@ -65,8 +65,95 @@ |
29 | #define IS_SAVE_HIDDEN_PTR(op, rd, ra, rb) \ | 32 | #define IS_SAVE_HIDDEN_PTR(op, rd, ra, rb) \ |
30 | ((op == add || op == addik) && ra == MICROBLAZE_FIRST_ARGREG && rb == 0) | 33 | ((op == add || op == addik) && ra == MICROBLAZE_FIRST_ARGREG && rb == 0) |
31 | 34 | ||
@@ -39,7 +42,8 @@ index 667d658adfd..aad6a9cae6e 100644 | |||
39 | +enum microblaze_abi | 42 | +enum microblaze_abi |
40 | +microblaze_abi (struct gdbarch *gdbarch) | 43 | +microblaze_abi (struct gdbarch *gdbarch) |
41 | +{ | 44 | +{ |
42 | + return gdbarch_tdep (gdbarch)->microblaze_abi; | 45 | + microblaze_gdbarch_tdep *tdep = (microblaze_gdbarch_tdep *) gdbarch_tdep (gdbarch); |
46 | + return tdep->microblaze_abi; | ||
43 | +} | 47 | +} |
44 | /* The registers of the Xilinx microblaze processor. */ | 48 | /* The registers of the Xilinx microblaze processor. */ |
45 | 49 | ||
@@ -54,7 +58,7 @@ index 667d658adfd..aad6a9cae6e 100644 | |||
54 | + | 58 | + |
55 | + /* Force the architecture to update, and (if it's a microblaze architecture) | 59 | + /* Force the architecture to update, and (if it's a microblaze architecture) |
56 | + * microblaze_gdbarch_init will take care of the rest. */ | 60 | + * microblaze_gdbarch_init will take care of the rest. */ |
57 | + gdbarch_info_init (&info); | 61 | +// gdbarch_info_init (&info); |
58 | + gdbarch_update_p (info); | 62 | + gdbarch_update_p (info); |
59 | +} | 63 | +} |
60 | + | 64 | + |
@@ -117,10 +121,10 @@ index 667d658adfd..aad6a9cae6e 100644 | |||
117 | + help_list (setmicroblazecmdlist, "set microblaze ", all_commands, gdb_stdout); | 121 | + help_list (setmicroblazecmdlist, "set microblaze ", all_commands, gdb_stdout); |
118 | +} | 122 | +} |
119 | + | 123 | + |
120 | static const char *microblaze_register_names[] = | 124 | static const char * const microblaze_register_names[] = |
121 | { | 125 | { |
122 | "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", | 126 | "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", |
123 | @@ -85,6 +171,18 @@ static const char *microblaze_register_names[] = | 127 | @@ -85,9 +172,21 @@ static const char * const microblaze_register_names[] = |
124 | static unsigned int microblaze_debug_flag = 0; | 128 | static unsigned int microblaze_debug_flag = 0; |
125 | int reg_size = 4; | 129 | int reg_size = 4; |
126 | 130 | ||
@@ -136,13 +140,17 @@ index 667d658adfd..aad6a9cae6e 100644 | |||
136 | + } | 140 | + } |
137 | +} | 141 | +} |
138 | + | 142 | + |
139 | static void ATTRIBUTE_PRINTF (1, 2) | 143 | #define microblaze_debug(fmt, ...) \ |
140 | microblaze_debug (const char *fmt, ...) | 144 | debug_prefixed_printf_cond_nofunc (microblaze_debug_flag, "MICROBLAZE", \ |
141 | { | 145 | - fmt, ## __VA_ARGS__) |
142 | @@ -880,15 +978,30 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 146 | + fmt, ## __VA_ARGS__) |
143 | struct gdbarch_tdep *tdep; | 147 | |
148 | |||
149 | /* Return the name of register REGNUM. */ | ||
150 | @@ -868,15 +967,30 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | ||
151 | { | ||
144 | struct gdbarch *gdbarch; | 152 | struct gdbarch *gdbarch; |
145 | struct tdesc_arch_data *tdesc_data = NULL; | 153 | tdesc_arch_data_up tdesc_data; |
146 | + enum microblaze_abi microblaze_abi, found_abi, wanted_abi; | 154 | + enum microblaze_abi microblaze_abi, found_abi, wanted_abi; |
147 | const struct target_desc *tdesc = info.target_desc; | 155 | const struct target_desc *tdesc = info.target_desc; |
148 | 156 | ||
@@ -172,7 +180,7 @@ index 667d658adfd..aad6a9cae6e 100644 | |||
172 | { | 180 | { |
173 | tdesc = tdesc_microblaze64; | 181 | tdesc = tdesc_microblaze64; |
174 | reg_size = 8; | 182 | reg_size = 8; |
175 | @@ -903,7 +1016,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 183 | @@ -891,7 +1005,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
176 | int valid_p; | 184 | int valid_p; |
177 | int i; | 185 | int i; |
178 | 186 | ||
@@ -181,16 +189,16 @@ index 667d658adfd..aad6a9cae6e 100644 | |||
181 | feature = tdesc_find_feature (tdesc, | 189 | feature = tdesc_find_feature (tdesc, |
182 | "org.gnu.gdb.microblaze64.core"); | 190 | "org.gnu.gdb.microblaze64.core"); |
183 | else | 191 | else |
184 | @@ -917,7 +1030,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 192 | @@ -905,7 +1019,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
185 | for (i = 0; i < MICROBLAZE_NUM_REGS; i++) | 193 | for (i = 0; i < MICROBLAZE_NUM_REGS; i++) |
186 | valid_p &= tdesc_numbered_register (feature, tdesc_data, i, | 194 | valid_p &= tdesc_numbered_register (feature, tdesc_data.get(), i, |
187 | microblaze_register_names[i]); | 195 | microblaze_register_names[i]); |
188 | - if (info.bfd_arch_info->mach == bfd_mach_microblaze64) | 196 | - if (info.bfd_arch_info->mach == bfd_mach_microblaze64) |
189 | + if ((info.bfd_arch_info->mach == bfd_mach_microblaze64) || (microblaze_abi == MICROBLAZE_ABI_M64)) | 197 | + if ((info.bfd_arch_info->mach == bfd_mach_microblaze64) || (microblaze_abi == MICROBLAZE_ABI_M64)) |
190 | feature = tdesc_find_feature (tdesc, | 198 | feature = tdesc_find_feature (tdesc, |
191 | "org.gnu.gdb.microblaze64.stack-protect"); | 199 | "org.gnu.gdb.microblaze64.stack-protect"); |
192 | else | 200 | else |
193 | @@ -968,7 +1081,8 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 201 | @@ -955,7 +1069,8 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
194 | set_gdbarch_ptr_bit (gdbarch, 64); | 202 | set_gdbarch_ptr_bit (gdbarch, 64); |
195 | break; | 203 | break; |
196 | } | 204 | } |
@@ -200,15 +208,21 @@ index 667d658adfd..aad6a9cae6e 100644 | |||
200 | 208 | ||
201 | /* Map Dwarf2 registers to GDB registers. */ | 209 | /* Map Dwarf2 registers to GDB registers. */ |
202 | set_gdbarch_dwarf2_reg_to_regnum (gdbarch, microblaze_dwarf2_reg_to_regnum); | 210 | set_gdbarch_dwarf2_reg_to_regnum (gdbarch, microblaze_dwarf2_reg_to_regnum); |
203 | @@ -1027,7 +1141,30 @@ void | 211 | @@ -1014,7 +1129,38 @@ void |
204 | _initialize_microblaze_tdep () | 212 | _initialize_microblaze_tdep () |
205 | { | 213 | { |
206 | register_gdbarch_init (bfd_arch_microblaze, microblaze_gdbarch_init); | 214 | register_gdbarch_init (bfd_arch_microblaze, microblaze_gdbarch_init); |
207 | - | ||
208 | +// static struct cmd_list_element *setmicroblazecmdlist = NULL; | 215 | +// static struct cmd_list_element *setmicroblazecmdlist = NULL; |
209 | +// static struct cmd_list_element *showmicroblazecmdlist = NULL; | 216 | +// static struct cmd_list_element *showmicroblazecmdlist = NULL; |
210 | + | 217 | + |
211 | + /* Add root prefix command for all "set microblaze"/"show microblaze" commands. */ | 218 | + /* Add root prefix command for all "set microblaze"/"show microblaze" commands. */ |
219 | |||
220 | + add_setshow_prefix_cmd ("microblaze", no_class, | ||
221 | + _("Various microblaze specific commands."), | ||
222 | + _("Various microblaze specific commands."), | ||
223 | + &setmicroblazecmdlist,&showmicroblazecmdlist, | ||
224 | + &setlist,&showlist); | ||
225 | +#if 0 | ||
212 | + add_prefix_cmd ("microblaze", no_class, set_microblaze_command, | 226 | + add_prefix_cmd ("microblaze", no_class, set_microblaze_command, |
213 | + _("Various microblaze specific commands."), | 227 | + _("Various microblaze specific commands."), |
214 | + &setmicroblazecmdlist, "set microblaze ", 0, &setlist); | 228 | + &setmicroblazecmdlist, "set microblaze ", 0, &setlist); |
@@ -216,6 +230,7 @@ index 667d658adfd..aad6a9cae6e 100644 | |||
216 | + add_prefix_cmd ("microblaze", no_class, show_microblaze_command, | 230 | + add_prefix_cmd ("microblaze", no_class, show_microblaze_command, |
217 | + _("Various microblaze specific commands."), | 231 | + _("Various microblaze specific commands."), |
218 | + &showmicroblazecmdlist, "show microblaze ", 0, &showlist); | 232 | + &showmicroblazecmdlist, "show microblaze ", 0, &showlist); |
233 | +#endif | ||
219 | + | 234 | + |
220 | + /* Allow the user to override the ABI. */ | 235 | + /* Allow the user to override the ABI. */ |
221 | + add_setshow_enum_cmd ("abi", class_obscure, microblaze_abi_strings, | 236 | + add_setshow_enum_cmd ("abi", class_obscure, microblaze_abi_strings, |
@@ -232,21 +247,23 @@ index 667d658adfd..aad6a9cae6e 100644 | |||
232 | initialize_tdesc_microblaze_with_stack_protect (); | 247 | initialize_tdesc_microblaze_with_stack_protect (); |
233 | initialize_tdesc_microblaze (); | 248 | initialize_tdesc_microblaze (); |
234 | initialize_tdesc_microblaze64_with_stack_protect (); | 249 | initialize_tdesc_microblaze64_with_stack_protect (); |
235 | @@ -1042,5 +1179,4 @@ When non-zero, microblaze specific debugging is enabled."), | 250 | @@ -1029,5 +1175,4 @@ When non-zero, microblaze specific debugging is enabled."), |
236 | NULL, | 251 | NULL, |
237 | &setdebuglist, &showdebuglist); | 252 | &setdebuglist, &showdebuglist); |
238 | 253 | ||
239 | - | 254 | - |
240 | } | 255 | } |
241 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h | 256 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h |
242 | index e0fa7ef9b12..9cb9628295f 100644 | 257 | index f4d810303ca..babd6c36926 100644 |
243 | --- a/gdb/microblaze-tdep.h | 258 | --- a/gdb/microblaze-tdep.h |
244 | +++ b/gdb/microblaze-tdep.h | 259 | +++ b/gdb/microblaze-tdep.h |
245 | @@ -19,8 +19,16 @@ | 260 | @@ -19,9 +19,17 @@ |
246 | 261 | ||
247 | #ifndef MICROBLAZE_TDEP_H | 262 | #ifndef MICROBLAZE_TDEP_H |
248 | #define MICROBLAZE_TDEP_H 1 | 263 | #define MICROBLAZE_TDEP_H 1 |
264 | - | ||
249 | +#include "objfiles.h" | 265 | +#include "objfiles.h" |
266 | #include "gdbarch.h" | ||
250 | 267 | ||
251 | +struct gdbarch; | 268 | +struct gdbarch; |
252 | +enum microblaze_abi | 269 | +enum microblaze_abi |
@@ -254,17 +271,17 @@ index e0fa7ef9b12..9cb9628295f 100644 | |||
254 | + MICROBLAZE_ABI_AUTO = 0, | 271 | + MICROBLAZE_ABI_AUTO = 0, |
255 | + MICROBLAZE_ABI_M64, | 272 | + MICROBLAZE_ABI_M64, |
256 | + }; | 273 | + }; |
257 | 274 | + | |
258 | +enum microblaze_abi microblaze_abi (struct gdbarch *gdbarch); | 275 | +enum microblaze_abi microblaze_abi (struct gdbarch *gdbarch); |
259 | /* Microblaze architecture-specific information. */ | 276 | /* Microblaze architecture-specific information. */ |
260 | struct microblaze_gregset | 277 | struct microblaze_gregset |
261 | { | 278 | { |
262 | @@ -34,11 +42,14 @@ struct gdbarch_tdep | 279 | @@ -35,11 +43,14 @@ struct microblaze_gdbarch_tdep : gdbarch_tdep |
263 | { | 280 | { |
264 | int dummy; // declare something. | 281 | int dummy; // declare something. |
265 | 282 | ||
266 | + enum microblaze_abi microblaze_abi; | 283 | + enum microblaze_abi microblaze_abi {}; |
267 | + enum microblaze_abi found_abi; | 284 | + enum microblaze_abi found_abi {}; |
268 | /* Register sets. */ | 285 | /* Register sets. */ |
269 | struct regset *gregset; | 286 | struct regset *gregset; |
270 | size_t sizeof_gregset; | 287 | size_t sizeof_gregset; |
@@ -275,5 +292,5 @@ index e0fa7ef9b12..9cb9628295f 100644 | |||
275 | 292 | ||
276 | /* Register numbers. */ | 293 | /* Register numbers. */ |
277 | -- | 294 | -- |
278 | 2.17.1 | 295 | 2.37.1 (Apple Git-137.1) |
279 | 296 | ||
diff --git a/meta-microblaze/recipes-devtools/gdb/gdb/0011-Patch-Microblaze-Depth-Total-number.patch b/meta-microblaze/recipes-devtools/gdb/gdb/0008-Patch-MicroBlaze.patch index 0e9c1a74..4c96fb49 100644 --- a/meta-microblaze/recipes-devtools/gdb/gdb/0011-Patch-Microblaze-Depth-Total-number.patch +++ b/meta-microblaze/recipes-devtools/gdb/gdb/0008-Patch-MicroBlaze.patch | |||
@@ -1,13 +1,13 @@ | |||
1 | From 1f6eef2eb2e6974ba9989977d1b1c8dfdeca94f4 Mon Sep 17 00:00:00 2001 | 1 | From 0532b1db08b9d8efc670f7288fe2d8168b8ed0d1 Mon Sep 17 00:00:00 2001 |
2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
3 | Date: Thu, 21 Jul 2022 11:45:01 +0530 | 3 | Date: Thu, 21 Jul 2022 11:45:01 +0530 |
4 | Subject: [PATCH] =?UTF-8?q?[Patch,MicroBlaze]:=20Depth:=20=20Total=20numbe?= | 4 | Subject: [PATCH 8/8] =?UTF-8?q?[Patch,MicroBlaze]:=20Depth:=20=20Total=20n?= |
5 | =?UTF-8?q?r=20of=20inline=20functions=20[refer=20inline-frame.c]=20state-?= | 5 | =?UTF-8?q?umber=20of=20inline=20functions=20[refer=20inline-frame.c]=20st?= |
6 | =?UTF-8?q?>skipped=5Fframes=20:=20Number=20of=20inline=20functions=20skip?= | 6 | =?UTF-8?q?ate->skipped=5Fframes=20:=20Number=20of=20inline=20functions=20?= |
7 | =?UTF-8?q?ped.=20the=20current=20unwind=5Fpc=20is=20causing=20an=20issue?= | 7 | =?UTF-8?q?skipped.=20the=20current=20unwind=5Fpc=20is=20causing=20an=20is?= |
8 | =?UTF-8?q?=20when=20we=20try=20to=20step=20into=20inline=20functions[Dept?= | 8 | =?UTF-8?q?sue=20when=20we=20try=20to=20step=20into=20inline=20functions[D?= |
9 | =?UTF-8?q?h=20is=20becoming=200].=20It=E2=80=99s=20incrementing=20pc=20by?= | 9 | =?UTF-8?q?epth=20is=20becoming=200].=20It=E2=80=99s=20incrementing=20pc?= |
10 | =?UTF-8?q?=208=20even=20with=20si=20instruction.?= | 10 | =?UTF-8?q?=20by=208=20even=20with=20si=20instruction.?= |
11 | MIME-Version: 1.0 | 11 | MIME-Version: 1.0 |
12 | Content-Type: text/plain; charset=UTF-8 | 12 | Content-Type: text/plain; charset=UTF-8 |
13 | Content-Transfer-Encoding: 8bit | 13 | Content-Transfer-Encoding: 8bit |
@@ -17,10 +17,10 @@ Content-Transfer-Encoding: 8bit | |||
17 | 1 file changed, 3 insertions(+), 11 deletions(-) | 17 | 1 file changed, 3 insertions(+), 11 deletions(-) |
18 | 18 | ||
19 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c | 19 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c |
20 | index aad6a9cae6e..41a2eb511d6 100644 | 20 | index d83072cdaef..38ba38e8c7d 100644 |
21 | --- a/gdb/microblaze-tdep.c | 21 | --- a/gdb/microblaze-tdep.c |
22 | +++ b/gdb/microblaze-tdep.c | 22 | +++ b/gdb/microblaze-tdep.c |
23 | @@ -524,16 +524,8 @@ microblaze_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, | 23 | @@ -513,16 +513,8 @@ microblaze_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, |
24 | static CORE_ADDR | 24 | static CORE_ADDR |
25 | microblaze_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame) | 25 | microblaze_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame) |
26 | { | 26 | { |
@@ -38,7 +38,7 @@ index aad6a9cae6e..41a2eb511d6 100644 | |||
38 | return pc; | 38 | return pc; |
39 | } | 39 | } |
40 | 40 | ||
41 | @@ -564,7 +556,6 @@ microblaze_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) | 41 | @@ -553,7 +545,6 @@ microblaze_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) |
42 | ostart_pc = microblaze_analyze_prologue (gdbarch, func_start, 0xffffffffUL, | 42 | ostart_pc = microblaze_analyze_prologue (gdbarch, func_start, 0xffffffffUL, |
43 | &cache); | 43 | &cache); |
44 | 44 | ||
@@ -46,7 +46,7 @@ index aad6a9cae6e..41a2eb511d6 100644 | |||
46 | if (ostart_pc > start_pc) | 46 | if (ostart_pc > start_pc) |
47 | return ostart_pc; | 47 | return ostart_pc; |
48 | return start_pc; | 48 | return start_pc; |
49 | @@ -670,7 +661,8 @@ static const struct frame_unwind microblaze_frame_unwind = | 49 | @@ -660,7 +651,8 @@ static const struct frame_unwind microblaze_frame_unwind = |
50 | microblaze_frame_this_id, | 50 | microblaze_frame_this_id, |
51 | microblaze_frame_prev_register, | 51 | microblaze_frame_prev_register, |
52 | NULL, | 52 | NULL, |
@@ -57,5 +57,5 @@ index aad6a9cae6e..41a2eb511d6 100644 | |||
57 | 57 | ||
58 | static CORE_ADDR | 58 | static CORE_ADDR |
59 | -- | 59 | -- |
60 | 2.17.1 | 60 | 2.37.1 (Apple Git-137.1) |
61 | 61 | ||
diff --git a/meta-microblaze/recipes-devtools/gdb/gdb/0010-Patch-MicroBlaze-Code-changes-for-gdbserver.patch b/meta-microblaze/recipes-devtools/gdb/gdb/0010-Patch-MicroBlaze-Code-changes-for-gdbserver.patch deleted file mode 100644 index dc38b480..00000000 --- a/meta-microblaze/recipes-devtools/gdb/gdb/0010-Patch-MicroBlaze-Code-changes-for-gdbserver.patch +++ /dev/null | |||
@@ -1,401 +0,0 @@ | |||
1 | From 01e16382c8fce4448c911a4c5780259e181e83dd Mon Sep 17 00:00:00 2001 | ||
2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | ||
3 | Date: Fri, 8 Jul 2022 12:53:51 +0530 | ||
4 | Subject: [PATCH 10/10] [Patch,MicroBlaze]: Code changes for gdbserver. | ||
5 | |||
6 | --- | ||
7 | gdb/features/Makefile | 1 + | ||
8 | gdb/features/microblaze-linux.xml | 1 + | ||
9 | gdb/regformats/microblaze-linux.dat | 64 +++++++++ | ||
10 | gdbserver/Makefile.in | 5 +- | ||
11 | gdbserver/configure.srv | 1 + | ||
12 | ...croblaze-low.c => linux-microblaze-low.cc} | 132 ++++++++++-------- | ||
13 | 6 files changed, 138 insertions(+), 66 deletions(-) | ||
14 | create mode 100644 gdb/regformats/microblaze-linux.dat | ||
15 | rename gdbserver/{linux-microblaze-low.c => linux-microblaze-low.cc} (72%) | ||
16 | |||
17 | diff --git a/gdb/features/Makefile b/gdb/features/Makefile | ||
18 | index 131fc14adbf..1b15305862e 100644 | ||
19 | --- a/gdb/features/Makefile | ||
20 | +++ b/gdb/features/Makefile | ||
21 | @@ -47,6 +47,7 @@ | ||
22 | WHICH = mips-linux mips-dsp-linux \ | ||
23 | microblaze-with-stack-protect \ | ||
24 | microblaze64-with-stack-protect \ | ||
25 | + microblaze-linux \ | ||
26 | mips64-linux mips64-dsp-linux \ | ||
27 | nios2-linux \ | ||
28 | rs6000/powerpc-32 \ | ||
29 | diff --git a/gdb/features/microblaze-linux.xml b/gdb/features/microblaze-linux.xml | ||
30 | index 8983e66eb3d..688a3f83d1e 100644 | ||
31 | --- a/gdb/features/microblaze-linux.xml | ||
32 | +++ b/gdb/features/microblaze-linux.xml | ||
33 | @@ -7,6 +7,7 @@ | ||
34 | |||
35 | <!DOCTYPE target SYSTEM "gdb-target.dtd"> | ||
36 | <target> | ||
37 | + <architecture>microblaze</architecture> | ||
38 | <osabi>GNU/Linux</osabi> | ||
39 | <xi:include href="microblaze-core.xml"/> | ||
40 | </target> | ||
41 | diff --git a/gdb/regformats/microblaze-linux.dat b/gdb/regformats/microblaze-linux.dat | ||
42 | new file mode 100644 | ||
43 | index 00000000000..b5b49f485cd | ||
44 | --- /dev/null | ||
45 | +++ b/gdb/regformats/microblaze-linux.dat | ||
46 | @@ -0,0 +1,64 @@ | ||
47 | +# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro: | ||
48 | +# Generated from: microblaze-linux.xml | ||
49 | +name:microblaze_linux | ||
50 | +xmltarget:microblaze-linux.xml | ||
51 | +expedite:r1,rpc | ||
52 | +32:r0 | ||
53 | +32:r1 | ||
54 | +32:r2 | ||
55 | +32:r3 | ||
56 | +32:r4 | ||
57 | +32:r5 | ||
58 | +32:r6 | ||
59 | +32:r7 | ||
60 | +32:r8 | ||
61 | +32:r9 | ||
62 | +32:r10 | ||
63 | +32:r11 | ||
64 | +32:r12 | ||
65 | +32:r13 | ||
66 | +32:r14 | ||
67 | +32:r15 | ||
68 | +32:r16 | ||
69 | +32:r17 | ||
70 | +32:r18 | ||
71 | +32:r19 | ||
72 | +32:r20 | ||
73 | +32:r21 | ||
74 | +32:r22 | ||
75 | +32:r23 | ||
76 | +32:r24 | ||
77 | +32:r25 | ||
78 | +32:r26 | ||
79 | +32:r27 | ||
80 | +32:r28 | ||
81 | +32:r29 | ||
82 | +32:r30 | ||
83 | +32:r31 | ||
84 | +32:rpc | ||
85 | +32:rmsr | ||
86 | +32:rear | ||
87 | +32:resr | ||
88 | +32:rfsr | ||
89 | +32:rbtr | ||
90 | +32:rpvr0 | ||
91 | +32:rpvr1 | ||
92 | +32:rpvr2 | ||
93 | +32:rpvr3 | ||
94 | +32:rpvr4 | ||
95 | +32:rpvr5 | ||
96 | +32:rpvr6 | ||
97 | +32:rpvr7 | ||
98 | +32:rpvr8 | ||
99 | +32:rpvr9 | ||
100 | +32:rpvr10 | ||
101 | +32:rpvr11 | ||
102 | +32:redr | ||
103 | +32:rpid | ||
104 | +32:rzpr | ||
105 | +32:rtlbx | ||
106 | +32:rtlbsx | ||
107 | +32:rtlblo | ||
108 | +32:rtlbhi | ||
109 | +32:slr | ||
110 | +32:shr | ||
111 | diff --git a/gdbserver/Makefile.in b/gdbserver/Makefile.in | ||
112 | index 46b5a0c7c60..eaaf6820fe0 100644 | ||
113 | --- a/gdbserver/Makefile.in | ||
114 | +++ b/gdbserver/Makefile.in | ||
115 | @@ -184,7 +184,7 @@ SFILES = \ | ||
116 | $(srcdir)/linux-ia64-low.cc \ | ||
117 | $(srcdir)/linux-low.cc \ | ||
118 | $(srcdir)/linux-m68k-low.cc \ | ||
119 | - $(srcdir)/linux-microblaze-low.c \ | ||
120 | + $(srcdir)/linux-microblaze-low.cc \ | ||
121 | $(srcdir)/linux-mips-low.cc \ | ||
122 | $(srcdir)/linux-nios2-low.cc \ | ||
123 | $(srcdir)/linux-ppc-low.cc \ | ||
124 | @@ -222,7 +222,6 @@ SFILES = \ | ||
125 | $(srcdir)/../gdb/nat/linux-namespaces.c \ | ||
126 | $(srcdir)/../gdb/nat/linux-osdata.c \ | ||
127 | $(srcdir)/../gdb/nat/linux-personality.c \ | ||
128 | - $(srcdir)/../gdb/nat/microblaze-linux.c \ | ||
129 | $(srcdir)/../gdb/nat/mips-linux-watch.c \ | ||
130 | $(srcdir)/../gdb/nat/ppc-linux.c \ | ||
131 | $(srcdir)/../gdb/nat/riscv-linux-tdesc.c \ | ||
132 | @@ -564,8 +563,6 @@ target/%.o: ../gdb/target/%.c | ||
133 | |||
134 | %-generated.cc: ../gdb/regformats/rs6000/%.dat $(regdat_sh) | ||
135 | $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $< $@ | ||
136 | -microblaze-linux.c : $(srcdir)/../regformats/reg-microblaze.dat $(regdat_sh) | ||
137 | - $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-microblaze.dat microblaze-linux.c | ||
138 | |||
139 | # | ||
140 | # Dependency tracking. | ||
141 | diff --git a/gdbserver/configure.srv b/gdbserver/configure.srv | ||
142 | index af10cb05683..026b156bd60 100644 | ||
143 | --- a/gdbserver/configure.srv | ||
144 | +++ b/gdbserver/configure.srv | ||
145 | @@ -169,6 +169,7 @@ case "${gdbserver_host}" in | ||
146 | microblaze*-*-linux*) srv_regobj="microblaze-linux.o" | ||
147 | srv_tgtobj="$srv_linux_obj linux-microblaze-low.o " | ||
148 | srv_xmlfiles="microblaze-linux.xml" | ||
149 | + srv_xmlfiles="${srv_xmlfiles} microblaze-core.xml" | ||
150 | srv_linux_regsets=yes | ||
151 | srv_linux_usrregs=yes | ||
152 | srv_linux_thread_db=yes | ||
153 | diff --git a/gdbserver/linux-microblaze-low.c b/gdbserver/linux-microblaze-low.cc | ||
154 | similarity index 72% | ||
155 | rename from gdbserver/linux-microblaze-low.c | ||
156 | rename to gdbserver/linux-microblaze-low.cc | ||
157 | index a2733f3c21c..d30fa102b5e 100644 | ||
158 | --- a/gdbserver/linux-microblaze-low.c | ||
159 | +++ b/gdbserver/linux-microblaze-low.cc | ||
160 | @@ -20,12 +20,17 @@ | ||
161 | #include "server.h" | ||
162 | #include "linux-low.h" | ||
163 | |||
164 | +#include "elf/common.h" | ||
165 | +#include "nat/gdb_ptrace.h" | ||
166 | +#include <endian.h> | ||
167 | + | ||
168 | #include <asm/ptrace.h> | ||
169 | #include <sys/procfs.h> | ||
170 | #include <sys/ptrace.h> | ||
171 | |||
172 | #include "gdb_proc_service.h" | ||
173 | |||
174 | + | ||
175 | static int microblaze_regmap[] = | ||
176 | {PT_GPR(0), PT_GPR(1), PT_GPR(2), PT_GPR(3), | ||
177 | PT_GPR(4), PT_GPR(5), PT_GPR(6), PT_GPR(7), | ||
178 | @@ -39,14 +44,46 @@ static int microblaze_regmap[] = | ||
179 | PT_FSR | ||
180 | }; | ||
181 | |||
182 | + | ||
183 | + | ||
184 | +class microblaze_target : public linux_process_target | ||
185 | +{ | ||
186 | +public: | ||
187 | + | ||
188 | + const regs_info *get_regs_info () override; | ||
189 | + | ||
190 | + const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) override; | ||
191 | + // CORE_ADDR microblaze_reinsert_addr (regcache *regcache); | ||
192 | + | ||
193 | +protected: | ||
194 | + | ||
195 | + void low_arch_setup () override; | ||
196 | + | ||
197 | + bool low_cannot_fetch_register (int regno) override; | ||
198 | + | ||
199 | + bool low_cannot_store_register (int regno) override; | ||
200 | + | ||
201 | + // bool low_supports_breakpoints () override; | ||
202 | + | ||
203 | + CORE_ADDR low_get_pc (regcache *regcache) override; | ||
204 | + | ||
205 | + void low_set_pc (regcache *regcache, CORE_ADDR newpc) override; | ||
206 | + | ||
207 | + bool low_breakpoint_at (CORE_ADDR pc) override; | ||
208 | +}; | ||
209 | + | ||
210 | +/* The singleton target ops object. */ | ||
211 | + | ||
212 | +static microblaze_target the_microblaze_target; | ||
213 | + | ||
214 | #define microblaze_num_regs (sizeof (microblaze_regmap) / sizeof (microblaze_regmap[0])) | ||
215 | |||
216 | /* Defined in auto-generated file microblaze-linux.c. */ | ||
217 | -void init_registers_microblaze (void); | ||
218 | -extern const struct target_desc *tdesc_microblaze; | ||
219 | +void init_registers_microblaze_linux (void); | ||
220 | +extern const struct target_desc *tdesc_microblaze_linux; | ||
221 | |||
222 | -static int | ||
223 | -microblaze_cannot_store_register (int regno) | ||
224 | +bool | ||
225 | +microblaze_target::low_cannot_store_register (int regno) | ||
226 | { | ||
227 | if (microblaze_regmap[regno] == -1 || regno == 0) | ||
228 | return 1; | ||
229 | @@ -54,14 +91,14 @@ microblaze_cannot_store_register (int regno) | ||
230 | return 0; | ||
231 | } | ||
232 | |||
233 | -static int | ||
234 | -microblaze_cannot_fetch_register (int regno) | ||
235 | +bool | ||
236 | +microblaze_target::low_cannot_fetch_register (int regno) | ||
237 | { | ||
238 | return 0; | ||
239 | } | ||
240 | |||
241 | -static CORE_ADDR | ||
242 | -microblaze_get_pc (struct regcache *regcache) | ||
243 | +CORE_ADDR | ||
244 | +microblaze_target::low_get_pc (struct regcache *regcache) | ||
245 | { | ||
246 | unsigned long pc; | ||
247 | |||
248 | @@ -69,8 +106,8 @@ microblaze_get_pc (struct regcache *regcache) | ||
249 | return (CORE_ADDR) pc; | ||
250 | } | ||
251 | |||
252 | -static void | ||
253 | -microblaze_set_pc (struct regcache *regcache, CORE_ADDR pc) | ||
254 | +void | ||
255 | +microblaze_target::low_set_pc (struct regcache *regcache, CORE_ADDR pc) | ||
256 | { | ||
257 | unsigned long newpc = pc; | ||
258 | |||
259 | @@ -84,34 +121,35 @@ static const unsigned long microblaze_breakpoint = 0xba0c0018; | ||
260 | |||
261 | /* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */ | ||
262 | |||
263 | -static const gdb_byte * | ||
264 | -microblaze_sw_breakpoint_from_kind (int kind, int *size) | ||
265 | +const gdb_byte * | ||
266 | +microblaze_target::sw_breakpoint_from_kind (int kind, int *size) | ||
267 | { | ||
268 | *size = microblaze_breakpoint_len; | ||
269 | return (const gdb_byte *) µblaze_breakpoint; | ||
270 | } | ||
271 | |||
272 | -static int | ||
273 | -microblaze_breakpoint_at (CORE_ADDR where) | ||
274 | +bool | ||
275 | +microblaze_target::low_breakpoint_at (CORE_ADDR where) | ||
276 | { | ||
277 | unsigned long insn; | ||
278 | |||
279 | - (*the_target->read_memory) (where, (unsigned char *) &insn, 4); | ||
280 | + read_memory (where, (unsigned char *) &insn, 4); | ||
281 | if (insn == microblaze_breakpoint) | ||
282 | return 1; | ||
283 | /* If necessary, recognize more trap instructions here. GDB only uses the | ||
284 | one. */ | ||
285 | return 0; | ||
286 | } | ||
287 | - | ||
288 | -static CORE_ADDR | ||
289 | -microblaze_reinsert_addr (struct regcache *regcache) | ||
290 | +#if 0 | ||
291 | +CORE_ADDR | ||
292 | +microblaze_target::microblaze_reinsert_addr (struct regcache *regcache) | ||
293 | { | ||
294 | unsigned long pc; | ||
295 | collect_register_by_name (regcache, "r15", &pc); | ||
296 | return pc; | ||
297 | } | ||
298 | - | ||
299 | +#endif | ||
300 | +#if 0 | ||
301 | #ifdef HAVE_PTRACE_GETREGS | ||
302 | |||
303 | static void | ||
304 | @@ -166,12 +204,15 @@ microblaze_store_gregset (struct regcache *regcache, const void *buf) | ||
305 | } | ||
306 | |||
307 | #endif /* HAVE_PTRACE_GETREGS */ | ||
308 | +#endif | ||
309 | |||
310 | static struct regset_info microblaze_regsets[] = { | ||
311 | +#if 0 | ||
312 | #ifdef HAVE_PTRACE_GETREGS | ||
313 | { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t), GENERAL_REGS, microblaze_fill_gregset, microblaze_store_gregset }, | ||
314 | { 0, 0, 0, -1, GENERAL_REGS, NULL, NULL }, | ||
315 | #endif /* HAVE_PTRACE_GETREGS */ | ||
316 | +#endif | ||
317 | { 0, 0, 0, -1, GENERAL_REGS, NULL, NULL }, | ||
318 | NULL_REGSET | ||
319 | }; | ||
320 | @@ -189,17 +230,17 @@ static struct regsets_info microblaze_regsets_info = | ||
321 | NULL, /* disabled_regsets */ | ||
322 | }; | ||
323 | |||
324 | -static struct regs_info regs_info = | ||
325 | +static struct regs_info microblaze_regs_info = | ||
326 | { | ||
327 | NULL, /* regset_bitmap */ | ||
328 | µblaze_usrregs_info, | ||
329 | µblaze_regsets_info | ||
330 | }; | ||
331 | |||
332 | -static const struct regs_info * | ||
333 | -microblaze_regs_info (void) | ||
334 | +const regs_info * | ||
335 | +microblaze_target::get_regs_info (void) | ||
336 | { | ||
337 | - return ®s_info; | ||
338 | + return µblaze_regs_info; | ||
339 | } | ||
340 | |||
341 | /* Support for hardware single step. */ | ||
342 | @@ -211,50 +252,17 @@ microblaze_supports_hardware_single_step (void) | ||
343 | } | ||
344 | |||
345 | |||
346 | -static void | ||
347 | -microblaze_arch_setup (void) | ||
348 | +void | ||
349 | +microblaze_target::low_arch_setup (void) | ||
350 | { | ||
351 | - current_process ()->tdesc = tdesc_microblaze; | ||
352 | + current_process ()->tdesc = tdesc_microblaze_linux; | ||
353 | } | ||
354 | |||
355 | -struct linux_target_ops the_low_target = { | ||
356 | - microblaze_arch_setup, | ||
357 | - microblaze_regs_info, | ||
358 | - microblaze_cannot_fetch_register, | ||
359 | - microblaze_cannot_store_register, | ||
360 | - NULL, /* fetch_register */ | ||
361 | - microblaze_get_pc, | ||
362 | - microblaze_set_pc, | ||
363 | - NULL, | ||
364 | - microblaze_sw_breakpoint_from_kind, | ||
365 | - NULL, | ||
366 | - 0, | ||
367 | - microblaze_breakpoint_at, | ||
368 | - NULL, | ||
369 | - NULL, | ||
370 | - NULL, | ||
371 | - NULL, | ||
372 | - NULL, | ||
373 | - microblaze_collect_ptrace_register, | ||
374 | - microblaze_supply_ptrace_register, | ||
375 | - NULL, /* siginfo_fixup */ | ||
376 | - NULL, /* new_process */ | ||
377 | - NULL, /* new_thread */ | ||
378 | - NULL, /* new_fork */ | ||
379 | - NULL, /* prepare_to_resume */ | ||
380 | - NULL, /* process_qsupported */ | ||
381 | - NULL, /* supports_tracepoints */ | ||
382 | - NULL, /* get_thread_area */ | ||
383 | - NULL, /* install_fast_tracepoint_jump_pad */ | ||
384 | - NULL, /* emit_ops */ | ||
385 | - NULL, /* get_min_fast_tracepoint_insn_len */ | ||
386 | - NULL, /* supports_range_stepping */ | ||
387 | - NULL, /* breakpoint_kind_from_current_state */ | ||
388 | - microblaze_supports_hardware_single_step, | ||
389 | -}; | ||
390 | +linux_process_target *the_linux_target = &the_microblaze_target; | ||
391 | |||
392 | void | ||
393 | initialize_low_arch (void) | ||
394 | { | ||
395 | - init_registers_microblaze (); | ||
396 | + init_registers_microblaze_linux (); | ||
397 | + initialize_regsets_info (µblaze_regsets_info); | ||
398 | } | ||
399 | -- | ||
400 | 2.17.1 | ||
401 | |||