mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-10-20 22:34:14 +08:00
Re-implement gdbach_dump() so that it prints out the macro values.
Add ``maint print arch'' command. Add ``gdbarch_register()'' function that also takes gdbarch_dump_tdep(). Use in mips-tdep.c.
This commit is contained in:
@ -1,3 +1,22 @@
|
|||||||
|
Fri Jun 9 15:06:37 2000 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* gdbarch.sh (struct gdbarch): Add member dump_tdep.
|
||||||
|
(struct gdbarch_registration): Ditto.
|
||||||
|
(gdbarch_dump): Add ui_file and gdbarch arguments. Add support
|
||||||
|
for external dump functions. Dump the macro value. Call target
|
||||||
|
dump routine.
|
||||||
|
(gdbarch_register): New function.
|
||||||
|
(gdbarch_registrary): Replace gdbarch_init_registrary.
|
||||||
|
* gdbarch.h, gdbarch.c: Re-generate.
|
||||||
|
* arch-utils.c (set_arch): Update.
|
||||||
|
|
||||||
|
* mips-tdep.c (mips_dump_tdep): New function. Move dump code here.
|
||||||
|
(mips_gdbarch_init): From here.
|
||||||
|
|
||||||
|
* maint.c (maintenance_print_architecture): New function.
|
||||||
|
(_initialize_maint_cmds): Add command ``maintenance print
|
||||||
|
architecture''.
|
||||||
|
|
||||||
2000-06-08 Kevin Buettner <kevinb@redhat.com>
|
2000-06-08 Kevin Buettner <kevinb@redhat.com>
|
||||||
|
|
||||||
* command.h, monitor.h: Eliminate use of PARAMS from these
|
* command.h, monitor.h: Eliminate use of PARAMS from these
|
||||||
|
@ -413,7 +413,7 @@ set_arch (const struct bfd_arch_info *arch,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (gdbarch_debug)
|
if (gdbarch_debug)
|
||||||
gdbarch_dump ();
|
gdbarch_dump (current_gdbarch, gdb_stdlog);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the architecture from arch/machine (deprecated) */
|
/* Set the architecture from arch/machine (deprecated) */
|
||||||
@ -564,7 +564,7 @@ set_gdbarch_from_file (abfd)
|
|||||||
extern const bfd_arch_info_type DEFAULT_BFD_ARCH;
|
extern const bfd_arch_info_type DEFAULT_BFD_ARCH;
|
||||||
static const bfd_arch_info_type *default_bfd_arch = &DEFAULT_BFD_ARCH;
|
static const bfd_arch_info_type *default_bfd_arch = &DEFAULT_BFD_ARCH;
|
||||||
#else
|
#else
|
||||||
static const bfd_arch_info_type *default_bfd_arch
|
static const bfd_arch_info_type *default_bfd_arch;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEFAULT_BFD_VEC
|
#ifdef DEFAULT_BFD_VEC
|
||||||
|
1319
gdb/gdbarch.c
1319
gdb/gdbarch.c
File diff suppressed because it is too large
Load Diff
@ -1180,8 +1180,11 @@ extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
|
|||||||
gdbarch'' from the ARCHES list - indicating that the new
|
gdbarch'' from the ARCHES list - indicating that the new
|
||||||
architecture is just a synonym for an earlier architecture (see
|
architecture is just a synonym for an earlier architecture (see
|
||||||
gdbarch_list_lookup_by_info()); a newly created ``struct gdbarch''
|
gdbarch_list_lookup_by_info()); a newly created ``struct gdbarch''
|
||||||
- that describes the selected architecture (see
|
- that describes the selected architecture (see gdbarch_alloc()).
|
||||||
gdbarch_alloc()). */
|
|
||||||
|
The DUMP_TDEP function shall print out all target specific values.
|
||||||
|
Care should be taken to ensure that the function works in both the
|
||||||
|
multi-arch and non- multi-arch cases. */
|
||||||
|
|
||||||
struct gdbarch_list
|
struct gdbarch_list
|
||||||
{
|
{
|
||||||
@ -1208,9 +1211,15 @@ struct gdbarch_info
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef struct gdbarch *(gdbarch_init_ftype) (struct gdbarch_info info, struct gdbarch_list *arches);
|
typedef struct gdbarch *(gdbarch_init_ftype) (struct gdbarch_info info, struct gdbarch_list *arches);
|
||||||
|
typedef void (gdbarch_dump_tdep_ftype) (struct gdbarch *gdbarch, struct ui_file *file);
|
||||||
|
|
||||||
|
/* DEPRECATED - use gdbarch_register() */
|
||||||
extern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
|
extern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
|
||||||
|
|
||||||
|
extern void gdbarch_register (enum bfd_architecture architecture,
|
||||||
|
gdbarch_init_ftype *,
|
||||||
|
gdbarch_dump_tdep_ftype *);
|
||||||
|
|
||||||
|
|
||||||
/* Return a freshly allocated, NULL terminated, array of the valid
|
/* Return a freshly allocated, NULL terminated, array of the valid
|
||||||
architecture names. Since architectures are registered during the
|
architecture names. Since architectures are registered during the
|
||||||
@ -1234,7 +1243,10 @@ extern struct gdbarch_list *gdbarch_list_lookup_by_info (struct gdbarch_list *ar
|
|||||||
extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gdbarch_tdep *tdep);
|
extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gdbarch_tdep *tdep);
|
||||||
|
|
||||||
|
|
||||||
/* Helper function. Free a partially-constructed ``struct gdbarch''. */
|
/* Helper function. Free a partially-constructed ``struct gdbarch''.
|
||||||
|
It is assumed that the caller freeds the ``struct
|
||||||
|
gdbarch_tdep''. */
|
||||||
|
|
||||||
extern void gdbarch_free (struct gdbarch *);
|
extern void gdbarch_free (struct gdbarch *);
|
||||||
|
|
||||||
|
|
||||||
@ -1407,6 +1419,6 @@ extern void initialize_current_architecture (void);
|
|||||||
/* gdbarch trace variable */
|
/* gdbarch trace variable */
|
||||||
extern int gdbarch_debug;
|
extern int gdbarch_debug;
|
||||||
|
|
||||||
extern void gdbarch_dump (void);
|
extern void gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
166
gdb/gdbarch.sh
166
gdb/gdbarch.sh
@ -250,6 +250,7 @@ do
|
|||||||
# An optional indicator for any predicte to wrap around the
|
# An optional indicator for any predicte to wrap around the
|
||||||
# print member code.
|
# print member code.
|
||||||
|
|
||||||
|
# () -> Call a custom function to do the dump.
|
||||||
# exp -> Wrap print up in ``if (${print_p}) ...
|
# exp -> Wrap print up in ``if (${print_p}) ...
|
||||||
# ``'' -> No predicate
|
# ``'' -> No predicate
|
||||||
|
|
||||||
@ -670,8 +671,11 @@ extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
|
|||||||
gdbarch'' from the ARCHES list - indicating that the new
|
gdbarch'' from the ARCHES list - indicating that the new
|
||||||
architecture is just a synonym for an earlier architecture (see
|
architecture is just a synonym for an earlier architecture (see
|
||||||
gdbarch_list_lookup_by_info()); a newly created \`\`struct gdbarch''
|
gdbarch_list_lookup_by_info()); a newly created \`\`struct gdbarch''
|
||||||
- that describes the selected architecture (see
|
- that describes the selected architecture (see gdbarch_alloc()).
|
||||||
gdbarch_alloc()). */
|
|
||||||
|
The DUMP_TDEP function shall print out all target specific values.
|
||||||
|
Care should be taken to ensure that the function works in both the
|
||||||
|
multi-arch and non- multi-arch cases. */
|
||||||
|
|
||||||
struct gdbarch_list
|
struct gdbarch_list
|
||||||
{
|
{
|
||||||
@ -698,9 +702,15 @@ struct gdbarch_info
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef struct gdbarch *(gdbarch_init_ftype) (struct gdbarch_info info, struct gdbarch_list *arches);
|
typedef struct gdbarch *(gdbarch_init_ftype) (struct gdbarch_info info, struct gdbarch_list *arches);
|
||||||
|
typedef void (gdbarch_dump_tdep_ftype) (struct gdbarch *gdbarch, struct ui_file *file);
|
||||||
|
|
||||||
|
/* DEPRECATED - use gdbarch_register() */
|
||||||
extern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
|
extern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
|
||||||
|
|
||||||
|
extern void gdbarch_register (enum bfd_architecture architecture,
|
||||||
|
gdbarch_init_ftype *,
|
||||||
|
gdbarch_dump_tdep_ftype *);
|
||||||
|
|
||||||
|
|
||||||
/* Return a freshly allocated, NULL terminated, array of the valid
|
/* Return a freshly allocated, NULL terminated, array of the valid
|
||||||
architecture names. Since architectures are registered during the
|
architecture names. Since architectures are registered during the
|
||||||
@ -724,7 +734,10 @@ extern struct gdbarch_list *gdbarch_list_lookup_by_info (struct gdbarch_list *ar
|
|||||||
extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gdbarch_tdep *tdep);
|
extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gdbarch_tdep *tdep);
|
||||||
|
|
||||||
|
|
||||||
/* Helper function. Free a partially-constructed \`\`struct gdbarch''. */
|
/* Helper function. Free a partially-constructed \`\`struct gdbarch''.
|
||||||
|
It is assumed that the caller freeds the \`\`struct
|
||||||
|
gdbarch_tdep''. */
|
||||||
|
|
||||||
extern void gdbarch_free (struct gdbarch *);
|
extern void gdbarch_free (struct gdbarch *);
|
||||||
|
|
||||||
|
|
||||||
@ -897,7 +910,7 @@ extern void initialize_current_architecture (void);
|
|||||||
/* gdbarch trace variable */
|
/* gdbarch trace variable */
|
||||||
extern int gdbarch_debug;
|
extern int gdbarch_debug;
|
||||||
|
|
||||||
extern void gdbarch_dump (void);
|
extern void gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
EOF
|
EOF
|
||||||
@ -982,6 +995,7 @@ done
|
|||||||
echo ""
|
echo ""
|
||||||
echo " /* target specific vector. */"
|
echo " /* target specific vector. */"
|
||||||
echo " struct gdbarch_tdep *tdep;"
|
echo " struct gdbarch_tdep *tdep;"
|
||||||
|
echo " gdbarch_dump_tdep_ftype *dump_tdep;"
|
||||||
echo ""
|
echo ""
|
||||||
echo " /* per-architecture data-pointers */"
|
echo " /* per-architecture data-pointers */"
|
||||||
echo " int nr_data;"
|
echo " int nr_data;"
|
||||||
@ -1040,9 +1054,10 @@ EOF
|
|||||||
echo ""
|
echo ""
|
||||||
echo "extern const struct bfd_arch_info bfd_default_arch_struct;"
|
echo "extern const struct bfd_arch_info bfd_default_arch_struct;"
|
||||||
echo ""
|
echo ""
|
||||||
echo "struct gdbarch startup_gdbarch = {"
|
echo "struct gdbarch startup_gdbarch ="
|
||||||
|
echo "{"
|
||||||
echo " /* basic architecture information */"
|
echo " /* basic architecture information */"
|
||||||
function_list | while do_read # eval read $read
|
function_list | while do_read
|
||||||
do
|
do
|
||||||
if class_is_info_p
|
if class_is_info_p
|
||||||
then
|
then
|
||||||
@ -1050,8 +1065,8 @@ do
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
/* target specific vector */
|
/* target specific vector and its dump routine */
|
||||||
NULL,
|
NULL, NULL,
|
||||||
/*per-architecture data-pointers and swap regions */
|
/*per-architecture data-pointers and swap regions */
|
||||||
0, NULL, NULL,
|
0, NULL, NULL,
|
||||||
/* Multi-arch values */
|
/* Multi-arch values */
|
||||||
@ -1066,6 +1081,7 @@ done
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
/* startup_gdbarch() */
|
/* startup_gdbarch() */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct gdbarch *current_gdbarch = &startup_gdbarch;
|
struct gdbarch *current_gdbarch = &startup_gdbarch;
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
@ -1123,6 +1139,7 @@ cat <<EOF
|
|||||||
However, if an architecture's init function encounters an error
|
However, if an architecture's init function encounters an error
|
||||||
building the structure, it may need to clean up a partially
|
building the structure, it may need to clean up a partially
|
||||||
constructed gdbarch. */
|
constructed gdbarch. */
|
||||||
|
|
||||||
void
|
void
|
||||||
gdbarch_free (struct gdbarch *arch)
|
gdbarch_free (struct gdbarch *arch)
|
||||||
{
|
{
|
||||||
@ -1193,41 +1210,70 @@ EOF
|
|||||||
# dump the structure
|
# dump the structure
|
||||||
echo ""
|
echo ""
|
||||||
echo ""
|
echo ""
|
||||||
echo "/* Print out the details of the current architecture. */"
|
|
||||||
echo ""
|
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
/* Print out the details of the current architecture. */
|
||||||
|
|
||||||
|
/* NOTE/WARNING: The parameter is called \`\`current_gdbarch'' so that it
|
||||||
|
just happens to match the global variable \`\`current_gdbarch''. That
|
||||||
|
way macros refering to that variable get the local and not the global
|
||||||
|
version - ulgh. Once everything is parameterised with gdbarch, this
|
||||||
|
will go away. */
|
||||||
|
|
||||||
void
|
void
|
||||||
gdbarch_dump (void)
|
gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
|
||||||
{
|
{
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"gdbarch_dump: GDB_MULTI_ARCH = %d\\n",
|
||||||
|
GDB_MULTI_ARCH);
|
||||||
EOF
|
EOF
|
||||||
function_list | while do_read # eval read $read
|
function_list | while do_read
|
||||||
do
|
do
|
||||||
echo "#ifdef ${macro}"
|
echo "#ifdef ${macro}"
|
||||||
if class_is_function_p
|
if class_is_function_p
|
||||||
then
|
then
|
||||||
echo " fprintf_unfiltered (gdb_stdlog,"
|
echo " fprintf_unfiltered (file,"
|
||||||
echo " \"gdbarch_update: ${macro} = 0x%08lx\\n\","
|
echo " \"gdbarch_dump: %s # %s\\n\","
|
||||||
echo " (long) current_gdbarch->${function}"
|
echo " \"${macro}(${actual})\","
|
||||||
echo " /*${macro} ()*/);"
|
echo " XSTRING (${macro} (${actual})));"
|
||||||
else
|
else
|
||||||
if [ "${print_p}" ]
|
echo " fprintf_unfiltered (file,"
|
||||||
then
|
echo " \"gdbarch_dump: ${macro} # %s\\n\","
|
||||||
echo " if (${print_p})"
|
echo " XSTRING (${macro}));"
|
||||||
echo " fprintf_unfiltered (gdb_stdlog,"
|
fi
|
||||||
echo " \"gdbarch_update: ${macro} = ${fmt}\\n\","
|
echo "#endif"
|
||||||
echo " ${print});"
|
done
|
||||||
else
|
function_list | while do_read
|
||||||
echo " fprintf_unfiltered (gdb_stdlog,"
|
do
|
||||||
echo " \"gdbarch_update: ${macro} = ${fmt}\\n\","
|
echo "#ifdef ${macro}"
|
||||||
echo " ${print});"
|
if [ "${print_p}" = "()" ]
|
||||||
fi
|
then
|
||||||
|
echo " gdbarch_dump_${function} (current_gdbarch);"
|
||||||
|
elif [ "${print_p}" = "0" ]
|
||||||
|
then
|
||||||
|
echo " /* skip print of ${macro}, print_p == 0. */"
|
||||||
|
elif [ "${print_p}" ]
|
||||||
|
then
|
||||||
|
echo " if (${print_p})"
|
||||||
|
echo " fprintf_unfiltered (file,"
|
||||||
|
echo " \"gdbarch_dump: ${macro} = ${fmt}\\n\","
|
||||||
|
echo " ${print});"
|
||||||
|
elif class_is_function_p
|
||||||
|
then
|
||||||
|
echo " if (GDB_MULTI_ARCH)"
|
||||||
|
echo " fprintf_unfiltered (file,"
|
||||||
|
echo " \"gdbarch_dump: ${macro} = 0x%08lx\\n\","
|
||||||
|
echo " (long) current_gdbarch->${function}"
|
||||||
|
echo " /*${macro} ()*/);"
|
||||||
|
else
|
||||||
|
echo " fprintf_unfiltered (file,"
|
||||||
|
echo " \"gdbarch_dump: ${macro} = ${fmt}\\n\","
|
||||||
|
echo " ${print});"
|
||||||
fi
|
fi
|
||||||
echo "#endif"
|
echo "#endif"
|
||||||
done
|
done
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
if (current_gdbarch->dump_tdep != NULL)
|
||||||
"gdbarch_update: GDB_MULTI_ARCH = %d\\n",
|
current_gdbarch->dump_tdep (current_gdbarch, file);
|
||||||
GDB_MULTI_ARCH);
|
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
@ -1501,15 +1547,16 @@ swapin_gdbarch_swap (struct gdbarch *gdbarch)
|
|||||||
|
|
||||||
/* Keep a registrary of the architectures known by GDB. */
|
/* Keep a registrary of the architectures known by GDB. */
|
||||||
|
|
||||||
struct gdbarch_init_registration
|
struct gdbarch_registration
|
||||||
{
|
{
|
||||||
enum bfd_architecture bfd_architecture;
|
enum bfd_architecture bfd_architecture;
|
||||||
gdbarch_init_ftype *init;
|
gdbarch_init_ftype *init;
|
||||||
|
gdbarch_dump_tdep_ftype *dump_tdep;
|
||||||
struct gdbarch_list *arches;
|
struct gdbarch_list *arches;
|
||||||
struct gdbarch_init_registration *next;
|
struct gdbarch_registration *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct gdbarch_init_registration *gdbarch_init_registrary = NULL;
|
static struct gdbarch_registration *gdbarch_registrary = NULL;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
append_name (const char ***buf, int *nr, const char *name)
|
append_name (const char ***buf, int *nr, const char *name)
|
||||||
@ -1529,8 +1576,8 @@ gdbarch_printable_names (void)
|
|||||||
enum bfd_architecture a;
|
enum bfd_architecture a;
|
||||||
int nr_arches = 0;
|
int nr_arches = 0;
|
||||||
const char **arches = NULL;
|
const char **arches = NULL;
|
||||||
struct gdbarch_init_registration *rego;
|
struct gdbarch_registration *rego;
|
||||||
for (rego = gdbarch_init_registrary;
|
for (rego = gdbarch_registrary;
|
||||||
rego != NULL;
|
rego != NULL;
|
||||||
rego = rego->next)
|
rego = rego->next)
|
||||||
{
|
{
|
||||||
@ -1556,10 +1603,11 @@ gdbarch_printable_names (void)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
register_gdbarch_init (enum bfd_architecture bfd_architecture,
|
gdbarch_register (enum bfd_architecture bfd_architecture,
|
||||||
gdbarch_init_ftype *init)
|
gdbarch_init_ftype *init,
|
||||||
|
gdbarch_dump_tdep_ftype *dump_tdep)
|
||||||
{
|
{
|
||||||
struct gdbarch_init_registration **curr;
|
struct gdbarch_registration **curr;
|
||||||
const struct bfd_arch_info *bfd_arch_info;
|
const struct bfd_arch_info *bfd_arch_info;
|
||||||
/* Check that BFD reconizes this architecture */
|
/* Check that BFD reconizes this architecture */
|
||||||
bfd_arch_info = bfd_lookup_arch (bfd_architecture, 0);
|
bfd_arch_info = bfd_lookup_arch (bfd_architecture, 0);
|
||||||
@ -1568,7 +1616,7 @@ register_gdbarch_init (enum bfd_architecture bfd_architecture,
|
|||||||
internal_error ("gdbarch: Attempt to register unknown architecture (%d)", bfd_architecture);
|
internal_error ("gdbarch: Attempt to register unknown architecture (%d)", bfd_architecture);
|
||||||
}
|
}
|
||||||
/* Check that we haven't seen this architecture before */
|
/* Check that we haven't seen this architecture before */
|
||||||
for (curr = &gdbarch_init_registrary;
|
for (curr = &gdbarch_registrary;
|
||||||
(*curr) != NULL;
|
(*curr) != NULL;
|
||||||
curr = &(*curr)->next)
|
curr = &(*curr)->next)
|
||||||
{
|
{
|
||||||
@ -1582,11 +1630,25 @@ register_gdbarch_init (enum bfd_architecture bfd_architecture,
|
|||||||
bfd_arch_info->printable_name,
|
bfd_arch_info->printable_name,
|
||||||
(long) init);
|
(long) init);
|
||||||
/* Append it */
|
/* Append it */
|
||||||
(*curr) = XMALLOC (struct gdbarch_init_registration);
|
(*curr) = XMALLOC (struct gdbarch_registration);
|
||||||
(*curr)->bfd_architecture = bfd_architecture;
|
(*curr)->bfd_architecture = bfd_architecture;
|
||||||
(*curr)->init = init;
|
(*curr)->init = init;
|
||||||
|
(*curr)->dump_tdep = dump_tdep;
|
||||||
(*curr)->arches = NULL;
|
(*curr)->arches = NULL;
|
||||||
(*curr)->next = NULL;
|
(*curr)->next = NULL;
|
||||||
|
/* When non- multi-arch, install what ever target dump routine we've
|
||||||
|
been provided - hopefully that routine has been writen correct
|
||||||
|
and works regardless of multi-arch. */
|
||||||
|
if (!GDB_MULTI_ARCH && dump_tdep != NULL
|
||||||
|
&& startup_gdbarch.dump_tdep == NULL)
|
||||||
|
startup_gdbarch.dump_tdep = dump_tdep;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
register_gdbarch_init (enum bfd_architecture bfd_architecture,
|
||||||
|
gdbarch_init_ftype *init)
|
||||||
|
{
|
||||||
|
gdbarch_register (bfd_architecture, init, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1617,7 +1679,7 @@ gdbarch_update (struct gdbarch_info info)
|
|||||||
{
|
{
|
||||||
struct gdbarch *new_gdbarch;
|
struct gdbarch *new_gdbarch;
|
||||||
struct gdbarch_list **list;
|
struct gdbarch_list **list;
|
||||||
struct gdbarch_init_registration *rego;
|
struct gdbarch_registration *rego;
|
||||||
|
|
||||||
/* Fill in any missing bits. Most important is the bfd_architecture
|
/* Fill in any missing bits. Most important is the bfd_architecture
|
||||||
which is used to select the target architecture. */
|
which is used to select the target architecture. */
|
||||||
@ -1651,9 +1713,11 @@ gdbarch_update (struct gdbarch_info info)
|
|||||||
/* A default for abfd? */
|
/* A default for abfd? */
|
||||||
|
|
||||||
/* Find the target that knows about this architecture. */
|
/* Find the target that knows about this architecture. */
|
||||||
for (rego = gdbarch_init_registrary;
|
for (rego = gdbarch_registrary;
|
||||||
rego != NULL && rego->bfd_architecture != info.bfd_architecture;
|
rego != NULL;
|
||||||
rego = rego->next);
|
rego = rego->next)
|
||||||
|
if (rego->bfd_architecture == info.bfd_architecture)
|
||||||
|
break;
|
||||||
if (rego == NULL)
|
if (rego == NULL)
|
||||||
{
|
{
|
||||||
if (gdbarch_debug)
|
if (gdbarch_debug)
|
||||||
@ -1718,7 +1782,8 @@ gdbarch_update (struct gdbarch_info info)
|
|||||||
if ((*list)->gdbarch == new_gdbarch)
|
if ((*list)->gdbarch == new_gdbarch)
|
||||||
{
|
{
|
||||||
if (gdbarch_debug)
|
if (gdbarch_debug)
|
||||||
fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Previous architecture 0x%08lx (%s) selected\n",
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
|
"gdbarch_update: Previous architecture 0x%08lx (%s) selected\n",
|
||||||
(long) new_gdbarch,
|
(long) new_gdbarch,
|
||||||
new_gdbarch->bfd_arch_info->printable_name);
|
new_gdbarch->bfd_arch_info->printable_name);
|
||||||
current_gdbarch = new_gdbarch;
|
current_gdbarch = new_gdbarch;
|
||||||
@ -1726,7 +1791,7 @@ gdbarch_update (struct gdbarch_info info)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Append this new architecture to this targets list. */
|
/* Append this new architecture to this targets list. */
|
||||||
(*list) = XMALLOC (struct gdbarch_list);
|
(*list) = XMALLOC (struct gdbarch_list);
|
||||||
(*list)->next = NULL;
|
(*list)->next = NULL;
|
||||||
@ -1740,10 +1805,11 @@ gdbarch_update (struct gdbarch_info info)
|
|||||||
"gdbarch_update: New architecture 0x%08lx (%s) selected\n",
|
"gdbarch_update: New architecture 0x%08lx (%s) selected\n",
|
||||||
(long) new_gdbarch,
|
(long) new_gdbarch,
|
||||||
new_gdbarch->bfd_arch_info->printable_name);
|
new_gdbarch->bfd_arch_info->printable_name);
|
||||||
gdbarch_dump ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check that the newly installed architecture is valid. */
|
/* Check that the newly installed architecture is valid. Plug in
|
||||||
|
any post init values. */
|
||||||
|
new_gdbarch->dump_tdep = rego->dump_tdep;
|
||||||
verify_gdbarch (new_gdbarch);
|
verify_gdbarch (new_gdbarch);
|
||||||
|
|
||||||
/* Initialize the per-architecture memory (swap) areas.
|
/* Initialize the per-architecture memory (swap) areas.
|
||||||
@ -1756,11 +1822,13 @@ gdbarch_update (struct gdbarch_info info)
|
|||||||
must be updated before these modules are called. */
|
must be updated before these modules are called. */
|
||||||
init_gdbarch_data (new_gdbarch);
|
init_gdbarch_data (new_gdbarch);
|
||||||
|
|
||||||
|
if (gdbarch_debug)
|
||||||
|
gdbarch_dump (current_gdbarch, gdb_stdlog);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Disassembler */
|
/* Disassembler */
|
||||||
|
|
||||||
/* Pointer to the target-dependent disassembly function. */
|
/* Pointer to the target-dependent disassembly function. */
|
||||||
|
20
gdb/maint.c
20
gdb/maint.c
@ -283,6 +283,21 @@ maintenance_print_statistics (args, from_tty)
|
|||||||
print_symbol_bcache_statistics ();
|
print_symbol_bcache_statistics ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
maintenance_print_architecture (char *args, int from_tty)
|
||||||
|
{
|
||||||
|
if (args == NULL)
|
||||||
|
gdbarch_dump (current_gdbarch, gdb_stdout);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct ui_file *file = gdb_fopen (args, "w");
|
||||||
|
if (file == NULL)
|
||||||
|
perror_with_name ("maintenance print architecture");
|
||||||
|
gdbarch_dump (current_gdbarch, file);
|
||||||
|
ui_file_delete (file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* The "maintenance print" command is defined as a prefix, with
|
/* The "maintenance print" command is defined as a prefix, with
|
||||||
allow_unknown 0. Therefore, its own definition is called only for
|
allow_unknown 0. Therefore, its own definition is called only for
|
||||||
"maintenance print" with no args. */
|
"maintenance print" with no args. */
|
||||||
@ -569,6 +584,11 @@ If a SOURCE file is specified, dump only that file's partial symbols.",
|
|||||||
"Print statistics about internal gdb state.",
|
"Print statistics about internal gdb state.",
|
||||||
&maintenanceprintlist);
|
&maintenanceprintlist);
|
||||||
|
|
||||||
|
add_cmd ("architecture", class_maintenance, maintenance_print_architecture,
|
||||||
|
"Print the internal architecture configuration.\
|
||||||
|
Takes an optional file parameter.",
|
||||||
|
&maintenanceprintlist);
|
||||||
|
|
||||||
add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
|
add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
|
||||||
"Check consistency of psymtabs and symtabs.",
|
"Check consistency of psymtabs and symtabs.",
|
||||||
&maintenancelist);
|
&maintenancelist);
|
||||||
|
138
gdb/mips-tdep.c
138
gdb/mips-tdep.c
@ -3840,7 +3840,6 @@ mips_gdbarch_init (info, arches)
|
|||||||
struct gdbarch *gdbarch;
|
struct gdbarch *gdbarch;
|
||||||
struct gdbarch_tdep *tdep;
|
struct gdbarch_tdep *tdep;
|
||||||
int elf_flags;
|
int elf_flags;
|
||||||
char *ef_mips_abi;
|
|
||||||
int ef_mips_bitptrs;
|
int ef_mips_bitptrs;
|
||||||
int ef_mips_arch;
|
int ef_mips_arch;
|
||||||
enum mips_abi mips_abi;
|
enum mips_abi mips_abi;
|
||||||
@ -3891,8 +3890,22 @@ mips_gdbarch_init (info, arches)
|
|||||||
if (mips_abi == MIPS_ABI_UNKNOWN)
|
if (mips_abi == MIPS_ABI_UNKNOWN)
|
||||||
mips_abi = MIPS_DEFAULT_ABI;
|
mips_abi = MIPS_DEFAULT_ABI;
|
||||||
#endif
|
#endif
|
||||||
if (mips_abi == MIPS_ABI_UNKNOWN)
|
|
||||||
mips_abi = MIPS_ABI_O32;
|
if (gdbarch_debug)
|
||||||
|
{
|
||||||
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
|
"mips_gdbarch_init: elf_flags = %08x\n",
|
||||||
|
elf_flags);
|
||||||
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
|
"mips_gdbarch_init: ef_mips_arch = %d\n",
|
||||||
|
ef_mips_arch);
|
||||||
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
|
"mips_gdbarch_init: ef_mips_bitptrs = %d\n",
|
||||||
|
ef_mips_bitptrs);
|
||||||
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
|
"mips_gdbarch_init: mips_abi = %d\n",
|
||||||
|
mips_abi);
|
||||||
|
}
|
||||||
|
|
||||||
/* try to find a pre-existing architecture */
|
/* try to find a pre-existing architecture */
|
||||||
for (arches = gdbarch_list_lookup_by_info (arches, &info);
|
for (arches = gdbarch_list_lookup_by_info (arches, &info);
|
||||||
@ -3923,7 +3936,6 @@ mips_gdbarch_init (info, arches)
|
|||||||
switch (mips_abi)
|
switch (mips_abi)
|
||||||
{
|
{
|
||||||
case MIPS_ABI_O32:
|
case MIPS_ABI_O32:
|
||||||
ef_mips_abi = "o32";
|
|
||||||
tdep->mips_default_saved_regsize = 4;
|
tdep->mips_default_saved_regsize = 4;
|
||||||
tdep->mips_default_stack_argsize = 4;
|
tdep->mips_default_stack_argsize = 4;
|
||||||
tdep->mips_fp_register_double = 0;
|
tdep->mips_fp_register_double = 0;
|
||||||
@ -3935,7 +3947,6 @@ mips_gdbarch_init (info, arches)
|
|||||||
set_gdbarch_long_long_bit (gdbarch, 64);
|
set_gdbarch_long_long_bit (gdbarch, 64);
|
||||||
break;
|
break;
|
||||||
case MIPS_ABI_O64:
|
case MIPS_ABI_O64:
|
||||||
ef_mips_abi = "o64";
|
|
||||||
tdep->mips_default_saved_regsize = 8;
|
tdep->mips_default_saved_regsize = 8;
|
||||||
tdep->mips_default_stack_argsize = 8;
|
tdep->mips_default_stack_argsize = 8;
|
||||||
tdep->mips_fp_register_double = 1;
|
tdep->mips_fp_register_double = 1;
|
||||||
@ -3947,7 +3958,6 @@ mips_gdbarch_init (info, arches)
|
|||||||
set_gdbarch_long_long_bit (gdbarch, 64);
|
set_gdbarch_long_long_bit (gdbarch, 64);
|
||||||
break;
|
break;
|
||||||
case MIPS_ABI_EABI32:
|
case MIPS_ABI_EABI32:
|
||||||
ef_mips_abi = "eabi32";
|
|
||||||
tdep->mips_default_saved_regsize = 4;
|
tdep->mips_default_saved_regsize = 4;
|
||||||
tdep->mips_default_stack_argsize = 4;
|
tdep->mips_default_stack_argsize = 4;
|
||||||
tdep->mips_fp_register_double = 0;
|
tdep->mips_fp_register_double = 0;
|
||||||
@ -3959,7 +3969,6 @@ mips_gdbarch_init (info, arches)
|
|||||||
set_gdbarch_long_long_bit (gdbarch, 64);
|
set_gdbarch_long_long_bit (gdbarch, 64);
|
||||||
break;
|
break;
|
||||||
case MIPS_ABI_EABI64:
|
case MIPS_ABI_EABI64:
|
||||||
ef_mips_abi = "eabi64";
|
|
||||||
tdep->mips_default_saved_regsize = 8;
|
tdep->mips_default_saved_regsize = 8;
|
||||||
tdep->mips_default_stack_argsize = 8;
|
tdep->mips_default_stack_argsize = 8;
|
||||||
tdep->mips_fp_register_double = 1;
|
tdep->mips_fp_register_double = 1;
|
||||||
@ -3971,7 +3980,6 @@ mips_gdbarch_init (info, arches)
|
|||||||
set_gdbarch_long_long_bit (gdbarch, 64);
|
set_gdbarch_long_long_bit (gdbarch, 64);
|
||||||
break;
|
break;
|
||||||
case MIPS_ABI_N32:
|
case MIPS_ABI_N32:
|
||||||
ef_mips_abi = "n32";
|
|
||||||
tdep->mips_default_saved_regsize = 4;
|
tdep->mips_default_saved_regsize = 4;
|
||||||
tdep->mips_default_stack_argsize = 8;
|
tdep->mips_default_stack_argsize = 8;
|
||||||
tdep->mips_fp_register_double = 1;
|
tdep->mips_fp_register_double = 1;
|
||||||
@ -3983,7 +3991,6 @@ mips_gdbarch_init (info, arches)
|
|||||||
set_gdbarch_long_long_bit (gdbarch, 64);
|
set_gdbarch_long_long_bit (gdbarch, 64);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ef_mips_abi = "default";
|
|
||||||
tdep->mips_default_saved_regsize = MIPS_REGSIZE;
|
tdep->mips_default_saved_regsize = MIPS_REGSIZE;
|
||||||
tdep->mips_default_stack_argsize = MIPS_REGSIZE;
|
tdep->mips_default_stack_argsize = MIPS_REGSIZE;
|
||||||
tdep->mips_fp_register_double = (REGISTER_VIRTUAL_SIZE (FP0_REGNUM) == 8);
|
tdep->mips_fp_register_double = (REGISTER_VIRTUAL_SIZE (FP0_REGNUM) == 8);
|
||||||
@ -4111,58 +4118,70 @@ mips_gdbarch_init (info, arches)
|
|||||||
set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid);
|
set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid);
|
||||||
set_gdbarch_get_saved_register (gdbarch, mips_get_saved_register);
|
set_gdbarch_get_saved_register (gdbarch, mips_get_saved_register);
|
||||||
|
|
||||||
if (gdbarch_debug)
|
|
||||||
{
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"mips_gdbarch_init: (info)ef_mips_abi = %s\n",
|
|
||||||
ef_mips_abi);
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"mips_gdbarch_init: (info)ef_mips_arch = %d\n",
|
|
||||||
ef_mips_arch);
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"mips_gdbarch_init: (info)ef_mips_bitptrs = %d\n",
|
|
||||||
ef_mips_bitptrs);
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"mips_gdbarch_init: MIPS_REGSIZE = %d\n",
|
|
||||||
MIPS_REGSIZE);
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"mips_gdbarch_init: tdep->elf_flags = 0x%x\n",
|
|
||||||
tdep->elf_flags);
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"mips_gdbarch_init: tdep->mips_abi = %d\n",
|
|
||||||
tdep->mips_abi);
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"mips_gdbarch_init: tdep->mips_fpu_type = %d (%s)\n",
|
|
||||||
tdep->mips_fpu_type,
|
|
||||||
(tdep->mips_fpu_type == MIPS_FPU_NONE ? "none"
|
|
||||||
: tdep->mips_fpu_type == MIPS_FPU_SINGLE ? "single"
|
|
||||||
: tdep->mips_fpu_type == MIPS_FPU_DOUBLE ? "double"
|
|
||||||
: "???"));
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"mips_gdbarch_init: tdep->mips_last_arg_regnum = %d\n",
|
|
||||||
tdep->mips_last_arg_regnum);
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"mips_gdbarch_init: tdep->mips_last_fp_arg_regnum = %d (%d)\n",
|
|
||||||
tdep->mips_last_fp_arg_regnum,
|
|
||||||
tdep->mips_last_fp_arg_regnum - FP0_REGNUM);
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"mips_gdbarch_init: tdep->mips_default_saved_regsize = %d\n",
|
|
||||||
tdep->mips_default_saved_regsize);
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"mips_gdbarch_init: tdep->mips_fp_register_double = %d (%s)\n",
|
|
||||||
tdep->mips_fp_register_double,
|
|
||||||
(tdep->mips_fp_register_double ? "true" : "false"));
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"mips_gdbarch_init: tdep->mips_regs_have_home_p = %d\n",
|
|
||||||
tdep->mips_regs_have_home_p);
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"mips_gdbarch_init: tdep->mips_default_stack_argsize = %d\n",
|
|
||||||
tdep->mips_default_stack_argsize);
|
|
||||||
}
|
|
||||||
|
|
||||||
return gdbarch;
|
return gdbarch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mips_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
|
||||||
|
{
|
||||||
|
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
|
||||||
|
if (tdep != NULL)
|
||||||
|
{
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: tdep->elf_flags = 0x%x\n",
|
||||||
|
tdep->elf_flags);
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: tdep->mips_abi = %d\n",
|
||||||
|
tdep->mips_abi);
|
||||||
|
}
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: FP_REGISTER_DOUBLE = %d\n",
|
||||||
|
FP_REGISTER_DOUBLE);
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: MIPS_DEFAULT_FPU_TYPE = %d (%s)\n",
|
||||||
|
MIPS_DEFAULT_FPU_TYPE,
|
||||||
|
(MIPS_DEFAULT_FPU_TYPE == MIPS_FPU_NONE ? "none"
|
||||||
|
: MIPS_DEFAULT_FPU_TYPE == MIPS_FPU_SINGLE ? "single"
|
||||||
|
: MIPS_DEFAULT_FPU_TYPE == MIPS_FPU_DOUBLE ? "double"
|
||||||
|
: "???"));
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: MIPS_EABI = %d\n",
|
||||||
|
MIPS_EABI);
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: MIPS_LAST_FP_ARG_REGNUM = %d\n",
|
||||||
|
MIPS_LAST_FP_ARG_REGNUM);
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: MIPS_LAST_ARG_REGNUM = %d\n",
|
||||||
|
MIPS_LAST_ARG_REGNUM);
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: MIPS_FPU_TYPE = %d (%s)\n",
|
||||||
|
MIPS_FPU_TYPE,
|
||||||
|
(MIPS_FPU_TYPE == MIPS_FPU_NONE ? "none"
|
||||||
|
: MIPS_FPU_TYPE == MIPS_FPU_SINGLE ? "single"
|
||||||
|
: MIPS_FPU_TYPE == MIPS_FPU_DOUBLE ? "double"
|
||||||
|
: "???"));
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: MIPS_DEFAULT_SAVED_REGSIZE = %d\n",
|
||||||
|
MIPS_DEFAULT_SAVED_REGSIZE);
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: MIPS_SAVED_REGSIZE = %d\n",
|
||||||
|
MIPS_SAVED_REGSIZE);
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: FP_REGISTER_DOUBLE = %d\n",
|
||||||
|
FP_REGISTER_DOUBLE);
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: MIPS_REGS_HAVE_HOME_P = %d\n",
|
||||||
|
MIPS_REGS_HAVE_HOME_P);
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: MIPS_DEFAULT_STACK_ARGSIZE = %d\n",
|
||||||
|
MIPS_DEFAULT_STACK_ARGSIZE);
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: MIPS_STACK_ARGSIZE = %d\n",
|
||||||
|
MIPS_STACK_ARGSIZE);
|
||||||
|
fprintf_unfiltered (file,
|
||||||
|
"mips_dump_tdep: MIPS_REGSIZE = %d\n",
|
||||||
|
MIPS_REGSIZE);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
_initialize_mips_tdep ()
|
_initialize_mips_tdep ()
|
||||||
@ -4170,8 +4189,7 @@ _initialize_mips_tdep ()
|
|||||||
static struct cmd_list_element *mipsfpulist = NULL;
|
static struct cmd_list_element *mipsfpulist = NULL;
|
||||||
struct cmd_list_element *c;
|
struct cmd_list_element *c;
|
||||||
|
|
||||||
if (GDB_MULTI_ARCH)
|
gdbarch_register (bfd_arch_mips, mips_gdbarch_init, mips_dump_tdep);
|
||||||
register_gdbarch_init (bfd_arch_mips, mips_gdbarch_init);
|
|
||||||
if (!tm_print_insn) /* Someone may have already set it */
|
if (!tm_print_insn) /* Someone may have already set it */
|
||||||
tm_print_insn = gdb_print_insn_mips;
|
tm_print_insn = gdb_print_insn_mips;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user