diff options
author | Andreas Arnez <arnez@linux.ibm.com> | 2019-08-09 20:27:03 +0200 |
---|---|---|
committer | Andreas Arnez <arnez@linux.ibm.com> | 2019-08-09 20:27:03 +0200 |
commit | 1022c627dbd9d7f7f67ac68f16de05474de7a75a (patch) | |
tree | 54bac81fe8d3f44c008f16429c295bab8b2e844b /gdb/s390-tdep.c | |
parent | f211b8c0b91fc7b1657079a495f05a9a4d957821 (diff) | |
download | binutils-1022c627dbd9d7f7f67ac68f16de05474de7a75a.zip binutils-1022c627dbd9d7f7f67ac68f16de05474de7a75a.tar.gz binutils-1022c627dbd9d7f7f67ac68f16de05474de7a75a.tar.bz2 |
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.
Diffstat (limited to 'gdb/s390-tdep.c')
-rw-r--r-- | gdb/s390-tdep.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c index 4b93101..871efc5 100644 --- a/gdb/s390-tdep.c +++ b/gdb/s390-tdep.c @@ -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 |