gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / i386-windows-tdep.c
CommitLineData
5982a56a
SM
1/* Target-dependent code for Windows (including Cygwin) running on i386's,
2 for GDB.
acd5c798 3
b811d2c2 4 Copyright (C) 2003-2020 Free Software Foundation, Inc.
1762d96d 5
acd5c798 6 This file is part of GDB.
1762d96d 7
acd5c798
MK
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
acd5c798 11 (at your option) any later version.
1762d96d 12
acd5c798
MK
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.
1762d96d 17
acd5c798 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/>. */
1762d96d
CV
20
21#include "defs.h"
1762d96d 22#include "osabi.h"
acd5c798 23#include "i386-tdep.h"
31b060a2 24#include "windows-tdep.h"
de584861
PA
25#include "regset.h"
26#include "gdb_obstack.h"
27#include "xml-support.h"
28#include "gdbcore.h"
a5ee0f0c 29#include "inferior.h"
de584861
PA
30
31/* Core file support. */
32
33/* This vector maps GDB's idea of a register's number into an address
dc05df57 34 in the windows exception context vector. */
de584861 35
dc05df57 36static int i386_windows_gregset_reg_offset[] =
de584861
PA
37{
38 176, /* eax */
39 172, /* ecx */
40 168, /* edx */
41 164, /* ebx */
42
43 196, /* esp */
44 180, /* ebp */
45 160, /* esi */
46 156, /* edi */
47
48 184, /* eip */
49 192, /* eflags */
50 188, /* cs */
51 200, /* ss */
52
53 152, /* ds */
54 148, /* es */
55 144, /* fs */
56 140, /* gs */
57
58 56, /* FloatSave.RegisterArea[0 * 10] */
59 66, /* FloatSave.RegisterArea[1 * 10] */
60 76, /* FloatSave.RegisterArea[2 * 10] */
61 86, /* FloatSave.RegisterArea[3 * 10] */
62 96, /* FloatSave.RegisterArea[4 * 10] */
63 106, /* FloatSave.RegisterArea[5 * 10] */
64 116, /* FloatSave.RegisterArea[6 * 10] */
65 126, /* FloatSave.RegisterArea[7 * 10] */
66
67 28, /* FloatSave.ControlWord */
68 32, /* FloatSave.StatusWord */
69 36, /* FloatSave.TagWord */
70 44, /* FloatSave.ErrorSelector */
71 40, /* FloatSave.ErrorOffset */
72 52, /* FloatSave.DataSelector */
73 48, /* FloatSave.DataOffset */
74 44, /* FloatSave.ErrorSelector */
75
76 /* XMM0-7 */
77 364, /* ExtendedRegisters[10*16] */
78 380, /* ExtendedRegisters[11*16] */
79 396, /* ExtendedRegisters[12*16] */
80 412, /* ExtendedRegisters[13*16] */
81 428, /* ExtendedRegisters[14*16] */
82 444, /* ExtendedRegisters[15*16] */
83 460, /* ExtendedRegisters[16*16] */
84 476, /* ExtendedRegisters[17*16] */
85
86 /* MXCSR */
87 228 /* ExtendedRegisters[24] */
88};
89
dc05df57 90#define I386_WINDOWS_SIZEOF_GREGSET 716
de584861 91
de584861
PA
92struct cpms_data
93{
5af949e3 94 struct gdbarch *gdbarch;
de584861
PA
95 struct obstack *obstack;
96 int module_count;
97};
98
99static void
100core_process_module_section (bfd *abfd, asection *sect, void *obj)
101{
9a3c8263 102 struct cpms_data *data = (struct cpms_data *) obj;
e17a4113 103 enum bfd_endian byte_order = gdbarch_byte_order (data->gdbarch);
de584861
PA
104
105 char *module_name;
106 size_t module_name_size;
107 CORE_ADDR base_addr;
108
001f13d8 109 gdb_byte *buf = NULL;
de584861 110
61012eef 111 if (!startswith (sect->name, ".module"))
de584861
PA
112 return;
113
fd361982 114 buf = (gdb_byte *) xmalloc (bfd_section_size (sect) + 1);
de584861
PA
115 if (!buf)
116 {
117 printf_unfiltered ("memory allocation failed for %s\n", sect->name);
118 goto out;
119 }
120 if (!bfd_get_section_contents (abfd, sect,
fd361982 121 buf, 0, bfd_section_size (sect)))
de584861
PA
122 goto out;
123
124
125
dc05df57 126 /* A DWORD (data_type) followed by struct windows_core_module_info. */
de584861
PA
127
128 base_addr =
e17a4113 129 extract_unsigned_integer (buf + 4, 4, byte_order);
de584861
PA
130
131 module_name_size =
e17a4113 132 extract_unsigned_integer (buf + 8, 4, byte_order);
de584861 133
fd361982 134 if (12 + module_name_size > bfd_section_size (sect))
de584861 135 goto out;
001f13d8 136 module_name = (char *) buf + 12;
de584861
PA
137
138 /* The first module is the .exe itself. */
139 if (data->module_count != 0)
5af949e3 140 windows_xfer_shared_library (module_name, base_addr,
c162ed3e 141 NULL, data->gdbarch, data->obstack);
de584861
PA
142 data->module_count++;
143
144out:
84d53fa9 145 xfree (buf);
de584861
PA
146 return;
147}
148
c09f20e4 149static ULONGEST
dc05df57 150windows_core_xfer_shared_libraries (struct gdbarch *gdbarch,
de584861 151 gdb_byte *readbuf,
7ec1862d 152 ULONGEST offset, ULONGEST len)
de584861
PA
153{
154 struct obstack obstack;
155 const char *buf;
c09f20e4 156 ULONGEST len_avail;
5af949e3 157 struct cpms_data data = { gdbarch, &obstack, 0 };
de584861
PA
158
159 obstack_init (&obstack);
160 obstack_grow_str (&obstack, "<library-list>\n");
161 bfd_map_over_sections (core_bfd,
162 core_process_module_section,
163 &data);
164 obstack_grow_str0 (&obstack, "</library-list>\n");
165
224c3ddb 166 buf = (const char *) obstack_finish (&obstack);
de584861
PA
167 len_avail = strlen (buf);
168 if (offset >= len_avail)
169 return 0;
170
171 if (len > len_avail - offset)
172 len = len_avail - offset;
173 memcpy (readbuf, buf + offset, len);
174
175 obstack_free (&obstack, NULL);
176 return len;
177}
1762d96d 178
a5ee0f0c
PA
179/* This is how we want PTIDs from core files to be printed. */
180
a068643d 181static std::string
a5ee0f0c
PA
182i386_windows_core_pid_to_str (struct gdbarch *gdbarch, ptid_t ptid)
183{
e38504b3 184 if (ptid.lwp () != 0)
a068643d 185 return string_printf ("Thread 0x%lx", ptid.lwp ());
a5ee0f0c
PA
186
187 return normal_pid_to_str (ptid);
188}
189
f7948b5f 190static CORE_ADDR
5982a56a 191i386_windows_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
f7948b5f 192{
e17a4113 193 return i386_pe_skip_trampoline_code (frame, pc, NULL);
f7948b5f
JB
194}
195
f870a310 196static const char *
5982a56a 197i386_windows_auto_wide_charset (void)
f870a310
TT
198{
199 return "UTF-16";
200}
201
627c7fb8
HD
202/* Implement the "push_dummy_call" gdbarch method. */
203
204static CORE_ADDR
205i386_windows_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
206 struct regcache *regcache, CORE_ADDR bp_addr,
207 int nargs, struct value **args, CORE_ADDR sp,
208 function_call_return_method return_method,
209 CORE_ADDR struct_addr)
210{
211 /* For non-static member functions of 32bit Windows programs, the thiscall
212 calling convention is used, so the 'this' pointer is passed in ECX. */
213 bool thiscall = false;
214
215 struct type *type = check_typedef (value_type (function));
78134374 216 if (type->code () == TYPE_CODE_PTR)
627c7fb8
HD
217 type = check_typedef (TYPE_TARGET_TYPE (type));
218
219 /* read_subroutine_type sets for non-static member functions the
220 artificial flag of the first parameter ('this' pointer). */
78134374 221 if (type->code () == TYPE_CODE_METHOD
1f704f76 222 && type->num_fields () > 0
627c7fb8 223 && TYPE_FIELD_ARTIFICIAL (type, 0)
78134374 224 && TYPE_FIELD_TYPE (type, 0)->code () == TYPE_CODE_PTR)
627c7fb8
HD
225 thiscall = 1;
226
227 return i386_thiscall_push_dummy_call (gdbarch, function, regcache, bp_addr,
228 nargs, args, sp, return_method,
229 struct_addr, thiscall);
230}
231
0f2265e2
SM
232/* Common parts for gdbarch initialization for Windows and Cygwin on i386. */
233
1762d96d 234static void
0f2265e2 235i386_windows_init_abi_common (struct gdbarch_info info, struct gdbarch *gdbarch)
1762d96d
CV
236{
237 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
238
5982a56a 239 set_gdbarch_skip_trampoline_code (gdbarch, i386_windows_skip_trampoline_code);
f7948b5f 240
4309257c
PM
241 set_gdbarch_skip_main_prologue (gdbarch, i386_skip_main_prologue);
242
1762d96d 243 tdep->struct_return = reg_struct_return;
de584861 244
dc05df57
CF
245 tdep->gregset_reg_offset = i386_windows_gregset_reg_offset;
246 tdep->gregset_num_regs = ARRAY_SIZE (i386_windows_gregset_reg_offset);
247 tdep->sizeof_gregset = I386_WINDOWS_SIZEOF_GREGSET;
de584861 248
490496c3
AA
249 tdep->sizeof_fpregset = 0;
250
de584861 251 /* Core file support. */
de584861 252 set_gdbarch_core_xfer_shared_libraries
dc05df57 253 (gdbarch, windows_core_xfer_shared_libraries);
a5ee0f0c 254 set_gdbarch_core_pid_to_str (gdbarch, i386_windows_core_pid_to_str);
f870a310 255
5982a56a 256 set_gdbarch_auto_wide_charset (gdbarch, i386_windows_auto_wide_charset);
1762d96d
CV
257}
258
0f2265e2
SM
259/* gdbarch initialization for Windows on i386. */
260
261static void
262i386_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
263{
264 i386_windows_init_abi_common (info, gdbarch);
265 windows_init_abi (info, gdbarch);
627c7fb8
HD
266
267 set_gdbarch_push_dummy_call (gdbarch, i386_windows_push_dummy_call);
0f2265e2
SM
268}
269
270/* gdbarch initialization for Cygwin on i386. */
271
272static void
273i386_cygwin_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
274{
275 i386_windows_init_abi_common (info, gdbarch);
276 cygwin_init_abi (info, gdbarch);
277}
278
5982a56a
SM
279static gdb_osabi
280i386_windows_osabi_sniffer (bfd *abfd)
de584861 281{
1d38e9d1 282 const char *target_name = bfd_get_target (abfd);
1762d96d 283
8db52437
SM
284 if (!streq (target_name, "pei-i386"))
285 return GDB_OSABI_UNKNOWN;
053205cc 286
8db52437
SM
287 if (is_linked_with_cygwin_dll (abfd))
288 return GDB_OSABI_CYGWIN;
289
290 return GDB_OSABI_WINDOWS;
053205cc
SM
291}
292
293static enum gdb_osabi
294i386_cygwin_core_osabi_sniffer (bfd *abfd)
295{
296 const char *target_name = bfd_get_target (abfd);
1762d96d 297
c0993dbe
UW
298 /* Cygwin uses elf core dumps. Do not claim all ELF executables,
299 check whether there is a .reg section of proper size. */
de584861 300 if (strcmp (target_name, "elf32-i386") == 0)
c0993dbe
UW
301 {
302 asection *section = bfd_get_section_by_name (abfd, ".reg");
053205cc 303 if (section != nullptr
fd361982 304 && bfd_section_size (section) == I386_WINDOWS_SIZEOF_GREGSET)
c0993dbe
UW
305 return GDB_OSABI_CYGWIN;
306 }
de584861 307
1762d96d
CV
308 return GDB_OSABI_UNKNOWN;
309}
310
5982a56a 311void _initialize_i386_windows_tdep ();
1762d96d 312void
5982a56a 313_initialize_i386_windows_tdep ()
1762d96d
CV
314{
315 gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_coff_flavour,
5982a56a 316 i386_windows_osabi_sniffer);
1762d96d 317
de584861
PA
318 /* Cygwin uses elf core dumps. */
319 gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_elf_flavour,
053205cc 320 i386_cygwin_core_osabi_sniffer);
de584861 321
053205cc 322 gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_WINDOWS,
5982a56a
SM
323 i386_windows_init_abi);
324 gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_CYGWIN,
0f2265e2 325 i386_cygwin_init_abi);
1762d96d 326}
This page took 1.356333 seconds and 4 git commands to generate.