* trad-frame.c (struct trad_frame_cache): Rename next_frame to this_frame.
[deliverable/binutils-gdb.git] / gdb / i386-sol2-tdep.c
CommitLineData
8201327c 1/* Target-dependent code for Solaris x86.
911bc6ee 2
9b254dd1
DJ
3 Copyright (C) 2002, 2003, 2004, 2006, 2007, 2008
4 Free Software Foundation, Inc.
8201327c
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
8201327c
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/>. */
8201327c
MK
20
21#include "defs.h"
52e9098c 22#include "value.h"
4be87837 23#include "osabi.h"
8201327c 24
d9f8c85b
MK
25#include "gdb_string.h"
26
081bf9da 27#include "sol2-tdep.h"
8201327c 28#include "i386-tdep.h"
75f501b5 29#include "solib-svr4.h"
8201327c 30
6a9756ed
MK
31/* From <ia32/sys/reg.h>. */
32static int i386_sol2_gregset_reg_offset[] =
33{
34 11 * 4, /* %eax */
35 10 * 4, /* %ecx */
36 9 * 4, /* %edx */
37 8 * 4, /* %ebx */
38 17 * 4, /* %esp */
39 6 * 4, /* %ebp */
40 5 * 4, /* %esi */
41 4 * 4, /* %edi */
42 14 * 4, /* %eip */
43 16 * 4, /* %eflags */
44 15 * 4, /* %cs */
45 18 * 4, /* %ss */
46 3 * 4, /* %ds */
47 2 * 4, /* %es */
48 1 * 4, /* %fs */
49 0 * 4 /* %gs */
50};
51
d9f8c85b
MK
52/* Return whether the frame preceding NEXT_FRAME corresponds to a
53 Solaris sigtramp routine. */
54
8201327c 55static int
911bc6ee 56i386_sol2_sigtramp_p (struct frame_info *next_frame)
8201327c 57{
911bc6ee 58 CORE_ADDR pc = frame_pc_unwind (next_frame);
d9f8c85b 59 char *name;
911bc6ee 60
d9f8c85b
MK
61 find_pc_partial_function (pc, &name, NULL, NULL);
62 return (name && (strcmp ("sigacthandler", name) == 0
63 || strcmp (name, "ucbsigvechandler") == 0));
8201327c
MK
64}
65
8349554d
MK
66/* Solaris doesn't have a `struct sigcontext', but it does have a
67 `mcontext_t' that contains the saved set of machine registers. */
68
69static CORE_ADDR
70i386_sol2_mcontext_addr (struct frame_info *next_frame)
71{
72 CORE_ADDR sp, ucontext_addr;
73
74 sp = frame_unwind_register_unsigned (next_frame, I386_ESP_REGNUM);
75 ucontext_addr = get_frame_memory_unsigned (next_frame, sp + 8, 4);
76
77 return ucontext_addr + 36;
78}
79
149ad273
UW
80/* SunPRO encodes the static variables. This is not related to C++
81 mangling, it is done for C too. */
82
83static char *
84i386_sol2_static_transform_name (char *name)
85{
86 char *p;
87 if (name[0] == '.')
88 {
89 /* For file-local statics there will be a period, a bunch of
90 junk (the contents of which match a string given in the
91 N_OPT), a period and the name. For function-local statics
92 there will be a bunch of junk (which seems to change the
93 second character from 'A' to 'B'), a period, the name of the
94 function, and the name. So just skip everything before the
95 last period. */
96 p = strrchr (name, '.');
97 if (p != NULL)
98 name = p + 1;
99 }
100 return name;
101}
102
8201327c
MK
103/* Solaris 2. */
104
105static void
106i386_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
107{
108 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
109
110 /* Solaris is SVR4-based. */
111 i386_svr4_init_abi (info, gdbarch);
112
203c3895
UW
113 /* The SunPRO compiler puts out 0 instead of the address in N_SO symbols,
114 and for SunPRO 3.0, N_FUN symbols too. */
115 set_gdbarch_sofun_address_maybe_missing (gdbarch, 1);
116
149ad273
UW
117 /* Handle SunPRO encoding of static symbols. */
118 set_gdbarch_static_transform_name (gdbarch, i386_sol2_static_transform_name);
119
6a9756ed
MK
120 /* Solaris reserves space for its FPU emulator in `fpregset_t'.
121 There is also some space reserved for the registers of a Weitek
122 math coprocessor. */
123 tdep->gregset_reg_offset = i386_sol2_gregset_reg_offset;
124 tdep->gregset_num_regs = ARRAY_SIZE (i386_sol2_gregset_reg_offset);
125 tdep->sizeof_gregset = 19 * 4;
126 tdep->sizeof_fpregset = 380;
127
911bc6ee
MK
128 /* Signal trampolines are slightly different from SVR4. */
129 tdep->sigtramp_p = i386_sol2_sigtramp_p;
8349554d
MK
130 tdep->sigcontext_addr = i386_sol2_mcontext_addr;
131 tdep->sc_reg_offset = tdep->gregset_reg_offset;
132 tdep->sc_num_regs = tdep->gregset_num_regs;
75f501b5 133
081bf9da
MK
134 /* Solaris has SVR4-style shared libraries. */
135 set_gdbarch_skip_solib_resolver (gdbarch, sol2_skip_solib_resolver);
75f501b5
MK
136 set_solib_svr4_fetch_link_map_offsets
137 (gdbarch, svr4_ilp32_fetch_link_map_offsets);
8201327c
MK
138}
139\f
140
6e157172
MK
141static enum gdb_osabi
142i386_sol2_osabi_sniffer (bfd *abfd)
143{
144 /* If we have a section named .SUNW_version, then it is almost
145 certainly Solaris 2. */
146 if (bfd_get_section_by_name (abfd, ".SUNW_version"))
147 return GDB_OSABI_SOLARIS;
148
149 return GDB_OSABI_UNKNOWN;
150}
151
8201327c
MK
152/* Provide a prototype to silence -Wmissing-prototypes. */
153void _initialize_i386_sol2_tdep (void);
154
155void
156_initialize_i386_sol2_tdep (void)
157{
0c52bd59 158 /* Register an ELF OS ABI sniffer for Solaris 2 binaries. */
6e157172
MK
159 gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_elf_flavour,
160 i386_sol2_osabi_sniffer);
161
05816f70 162 gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_SOLARIS,
8201327c
MK
163 i386_sol2_init_abi);
164}
This page took 0.464027 seconds and 4 git commands to generate.