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:
parent
f211b8c0b9
commit
1022c627db
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue