s390: Implement 'type_align' gdbarch method

The align.exp test case yields many FAILs on s390x, since GDB's _Alignoff
doesn't always agree with the compiler's.  On s390x, the maximum alignment
is 8, but GDB returns an alignment of 16 for 16-byte data types such as
"long double".

This is fixed by implementing the type_align gdbarch method.  The new
method returns an alignment of 8 for all integer, floating-point, and
vector types larger than 8 bytes.  With this change, all align.exp tests
pass.

gdb/ChangeLog:

	* s390-tdep.c (s390_type_align): New function.
	(s390_gdbarch_init): Set it as type_align gdbarch method.
This commit is contained in:
Andreas Arnez 2019-08-09 20:27:03 +02:00
parent f211b8c0b9
commit 1022c627db
2 changed files with 38 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2019-08-09 Andreas Arnez <arnez@linux.ibm.com>
* s390-tdep.c (s390_type_align): New function.
(s390_gdbarch_init): Set it as type_align gdbarch method.
2019-08-09 Tom de Vries <tdevries@suse.de>
PR gdb/24591

View File

@ -52,6 +52,37 @@ constexpr gdb_byte s390_break_insn[] = { 0x0, 0x1 };
typedef BP_MANIPULATION (s390_break_insn) s390_breakpoint;
/* Types. */
/* Implement the gdbarch type alignment method. */
static ULONGEST
s390_type_align (gdbarch *gdbarch, struct type *t)
{
t = check_typedef (t);
if (TYPE_LENGTH (t) > 8)
{
switch (TYPE_CODE (t))
{
case TYPE_CODE_INT:
case TYPE_CODE_RANGE:
case TYPE_CODE_FLT:
case TYPE_CODE_ENUM:
case TYPE_CODE_CHAR:
case TYPE_CODE_BOOL:
case TYPE_CODE_DECFLOAT:
return 8;
case TYPE_CODE_ARRAY:
if (TYPE_VECTOR (t))
return 8;
break;
}
}
return 0;
}
/* Decoding S/390 instructions. */
/* Read a single instruction from address AT. */
@ -6944,6 +6975,8 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_long_double_bit (gdbarch, 128);
set_gdbarch_long_double_format (gdbarch, floatformats_ia64_quad);
set_gdbarch_type_align (gdbarch, s390_type_align);
/* Breakpoints. */
/* Amount PC must be decremented by after a breakpoint. This is
often the number of bytes returned by gdbarch_breakpoint_from_pc but not