diff options
author | Daniel Jacobowitz <drow@false.org> | 2006-11-28 22:10:26 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2006-11-28 22:10:26 +0000 |
commit | 424163ea1524c5823612a24284cb900cd70e2e2b (patch) | |
tree | 5904b83f46fcb044c58f6fefa6f720d578d6bfce /gdb/target-descriptions.c | |
parent | 979894f2c29bdd6ce92b9588e308dbaeaf9ac819 (diff) | |
download | gdb-424163ea1524c5823612a24284cb900cd70e2e2b.zip gdb-424163ea1524c5823612a24284cb900cd70e2e2b.tar.gz gdb-424163ea1524c5823612a24284cb900cd70e2e2b.tar.bz2 |
* Makefile.in (SFILES): Add new and missed files.
(target_descriptions_h): New.
(COMMON_OBS): Add target-descriptions.o.
(arch-utils.o, infcmd.o, remote.o, target.o): Update.
(target-descriptions.o): New.
* arch-utils.c (gdbarch_info_fill): Check for a target
description.
* target-descriptions.c, target-descriptions.h: New files.
* gdbarch.sh: Add target_desc to info. Declare it in gdbarch.h.
Correct typos.
(gdbarch_list_lookup_by_info): Check target_desc.
* gdbarch.c, gdbarch.h: Regenerated.
* target.c (update_current_target): Mention to_read_description.
(target_pre_inferior): Call target_clear_description.
(target_read_description): New.
* target.h (struct target_ops): Add to_read_description.
(target_read_description): New prototype.
* infcmd.c (post_create_inferior): Call target_find_description.
* remote.c (remote_open_1): Likewise.
(extended_remote_create_inferior): Add a comment.
(extended_remote_async_create_inferior): Likewise.
Diffstat (limited to 'gdb/target-descriptions.c')
-rw-r--r-- | gdb/target-descriptions.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c new file mode 100644 index 0000000..041d72b --- /dev/null +++ b/gdb/target-descriptions.c @@ -0,0 +1,131 @@ +/* Target description support for GDB. + + Copyright (C) 2006 + Free Software Foundation, Inc. + + Contributed by CodeSourcery. + + 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 2 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +#include "defs.h" +#include "arch-utils.h" +#include "target.h" +#include "target-descriptions.h" + +#include "gdb_assert.h" + +/* Types. */ + +struct target_desc +{ +}; + +/* Global state. These variables are associated with the current + target; if GDB adds support for multiple simultaneous targets, then + these variables should become target-specific data. */ + +/* A flag indicating that a description has already been fetched from + the current target, so it should not be queried again. */ + +static int target_desc_fetched; + +/* The description fetched from the current target, or NULL if the + current target did not supply any description. Only valid when + target_desc_fetched is set. Only the description initialization + code should access this; normally, the description should be + accessed through the gdbarch object. */ + +static const struct target_desc *current_target_desc; + +/* Fetch the current target's description, and switch the current + architecture to one which incorporates that description. */ + +void +target_find_description (void) +{ + /* If we've already fetched a description from the target, don't do + it again. This allows a target to fetch the description early, + during its to_open or to_create_inferior, if it needs extra + information about the target to initialize. */ + if (target_desc_fetched) + return; + + /* The current architecture should not have any target description + specified. It should have been cleared, e.g. when we + disconnected from the previous target. */ + gdb_assert (gdbarch_target_desc (current_gdbarch) == NULL); + + current_target_desc = target_read_description (¤t_target); + + /* If a non-NULL description was returned, then update the current + architecture. */ + if (current_target_desc) + { + struct gdbarch_info info; + + gdbarch_info_init (&info); + info.target_desc = current_target_desc; + if (!gdbarch_update_p (info)) + warning (_("Could not use target-supplied description")); + } + + /* Now that we know this description is usable, record that we + fetched it. */ + target_desc_fetched = 1; +} + +/* Discard any description fetched from the current target, and switch + the current architecture to one with no target description. */ + +void +target_clear_description (void) +{ + struct gdbarch_info info; + + if (!target_desc_fetched) + return; + + target_desc_fetched = 0; + current_target_desc = NULL; + + gdbarch_info_init (&info); + if (!gdbarch_update_p (info)) + internal_error (__FILE__, __LINE__, + _("Could not remove target-supplied description")); +} + +/* Return the global current target description. This should only be + used by gdbarch initialization code; most access should be through + an existing gdbarch. */ + +const struct target_desc * +target_current_description (void) +{ + if (target_desc_fetched) + return current_target_desc; + + return NULL; +} + +/* Methods for constructing a target description. */ + +struct target_desc * +allocate_target_description (void) +{ + return XZALLOC (struct target_desc); +} |