diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b0fce99b94..07f3c478b2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2019-02-27 Andrew Burgess + + * 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. + 2019-02-27 Joel Brobecker * NEWS: Create a new section for the next release branch. diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c index cd2762cb5c..235fb276e4 100644 --- a/gdb/arc-tdep.c +++ b/gdb/arc-tdep.c @@ -1963,8 +1963,27 @@ arc_tdesc_init (struct gdbarch_info info, const struct target_desc **tdesc, static ULONGEST arc_type_align (struct gdbarch *gdbarch, struct type *type) { - type = check_typedef (type); - return std::min (4, TYPE_LENGTH (type)); + switch (TYPE_CODE (type)) + { + case TYPE_CODE_PTR: + case TYPE_CODE_FUNC: + case TYPE_CODE_FLAGS: + case TYPE_CODE_INT: + case TYPE_CODE_RANGE: + case TYPE_CODE_FLT: + case TYPE_CODE_ENUM: + case TYPE_CODE_REF: + case TYPE_CODE_RVALUE_REF: + case TYPE_CODE_CHAR: + case TYPE_CODE_BOOL: + case TYPE_CODE_DECFLOAT: + case TYPE_CODE_METHODPTR: + case TYPE_CODE_MEMBERPTR: + type = check_typedef (type); + return std::min (4, TYPE_LENGTH (type)); + default: + return 0; + } } /* Implement the "init" gdbarch method. */ diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c index d2e27d9555..52a08daa3b 100644 --- a/gdb/arch-utils.c +++ b/gdb/arch-utils.c @@ -993,7 +993,7 @@ default_in_indirect_branch_thunk (gdbarch *gdbarch, CORE_ADDR pc) ULONGEST default_type_align (struct gdbarch *gdbarch, struct type *type) { - return type_length_units (check_typedef (type)); + return 0; } void diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 5b265a462a..75618376ab 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -1589,7 +1589,10 @@ extern void set_gdbarch_disassembler_options (struct gdbarch *gdbarch, char ** d extern const disasm_options_and_args_t * gdbarch_valid_disassembler_options (struct gdbarch *gdbarch); extern void set_gdbarch_valid_disassembler_options (struct gdbarch *gdbarch, const disasm_options_and_args_t * valid_disassembler_options); -/* Type alignment. */ +/* Type alignment override method. Return the architecture specific + alignment required for TYPE. If there is no special handling + required for TYPE then return the value 0, GDB will then apply the + default rules as laid out in gdbtypes.c:type_align. */ typedef ULONGEST (gdbarch_type_align_ftype) (struct gdbarch *gdbarch, struct type *type); extern ULONGEST gdbarch_type_align (struct gdbarch *gdbarch, struct type *type); diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index d53bbcc2ff..48fcebd19a 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -1171,7 +1171,10 @@ v;const char *;disassembler_options_implicit;;;0;0;;0;pstring (gdbarch->disassem v;char **;disassembler_options;;;0;0;;0;pstring_ptr (gdbarch->disassembler_options) v;const disasm_options_and_args_t *;valid_disassembler_options;;;0;0;;0;host_address_to_string (gdbarch->valid_disassembler_options) -# Type alignment. +# Type alignment override method. Return the architecture specific +# alignment required for TYPE. If there is no special handling +# required for TYPE then return the value 0, GDB will then apply the +# default rules as laid out in gdbtypes.c:type_align. m;ULONGEST;type_align;struct type *type;type;;default_type_align;;0 EOF diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 0d293393da..63dec3c8b7 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -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: diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 663d510a91..bc9ba752ed 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -8348,7 +8348,7 @@ i386_type_align (struct gdbarch *gdbarch, struct type *type) return 4; } - return TYPE_LENGTH (type); + return 0; } diff --git a/gdb/nios2-tdep.c b/gdb/nios2-tdep.c index aa49a577dd..ee45db98af 100644 --- a/gdb/nios2-tdep.c +++ b/gdb/nios2-tdep.c @@ -2233,8 +2233,27 @@ nios2_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc) static ULONGEST nios2_type_align (struct gdbarch *gdbarch, struct type *type) { - type = check_typedef (type); - return std::min (4, TYPE_LENGTH (type)); + switch (TYPE_CODE (type)) + { + case TYPE_CODE_PTR: + case TYPE_CODE_FUNC: + case TYPE_CODE_FLAGS: + case TYPE_CODE_INT: + case TYPE_CODE_RANGE: + case TYPE_CODE_FLT: + case TYPE_CODE_ENUM: + case TYPE_CODE_REF: + case TYPE_CODE_RVALUE_REF: + case TYPE_CODE_CHAR: + case TYPE_CODE_BOOL: + case TYPE_CODE_DECFLOAT: + case TYPE_CODE_METHODPTR: + case TYPE_CODE_MEMBERPTR: + type = check_typedef (type); + return std::min (4, TYPE_LENGTH (type)); + default: + return 0; + } } /* Implement the gcc_target_options gdbarch method. */