RISC-V: Handle vector type alignment.

For riscv64-linux target, first half of fix for
FAIL: gdb.base/gnu_vector.exp: call add_various_floatvecs

GCC gives vectors natural aligment based on total size, not element size,
bounded by the maximum supported type alignment.

	gdb/
	* riscv-tdep.c (BIGGEST_ALIGNMENT): New.
	(riscv_type_alignment) <TYPE_CODE_ARRAY>: If TYPE_VECTOR, return min
	of TYPE_LENGTH and BIGGEST_ALIGNMENT.
This commit is contained in:
Jim Wilson 2018-11-14 14:52:34 -08:00
parent 174f8ac8d4
commit ef2de9e7eb
2 changed files with 11 additions and 0 deletions

View File

@ -1,5 +1,9 @@
2018-11-14 Jim Wilson <jimw@sifive.com> 2018-11-14 Jim Wilson <jimw@sifive.com>
* riscv-tdep.c (BIGGEST_ALIGNMENT): New.
(riscv_type_alignment) <TYPE_CODE_ARRAY>: If TYPE_VECTOR, return min
of TYPE_LENGTH and BIGGEST_ALIGNMENT.
* riscv-tdep.c (riscv_call_arg_scalar_int): Use std::min when * riscv-tdep.c (riscv_call_arg_scalar_int): Use std::min when
setting len. New local align, set to max of arg align and xlen, setting len. New local align, set to max of arg align and xlen,
and pass to first riscv_assign_stack_location call. and pass to first riscv_assign_stack_location call.

View File

@ -59,6 +59,9 @@
/* The stack must be 16-byte aligned. */ /* The stack must be 16-byte aligned. */
#define SP_ALIGNMENT 16 #define SP_ALIGNMENT 16
/* The biggest alignment that the target supports. */
#define BIGGEST_ALIGNMENT 16
/* Forward declarations. */ /* Forward declarations. */
static bool riscv_has_feature (struct gdbarch *gdbarch, char feature); static bool riscv_has_feature (struct gdbarch *gdbarch, char feature);
@ -1642,6 +1645,10 @@ riscv_type_alignment (struct type *t)
return TYPE_LENGTH (t); return TYPE_LENGTH (t);
case TYPE_CODE_ARRAY: case TYPE_CODE_ARRAY:
if (TYPE_VECTOR (t))
return std::min (TYPE_LENGTH (t), (unsigned) BIGGEST_ALIGNMENT);
/* FALLTHROUGH */
case TYPE_CODE_COMPLEX: case TYPE_CODE_COMPLEX:
return riscv_type_alignment (TYPE_TARGET_TYPE (t)); return riscv_type_alignment (TYPE_TARGET_TYPE (t));