X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fravenscar-thread.c;h=fdec52a8e563b3b6df1d9815805bfc5f10006cb7;hb=2117c711ae07700adb57ea5b5ca61e4c32d7e3d2;hp=0f9380bcaf2a48b8552213b464d039646e4a96a4;hpb=f5656eadf4383cc733b96ff49ba8efbea6922ad3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c index 0f9380bcaf..fdec52a8e5 100644 --- a/gdb/ravenscar-thread.c +++ b/gdb/ravenscar-thread.c @@ -1,6 +1,6 @@ /* Ada Ravenscar thread support. - Copyright 2004, 2009-2012 Free Software Foundation, Inc. + Copyright (C) 2004-2014 Free Software Foundation, Inc. This file is part of GDB. @@ -26,7 +26,7 @@ #include "command.h" #include "ravenscar-thread.h" #include "observer.h" -#include "gdb_string.h" +#include #include "gdbcmd.h" #include "top.h" #include "regcache.h" @@ -34,10 +34,6 @@ /* If non-null, ravenscar task support is enabled. */ static int ravenscar_task_support = 1; -/* Non-null if the ravenscar thread layer has been pushed on the target - stack. */ -static int ravenscar_is_open = 0; - /* This module's target-specific operations. */ static struct target_ops ravenscar_ops; @@ -56,21 +52,17 @@ static const char first_task_name[] = "system__tasking__debug__first_task"; static const char ravenscar_runtime_initializer[] = "system__bb__threads__initialize"; -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); +static char *ravenscar_extra_thread_info (struct target_ops *self, + struct thread_info *tp); static int ravenscar_thread_alive (struct target_ops *ops, ptid_t ptid); static void ravenscar_fetch_registers (struct target_ops *ops, struct regcache *regcache, int regnum); static void ravenscar_store_registers (struct target_ops *ops, struct regcache *regcache, int regnum); -static void ravenscar_prepare_to_store (struct regcache *regcache); -static void ravenscar_initialize (char *name, int from_tty); +static void ravenscar_prepare_to_store (struct target_ops *self, + struct regcache *regcache); static void ravenscar_resume (struct target_ops *ops, ptid_t ptid, int step, enum gdb_signal siggnal); static void ravenscar_mourn_inferior (struct target_ops *ops); @@ -163,7 +155,7 @@ get_running_thread_id (void) const struct minimal_symbol *object_msym = get_running_thread_msymbol (); int object_size; int buf_size; - char *buf; + gdb_byte *buf; CORE_ADDR object_addr; struct type *builtin_type_void_data_ptr = builtin_type (target_gdbarch ())->builtin_data_ptr; @@ -179,12 +171,6 @@ get_running_thread_id (void) return extract_typed_address (buf, builtin_type_void_data_ptr); } -static void -ravenscar_close (int quitting) -{ - ravenscar_is_open = 0; -} - static void ravenscar_resume (struct target_ops *ops, ptid_t ptid, int step, enum gdb_signal siggnal) @@ -255,7 +241,7 @@ ravenscar_running_thread (void) } static char * -ravenscar_extra_thread_info (struct thread_info *tp) +ravenscar_extra_thread_info (struct target_ops *self, struct thread_info *tp) { return "Ravenscar task"; } @@ -287,7 +273,13 @@ ravenscar_fetch_registers (struct target_ops *ops, || 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 @@ -301,20 +293,33 @@ ravenscar_store_registers (struct target_ops *ops, || 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 -ravenscar_prepare_to_store (struct regcache *regcache) +ravenscar_prepare_to_store (struct target_ops *self, + struct regcache *regcache) { struct target_ops *beneath = find_target_beneath (&ravenscar_ops); if (!ravenscar_runtime_initialized () || ptid_equal (inferior_ptid, base_magic_null_ptid) || ptid_equal (inferior_ptid, ravenscar_running_thread ())) - beneath->to_prepare_to_store (regcache); + beneath->to_prepare_to_store (beneath, 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 @@ -332,38 +337,20 @@ ravenscar_mourn_inferior (struct target_ops *ops) static void ravenscar_inferior_created (struct target_ops *target, int from_tty) { - if (ravenscar_task_support - && has_ravenscar_runtime ()) - ravenscar_initialize (NULL, 0); -} - -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; -} + struct ravenscar_arch_ops *ops; -/* Initialize Ravenscar support. */ - -static void -ravenscar_initialize (char *name, int from_tty) -{ - if (ravenscar_is_open) + if (!ravenscar_task_support + || gdbarch_ravenscar_ops (current_inferior ()->gdbarch) == NULL + || !has_ravenscar_runtime ()) return; base_magic_null_ptid = inferior_ptid; ravenscar_update_inferior_ptid (); push_target (&ravenscar_ops); - ravenscar_is_open = 1; } static ptid_t -ravenscar_get_ada_task_ptid (long lwp, long thread) +ravenscar_get_ada_task_ptid (struct target_ops *self, long lwp, long thread) { return ptid_build (ptid_get_pid (base_ptid), 0, thread); } @@ -374,7 +361,6 @@ init_ravenscar_thread_ops (void) ravenscar_ops.to_shortname = "ravenscar"; ravenscar_ops.to_longname = "Ravenscar tasks."; ravenscar_ops.to_doc = "Ravenscar tasks support."; - ravenscar_ops.to_close = ravenscar_close; ravenscar_ops.to_resume = ravenscar_resume; ravenscar_ops.to_wait = ravenscar_wait; ravenscar_ops.to_fetch_registers = ravenscar_fetch_registers; @@ -448,7 +434,7 @@ _initialize_ravenscar (void) ravenscar ops if needed. */ observer_attach_inferior_created (ravenscar_inferior_created); - add_target (&ravenscar_ops); + complete_target_initialization (&ravenscar_ops); add_prefix_cmd ("ravenscar", no_class, set_ravenscar_command, _("Prefix command for changing Ravenscar-specific settings"),