/* Dynamic architecture support for GDB, the GNU debugger.
- Copyright 1998-1999, Free Software Foundation, Inc.
+ Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of GDB.
/* Just include everything in sight so that the every old definition
of macro is visible. */
#include "gdb_string.h"
-#include <ctype.h>
#include "symtab.h"
#include "frame.h"
#include "inferior.h"
#include "gdbcore.h"
#include "gdbcmd.h"
#include "target.h"
-#include "gdbthread.h"
#include "annotate.h"
-#include "symfile.h" /* for overlay functions */
#endif
+#include "regcache.h"
#include "version.h"
#include "floatformat.h"
-/* Convenience macro for allocting typesafe memory. */
-
-#ifndef XMALLOC
-#define XMALLOC(TYPE) (TYPE*) xmalloc (sizeof (TYPE))
-#endif
-
-
/* Use the program counter to determine the contents and size
of a breakpoint instruction. If no target-dependent macro
BREAKPOINT_FROM_PC has been defined to implement this function,
else
return names[i];
#else
- internal_error ("legacy_register_name: called.");
+ internal_error (__FILE__, __LINE__,
+ "legacy_register_name: called.");
return NULL;
#endif
}
case LITTLE_ENDIAN:
return &floatformat_ieee_single_little;
default:
- internal_error ("default_float_format: bad byte order");
+ internal_error (__FILE__, __LINE__,
+ "default_float_format: bad byte order");
}
}
case LITTLE_ENDIAN:
return &floatformat_ieee_double_little;
default:
- internal_error ("default_double_format: bad byte order");
+ internal_error (__FILE__, __LINE__,
+ "default_double_format: bad byte order");
}
}
return addr;
}
+int
+no_op_reg_to_regnum (int reg)
+{
+ return reg;
+}
+
+/* For use by frame_args_address and frame_locals_address. */
+CORE_ADDR
+default_frame_address (struct frame_info *fi)
+{
+ return fi->frame;
+}
+
+/* Default prepare_to_procced(). */
+int
+default_prepare_to_proceed (int select_it)
+{
+ return 0;
+}
+
+/* Generic prepare_to_proceed(). This one should be suitable for most
+ targets that support threads. */
+int
+generic_prepare_to_proceed (int select_it)
+{
+ ptid_t wait_ptid;
+ struct target_waitstatus wait_status;
+
+ /* Get the last target status returned by target_wait(). */
+ get_last_target_status (&wait_ptid, &wait_status);
+
+ /* Make sure we were stopped at a breakpoint. */
+ if (wait_status.kind != TARGET_WAITKIND_STOPPED
+ || wait_status.value.sig != TARGET_SIGNAL_TRAP)
+ {
+ return 0;
+ }
+
+ if (!ptid_equal (wait_ptid, minus_one_ptid)
+ && !ptid_equal (inferior_ptid, wait_ptid))
+ {
+ /* Switched over from WAIT_PID. */
+ CORE_ADDR wait_pc = read_pc_pid (wait_ptid);
+
+ /* Avoid switching where it wouldn't do any good, i.e. if both
+ threads are at the same breakpoint. */
+ if (wait_pc != read_pc () && breakpoint_here_p (wait_pc))
+ {
+ if (select_it)
+ {
+ /* User hasn't deleted the breakpoint. Switch back to
+ WAIT_PID and return non-zero. */
+ inferior_ptid = wait_ptid;
+
+ /* FIXME: This stuff came from switch_to_thread() in
+ thread.c (which should probably be a public function). */
+ flush_cached_frames ();
+ registers_changed ();
+ stop_pc = wait_pc;
+ select_frame (get_current_frame (), 0);
+ }
+
+ return 1;
+ }
+ }
+ return 0;
+
+}
+
/* Functions to manipulate the endianness of the target. */
#ifdef TARGET_BYTE_ORDER_SELECTABLE
}
}
else
- internal_error ("set_endian: bad value");
+ internal_error (__FILE__, __LINE__,
+ "set_endian: bad value");
show_endian (NULL, from_tty);
}
set_endian_from_file (bfd *abfd)
{
if (GDB_MULTI_ARCH)
- internal_error ("set_endian_from_file: not for multi-arch");
+ internal_error (__FILE__, __LINE__,
+ "set_endian_from_file: not for multi-arch");
if (TARGET_BYTE_ORDER_SELECTABLE_P)
{
int want;
arch_ok (const struct bfd_arch_info *arch)
{
if (GDB_MULTI_ARCH)
- internal_error ("arch_ok: not multi-arched");
+ internal_error (__FILE__, __LINE__,
+ "arch_ok: not multi-arched");
/* Should be performing the more basic check that the binary is
compatible with GDB. */
/* Check with the target that the architecture is valid. */
enum set_arch type)
{
if (GDB_MULTI_ARCH)
- internal_error ("set_arch: not multi-arched");
+ internal_error (__FILE__, __LINE__,
+ "set_arch: not multi-arched");
switch (type)
{
case set_arch_auto:
{
const struct bfd_arch_info *wanted = bfd_lookup_arch (arch, mach);
if (GDB_MULTI_ARCH)
- internal_error ("set_architecture_from_arch_mach: not multi-arched");
+ internal_error (__FILE__, __LINE__,
+ "set_architecture_from_arch_mach: not multi-arched");
if (wanted != NULL)
set_arch (wanted, set_arch_manual);
else
- internal_error ("gdbarch: hardwired architecture/machine not reconized");
+ internal_error (__FILE__, __LINE__,
+ "gdbarch: hardwired architecture/machine not recognized");
}
/* Set the architecture from a BFD (deprecated) */
{
const struct bfd_arch_info *wanted = bfd_get_arch_info (abfd);
if (GDB_MULTI_ARCH)
- internal_error ("set_architecture_from_file: not multi-arched");
+ internal_error (__FILE__, __LINE__,
+ "set_architecture_from_file: not multi-arched");
if (target_architecture_auto)
{
set_arch (wanted, set_arch_auto);
memset (&info, 0, sizeof info);
info.bfd_arch_info = bfd_scan_arch (set_architecture_string);
if (info.bfd_arch_info == NULL)
- internal_error ("set_architecture: bfd_scan_arch failed");
+ internal_error (__FILE__, __LINE__,
+ "set_architecture: bfd_scan_arch failed");
if (gdbarch_update_p (info))
target_architecture_auto = 0;
else
- printf_unfiltered ("Architecture `%s' not reconized.\n",
+ printf_unfiltered ("Architecture `%s' not recognized.\n",
set_architecture_string);
}
else
const struct bfd_arch_info *arch
= bfd_scan_arch (set_architecture_string);
if (arch == NULL)
- internal_error ("set_architecture: bfd_scan_arch failed");
+ internal_error (__FILE__, __LINE__,
+ "set_architecture: bfd_scan_arch failed");
set_arch (arch, set_arch_manual);
}
show_architecture (NULL, from_tty);
{
printf_filtered (" %s", *arch);
}
- free (arches);
+ xfree (arches);
}
else
{
memset (&info, 0, sizeof info);
info.abfd = abfd;
if (! gdbarch_update_p (info))
- error ("Architecture of file not reconized.\n");
+ error ("Architecture of file not recognized.\n");
}
else
{
chosen = *arch;
}
if (chosen == NULL)
- internal_error ("initialize_current_architecture: No arch");
+ internal_error (__FILE__, __LINE__,
+ "initialize_current_architecture: No arch");
info.bfd_arch_info = bfd_scan_arch (chosen);
if (info.bfd_arch_info == NULL)
- internal_error ("initialize_current_architecture: Arch not found");
+ internal_error (__FILE__, __LINE__,
+ "initialize_current_architecture: Arch not found");
}
/* take several guesses at a byte order. */
{
if (! gdbarch_update_p (info))
{
- internal_error ("initialize_current_architecture: Selection of initial architecture failed");
+ internal_error (__FILE__, __LINE__,
+ "initialize_current_architecture: Selection of initial architecture failed");
}
}