Warn if core file register section is larger than expected

When reading a core file register section which is larger than
expected, emit a warning.  Assume that a register section usually has
exactly the size specified by the regset section iterator.  In some
special cases this assumption is wrong, or at least does not match the
regset supply function's logic.  Thus also add a way to suppress the
warning in those cases, using a new flag REGSET_VARIABLE_SIZE.

gdb/ChangeLog:

	* regset.h (struct regset): Add flags field.
	(REGSET_VARIABLE_SIZE): New value for a regset's flags field.
	* corelow.c (get_core_register_section): Add warning if the size
	exceeds the requested size and the regset does not have the
	REGSET_VARIABLE_SIZE flag set.
	* alphanbsd-tdep.c (alphanbsd_gregset): Add REGSET_VARIABLE_SIZE
	flag.
	* armbsd-tdep.c (armbsd_gregset): Likewise.
	* hppa-hpux-tdep.c (hppa_hpux_regset): Likewise.
	* hppaobsd-tdep.c (hppaobsd_gregset): Likewise.
	* m68kbsd-tdep.c (m68kbsd_gregset): Likewise.
	* mipsnbsd-tdep.c (mipsnbsd_gregset): Likewise.
This commit is contained in:
Andreas Arnez 2015-01-15 10:20:45 +00:00 committed by Ulrich Weigand
parent dde9acd693
commit f962539ad2
9 changed files with 45 additions and 6 deletions

View File

@ -1,3 +1,18 @@
2015-02-04 Andreas Arnez <arnez@linux.vnet.ibm.com>
* regset.h (struct regset): Add flags field.
(REGSET_VARIABLE_SIZE): New value for a regset's flags field.
* corelow.c (get_core_register_section): Add warning if the size
exceeds the requested size and the regset does not have the
REGSET_VARIABLE_SIZE flag set.
* alphanbsd-tdep.c (alphanbsd_gregset): Add REGSET_VARIABLE_SIZE
flag.
* armbsd-tdep.c (armbsd_gregset): Likewise.
* hppa-hpux-tdep.c (hppa_hpux_regset): Likewise.
* hppaobsd-tdep.c (hppaobsd_gregset): Likewise.
* m68kbsd-tdep.c (m68kbsd_gregset): Likewise.
* mipsnbsd-tdep.c (mipsnbsd_gregset): Likewise.
2015-02-04 Andreas Arnez <arnez@linux.vnet.ibm.com>
* amd64-linux-tdep.c (amd64_linux_iterate_over_regset_sections):

View File

@ -145,7 +145,9 @@ alphanbsd_supply_gregset (const struct regset *regset,
static const struct regset alphanbsd_gregset =
{
NULL,
alphanbsd_supply_gregset
alphanbsd_supply_gregset,
NULL,
REGSET_VARIABLE_SIZE
};
static const struct regset alphanbsd_fpregset =

View File

@ -98,7 +98,9 @@ armbsd_supply_gregset (const struct regset *regset,
static const struct regset armbsd_gregset =
{
NULL,
armbsd_supply_gregset
armbsd_supply_gregset,
NULL,
REGSET_VARIABLE_SIZE
};
static const struct regset armbsd_fpregset =

View File

@ -536,6 +536,11 @@ get_core_register_section (struct regcache *regcache,
warning (_("Section `%s' in core file too small."), section_name);
return;
}
if (size != min_size && !(regset->flags & REGSET_VARIABLE_SIZE))
{
warning (_("Unexpected size of section `%s' in core file."),
section_name);
}
contents = alloca (size);
if (! bfd_get_section_contents (core_bfd, section, contents,

View File

@ -1367,7 +1367,9 @@ hppa_hpux_supply_save_state (const struct regset *regset,
static const struct regset hppa_hpux_regset =
{
NULL,
hppa_hpux_supply_save_state
hppa_hpux_supply_save_state,
NULL,
REGSET_VARIABLE_SIZE
};
static void

View File

@ -131,7 +131,9 @@ hppaobsd_supply_fpregset (const struct regset *regset,
static const struct regset hppaobsd_gregset =
{
NULL,
hppaobsd_supply_gregset
hppaobsd_supply_gregset,
NULL,
REGSET_VARIABLE_SIZE
};
static const struct regset hppaobsd_fpregset =

View File

@ -105,7 +105,9 @@ m68kbsd_supply_gregset (const struct regset *regset,
static const struct regset m68kbsd_gregset =
{
NULL,
m68kbsd_supply_gregset
m68kbsd_supply_gregset,
NULL,
REGSET_VARIABLE_SIZE
};
static const struct regset m68kbsd_fpregset =

View File

@ -103,7 +103,9 @@ mipsnbsd_supply_gregset (const struct regset *regset,
static const struct regset mipsnbsd_gregset =
{
NULL,
mipsnbsd_supply_gregset
mipsnbsd_supply_gregset,
NULL,
REGSET_VARIABLE_SIZE
};
static const struct regset mipsnbsd_fpregset =

View File

@ -43,6 +43,13 @@ struct regset
/* Function collecting values in a register set from a register cache. */
collect_regset_ftype *collect_regset;
unsigned flags;
};
/* Values for a regset's 'flags' field. */
#define REGSET_VARIABLE_SIZE 1 /* Accept a larger regset section size
in a core file without warning. */
#endif /* regset.h */