Mark the linker's -Bsymbolic-functions test as an expected failure for MIPS targets.
[deliverable/binutils-gdb.git] / gdb / alphafbsd-tdep.c
CommitLineData
4b17b389
MK
1/* Target-dependent code for FreeBSD/alpha.
2
618f726f 3 Copyright (C) 2001-2016 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
dff2166e
AA
96 /* FIXME: Should activate generic FreeBSD support here with
97 fbsd_init_abi(), but this requires a valid
98 'iterate_over_regset_sections' gdbarch method and
99 'collect_regset' functions for each regset. */
100
baa490c4
RH
101 /* Hook into the DWARF CFI frame unwinder. */
102 alpha_dwarf2_init_abi (info, gdbarch);
103
104 /* Hook into the MDEBUG frame unwinder. */
105 alpha_mdebug_init_abi (info, gdbarch);
106
4b17b389
MK
107 /* FreeBSD/alpha has SVR4-style shared libraries. */
108 set_solib_svr4_fetch_link_map_offsets
109 (gdbarch, svr4_lp64_fetch_link_map_offsets);
110
138e7be5
MK
111 tdep->dynamic_sigtramp_offset = alphafbsd_sigtramp_offset;
112 tdep->sigcontext_addr = alphafbsd_sigcontext_addr;
f2524b93 113 tdep->pc_in_sigtramp = alphafbsd_pc_in_sigtramp;
9823e921 114 tdep->return_in_memory = alphafbsd_return_in_memory;
138e7be5
MK
115 tdep->sc_pc_offset = 288;
116 tdep->sc_regs_offset = 24;
117 tdep->sc_fpregs_offset = 320;
accc6d1f
JT
118
119 tdep->jb_pc = 2;
120 tdep->jb_elt_size = 8;
82a4efa1 121}
138e7be5
MK
122\f
123
124/* Provide a prototype to silence -Wmissing-prototypes. */
125void _initialize_alphafbsd_tdep (void);
82a4efa1
JT
126
127void
128_initialize_alphafbsd_tdep (void)
129{
05816f70 130 gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_FREEBSD_ELF,
70f80edf 131 alphafbsd_init_abi);
82a4efa1 132}
This page took 1.032772 seconds and 4 git commands to generate.