1 /* Target-dependent code for FreeBSD/Alpha. 2 Copyright 2001, 2002, 2003 Free Software Foundation, Inc. 3 4 This file is part of GDB. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 59 Temple Place - Suite 330, 19 Boston, MA 02111-1307, USA. */ 20 21 #include "defs.h" 22 #include "value.h" 23 #include "osabi.h" 24 25 #include "alpha-tdep.h" 26 27 static int 28 alphafbsd_use_struct_convention (int gcc_p, struct type *type) 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 63 CORE_ADDR alphafbsd_sigtramp_start = 0x11ffff68; 64 CORE_ADDR alphafbsd_sigtramp_end = 0x11ffffe0; 65 66 static int 67 alphafbsd_pc_in_sigtramp (CORE_ADDR pc, char *func_name) 68 { 69 return (pc >= alphafbsd_sigtramp_start && pc < alphafbsd_sigtramp_end); 70 } 71 72 static LONGEST 73 alphafbsd_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 81 static CORE_ADDR 82 alphafbsd_sigcontext_addr (struct frame_info *next_frame) 83 { 84 return frame_unwind_register_unsigned (next_frame, ALPHA_SP_REGNUM) + 24; 85 } 86 87 /* FreeBSD 5.0-RELEASE or later. */ 88 89 static void 90 alphafbsd_init_abi (struct gdbarch_info info, 91 struct gdbarch *gdbarch) 92 { 93 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); 94 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 101 set_gdbarch_deprecated_use_struct_convention (gdbarch, alphafbsd_use_struct_convention); 102 103 tdep->dynamic_sigtramp_offset = alphafbsd_sigtramp_offset; 104 tdep->sigcontext_addr = alphafbsd_sigcontext_addr; 105 tdep->pc_in_sigtramp = alphafbsd_pc_in_sigtramp; 106 tdep->sc_pc_offset = 288; 107 tdep->sc_regs_offset = 24; 108 tdep->sc_fpregs_offset = 320; 109 110 tdep->jb_pc = 2; 111 tdep->jb_elt_size = 8; 112 } 113 114 115 /* Provide a prototype to silence -Wmissing-prototypes. */ 116 void _initialize_alphafbsd_tdep (void); 117 118 void 119 _initialize_alphafbsd_tdep (void) 120 { 121 gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_FREEBSD_ELF, 122 alphafbsd_init_abi); 123 } 124