]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/alphafbsd-tdep.c
Update Copyright year range in all files maintained by GDB.
[thirdparty/binutils-gdb.git] / gdb / alphafbsd-tdep.c
CommitLineData
4b17b389
MK
1/* Target-dependent code for FreeBSD/alpha.
2
ecd75fc8 3 Copyright (C) 2001-2014 Free Software Foundation, Inc.
efd59e3f
MK
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
efd59e3f
MK
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
efd59e3f
MK
19
20#include "defs.h"
21#include "value.h"
4be87837 22#include "osabi.h"
efd59e3f 23
82a4efa1 24#include "alpha-tdep.h"
4b17b389 25#include "solib-svr4.h"
82a4efa1
JT
26
27static int
9823e921 28alphafbsd_return_in_memory (struct type *type)
efd59e3f
MK
29{
30 enum type_code code;
31 int i;
32
33 /* All aggregate types that won't fit in a register must be returned
34 in memory. */
138e7be5 35 if (TYPE_LENGTH (type) > ALPHA_REGISTER_SIZE)
efd59e3f
MK
36 return 1;
37
38 /* The only aggregate types that can be returned in a register are
39 structs and unions. Arrays must be returned in memory. */
40 code = TYPE_CODE (type);
41 if (code != TYPE_CODE_STRUCT && code != TYPE_CODE_UNION)
42 return 1;
43
44 /* We need to check if this struct/union is "integer" like. For
45 this to be true, the offset of each adressable subfield must be
46 zero. Note that bit fields are not addressable. */
47 for (i = 0; i < TYPE_NFIELDS (type); i++)
48 {
49 /* If the field bitsize is non-zero, it isn't adressable. */
50 if (TYPE_FIELD_BITPOS (type, i) != 0
51 && TYPE_FIELD_BITSIZE (type, i) == 0)
52 return 1;
53 }
54
55 return 0;
56}
138e7be5
MK
57\f
58
59/* Support for signal handlers. */
60
61/* Return whether PC is in a BSD sigtramp routine. */
62
63CORE_ADDR alphafbsd_sigtramp_start = 0x11ffff68;
64CORE_ADDR alphafbsd_sigtramp_end = 0x11ffffe0;
82a4efa1 65
6c72f9f9 66static int
e17a4113 67alphafbsd_pc_in_sigtramp (struct gdbarch *gdbarch,
2c02bd72 68 CORE_ADDR pc, const char *func_name)
6c72f9f9 69{
138e7be5 70 return (pc >= alphafbsd_sigtramp_start && pc < alphafbsd_sigtramp_end);
6c72f9f9
JT
71}
72
138e7be5 73static LONGEST
e17a4113 74alphafbsd_sigtramp_offset (struct gdbarch *gdbarch, CORE_ADDR pc)
138e7be5
MK
75{
76 return pc - alphafbsd_sigtramp_start;
77}
78
94afd7a6
UW
79/* Assuming THIS_FRAME is the frame of a BSD sigtramp routine,
80 return the address of the associated sigcontext structure. */
138e7be5
MK
81
82static CORE_ADDR
94afd7a6 83alphafbsd_sigcontext_addr (struct frame_info *this_frame)
138e7be5 84{
94afd7a6 85 return get_frame_register_unsigned (this_frame, ALPHA_SP_REGNUM) + 24;
138e7be5
MK
86}
87
88/* FreeBSD 5.0-RELEASE or later. */
89
82a4efa1
JT
90static void
91alphafbsd_init_abi (struct gdbarch_info info,
92 struct gdbarch *gdbarch)
93{
94 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
95
baa490c4
RH
96 /* Hook into the DWARF CFI frame unwinder. */
97 alpha_dwarf2_init_abi (info, gdbarch);
98
99 /* Hook into the MDEBUG frame unwinder. */
100 alpha_mdebug_init_abi (info, gdbarch);
101
4b17b389
MK
102 /* FreeBSD/alpha has SVR4-style shared libraries. */
103 set_solib_svr4_fetch_link_map_offsets
104 (gdbarch, svr4_lp64_fetch_link_map_offsets);
105
138e7be5
MK
106 tdep->dynamic_sigtramp_offset = alphafbsd_sigtramp_offset;
107 tdep->sigcontext_addr = alphafbsd_sigcontext_addr;
f2524b93 108 tdep->pc_in_sigtramp = alphafbsd_pc_in_sigtramp;
9823e921 109 tdep->return_in_memory = alphafbsd_return_in_memory;
138e7be5
MK
110 tdep->sc_pc_offset = 288;
111 tdep->sc_regs_offset = 24;
112 tdep->sc_fpregs_offset = 320;
accc6d1f
JT
113
114 tdep->jb_pc = 2;
115 tdep->jb_elt_size = 8;
82a4efa1 116}
138e7be5
MK
117\f
118
119/* Provide a prototype to silence -Wmissing-prototypes. */
120void _initialize_alphafbsd_tdep (void);
82a4efa1
JT
121
122void
123_initialize_alphafbsd_tdep (void)
124{
05816f70 125 gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_FREEBSD_ELF,
70f80edf 126 alphafbsd_init_abi);
82a4efa1 127}