gdb: Restructure type_align and gdbarch_type_align

This commit restructures the relationship between the type_align
function and the gdbarch_type_align method.

The problem being addressed with this commit is this; previously the
type_align function was structured so that for "basic" types (int,
float, etc) the gdbarch_type_align hook was called, which for
"compound" types (arrays, structs, etc) the common type_align code has
a fixed method for how to extract a "basic" type and would then call
itself on that "basic" type.

The problem is that if an architecture wants to modify the alignment
rules for a "compound" type then this is not currently possible.

In the revised structure, all types pass through the
gdbarch_type_align method.  If this method returns 0 then this
indicates that the architecture has no special rules for this type,
and GDB should apply the default rules for alignment.  However, the
architecture is free to provide an alignment for any type, both
"basic" and "compound".

After this commit the default alignment rules now all live in the
type_align function, the default_type_align only ever returns 0,
meaning apply the default rules.

I've updated the 3 targets (arc, i386, and nios2) that already
override the gdbarch_type_align method to fit the new scheme.

Tested on X86-64/GNU Linux with no regressions.

gdb/ChangeLog:

	* arc-tdep.c (arc_type_align): Provide alignment for basic types,
	return 0 for other types.
	* arch-utils.c (default_type_align): Always return 0.
	* gdbarch.h: Regenerate.
	* gdbarch.sh (type_align): Extend comment.
	* gdbtypes.c (type_align): Add additional comments, always call
	gdbarch_type_align before applying the default rules.
	* i386-tdep.c (i386_type_align): Return 0 as the default rule,
	generic code will then apply a suitable default.
	* nios2-tdep.c (nios2_type_align): Provide alignment for basic
	types, return 0 for other types.
This commit is contained in:
Andrew Burgess 2019-02-22 20:49:04 +00:00
parent 9335e75a61
commit 5561fc304f
8 changed files with 74 additions and 13 deletions

View file

@ -2992,11 +2992,17 @@ type_raw_align (struct type *type)
unsigned
type_align (struct type *type)
{
/* Check alignment provided in the debug information. */
unsigned raw_align = type_raw_align (type);
if (raw_align != 0)
return raw_align;
ULONGEST align = 0;
/* Allow the architecture to provide an alignment. */
struct gdbarch *arch = get_type_arch (type);
ULONGEST align = gdbarch_type_align (arch, type);
if (align != 0)
return align;
switch (TYPE_CODE (type))
{
case TYPE_CODE_PTR:
@ -3013,10 +3019,7 @@ type_align (struct type *type)
case TYPE_CODE_DECFLOAT:
case TYPE_CODE_METHODPTR:
case TYPE_CODE_MEMBERPTR:
{
struct gdbarch *arch = get_type_arch (type);
align = gdbarch_type_align (arch, type);
}
align = type_length_units (check_typedef (type));
break;
case TYPE_CODE_ARRAY: