+
+ * gdbarch.sh: Add "struct ravenscar_arch_ops" advance
+ declaration.
+ (ravenscar_ops): New gdbarch variable.
+ * gdbarch.h, gdbarch.c: Regenerate.
+ * ravenscar-thread.h (ravenscar_register_arch_ops): Delete.
+ * ravenscar-thread.c (current_arch_ops): Delete.
+ (ravenscar_fetch_registers): Get the ravenscar_arch_ops
+ from the gdbarch.
+ (ravenscar_store_registers, ravenscar_prepare_to_store): Likewise.
+ (ravenscar_inferior_created): Add gdbarch_ravenscar_ops check.
+ (ravenscar_register_arch_ops): Delete.
+ * ravenscar-sparc-thread.h: New file.
+ * ravenscar-sparc-thread.c: #include "ravenscar-sparc-thread.h".
+ (ravenscar_sparc_ops): Define value statically.
+ (_initialize_ravenscar_sparc): Delete.
+ (register_sparc_ravenscar_ops): New function.
+ * sparc-tdep.c: #include "ravenscar-sparc-thread.h".
+ (sparc32_gdbarch_init): Add call to register_sparc_ravenscar_ops.
+ * Makefile.in (ALL_TARGET_OBS): Add ravenscar-thread.o and
+ ravenscar-sparc-thread.o.
+ (SFILES): Add ravenscar-thread.c.
+ (HFILES_NO_SRCDIR): Add ravenscar-sparc-thread.h.
+ (ALLDEPFILES): ravenscar-sparc-thread.c.
+ * configure.tgt: Add ravenscar-thread.o and ravenscar-sparc-thread.o
+ to gdb_target_obs
+ for all the targets that use sparc-tdep.o.
+
* ravenscar-thread.c (ravenscar_is_open): Delete.
score-tdep.o \
sh64-tdep.o sh-linux-tdep.o shnbsd-tdep.o sh-tdep.o \
sparc-linux-tdep.o sparcnbsd-tdep.o sparcobsd-tdep.o \
- sparc-sol2-tdep.o sparc-tdep.o \
+ sparc-sol2-tdep.o sparc-tdep.o ravenscar-sparc-thread.o \
spu-tdep.o spu-multiarch.o solib-spu.o \
tic6x-tdep.o tic6x-linux-tdep.o \
tilegx-tdep.o tilegx-linux-tdep.o \
xcoffread.o \
symfile-mem.o \
windows-tdep.o \
- linux-record.o
+ linux-record.o \
+ ravenscar-thread.o
# Host-dependent makefile fragment comes in here.
@host_makefile_frag@
p-exp.y p-lang.c p-typeprint.c p-valprint.c parse.c printcmd.c \
proc-service.list progspace.c \
prologue-value.c psymtab.c \
+ ravenscar-thread.c \
regcache.c reggroups.c remote.c remote-fileio.c remote-notif.c reverse.c \
sentinel-frame.c \
serial.c ser-base.c ser-unix.c skip.c \
gnulib/import/stddef.in.h gnulib/import/inttypes.in.h inline-frame.h skip.h \
common/common-utils.h common/xml-utils.h common/buffer.h common/ptid.h \
common/format.h common/host-defs.h utils.h common/queue.h \
-common/linux-osdata.h gdb-dlfcn.h auto-load.h probe.h stap-probe.h gdb_bfd.h
+common/linux-osdata.h gdb-dlfcn.h auto-load.h probe.h stap-probe.h \
+gdb_bfd.h ravenscar-sparc-thread.h
# Header files that already have srcdir in them, or which are in objdir.
sparc64-nat.c sparc64-tdep.c sparc64fbsd-nat.c sparc64fbsd-tdep.c \
sparc64nbsd-nat.c sparc64nbsd-tdep.c sparc64obsd-tdep.c \
sparcnbsd-nat.c sparcnbsd-tdep.c sparcobsd-tdep.c \
+ ravenscar-sparc-thread.c \
spu-linux-nat.c spu-tdep.c spu-multiarch.c solib-spu.c \
tilegx-linux-nat.c tilegx-tdep.c tilegx-linux-tdep.c \
v850-tdep.c \
# Target: GNU/Linux SPARC
gdb_target_obs="sparc-tdep.o sparc-sol2-tdep.o sol2-tdep.o \
sparc-linux-tdep.o solib-svr4.o symfile-mem.o \
- linux-tdep.o"
+ linux-tdep.o \
+ ravenscar-thread.o ravenscar-sparc-thread.o"
if test "x$enable_64_bit_bfd" = "xyes"; then
# Target: GNU/Linux UltraSPARC
gdb_target_obs="sparc64-tdep.o sparc64-sol2-tdep.o \
# Target: GNU/Linux UltraSPARC
gdb_target_obs="sparc64-tdep.o sparc64-sol2-tdep.o sol2-tdep.o \
sparc64-linux-tdep.o sparc-tdep.o sparc-sol2-tdep.o \
- sparc-linux-tdep.o solib-svr4.o linux-tdep.o"
+ sparc-linux-tdep.o solib-svr4.o linux-tdep.o \
+ ravenscar-thread.o ravenscar-sparc-thread.o"
build_gdbserver=yes
;;
sparc*-*-freebsd* | sparc*-*-kfreebsd*-gnu)
# Target: FreeBSD/sparc64
gdb_target_obs="sparc-tdep.o sparc64-tdep.o sparc64fbsd-tdep.o \
- solib-svr4.o"
+ solib-svr4.o \
+ ravenscar-thread.o ravenscar-sparc-thread.o"
;;
sparc-*-netbsd* | sparc-*-knetbsd*-gnu)
# Target: NetBSD/sparc
- gdb_target_obs="sparc-tdep.o sparcnbsd-tdep.o nbsd-tdep.o solib-svr4.o"
+ gdb_target_obs="sparc-tdep.o sparcnbsd-tdep.o nbsd-tdep.o \
+ solib-svr4.o \
+ ravenscar-thread.o ravenscar-sparc-thread.o"
;;
sparc64-*-netbsd* | sparc64-*-knetbsd*-gnu)
# Target: NetBSD/sparc64
gdb_target_obs="sparc64-tdep.o sparc64nbsd-tdep.o sparc-tdep.o \
- sparcnbsd-tdep.o nbsd-tdep.o solib-svr4.o"
+ sparcnbsd-tdep.o nbsd-tdep.o solib-svr4.o \
+ ravenscar-thread.o ravenscar-sparc-thread.o"
;;
sparc-*-openbsd*)
# Target: OpenBSD/sparc
gdb_target_obs="sparc-tdep.o sparcnbsd-tdep.o sparcobsd-tdep.o \
- nbsd-tdep.o obsd-tdep.o bsd-uthread.o solib-svr4.o"
+ nbsd-tdep.o obsd-tdep.o bsd-uthread.o solib-svr4.o \
+ ravenscar-thread.o ravenscar-sparc-thread.o"
;;
sparc64-*-openbsd*)
# Target: OpenBSD/sparc64
gdb_target_obs="sparc64-tdep.o sparc64nbsd-tdep.o sparc64obsd-tdep.o \
sparc-tdep.o sparcnbsd-tdep.o sparcobsd-tdep.o \
- nbsd-tdep.o obsd-tdep.o bsd-uthread.o solib-svr4.o"
+ nbsd-tdep.o obsd-tdep.o bsd-uthread.o solib-svr4.o \
+ ravenscar-thread.o ravenscar-sparc-thread.o"
;;
sparc-*-solaris2.[0-6] | sparc-*-solaris2.[0-6].*)
# Target: Solaris SPARC
- gdb_target_obs="sparc-tdep.o sparc-sol2-tdep.o sol2-tdep.o solib-svr4.o"
+ gdb_target_obs="sparc-tdep.o sparc-sol2-tdep.o sol2-tdep.o \
+ solib-svr4.o \
+ ravenscar-thread.o ravenscar-sparc-thread.o"
;;
sparc-*-solaris2* | sparcv9-*-solaris2* | sparc64-*-solaris2*)
# Target: Solaris UltraSPARC
gdb_target_obs="sparc64-tdep.o sparc64-sol2-tdep.o sparc-tdep.o \
- sparc-sol2-tdep.o sol2-tdep.o solib-svr4.o"
+ sparc-sol2-tdep.o sol2-tdep.o solib-svr4.o \
+ ravenscar-thread.o ravenscar-sparc-thread.o"
;;
sparc-*-*)
# Target: SPARC
- gdb_target_obs="sparc-tdep.o ravenscar-thread.o \
- ravenscar-sparc-thread.o"
+ gdb_target_obs="sparc-tdep.o
+ ravenscar-thread.o ravenscar-sparc-thread.o"
gdb_sim=../sim/erc32/libsim.a
;;
sparc64-*-*)
# Target: UltraSPARC
- gdb_target_obs="sparc-tdep.o sparc64-tdep.o"
+ gdb_target_obs="sparc-tdep.o sparc64-tdep.o \
+ ravenscar-thread.o ravenscar-sparc-thread.o"
;;
spu*-*-*)
gdbarch_info_proc_ftype *info_proc;
gdbarch_core_info_proc_ftype *core_info_proc;
gdbarch_iterate_over_objfiles_in_search_order_ftype *iterate_over_objfiles_in_search_order;
+ struct ravenscar_arch_ops * ravenscar_ops;
};
0, /* info_proc */
0, /* core_info_proc */
default_iterate_over_objfiles_in_search_order, /* iterate_over_objfiles_in_search_order */
+ NULL, /* ravenscar_ops */
/* startup_gdbarch() */
};
gdbarch->auto_wide_charset = default_auto_wide_charset;
gdbarch->gen_return_address = default_gen_return_address;
gdbarch->iterate_over_objfiles_in_search_order = default_iterate_over_objfiles_in_search_order;
+ gdbarch->ravenscar_ops = NULL;
/* gdbarch_alloc() */
return gdbarch;
/* Skip verify of info_proc, has predicate. */
/* Skip verify of core_info_proc, has predicate. */
/* Skip verify of iterate_over_objfiles_in_search_order, invalid_p == 0 */
+ /* Skip verify of ravenscar_ops, invalid_p == 0 */
buf = ui_file_xstrdup (log, &length);
make_cleanup (xfree, buf);
if (length > 0)
fprintf_unfiltered (file,
"gdbarch_dump: push_dummy_code = <%s>\n",
host_address_to_string (gdbarch->push_dummy_code));
+ fprintf_unfiltered (file,
+ "gdbarch_dump: ravenscar_ops = %s\n",
+ host_address_to_string (gdbarch->ravenscar_ops));
fprintf_unfiltered (file,
"gdbarch_dump: gdbarch_read_pc_p() = %d\n",
gdbarch_read_pc_p (gdbarch));
gdbarch->iterate_over_objfiles_in_search_order = iterate_over_objfiles_in_search_order;
}
+struct ravenscar_arch_ops *
+gdbarch_ravenscar_ops (struct gdbarch *gdbarch)
+{
+ gdb_assert (gdbarch != NULL);
+ /* Skip verify of ravenscar_ops, invalid_p == 0 */
+ if (gdbarch_debug >= 2)
+ fprintf_unfiltered (gdb_stdlog, "gdbarch_ravenscar_ops called\n");
+ return gdbarch->ravenscar_ops;
+}
+
+void
+set_gdbarch_ravenscar_ops (struct gdbarch *gdbarch,
+ struct ravenscar_arch_ops * ravenscar_ops)
+{
+ gdbarch->ravenscar_ops = ravenscar_ops;
+}
+
/* Keep a registry of per-architecture data-pointers required by GDB
modules. */
struct agent_expr;
struct axs_value;
struct stap_parse_info;
+struct ravenscar_arch_ops;
/* The architecture associated with the inferior through the
connection to the target.
extern void gdbarch_iterate_over_objfiles_in_search_order (struct gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype *cb, void *cb_data, struct objfile *current_objfile);
extern void set_gdbarch_iterate_over_objfiles_in_search_order (struct gdbarch *gdbarch, gdbarch_iterate_over_objfiles_in_search_order_ftype *iterate_over_objfiles_in_search_order);
+/* Ravenscar arch-dependent ops. */
+
+extern struct ravenscar_arch_ops * gdbarch_ravenscar_ops (struct gdbarch *gdbarch);
+extern void set_gdbarch_ravenscar_ops (struct gdbarch *gdbarch, struct ravenscar_arch_ops * ravenscar_ops);
+
/* Definition for an unknown syscall, used basically in error-cases. */
#define UNKNOWN_SYSCALL (-1)
# inspected when the symbol search was requested.
m:void:iterate_over_objfiles_in_search_order:iterate_over_objfiles_in_search_order_cb_ftype *cb, void *cb_data, struct objfile *current_objfile:cb, cb_data, current_objfile:0:default_iterate_over_objfiles_in_search_order::0
+# Ravenscar arch-dependent ops.
+v:struct ravenscar_arch_ops *:ravenscar_ops:::NULL:NULL::0:host_address_to_string (gdbarch->ravenscar_ops)
EOF
}
struct agent_expr;
struct axs_value;
struct stap_parse_info;
+struct ravenscar_arch_ops;
/* The architecture associated with the inferior through the
connection to the target.
#include "sparc-tdep.h"
#include "inferior.h"
#include "ravenscar-thread.h"
-
-static struct ravenscar_arch_ops ravenscar_sparc_ops;
+#include "ravenscar-sparc-thread.h"
static void ravenscar_sparc_fetch_registers (struct regcache *regcache,
int regnum);
buf_size);
}
-/* Provide a prototype to silence -Wmissing-prototypes. */
-extern void _initialize_ravenscar_sparc (void);
+static struct ravenscar_arch_ops ravenscar_sparc_ops =
+{
+ ravenscar_sparc_fetch_registers,
+ ravenscar_sparc_store_registers,
+ ravenscar_sparc_prepare_to_store
+};
+
+/* Register ravenscar_arch_ops in GDBARCH. */
void
-_initialize_ravenscar_sparc (void)
+register_sparc_ravenscar_ops (struct gdbarch *gdbarch)
{
- ravenscar_sparc_ops.to_fetch_registers = ravenscar_sparc_fetch_registers;
- ravenscar_sparc_ops.to_store_registers = ravenscar_sparc_store_registers;
- ravenscar_sparc_ops.to_prepare_to_store = ravenscar_sparc_prepare_to_store;
- ravenscar_register_arch_ops (&ravenscar_sparc_ops);
+ set_gdbarch_ravenscar_ops (gdbarch, &ravenscar_sparc_ops);
}
--- /dev/null
+/* Ravenscar SPARC target support.
+
+ Copyright 2012 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef RAVENSCAR_SPARC_THREAD_H
+#define RAVENSCAR_SPARC_THREAD_H
+
+struct gdbarch;
+
+extern void register_sparc_ravenscar_ops (struct gdbarch *gdbarch);
+#endif
static struct observer *update_target_observer = NULL;
-/* Architecture-specific hooks. */
-static struct ravenscar_arch_ops* current_arch_ops;
-
static void ravenscar_find_new_threads (struct target_ops *ops);
static ptid_t ravenscar_running_thread (void);
static char *ravenscar_extra_thread_info (struct thread_info *tp);
|| ptid_equal (inferior_ptid, ravenscar_running_thread ()))
beneath->to_fetch_registers (beneath, regcache, regnum);
else
- current_arch_ops->to_fetch_registers (regcache, regnum);
+ {
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ struct ravenscar_arch_ops *arch_ops
+ = gdbarch_ravenscar_ops (gdbarch);
+
+ arch_ops->to_fetch_registers (regcache, regnum);
+ }
}
static void
|| ptid_equal (inferior_ptid, ravenscar_running_thread ()))
beneath->to_store_registers (beneath, regcache, regnum);
else
- current_arch_ops->to_store_registers (regcache, regnum);
+ {
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ struct ravenscar_arch_ops *arch_ops
+ = gdbarch_ravenscar_ops (gdbarch);
+
+ arch_ops->to_store_registers (regcache, regnum);
+ }
}
static void
|| ptid_equal (inferior_ptid, ravenscar_running_thread ()))
beneath->to_prepare_to_store (regcache);
else
- current_arch_ops->to_prepare_to_store (regcache);
+ {
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ struct ravenscar_arch_ops *arch_ops
+ = gdbarch_ravenscar_ops (gdbarch);
+
+ arch_ops->to_prepare_to_store (regcache);
+ }
}
static void
static void
ravenscar_inferior_created (struct target_ops *target, int from_tty)
{
- if (!ravenscar_task_support || !has_ravenscar_runtime ())
+ struct ravenscar_arch_ops *ops;
+
+ if (!ravenscar_task_support
+ || gdbarch_ravenscar_ops (current_inferior ()->gdbarch) == NULL
+ || !has_ravenscar_runtime ())
return;
base_magic_null_ptid = inferior_ptid;
push_target (&ravenscar_ops);
}
-void
-ravenscar_register_arch_ops (struct ravenscar_arch_ops *ops)
-{
- /* FIXME: To be clean, we would need to handle a list of
- architectures, just like in remote-wtx-hw.c. However, for now the
- only Ravenscar run-time for bare board that is implemented in
- GNAT is for only one architecture: erc32-elf. So no need to care about
- that for now... */
- current_arch_ops = ops;
-}
-
static ptid_t
ravenscar_get_ada_task_ptid (long lwp, long thread)
{
void (*to_prepare_to_store) (struct regcache *);
};
-/* Register implementations for target ops to_store_registers,
- to_prepare_to_store and to_fetch_registers when the inferior_ptid
- is different from the running thread. In that case, the registers
- are saved in a architecture-specific location. */
-/* FIXME: only one architecture can be registered for now. See
- implementation. */
-
-extern void ravenscar_register_arch_ops (struct ravenscar_arch_ops *ops);
-
#endif /* !defined (RAVENSCAR_THREAD_H) */
#include "gdb_string.h"
#include "sparc-tdep.h"
+#include "ravenscar-sparc-thread.h"
struct regset;
set_gdbarch_regset_from_core_section (gdbarch,
sparc_regset_from_core_section);
+ register_sparc_ravenscar_ops (gdbarch);
+
return gdbarch;
}
\f