daily update
[deliverable/binutils-gdb.git] / gdb / corelow.c
CommitLineData
c906108c 1/* Core dump and executable file functions below target vector, for GDB.
4646aa9d 2
6aba47ca 3 Copyright (C) 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
9b254dd1 4 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008
961cb7b5 5 Free Software Foundation, Inc.
c906108c 6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
c5aa993b 12 (at your option) any later version.
c906108c 13
c5aa993b
JM
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
c906108c 18
c5aa993b 19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22#include "defs.h"
0e24ac5d 23#include "arch-utils.h"
c906108c
SS
24#include "gdb_string.h"
25#include <errno.h>
26#include <signal.h>
27#include <fcntl.h>
fc24370e
MS
28#ifdef HAVE_SYS_FILE_H
29#include <sys/file.h> /* needed for F_OK and friends */
30#endif
c5aa993b 31#include "frame.h" /* required by inferior.h */
c906108c
SS
32#include "inferior.h"
33#include "symtab.h"
34#include "command.h"
35#include "bfd.h"
36#include "target.h"
37#include "gdbcore.h"
38#include "gdbthread.h"
4e052eda 39#include "regcache.h"
0e24ac5d 40#include "regset.h"
990f9fe3 41#include "symfile.h"
4646aa9d 42#include "exec.h"
dbda9972 43#include "readline/readline.h"
0e24ac5d 44#include "gdb_assert.h"
60250e8b 45#include "exceptions.h"
a77053c2 46#include "solib.h"
f90c07ac 47#include "filenames.h"
0e24ac5d 48
8e860359 49
ee28ca0f
AC
50#ifndef O_LARGEFILE
51#define O_LARGEFILE 0
52#endif
53
00e32a35
AC
54/* List of all available core_fns. On gdb startup, each core file
55 register reader calls deprecated_add_core_fns() to register
56 information on each core format it is prepared to read. */
c906108c
SS
57
58static struct core_fns *core_file_fns = NULL;
59
2acceee2
JM
60/* The core_fns for a core file handler that is prepared to read the core
61 file currently open on core_bfd. */
62
63static struct core_fns *core_vec = NULL;
64
0e24ac5d
MK
65/* FIXME: kettenis/20031023: Eventually this variable should
66 disappear. */
67
68struct gdbarch *core_gdbarch = NULL;
69
a14ed312 70static void core_files_info (struct target_ops *);
c906108c 71
a14ed312 72static struct core_fns *sniff_core_bfd (bfd *);
2acceee2 73
020cc13c 74static int gdb_check_format (bfd *);
2acceee2 75
a14ed312 76static void core_open (char *, int);
c906108c 77
a14ed312 78static void core_detach (char *, int);
c906108c 79
a14ed312 80static void core_close (int);
c906108c 81
74b7792f
AC
82static void core_close_cleanup (void *ignore);
83
56be3814 84static void get_core_registers (struct regcache *, int);
c906108c 85
4efb68b1 86static void add_to_thread_list (bfd *, asection *, void *);
c906108c 87
39f77062 88static int core_file_thread_alive (ptid_t tid);
c906108c 89
a14ed312 90static void init_core_ops (void);
c906108c 91
a14ed312 92void _initialize_corelow (void);
c906108c
SS
93
94struct target_ops core_ops;
95
96/* Link a new core_fns into the global core_file_fns list. Called on gdb
97 startup by the _initialize routine in each core file register reader, to
98 register information about each format the the reader is prepared to
99 handle. */
100
101void
00e32a35 102deprecated_add_core_fns (struct core_fns *cf)
c906108c 103{
c5aa993b 104 cf->next = core_file_fns;
c906108c
SS
105 core_file_fns = cf;
106}
107
2acceee2
JM
108/* The default function that core file handlers can use to examine a
109 core file BFD and decide whether or not to accept the job of
110 reading the core file. */
111
112int
fba45db2 113default_core_sniffer (struct core_fns *our_fns, bfd *abfd)
2acceee2
JM
114{
115 int result;
116
117 result = (bfd_get_flavour (abfd) == our_fns -> core_flavour);
118 return (result);
119}
120
121/* Walk through the list of core functions to find a set that can
122 handle the core file open on ABFD. Default to the first one in the
ee923081 123 list if nothing matches. Returns pointer to set that is
2acceee2
JM
124 selected. */
125
126static struct core_fns *
fba45db2 127sniff_core_bfd (bfd *abfd)
2acceee2
JM
128{
129 struct core_fns *cf;
130 struct core_fns *yummy = NULL;
131 int matches = 0;;
132
0e24ac5d
MK
133 /* Don't sniff if we have support for register sets in CORE_GDBARCH. */
134 if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
135 return NULL;
136
2acceee2
JM
137 for (cf = core_file_fns; cf != NULL; cf = cf->next)
138 {
139 if (cf->core_sniffer (cf, abfd))
140 {
141 yummy = cf;
142 matches++;
143 }
144 }
145 if (matches > 1)
146 {
8a3fe4f8 147 warning (_("\"%s\": ambiguous core format, %d handlers match"),
2acceee2
JM
148 bfd_get_filename (abfd), matches);
149 }
150 else if (matches == 0)
151 {
8a3fe4f8 152 warning (_("\"%s\": no core file handler recognizes format, using default"),
2acceee2
JM
153 bfd_get_filename (abfd));
154 }
155 if (yummy == NULL)
156 {
157 yummy = core_file_fns;
158 }
159 return (yummy);
160}
161
162/* The default is to reject every core file format we see. Either
163 BFD has to recognize it, or we have to provide a function in the
164 core file handler that recognizes it. */
165
166int
fba45db2 167default_check_format (bfd *abfd)
2acceee2
JM
168{
169 return (0);
170}
171
172/* Attempt to recognize core file formats that BFD rejects. */
173
020cc13c 174static int
fba45db2 175gdb_check_format (bfd *abfd)
2acceee2
JM
176{
177 struct core_fns *cf;
178
179 for (cf = core_file_fns; cf != NULL; cf = cf->next)
180 {
181 if (cf->check_format (abfd))
182 {
81a9a963 183 return (1);
2acceee2
JM
184 }
185 }
81a9a963 186 return (0);
2acceee2 187}
c906108c
SS
188
189/* Discard all vestiges of any previous core file and mark data and stack
190 spaces as empty. */
191
c906108c 192static void
fba45db2 193core_close (int quitting)
c906108c
SS
194{
195 char *name;
196
197 if (core_bfd)
198 {
39f77062 199 inferior_ptid = null_ptid; /* Avoid confusion from thread stuff */
c906108c 200
7a292a7a 201 /* Clear out solib state while the bfd is still open. See
c5aa993b 202 comments in clear_solib in solib.c. */
a77053c2 203 clear_solib ();
7a292a7a 204
c906108c
SS
205 name = bfd_get_filename (core_bfd);
206 if (!bfd_close (core_bfd))
8a3fe4f8 207 warning (_("cannot close \"%s\": %s"),
c906108c 208 name, bfd_errmsg (bfd_get_error ()));
b8c9b27d 209 xfree (name);
c906108c 210 core_bfd = NULL;
c906108c
SS
211 if (core_ops.to_sections)
212 {
b8c9b27d 213 xfree (core_ops.to_sections);
c906108c
SS
214 core_ops.to_sections = NULL;
215 core_ops.to_sections_end = NULL;
216 }
217 }
2acceee2 218 core_vec = NULL;
0e24ac5d 219 core_gdbarch = NULL;
c906108c
SS
220}
221
74b7792f
AC
222static void
223core_close_cleanup (void *ignore)
224{
225 core_close (0/*ignored*/);
226}
227
c906108c
SS
228/* Look for sections whose names start with `.reg/' so that we can extract the
229 list of threads in a core file. */
230
231static void
4efb68b1 232add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg)
c906108c 233{
0de3b513 234 ptid_t ptid;
c906108c
SS
235 int thread_id;
236 asection *reg_sect = (asection *) reg_sect_arg;
237
238 if (strncmp (bfd_section_name (abfd, asect), ".reg/", 5) != 0)
239 return;
240
241 thread_id = atoi (bfd_section_name (abfd, asect) + 5);
242
0de3b513
PA
243 ptid = ptid_build (ptid_get_pid (inferior_ptid), thread_id, 0);
244
245 if (ptid_get_lwp (inferior_ptid) == 0)
246 /* The main thread has already been added before getting here, and
247 this is the first time we hear about a thread id. Assume this
248 is the main thread. */
249 thread_change_ptid (inferior_ptid, ptid);
250 else
251 /* Nope, really a new thread. */
252 add_thread (ptid);
c906108c
SS
253
254/* Warning, Will Robinson, looking at BFD private data! */
255
256 if (reg_sect != NULL
c5aa993b 257 && asect->filepos == reg_sect->filepos) /* Did we find .reg? */
0de3b513 258 inferior_ptid = ptid; /* Yes, make it current */
c906108c
SS
259}
260
261/* This routine opens and sets up the core file bfd. */
262
263static void
fba45db2 264core_open (char *filename, int from_tty)
c906108c
SS
265{
266 const char *p;
267 int siggy;
268 struct cleanup *old_chain;
269 char *temp;
270 bfd *temp_bfd;
c906108c 271 int scratch_chan;
ee28ca0f 272 int flags;
0de3b513
PA
273 /* An arbitrary identifier for the core inferior. */
274 int corelow_pid = 1;
c906108c
SS
275
276 target_preopen (from_tty);
277 if (!filename)
278 {
8a3fe4f8
AC
279 if (core_bfd)
280 error (_("No core file specified. (Use `detach' to stop debugging a core file.)"));
281 else
282 error (_("No core file specified."));
c906108c
SS
283 }
284
285 filename = tilde_expand (filename);
f90c07ac 286 if (!IS_ABSOLUTE_PATH(filename))
c906108c 287 {
1754f103 288 temp = concat (current_directory, "/", filename, (char *)NULL);
b8c9b27d 289 xfree (filename);
c906108c
SS
290 filename = temp;
291 }
292
b8c9b27d 293 old_chain = make_cleanup (xfree, filename);
c906108c 294
ee28ca0f
AC
295 flags = O_BINARY | O_LARGEFILE;
296 if (write_files)
297 flags |= O_RDWR;
298 else
299 flags |= O_RDONLY;
300 scratch_chan = open (filename, flags, 0);
c906108c
SS
301 if (scratch_chan < 0)
302 perror_with_name (filename);
303
9f76c2cd
MM
304 temp_bfd = bfd_fopen (filename, gnutarget,
305 write_files ? FOPEN_RUB : FOPEN_RB,
306 scratch_chan);
c906108c
SS
307 if (temp_bfd == NULL)
308 perror_with_name (filename);
309
2acceee2
JM
310 if (!bfd_check_format (temp_bfd, bfd_core) &&
311 !gdb_check_format (temp_bfd))
c906108c
SS
312 {
313 /* Do it after the err msg */
314 /* FIXME: should be checking for errors from bfd_close (for one thing,
c5aa993b
JM
315 on error it does not free all the storage associated with the
316 bfd). */
5c65bbb6 317 make_cleanup_bfd_close (temp_bfd);
8a3fe4f8 318 error (_("\"%s\" is not a core dump: %s"),
c906108c
SS
319 filename, bfd_errmsg (bfd_get_error ()));
320 }
321
322 /* Looks semi-reasonable. Toss the old core file and work on the new. */
323
c5aa993b 324 discard_cleanups (old_chain); /* Don't free filename any more */
c906108c
SS
325 unpush_target (&core_ops);
326 core_bfd = temp_bfd;
74b7792f 327 old_chain = make_cleanup (core_close_cleanup, 0 /*ignore*/);
c906108c 328
0e24ac5d
MK
329 /* FIXME: kettenis/20031023: This is very dangerous. The
330 CORE_GDBARCH that results from this call may very well be
331 different from CURRENT_GDBARCH. However, its methods may only
332 work if it is selected as the current architecture, because they
333 rely on swapped data (see gdbarch.c). We should get rid of that
334 swapped data. */
335 core_gdbarch = gdbarch_from_bfd (core_bfd);
336
2acceee2
JM
337 /* Find a suitable core file handler to munch on core_bfd */
338 core_vec = sniff_core_bfd (core_bfd);
339
c906108c
SS
340 validate_files ();
341
342 /* Find the data section */
343 if (build_section_table (core_bfd, &core_ops.to_sections,
344 &core_ops.to_sections_end))
8a3fe4f8 345 error (_("\"%s\": Can't find sections: %s"),
c906108c
SS
346 bfd_get_filename (core_bfd), bfd_errmsg (bfd_get_error ()));
347
2f1b5984
MK
348 /* If we have no exec file, try to set the architecture from the
349 core file. We don't do this unconditionally since an exec file
350 typically contains more information that helps us determine the
351 architecture than a core file. */
352 if (!exec_bfd)
353 set_gdbarch_from_file (core_bfd);
cbda0a99 354
87ab71f0 355 push_target (&core_ops);
c906108c
SS
356 discard_cleanups (old_chain);
357
0de3b513
PA
358 /* Do this before acknowledging the inferior, so if
359 post_create_inferior throws (can happen easilly if you're loading
360 a core file with the wrong exec), we aren't left with threads
361 from the previous inferior. */
362 init_thread_list ();
363
364 /* Set INFERIOR_PTID early, so an upper layer can rely on it being
365 set while in the target_find_new_threads call below. */
366 inferior_ptid = pid_to_ptid (corelow_pid);
367
368 /* Assume ST --- Add a main task. We'll later detect when we go
369 from ST to MT. */
370 add_thread_silent (inferior_ptid);
371
20d2ca3e
AC
372 /* This is done first, before anything has a chance to query the
373 inferior for information such as symbols. */
9353355f 374 post_create_inferior (&core_ops, from_tty);
20d2ca3e 375
0de3b513
PA
376 /* Build up thread list from BFD sections, and possibly set the
377 current thread to the .reg/NN section matching the .reg
378 section. */
379 bfd_map_over_sections (core_bfd, add_to_thread_list,
380 bfd_get_section_by_name (core_bfd, ".reg"));
381
382 /* Now go through the target stack looking for threads since there
383 may be a thread_stratum target loaded on top of target core by
384 now. The layer above should claim threads found in the BFD
385 sections. */
386 target_find_new_threads ();
387
c906108c
SS
388 p = bfd_core_file_failing_command (core_bfd);
389 if (p)
a3f17187 390 printf_filtered (_("Core was generated by `%s'.\n"), p);
c906108c
SS
391
392 siggy = bfd_core_file_failing_signal (core_bfd);
393 if (siggy > 0)
8e6a3c35 394 /* NOTE: target_signal_from_host() converts a target signal value
e26cc349 395 into gdb's internal signal value. Unfortunately gdb's internal
8e6a3c35
AC
396 value is called ``target_signal'' and this function got the
397 name ..._from_host(). */
a3f17187 398 printf_filtered (_("Program terminated with signal %d, %s.\n"), siggy,
1cded358
AR
399 target_signal_to_string (
400 gdbarch_target_signal_from_host (core_gdbarch, siggy)));
c906108c 401
87ab71f0
PA
402 /* Fetch all registers from core file. */
403 target_fetch_registers (get_current_regcache (), -1);
c906108c 404
87ab71f0
PA
405 /* Now, set up the frame cache, and print the top of stack. */
406 reinit_frame_cache ();
407 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
c906108c
SS
408}
409
410static void
fba45db2 411core_detach (char *args, int from_tty)
c906108c
SS
412{
413 if (args)
8a3fe4f8 414 error (_("Too many arguments"));
c906108c
SS
415 unpush_target (&core_ops);
416 reinit_frame_cache ();
417 if (from_tty)
a3f17187 418 printf_filtered (_("No core file now.\n"));
c906108c
SS
419}
420
de57eccd
JM
421
422/* Try to retrieve registers from a section in core_bfd, and supply
423 them to core_vec->core_read_registers, as the register set numbered
424 WHICH.
425
0de3b513
PA
426 If inferior_ptid's lwp member is zero, do the single-threaded
427 thing: look for a section named NAME. If inferior_ptid's lwp
428 member is non-zero, do the multi-threaded thing: look for a section
429 named "NAME/LWP", where LWP is the shortest ASCII decimal
430 representation of inferior_ptid's lwp member.
de57eccd
JM
431
432 HUMAN_NAME is a human-readable name for the kind of registers the
433 NAME section contains, for use in error messages.
434
435 If REQUIRED is non-zero, print an error if the core file doesn't
436 have a section by the appropriate name. Otherwise, just do nothing. */
437
438static void
9eefc95f
UW
439get_core_register_section (struct regcache *regcache,
440 char *name,
de57eccd
JM
441 int which,
442 char *human_name,
443 int required)
444{
3ecda457 445 static char *section_name = NULL;
7be0c536 446 struct bfd_section *section;
de57eccd
JM
447 bfd_size_type size;
448 char *contents;
449
3ecda457 450 xfree (section_name);
0de3b513
PA
451 if (ptid_get_lwp (inferior_ptid))
452 section_name = xstrprintf ("%s/%ld", name, ptid_get_lwp (inferior_ptid));
de57eccd 453 else
3ecda457 454 section_name = xstrdup (name);
de57eccd
JM
455
456 section = bfd_get_section_by_name (core_bfd, section_name);
457 if (! section)
458 {
459 if (required)
8a3fe4f8 460 warning (_("Couldn't find %s registers in core file."), human_name);
de57eccd
JM
461 return;
462 }
463
464 size = bfd_section_size (core_bfd, section);
465 contents = alloca (size);
466 if (! bfd_get_section_contents (core_bfd, section, contents,
467 (file_ptr) 0, size))
468 {
8a3fe4f8 469 warning (_("Couldn't read %s registers from `%s' section in core file."),
de57eccd
JM
470 human_name, name);
471 return;
472 }
473
0e24ac5d
MK
474 if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
475 {
476 const struct regset *regset;
477
478 regset = gdbarch_regset_from_core_section (core_gdbarch, name, size);
479 if (regset == NULL)
480 {
481 if (required)
8a3fe4f8 482 warning (_("Couldn't recognize %s registers in core file."),
0e24ac5d
MK
483 human_name);
484 return;
485 }
486
9eefc95f 487 regset->supply_regset (regset, regcache, -1, contents, size);
0e24ac5d
MK
488 return;
489 }
490
491 gdb_assert (core_vec);
9eefc95f 492 core_vec->core_read_registers (regcache, contents, size, which,
de57eccd
JM
493 ((CORE_ADDR)
494 bfd_section_vma (core_bfd, section)));
495}
496
497
c906108c
SS
498/* Get the registers out of a core file. This is the machine-
499 independent part. Fetch_core_registers is the machine-dependent
500 part, typically implemented in the xm-file for each architecture. */
501
502/* We just get all the registers, so we don't use regno. */
503
c906108c 504static void
56be3814 505get_core_registers (struct regcache *regcache, int regno)
c906108c 506{
9c5ea4d9 507 int i;
c906108c 508
0e24ac5d
MK
509 if (!(core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
510 && (core_vec == NULL || core_vec->core_read_registers == NULL))
c906108c
SS
511 {
512 fprintf_filtered (gdb_stderr,
c5aa993b 513 "Can't fetch registers from this type of core file\n");
c906108c
SS
514 return;
515 }
516
56be3814 517 get_core_register_section (regcache,
9eefc95f 518 ".reg", 0, "general-purpose", 1);
56be3814 519 get_core_register_section (regcache,
9eefc95f 520 ".reg2", 2, "floating-point", 0);
56be3814 521 get_core_register_section (regcache,
9eefc95f 522 ".reg-xfp", 3, "extended floating-point", 0);
06caf7d2
CES
523 get_core_register_section (regcache,
524 ".reg-ppc-vmx", 3, "ppc Altivec", 0);
604c2f83
LM
525 get_core_register_section (regcache,
526 ".reg-ppc-vsx", 4, "POWER7 VSX", 0);
c906108c 527
9c5ea4d9 528 /* Supply dummy value for all registers not found in the core. */
13b8769f 529 for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
9c5ea4d9
UW
530 if (!regcache_valid_p (regcache, i))
531 regcache_raw_supply (regcache, i, NULL);
c906108c
SS
532}
533
c906108c 534static void
fba45db2 535core_files_info (struct target_ops *t)
c906108c
SS
536{
537 print_section_info (t, core_bfd);
538}
e2544d02
RM
539\f
540static LONGEST
541core_xfer_partial (struct target_ops *ops, enum target_object object,
961cb7b5
MK
542 const char *annex, gdb_byte *readbuf,
543 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
e2544d02
RM
544{
545 switch (object)
546 {
547 case TARGET_OBJECT_MEMORY:
548 if (readbuf)
7160c4c3 549 return (*ops->deprecated_xfer_memory) (offset, readbuf,
662fb31b 550 len, 0/*read*/, NULL, ops);
e2544d02 551 if (writebuf)
7160c4c3
PA
552 return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf,
553 len, 1/*write*/, NULL, ops);
e2544d02
RM
554 return -1;
555
556 case TARGET_OBJECT_AUXV:
557 if (readbuf)
558 {
559 /* When the aux vector is stored in core file, BFD
560 represents this with a fake section called ".auxv". */
561
c4c5b7ba 562 struct bfd_section *section;
e2544d02
RM
563 bfd_size_type size;
564 char *contents;
565
566 section = bfd_get_section_by_name (core_bfd, ".auxv");
567 if (section == NULL)
568 return -1;
569
570 size = bfd_section_size (core_bfd, section);
571 if (offset >= size)
572 return 0;
573 size -= offset;
574 if (size > len)
575 size = len;
403e1656
MK
576 if (size > 0
577 && !bfd_get_section_contents (core_bfd, section, readbuf,
578 (file_ptr) offset, size))
e2544d02 579 {
8a3fe4f8 580 warning (_("Couldn't read NT_AUXV note in core file."));
e2544d02
RM
581 return -1;
582 }
583
584 return size;
585 }
586 return -1;
587
403e1656
MK
588 case TARGET_OBJECT_WCOOKIE:
589 if (readbuf)
590 {
591 /* When the StackGhost cookie is stored in core file, BFD
592 represents this with a fake section called ".wcookie". */
593
594 struct bfd_section *section;
595 bfd_size_type size;
596 char *contents;
597
598 section = bfd_get_section_by_name (core_bfd, ".wcookie");
599 if (section == NULL)
600 return -1;
601
602 size = bfd_section_size (core_bfd, section);
603 if (offset >= size)
604 return 0;
605 size -= offset;
606 if (size > len)
607 size = len;
608 if (size > 0
609 && !bfd_get_section_contents (core_bfd, section, readbuf,
610 (file_ptr) offset, size))
611 {
8a3fe4f8 612 warning (_("Couldn't read StackGhost cookie in core file."));
403e1656
MK
613 return -1;
614 }
615
616 return size;
617 }
618 return -1;
619
de584861
PA
620 case TARGET_OBJECT_LIBRARIES:
621 if (core_gdbarch
622 && gdbarch_core_xfer_shared_libraries_p (core_gdbarch))
623 {
624 if (writebuf)
625 return -1;
626 return
627 gdbarch_core_xfer_shared_libraries (core_gdbarch,
628 readbuf, offset, len);
629 }
630 /* FALL THROUGH */
631
e2544d02
RM
632 default:
633 if (ops->beneath != NULL)
634 return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
635 readbuf, writebuf, offset, len);
636 return -1;
637 }
638}
639
c906108c
SS
640\f
641/* If mourn is being called in all the right places, this could be say
642 `gdb internal error' (since generic_mourn calls breakpoint_init_inferior). */
643
644static int
8181d85f 645ignore (struct bp_target_info *bp_tgt)
c906108c
SS
646{
647 return 0;
648}
649
650
651/* Okay, let's be honest: threads gleaned from a core file aren't
652 exactly lively, are they? On the other hand, if we don't claim
653 that each & every one is alive, then we don't get any of them
654 to appear in an "info thread" command, which is quite a useful
655 behaviour.
c5aa993b 656 */
c906108c 657static int
39f77062 658core_file_thread_alive (ptid_t tid)
c906108c
SS
659{
660 return 1;
661}
662
4eb0ad19
DJ
663/* Ask the current architecture what it knows about this core file.
664 That will be used, in turn, to pick a better architecture. This
665 wrapper could be avoided if targets got a chance to specialize
666 core_ops. */
667
668static const struct target_desc *
669core_read_description (struct target_ops *target)
670{
671 if (gdbarch_core_read_description_p (current_gdbarch))
672 return gdbarch_core_read_description (current_gdbarch, target, core_bfd);
673
674 return NULL;
675}
676
0de3b513
PA
677static char *
678core_pid_to_str (ptid_t ptid)
679{
680 static char buf[64];
681
682 if (ptid_get_lwp (ptid) == 0)
683 xsnprintf (buf, sizeof buf, "<main task>");
684 else
685 xsnprintf (buf, sizeof buf, "Thread %ld", ptid_get_lwp (ptid));
686
687 return buf;
688}
689
c906108c
SS
690/* Fill in core_ops with its defined operations and properties. */
691
692static void
fba45db2 693init_core_ops (void)
c906108c
SS
694{
695 core_ops.to_shortname = "core";
696 core_ops.to_longname = "Local core dump file";
697 core_ops.to_doc =
698 "Use a core file as a target. Specify the filename of the core file.";
699 core_ops.to_open = core_open;
700 core_ops.to_close = core_close;
701 core_ops.to_attach = find_default_attach;
c906108c 702 core_ops.to_detach = core_detach;
c906108c 703 core_ops.to_fetch_registers = get_core_registers;
e2544d02 704 core_ops.to_xfer_partial = core_xfer_partial;
c8e73a31 705 core_ops.deprecated_xfer_memory = xfer_memory;
c906108c
SS
706 core_ops.to_files_info = core_files_info;
707 core_ops.to_insert_breakpoint = ignore;
708 core_ops.to_remove_breakpoint = ignore;
709 core_ops.to_create_inferior = find_default_create_inferior;
c906108c 710 core_ops.to_thread_alive = core_file_thread_alive;
4eb0ad19 711 core_ops.to_read_description = core_read_description;
0de3b513 712 core_ops.to_pid_to_str = core_pid_to_str;
c906108c
SS
713 core_ops.to_stratum = core_stratum;
714 core_ops.to_has_memory = 1;
715 core_ops.to_has_stack = 1;
716 core_ops.to_has_registers = 1;
c5aa993b 717 core_ops.to_magic = OPS_MAGIC;
c906108c
SS
718}
719
720/* non-zero if we should not do the add_target call in
721 _initialize_corelow; not initialized (i.e., bss) so that
722 the target can initialize it (i.e., data) if appropriate.
723 This needs to be set at compile time because we don't know
724 for sure whether the target's initialize routine is called
725 before us or after us. */
726int coreops_suppress_target;
727
728void
fba45db2 729_initialize_corelow (void)
c906108c
SS
730{
731 init_core_ops ();
732
733 if (!coreops_suppress_target)
734 add_target (&core_ops);
735}
This page took 0.562133 seconds and 4 git commands to generate.