GDB (xrefs)
/tmp/gdb-7.10/gdb/alphafbsd-tdep.c
Go to the documentation of this file.
1 /* Target-dependent code for FreeBSD/alpha.
2 
3  Copyright (C) 2001-2015 Free Software Foundation, Inc.
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
9  the Free Software Foundation; either version 3 of the License, or
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
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #include "defs.h"
21 #include "value.h"
22 #include "osabi.h"
23 
24 #include "alpha-tdep.h"
25 #include "solib-svr4.h"
26 
27 static int
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. */
35  if (TYPE_LENGTH (type) > ALPHA_REGISTER_SIZE)
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 }
57 
58 
59 /* Support for signal handlers. */
60 
61 /* Return whether PC is in a BSD sigtramp routine. */
62 
65 
66 static int
68  CORE_ADDR pc, const char *func_name)
69 {
70  return (pc >= alphafbsd_sigtramp_start && pc < alphafbsd_sigtramp_end);
71 }
72 
73 static LONGEST
75 {
76  return pc - alphafbsd_sigtramp_start;
77 }
78 
79 /* Assuming THIS_FRAME is the frame of a BSD sigtramp routine,
80  return the address of the associated sigcontext structure. */
81 
82 static CORE_ADDR
84 {
85  return get_frame_register_unsigned (this_frame, ALPHA_SP_REGNUM) + 24;
86 }
87 
88 /* FreeBSD 5.0-RELEASE or later. */
89 
90 static void
92  struct gdbarch *gdbarch)
93 {
94  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
95 
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 
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 
107  /* FreeBSD/alpha has SVR4-style shared libraries. */
110 
115  tdep->sc_pc_offset = 288;
116  tdep->sc_regs_offset = 24;
117  tdep->sc_fpregs_offset = 320;
118 
119  tdep->jb_pc = 2;
120  tdep->jb_elt_size = 8;
121 }
122 
123 
124 /* Provide a prototype to silence -Wmissing-prototypes. */
125 void _initialize_alphafbsd_tdep (void);
126 
127 void
129 {
130  gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_FREEBSD_ELF,
132 }
void alpha_mdebug_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
type_code
Definition: gdbtypes.h:85
static int alphafbsd_pc_in_sigtramp(struct gdbarch *gdbarch, CORE_ADDR pc, const char *func_name)
bfd_vma CORE_ADDR
Definition: common-types.h:41
int(* return_in_memory)(struct type *type)
Definition: alpha-tdep.h:92
struct link_map_offsets * svr4_lp64_fetch_link_map_offsets(void)
Definition: solib-svr4.c:3180
LONGEST(* dynamic_sigtramp_offset)(struct gdbarch *, CORE_ADDR)
Definition: alpha-tdep.h:78
CORE_ADDR alphafbsd_sigtramp_end
static CORE_ADDR alphafbsd_sigcontext_addr(struct frame_info *this_frame)
static void alphafbsd_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
void alpha_dwarf2_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
Definition: alpha-tdep.c:1849
#define ALPHA_SP_REGNUM
Definition: alpha-tdep.h:45
struct m32c_reg * pc
Definition: m32c-tdep.c:111
CORE_ADDR(* sigcontext_addr)(struct frame_info *)
Definition: alpha-tdep.h:82
int sc_pc_offset
Definition: alpha-tdep.h:95
static int alphafbsd_return_in_memory(struct type *type)
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
Definition: gdbarch.c:1402
CORE_ADDR alphafbsd_sigtramp_start
int sc_regs_offset
Definition: alpha-tdep.h:96
void set_solib_svr4_fetch_link_map_offsets(struct gdbarch *gdbarch, struct link_map_offsets *(*flmo)(void))
Definition: solib-svr4.c:3108
Definition: gdbtypes.h:749
ULONGEST get_frame_register_unsigned(struct frame_info *frame, int regnum)
Definition: frame.c:1194
#define TYPE_FIELD_BITSIZE(thistype, n)
Definition: gdbtypes.h:1377
#define TYPE_FIELD_BITPOS(thistype, n)
Definition: gdbtypes.h:1371
size_t jb_elt_size
Definition: aarch64-tdep.h:83
static LONGEST alphafbsd_sigtramp_offset(struct gdbarch *gdbarch, CORE_ADDR pc)
int(* pc_in_sigtramp)(struct gdbarch *gdbarch, CORE_ADDR pc, const char *name)
Definition: alpha-tdep.h:88
#define TYPE_CODE(thistype)
Definition: gdbtypes.h:1240
int code
Definition: ser-unix.c:684
#define TYPE_NFIELDS(thistype)
Definition: gdbtypes.h:1241
void _initialize_alphafbsd_tdep(void)
#define TYPE_LENGTH(thistype)
Definition: gdbtypes.h:1237
#define ALPHA_REGISTER_SIZE
Definition: alpha-tdep.h:27
void gdbarch_register_osabi(enum bfd_architecture arch, unsigned long machine, enum gdb_osabi osabi, void(*init_osabi)(struct gdbarch_info, struct gdbarch *))
Definition: osabi.c:148
int sc_fpregs_offset
Definition: alpha-tdep.h:97
long long LONGEST
Definition: common-types.h:52