* alphafbsd-tdep.c: Update for unwinder changes.
[deliverable/binutils-gdb.git] / gdb / alphafbsd-tdep.c
CommitLineData
4b17b389
MK
1/* Target-dependent code for FreeBSD/alpha.
2
9b254dd1
DJ
3 Copyright (C) 2001, 2002, 2003, 2006, 2007, 2008
4 Free Software Foundation, Inc.
efd59e3f
MK
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
efd59e3f
MK
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
efd59e3f
MK
20
21#include "defs.h"
22#include "value.h"
4be87837 23#include "osabi.h"
efd59e3f 24
82a4efa1 25#include "alpha-tdep.h"
4b17b389 26#include "solib-svr4.h"
82a4efa1
JT
27
28static int
9823e921 29alphafbsd_return_in_memory (struct type *type)
efd59e3f
MK
30{
31 enum type_code code;
32 int i;
33
34 /* All aggregate types that won't fit in a register must be returned
35 in memory. */
138e7be5 36 if (TYPE_LENGTH (type) > ALPHA_REGISTER_SIZE)
efd59e3f
MK
37 return 1;
38
39 /* The only aggregate types that can be returned in a register are
40 structs and unions. Arrays must be returned in memory. */
41 code = TYPE_CODE (type);
42 if (code != TYPE_CODE_STRUCT && code != TYPE_CODE_UNION)
43 return 1;
44
45 /* We need to check if this struct/union is "integer" like. For
46 this to be true, the offset of each adressable subfield must be
47 zero. Note that bit fields are not addressable. */
48 for (i = 0; i < TYPE_NFIELDS (type); i++)
49 {
50 /* If the field bitsize is non-zero, it isn't adressable. */
51 if (TYPE_FIELD_BITPOS (type, i) != 0
52 && TYPE_FIELD_BITSIZE (type, i) == 0)
53 return 1;
54 }
55
56 return 0;
57}
138e7be5
MK
58\f
59
60/* Support for signal handlers. */
61
62/* Return whether PC is in a BSD sigtramp routine. */
63
64CORE_ADDR alphafbsd_sigtramp_start = 0x11ffff68;
65CORE_ADDR alphafbsd_sigtramp_end = 0x11ffffe0;
82a4efa1 66
6c72f9f9
JT
67static int
68alphafbsd_pc_in_sigtramp (CORE_ADDR pc, char *func_name)
69{
138e7be5 70 return (pc >= alphafbsd_sigtramp_start && pc < alphafbsd_sigtramp_end);
6c72f9f9
JT
71}
72
138e7be5
MK
73static LONGEST
74alphafbsd_sigtramp_offset (CORE_ADDR pc)
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}
This page took 0.850765 seconds and 4 git commands to generate.