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