ld: Fix pr22269-1 on 32-bit Solaris/SPARC
[deliverable/binutils-gdb.git] / gdb / nbsd-tdep.c
CommitLineData
ea5bc2a6 1/* Common target-dependent code for NetBSD systems.
76a9d10f 2
b811d2c2 3 Copyright (C) 2002-2020 Free Software Foundation, Inc.
76a9d10f 4
ea5bc2a6
JT
5 Contributed by Wasabi Systems, Inc.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
ea5bc2a6 12 (at your option) any later version.
a9762ec7 13
ea5bc2a6
JT
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
a9762ec7 18
ea5bc2a6 19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
ea5bc2a6
JT
21
22#include "defs.h"
23#include "solib-svr4.h"
63807e1d 24#include "nbsd-tdep.h"
79743962 25#include "gdbarch.h"
063f8e80 26#include "objfiles.h"
ea5bc2a6 27
76a9d10f
MK
28/* FIXME: kettenis/20060115: We should really eliminate the next two
29 functions completely. */
ea5bc2a6 30
ea5bc2a6
JT
31struct link_map_offsets *
32nbsd_ilp32_solib_svr4_fetch_link_map_offsets (void)
33{
76a9d10f 34 return svr4_ilp32_fetch_link_map_offsets ();
ea5bc2a6
JT
35}
36
37struct link_map_offsets *
38nbsd_lp64_solib_svr4_fetch_link_map_offsets (void)
39{
76a9d10f 40 return svr4_lp64_fetch_link_map_offsets ();
ea5bc2a6 41}
3d9b49b0
JT
42
43int
2c02bd72 44nbsd_pc_in_sigtramp (CORE_ADDR pc, const char *func_name)
3d9b49b0
JT
45{
46 /* Check for libc-provided signal trampoline. All such trampolines
47 have function names which begin with "__sigtramp". */
48
49 return (func_name != NULL
61012eef 50 && startswith (func_name, "__sigtramp"));
3d9b49b0 51}
79743962
KR
52
53/* This enum is derived from NETBSD's <sys/signal.h>. */
54
55enum
56 {
57 NBSD_SIGHUP = 1,
58 NBSD_SIGINT = 2,
59 NBSD_SIGQUIT = 3,
60 NBSD_SIGILL = 4,
61 NBSD_SIGTRAP = 5,
62 NBSD_SIGABRT = 6,
63 NBSD_SIGEMT = 7,
64 NBSD_SIGFPE = 8,
65 NBSD_SIGKILL = 9,
66 NBSD_SIGBUS = 10,
67 NBSD_SIGSEGV = 11,
68 NBSD_SIGSYS = 12,
69 NBSD_SIGPIPE = 13,
70 NBSD_SIGALRM = 14,
71 NBSD_SIGTERM = 15,
72 NBSD_SIGURG = 16,
73 NBSD_SIGSTOP = 17,
74 NBSD_SIGTSTP = 18,
75 NBSD_SIGCONT = 19,
76 NBSD_SIGCHLD = 20,
77 NBSD_SIGTTIN = 21,
78 NBSD_SIGTTOU = 22,
79 NBSD_SIGIO = 23,
80 NBSD_SIGXCPU = 24,
81 NBSD_SIGXFSZ = 25,
82 NBSD_SIGVTALRM = 26,
83 NBSD_SIGPROF = 27,
84 NBSD_SIGWINCH = 28,
85 NBSD_SIGINFO = 29,
86 NBSD_SIGUSR1 = 30,
87 NBSD_SIGUSR2 = 31,
88 NBSD_SIGPWR = 32,
89 NBSD_SIGRTMIN = 33,
90 NBSD_SIGRTMAX = 63,
91 };
92
93/* Implement the "gdb_signal_from_target" gdbarch method. */
94
95static enum gdb_signal
96nbsd_gdb_signal_from_target (struct gdbarch *gdbarch, int signal)
97{
98 switch (signal)
99 {
100 case 0:
101 return GDB_SIGNAL_0;
102
103 case NBSD_SIGHUP:
104 return GDB_SIGNAL_HUP;
105
106 case NBSD_SIGINT:
107 return GDB_SIGNAL_INT;
108
109 case NBSD_SIGQUIT:
110 return GDB_SIGNAL_QUIT;
111
112 case NBSD_SIGILL:
113 return GDB_SIGNAL_ILL;
114
115 case NBSD_SIGTRAP:
116 return GDB_SIGNAL_TRAP;
117
118 case NBSD_SIGABRT:
119 return GDB_SIGNAL_ABRT;
120
121 case NBSD_SIGEMT:
122 return GDB_SIGNAL_EMT;
123
124 case NBSD_SIGFPE:
125 return GDB_SIGNAL_FPE;
126
127 case NBSD_SIGKILL:
128 return GDB_SIGNAL_KILL;
129
130 case NBSD_SIGBUS:
131 return GDB_SIGNAL_BUS;
132
133 case NBSD_SIGSEGV:
134 return GDB_SIGNAL_SEGV;
135
136 case NBSD_SIGSYS:
137 return GDB_SIGNAL_SYS;
138
139 case NBSD_SIGPIPE:
140 return GDB_SIGNAL_PIPE;
141
142 case NBSD_SIGALRM:
143 return GDB_SIGNAL_ALRM;
144
145 case NBSD_SIGTERM:
146 return GDB_SIGNAL_TERM;
147
148 case NBSD_SIGURG:
149 return GDB_SIGNAL_URG;
150
151 case NBSD_SIGSTOP:
152 return GDB_SIGNAL_STOP;
153
154 case NBSD_SIGTSTP:
155 return GDB_SIGNAL_TSTP;
156
157 case NBSD_SIGCONT:
158 return GDB_SIGNAL_CONT;
159
160 case NBSD_SIGCHLD:
161 return GDB_SIGNAL_CHLD;
162
163 case NBSD_SIGTTIN:
164 return GDB_SIGNAL_TTIN;
165
166 case NBSD_SIGTTOU:
167 return GDB_SIGNAL_TTOU;
168
169 case NBSD_SIGIO:
170 return GDB_SIGNAL_IO;
171
172 case NBSD_SIGXCPU:
173 return GDB_SIGNAL_XCPU;
174
175 case NBSD_SIGXFSZ:
176 return GDB_SIGNAL_XFSZ;
177
178 case NBSD_SIGVTALRM:
179 return GDB_SIGNAL_VTALRM;
180
181 case NBSD_SIGPROF:
182 return GDB_SIGNAL_PROF;
183
184 case NBSD_SIGWINCH:
185 return GDB_SIGNAL_WINCH;
186
187 case NBSD_SIGINFO:
188 return GDB_SIGNAL_INFO;
189
190 case NBSD_SIGUSR1:
191 return GDB_SIGNAL_USR1;
192
193 case NBSD_SIGUSR2:
194 return GDB_SIGNAL_USR2;
195
196 case NBSD_SIGPWR:
197 return GDB_SIGNAL_PWR;
198
199 /* SIGRTMIN and SIGRTMAX are not continuous in <gdb/signals.def>,
200 therefore we have to handle them here. */
201 case NBSD_SIGRTMIN:
202 return GDB_SIGNAL_REALTIME_33;
203
204 case NBSD_SIGRTMAX:
205 return GDB_SIGNAL_REALTIME_63;
206 }
207
208 if (signal >= NBSD_SIGRTMIN + 1 && signal <= NBSD_SIGRTMAX - 1)
209 {
210 int offset = signal - NBSD_SIGRTMIN + 1;
211
212 return (enum gdb_signal) ((int) GDB_SIGNAL_REALTIME_34 + offset);
213 }
214
215 return GDB_SIGNAL_UNKNOWN;
216}
217
218/* Implement the "gdb_signal_to_target" gdbarch method. */
219
220static int
221nbsd_gdb_signal_to_target (struct gdbarch *gdbarch,
222 enum gdb_signal signal)
223{
224 switch (signal)
225 {
226 case GDB_SIGNAL_0:
227 return 0;
228
229 case GDB_SIGNAL_HUP:
230 return NBSD_SIGHUP;
231
232 case GDB_SIGNAL_INT:
233 return NBSD_SIGINT;
234
235 case GDB_SIGNAL_QUIT:
236 return NBSD_SIGQUIT;
237
238 case GDB_SIGNAL_ILL:
239 return NBSD_SIGILL;
240
241 case GDB_SIGNAL_TRAP:
242 return NBSD_SIGTRAP;
243
244 case GDB_SIGNAL_ABRT:
245 return NBSD_SIGABRT;
246
247 case GDB_SIGNAL_EMT:
248 return NBSD_SIGEMT;
249
250 case GDB_SIGNAL_FPE:
251 return NBSD_SIGFPE;
252
253 case GDB_SIGNAL_KILL:
254 return NBSD_SIGKILL;
255
256 case GDB_SIGNAL_BUS:
257 return NBSD_SIGBUS;
258
259 case GDB_SIGNAL_SEGV:
260 return NBSD_SIGSEGV;
261
262 case GDB_SIGNAL_SYS:
263 return NBSD_SIGSYS;
264
265 case GDB_SIGNAL_PIPE:
266 return NBSD_SIGPIPE;
267
268 case GDB_SIGNAL_ALRM:
269 return NBSD_SIGALRM;
270
271 case GDB_SIGNAL_TERM:
272 return NBSD_SIGTERM;
273
274 case GDB_SIGNAL_URG:
275 return NBSD_SIGSTOP;
276
277 case GDB_SIGNAL_TSTP:
278 return NBSD_SIGTSTP;
279
280 case GDB_SIGNAL_CONT:
281 return NBSD_SIGCONT;
282
283 case GDB_SIGNAL_CHLD:
284 return NBSD_SIGCHLD;
285
286 case GDB_SIGNAL_TTIN:
287 return NBSD_SIGTTIN;
288
289 case GDB_SIGNAL_TTOU:
290 return NBSD_SIGTTOU;
291
292 case GDB_SIGNAL_IO:
293 return NBSD_SIGIO;
294
295 case GDB_SIGNAL_XCPU:
296 return NBSD_SIGXCPU;
297
298 case GDB_SIGNAL_XFSZ:
299 return NBSD_SIGXFSZ;
300
301 case GDB_SIGNAL_VTALRM:
302 return NBSD_SIGVTALRM;
303
304 case GDB_SIGNAL_PROF:
305 return NBSD_SIGPROF;
306
307 case GDB_SIGNAL_WINCH:
308 return NBSD_SIGWINCH;
309
310 case GDB_SIGNAL_INFO:
311 return NBSD_SIGINFO;
312
313 case GDB_SIGNAL_USR1:
314 return NBSD_SIGUSR1;
315
316 case GDB_SIGNAL_USR2:
317 return NBSD_SIGUSR2;
318
319 case GDB_SIGNAL_PWR:
320 return NBSD_SIGPWR;
321
322 /* GDB_SIGNAL_REALTIME_33 is not continuous in <gdb/signals.def>,
323 therefore we have to handle it here. */
324 case GDB_SIGNAL_REALTIME_33:
325 return NBSD_SIGRTMIN;
326
327 /* Same comment applies to _64. */
328 case GDB_SIGNAL_REALTIME_63:
329 return NBSD_SIGRTMAX;
330 }
331
332 if (signal >= GDB_SIGNAL_REALTIME_34
333 && signal <= GDB_SIGNAL_REALTIME_62)
334 {
335 int offset = signal - GDB_SIGNAL_REALTIME_32;
336
337 return NBSD_SIGRTMIN + 1 + offset;
338 }
339
340 return -1;
341}
342
063f8e80
KR
343/* Shared library resolver handling. */
344
345static CORE_ADDR
346nbsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
347{
348 struct bound_minimal_symbol msym;
349
350 msym = lookup_minimal_symbol ("_rtld_bind_start", NULL, NULL);
351 if (msym.minsym && BMSYMBOL_VALUE_ADDRESS (msym) == pc)
352 return frame_unwind_caller_pc (get_current_frame ());
353 else
354 return find_solib_trampoline_target (get_current_frame (), pc);
355}
356
79743962
KR
357/* See nbsd-tdep.h. */
358
359void
360nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
361{
362 set_gdbarch_gdb_signal_from_target (gdbarch, nbsd_gdb_signal_from_target);
363 set_gdbarch_gdb_signal_to_target (gdbarch, nbsd_gdb_signal_to_target);
063f8e80 364 set_gdbarch_skip_solib_resolver (gdbarch, nbsd_skip_solib_resolver);
79743962 365}
This page took 1.681284 seconds and 4 git commands to generate.