2010-04-28 Kai Tietz <kai.tietz@onevision.com>
[deliverable/binutils-gdb.git] / gdb / alphafbsd-tdep.c
CommitLineData
4b17b389
MK
1/* Target-dependent code for FreeBSD/alpha.
2
4c38e0a4 3 Copyright (C) 2001, 2002, 2003, 2006, 2007, 2008, 2009, 2010
9b254dd1 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 67static int
e17a4113
UW
68alphafbsd_pc_in_sigtramp (struct gdbarch *gdbarch,
69 CORE_ADDR pc, char *func_name)
6c72f9f9 70{
138e7be5 71 return (pc >= alphafbsd_sigtramp_start && pc < alphafbsd_sigtramp_end);
6c72f9f9
JT
72}
73
138e7be5 74static LONGEST
e17a4113 75alphafbsd_sigtramp_offset (struct gdbarch *gdbarch, CORE_ADDR pc)
138e7be5
MK
76{
77 return pc - alphafbsd_sigtramp_start;
78}
79
94afd7a6
UW
80/* Assuming THIS_FRAME is the frame of a BSD sigtramp routine,
81 return the address of the associated sigcontext structure. */
138e7be5
MK
82
83static CORE_ADDR
94afd7a6 84alphafbsd_sigcontext_addr (struct frame_info *this_frame)
138e7be5 85{
94afd7a6 86 return get_frame_register_unsigned (this_frame, ALPHA_SP_REGNUM) + 24;
138e7be5
MK
87}
88
89/* FreeBSD 5.0-RELEASE or later. */
90
82a4efa1
JT
91static void
92alphafbsd_init_abi (struct gdbarch_info info,
93 struct gdbarch *gdbarch)
94{
95 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
96
baa490c4
RH
97 /* Hook into the DWARF CFI frame unwinder. */
98 alpha_dwarf2_init_abi (info, gdbarch);
99
100 /* Hook into the MDEBUG frame unwinder. */
101 alpha_mdebug_init_abi (info, gdbarch);
102
4b17b389
MK
103 /* FreeBSD/alpha has SVR4-style shared libraries. */
104 set_solib_svr4_fetch_link_map_offsets
105 (gdbarch, svr4_lp64_fetch_link_map_offsets);
106
138e7be5
MK
107 tdep->dynamic_sigtramp_offset = alphafbsd_sigtramp_offset;
108 tdep->sigcontext_addr = alphafbsd_sigcontext_addr;
f2524b93 109 tdep->pc_in_sigtramp = alphafbsd_pc_in_sigtramp;
9823e921 110 tdep->return_in_memory = alphafbsd_return_in_memory;
138e7be5
MK
111 tdep->sc_pc_offset = 288;
112 tdep->sc_regs_offset = 24;
113 tdep->sc_fpregs_offset = 320;
accc6d1f
JT
114
115 tdep->jb_pc = 2;
116 tdep->jb_elt_size = 8;
82a4efa1 117}
138e7be5
MK
118\f
119
120/* Provide a prototype to silence -Wmissing-prototypes. */
121void _initialize_alphafbsd_tdep (void);
82a4efa1
JT
122
123void
124_initialize_alphafbsd_tdep (void)
125{
05816f70 126 gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_FREEBSD_ELF,
70f80edf 127 alphafbsd_init_abi);
82a4efa1 128}
This page took 0.515357 seconds and 4 git commands to generate.