From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 102732 invoked by alias); 21 Sep 2015 23:07:52 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 102719 invoked by uid 89); 21 Sep 2015 23:07:51 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.8 required=5.0 tests=AWL,BAYES_50,KAM_LAZY_DOMAIN_SECURITY,RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 X-HELO: smtp-out6.electric.net Received: from smtp-out6.electric.net (HELO smtp-out6.electric.net) (192.162.217.189) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Mon, 21 Sep 2015 23:07:50 +0000 Received: from 1ZeABX-0007qi-T6 by out6a.electric.net with emc1-ok (Exim 4.85) (envelope-from ) id 1ZeABX-0007r4-Uj for gdb-patches@sourceware.org; Mon, 21 Sep 2015 16:07:47 -0700 Received: by emcmailer; Mon, 21 Sep 2015 16:07:47 -0700 Received: from [188.39.184.227] (helo=GLAEXCH3.ftdi.local) by out6a.electric.net with esmtps (TLSv1:AES128-SHA:128) (Exim 4.85) (envelope-from ) id 1ZeABX-0007qi-T6 for gdb-patches@sourceware.org; Mon, 21 Sep 2015 16:07:47 -0700 Received: from GLAEXCH1.ftdi.local ([172.16.0.121]) by glaexch3 ([172.16.0.161]) with mapi id 14.01.0438.000; Tue, 22 Sep 2015 00:06:51 +0100 From: James Bowman To: "gdb-patches@sourceware.org" Subject: [PATCH, FT32] Proper support for address <-> pointer conversions Date: Mon, 21 Sep 2015 23:07:00 -0000 Message-ID: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Outbound-IP: 188.39.184.227 X-Env-From: james.bowman@ftdichip.com X-PolicySMART: 3094660 X-SW-Source: 2015-09/txt/msg00517.txt.bz2 FT32 is a Harvard architecture with two address spaces -- RAM and flash. This patch properly implements the address to pointer conversion method, and its reverse. There are some other small fixes to handle address spaces. OK to apply? 2015-09-21 James Bowman * ft32-tdep.c: Properly support address <-> pointer conversions, so that FT32's address spaces (RAM and flash) work correctly when dereferencing pointers in gdb. * ft32-tdep.h: Add a type for an address space 1 pointer. diff --git a/gdb/ft32-tdep.c b/gdb/ft32-tdep.c index 2e5deca..d6e8c6d 100644 --- a/gdb/ft32-tdep.c +++ b/gdb/ft32-tdep.c @@ -117,7 +117,7 @@ static struct type * ft32_register_type (struct gdbarch *gdbarch, int reg_nr) { if (reg_nr =3D=3D FT32_PC_REGNUM) - return builtin_type (gdbarch)->builtin_func_ptr; + return gdbarch_tdep (gdbarch)->pc_type; else if (reg_nr =3D=3D FT32_SP_REGNUM || reg_nr =3D=3D FT32_FP_REGNUM) return builtin_type (gdbarch)->builtin_data_ptr; else @@ -270,6 +270,88 @@ ft32_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR= pc) return pc; } =20 +/* Convert from address to pointer and vice-versa. */ + +static void +ft32_address_to_pointer (struct gdbarch *gdbarch, + struct type *type, gdb_byte *buf, CORE_ADDR addr) +{ + enum bfd_endian byte_order =3D gdbarch_byte_order (gdbarch); + + store_unsigned_integer (buf, TYPE_LENGTH (type), byte_order, + addr); +} + +static CORE_ADDR +ft32_pointer_to_address (struct gdbarch *gdbarch, + struct type *type, const gdb_byte *buf) +{ + enum bfd_endian byte_order =3D gdbarch_byte_order (gdbarch); + CORE_ADDR addr + =3D extract_unsigned_integer (buf, TYPE_LENGTH (type), byte_order); + if (TYPE_ADDRESS_CLASS_1 (type)) + return addr; + else + return addr | RAM_BIAS; +} + +static CORE_ADDR +ft32_integer_to_address (struct gdbarch *gdbarch, + struct type *type, const gdb_byte *buf) +{ + ULONGEST addr =3D unpack_long (type, buf); + + return addr; +} + +/* Implementation of `address_class_type_flags' gdbarch method. + + This method maps DW_AT_address_class attributes to a + type_instance_flag_value. */ + +static int +ft32_address_class_type_flags (int byte_size, int dwarf2_addr_class) +{ + /* The value 1 of the DW_AT_address_class attribute corresponds to the + __flash__ qualifier, meaning pointer to data in FT32 program memory. + */ + if (dwarf2_addr_class =3D=3D 1) + return TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1; + return 0; +} + +/* Implementation of `address_class_type_flags_to_name' gdbarch method. + + Convert a type_instance_flag_value to an address space qualifier. */ + +static const char* +ft32_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_f= lags) +{ + if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1) + return "flash"; + else + return NULL; +} + +/* Implementation of `address_class_name_to_type_flags' gdbarch method. + + Convert an address space qualifier to a type_instance_flag_value. */ + +static int +ft32_address_class_name_to_type_flags (struct gdbarch *gdbarch, + const char* name, + int *type_flags_ptr) +{ + if (strcmp (name, "flash") =3D=3D 0) + { + *type_flags_ptr =3D TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1; + return 1; + } + else + return 0; +} + + /* Implement the "read_pc" gdbarch method. */ =20 static CORE_ADDR @@ -498,6 +580,15 @@ ft32_gdbarch_init (struct gdbarch_info info, struct gd= barch_list *arches) tdep =3D XNEW (struct gdbarch_tdep); gdbarch =3D gdbarch_alloc (&info, tdep); =20 + /* Create a type for PC. We can't use builtin types here, as they may n= ot + be defined. */ + tdep->void_type =3D arch_type (gdbarch, TYPE_CODE_VOID, 1, "void"); + tdep->func_void_type =3D make_function_type (tdep->void_type, NULL); + tdep->pc_type =3D arch_type (gdbarch, TYPE_CODE_PTR, 4, NULL); + TYPE_TARGET_TYPE (tdep->pc_type) =3D tdep->func_void_type; + TYPE_UNSIGNED (tdep->pc_type) =3D 1; + TYPE_INSTANCE_FLAGS (tdep->pc_type) |=3D TYPE_INSTANCE_FLAG_ADDRESS_CLAS= S_1; + set_gdbarch_read_pc (gdbarch, ft32_read_pc); set_gdbarch_write_pc (gdbarch, ft32_write_pc); set_gdbarch_unwind_sp (gdbarch, ft32_unwind_sp); @@ -510,6 +601,10 @@ ft32_gdbarch_init (struct gdbarch_info info, struct gd= barch_list *arches) =20 set_gdbarch_return_value (gdbarch, ft32_return_value); =20 + set_gdbarch_address_to_pointer (gdbarch, ft32_address_to_pointer); + set_gdbarch_pointer_to_address (gdbarch, ft32_pointer_to_address); + set_gdbarch_integer_to_address (gdbarch, ft32_integer_to_address); + set_gdbarch_skip_prologue (gdbarch, ft32_skip_prologue); set_gdbarch_inner_than (gdbarch, core_addr_lessthan); set_gdbarch_breakpoint_from_pc (gdbarch, ft32_breakpoint_from_pc); @@ -535,6 +630,12 @@ ft32_gdbarch_init (struct gdbarch_info info, struct gd= barch_list *arches) /* Support simple overlay manager. */ set_gdbarch_overlay_update (gdbarch, simple_overlay_update); =20 + set_gdbarch_address_class_type_flags (gdbarch, ft32_address_class_type_f= lags); + set_gdbarch_address_class_name_to_type_flags + (gdbarch, ft32_address_class_name_to_type_flags); + set_gdbarch_address_class_type_flags_to_name + (gdbarch, ft32_address_class_type_flags_to_name); + return gdbarch; } =20 diff --git a/gdb/ft32-tdep.h b/gdb/ft32-tdep.h index 5c52480..f236163 100644 --- a/gdb/ft32-tdep.h +++ b/gdb/ft32-tdep.h @@ -22,7 +22,12 @@ =20 struct gdbarch_tdep { - /* gdbarch target dependent data here. Currently unused for FT32. */ + /* Type for void. */ + struct type *void_type; + /* Type for a function returning void. */ + struct type *func_void_type; + /* Type for a pointer to a function. Used for the type of PC. */ + struct type *pc_type; }; =20 #endif /* FT32_TDEP_H */ >From gdb-patches-return-126278-listarch-gdb-patches=sources.redhat.com@sourceware.org Mon Sep 21 23:17:04 2015 Return-Path: Delivered-To: listarch-gdb-patches@sources.redhat.com Received: (qmail 118636 invoked by alias); 21 Sep 2015 23:17:04 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 118625 invoked by uid 89); 21 Sep 2015 23:17:03 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00,SPF_PASS autolearn=ham version=3.3.2 X-HELO: usevmg21.ericsson.net Received: from usevmg21.ericsson.net (HELO usevmg21.ericsson.net) (198.24.6.65) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Mon, 21 Sep 2015 23:17:02 +0000 Received: from EUSAAHC001.ericsson.se (Unknown_Domain [147.117.188.75]) by usevmg21.ericsson.net (Symantec Mail Security) with SMTP id 7D.B4.26730.9B420065; Mon, 21 Sep 2015 17:39:37 +0200 (CEST) Received: from elxcz23q12-y4.dyn.mo.ca.am.ericsson.se (147.117.188.8) by smtps-am.internal.ericsson.com (147.117.188.75) with Microsoft SMTP Server (TLS) id 14.3.248.2; Mon, 21 Sep 2015 19:16:59 -0400 From: Simon Marchi To: CC: Simon Marchi Subject: [PATCH] tui: Simplify tui_alloc_content Date: Mon, 21 Sep 2015 23:17:00 -0000 Message-ID: <1442877416-16659-1-git-send-email-simon.marchi@ericsson.com> MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes X-SW-Source: 2015-09/txt/msg00518.txt.bz2 Content-length: 2383 I stumbled upon this while doing some cxx-conversion work. Since the x-family alloc functions throw on failure, it is useless to test their result for failure. The else branch of != NULL is basically dead code. I changed the type of element_block_ptr to struct tui_win_element, which seems obvious (this is actually what raised the flag, casting the result of xmalloc to struct tui_win_element* wouldn't work). gdb/ChangeLog: * tui/tui-data.c (tui_alloc_content): Don't check xmalloc result. Change type of element_block_ptr. Change allocation to use XNEWVEC. --- gdb/tui/tui-data.c | 41 ++++++++++++++--------------------------- 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c index 2fcd547..ca7502d 100644 --- a/gdb/tui/tui-data.c +++ b/gdb/tui/tui-data.c @@ -573,40 +573,27 @@ tui_win_content tui_alloc_content (int num_elements, enum tui_win_type type) { tui_win_content content; - char *element_block_ptr; + struct tui_win_element *element_block_ptr; int i; content = XNEWVEC (struct tui_win_element *, num_elements); - if (content != NULL) + + /* + * All windows, except the data window, can allocate the + * elements in a chunk. The data window cannot because items + * can be added/removed from the data display by the user at any + * time. + */ + if (type != DATA_WIN) { - /* - * All windows, except the data window, can allocate the - * elements in a chunk. The data window cannot because items - * can be added/removed from the data display by the user at any - * time. - */ - if (type != DATA_WIN) + element_block_ptr = XNEWVEC (struct tui_win_element, num_elements); + for (i = 0; i < num_elements; i++) { - element_block_ptr = - xmalloc (sizeof (struct tui_win_element) * num_elements); - if (element_block_ptr != NULL) - { - for (i = 0; i < num_elements; i++) - { - content[i] = (struct tui_win_element *) element_block_ptr; - init_content_element (content[i], type); - element_block_ptr += sizeof (struct tui_win_element); - } - } - else - { - xfree (content); - content = (tui_win_content) NULL; - } + content[i] = element_block_ptr; + init_content_element (content[i], type); + element_block_ptr++; } } - - return content; } -- 2.5.1