From patchwork Fri Feb 22 22:29:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 31566 Received: (qmail 109091 invoked by alias); 22 Feb 2019 22:30:25 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 107760 invoked by uid 89); 22 Feb 2019 22:30:05 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-wm1-f41.google.com Received: from mail-wm1-f41.google.com (HELO mail-wm1-f41.google.com) (209.85.128.41) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 22 Feb 2019 22:30:03 +0000 Received: by mail-wm1-f41.google.com with SMTP id h22so9820313wmb.0 for ; Fri, 22 Feb 2019 14:30:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=wqFA9RNzNf4QdMGbnfHemMhe05VBf5fuff8aSx1sRjM=; b=WcR1Tx4q6BElZ1J+Lyl0QaEuw4BEX/QYmHRfvVFfGnHRD0IlXu6W43ZtdE+6aj/U2S 73kssRaZUfZLLG5O0Al+jGDwE6ZScav+xHLPkMl9FSgOKXZP9DbGNZWjyzejSqy7qATV JWqSFK+VsZnJWzDVTbugjaI5ITyldKcabGO1TpoNy70shXUa+udsRvinYtJhGx07Iari G8FDzHebiCtwlx40xjgCVoChSFBa59mgy6ixPB0/2CNJ6jE5gzR24SfEellBP/1wGYi+ qbHUTEE/wwSxkRYjO+LM1hYrZyBHtbyX4ZAVFsRTtEoB4bfsghHPGbTYc/skKnowe2Fp h66g== Return-Path: Received: from localhost ([94.185.164.146]) by smtp.gmail.com with ESMTPSA id t133sm3061376wmf.3.2019.02.22.14.29.59 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 22 Feb 2019 14:29:59 -0800 (PST) From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Tom Tromey , Andrew Burgess Subject: [PATCH 1/2] gdb: Restructure type_align and gdbarch_type_align Date: Fri, 22 Feb 2019 22:29:53 +0000 Message-Id: In-Reply-To: References: In-Reply-To: References: X-IsSubscribed: yes This commit restructures the relationship between the type_align function and the gdbarch_type_align method. The problem being addressed with this commit is this; previously the type_align function was structured so that for "basic" types (int, float, etc) the gdbarch_type_align hook was called, which for "compound" types (arrays, structs, etc) the common type_align code has a fixed method for how to extract a "basic" type and would then call itself on that "basic" type. The problem is that if an architecture wants to modify the alignment rules for a "compound" type then this is not currently possible. In the revised structure, all types pass through the gdbarch_type_align method. If this method returns 0 then this indicates that the architecture has no special rules for this type, and GDB should apply the default rules for alignment. However, the architecture is free to provide an alignment for any type, both "basic" and "compound". After this commit the default alignment rules now all live in the type_align function, the default_type_align only ever returns 0, meaning apply the default rules. I've updated the 3 targets (arc, i386, and nios2) that already override the gdbarch_type_align method to fit the new scheme. Tested on X86-64/GNU Linux with no regressions. gdb/ChangeLog: * 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. --- gdb/ChangeLog | 14 ++++++++++++++ gdb/arc-tdep.c | 23 +++++++++++++++++++++-- gdb/arch-utils.c | 2 +- gdb/gdbarch.h | 5 ++++- gdb/gdbarch.sh | 5 ++++- gdb/gdbtypes.c | 13 ++++++++----- gdb/i386-tdep.c | 2 +- gdb/nios2-tdep.c | 23 +++++++++++++++++++++-- 8 files changed, 74 insertions(+), 13 deletions(-) diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c index cd2762cb5cd..235fb276e47 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 d2e27d95558..52a08daa3b9 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 5b265a462aa..75618376abb 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 d53bbcc2ff4..48fcebd19a0 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 0d293393dae..63dec3c8b7d 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 663d510a915..bc9ba752edf 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 aa49a577dda..ee45db98af6 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. */