From patchwork Thu Mar 22 08:44:21 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Hayward X-Patchwork-Id: 26417 Received: (qmail 36815 invoked by alias); 22 Mar 2018 08:45:06 -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 36327 invoked by uid 89); 22 Mar 2018 08:45:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.0 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=reduces, eventual X-HELO: EUR03-DB5-obe.outbound.protection.outlook.com Received: from mail-eopbgr40079.outbound.protection.outlook.com (HELO EUR03-DB5-obe.outbound.protection.outlook.com) (40.107.4.79) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 22 Mar 2018 08:44:59 +0000 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Alan.Hayward@arm.com; Received: from C02TF0U7HF1T.arm.com (217.140.96.140) by AM2PR08MB0097.eurprd08.prod.outlook.com (2a01:111:e400:841e::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.609.10; Thu, 22 Mar 2018 08:44:53 +0000 From: alan.hayward@arm.com To: gdb-patches@sourceware.org Cc: nd@arm.com, Alan Hayward Subject: [PATCH v4 02/10] Make gdbserver reg_defs a vector of objects Date: Thu, 22 Mar 2018 08:44:21 +0000 Message-Id: <20180322084429.26250-3-alan.hayward@arm.com> In-Reply-To: <20180322084429.26250-1-alan.hayward@arm.com> References: <20180322084429.26250-1-alan.hayward@arm.com> MIME-Version: 1.0 X-ClientProxiedBy: CWXP265CA0052.GBRP265.PROD.OUTLOOK.COM (2603:10a6:400:2c::16) To AM2PR08MB0097.eurprd08.prod.outlook.com (2a01:111:e400:841e::18) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: a4e1f426-0ae7-4340-9e47-08d58fd12ec5 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:AM2PR08MB0097; X-Microsoft-Exchange-Diagnostics: 1; AM2PR08MB0097; 3:ocdC5j4V2uhY3JeXhBNtaKFOg6NNRTGvR/DV5KnYKNY1Mo/C68MC0eX2NYgUcdVEupx/sKam+JQR3XIs92qlmSsRvkF7VCCEhgVR5NdptZv/A0rhVvGiYgED9MbDL+oFZn0SPp19H/NO7D/LWcRUOv/Iffyp+NRdlq19bdM/lfyfQFd4dhiF9GfLXEBkRy/Ph3rT5iQosyGdRGfBYwl8tm+hxIJiYaKXx1WbNDRMqwvbso7hocM6x5FByaWFstqy; 25:iu7C8PBfIWCdDJtsMHktoGKLRe+mLTXUxLMthWH/PA/5ejGJU8XQIjlE4wVnfZzCLwJFIbOJlj+cJPcKMhcyFl/Ddyqmj73X56+S0enf07n4ocAkEZ8SEDGtKptNfpNVnBsGYpq7XgBOwgkOdQrCy1wLqDXO9N0F694Y71rb9zD5eq79Yc7o5vI1k6IdL292Wj/cExCPM+qsoaseB868PfNQ/+El1Oiykhp0xqBySuREgzpac24MDNMUS1mFu/7IYez6Lgd1OuTRhX0gB5hsytZobQEaALWnlV9btvL7UvEN5/du/P8T1FHQnfAohK8HnINEjVr/eanr08uJtIJFtA==; 31:JKFqVrAxFFyepkch7lL7qK0F9W/LOQEQ6K4Mg0uHaOr6s77EvCyxM1lb8QXWFKTlOct5SChwQth5Xqi/T0aY2ZIbefHZRnYVR1BzQdgXdDTuFwQntuDlm99Wx3/uZ2CKKghCl3u0clvudsjsMUeDwTmbKGhT+3ofIfwttDQftmfg/zi7QSB73f7WW6GOVeIPk7qfIQSK7fE4EXTQ01Zmv/aMNSLWpDYQ5eAHoNhM1rI= X-MS-TrafficTypeDiagnostic: AM2PR08MB0097: NoDisclaimer: True X-Microsoft-Exchange-Diagnostics: 1; AM2PR08MB0097; 20:7lTzJaLXibfk/W/e0jcfYuCYBLCtFf9LDXiCh/r2HwRv6xuo2PcVQ4ylp/oK9JWKXplab2plHjb6wWeTWt08a8y8PSHVF7+BuN8DClBbnMe8xXNqCkfWWRT7JkqUD4pHEXH5sSIThH+cycO32q8YGhZKWUJXkElMg1YjNqh6AOs=; 4:fZ5JMFn43JIiSwbC5MObtwQpXDTRH+QWyd3GutrX4eifLHzMslUJd7pOM2mMqPnKOv+jvxlGGhccp6OmWxi+ZsQ7VvkmJoOwkXgsPgM477mlEVjV2En1o4FgOPFE7fBW7YXqnZhMkJpK32lokFPJ4I/9tPi2oyslehifOOdS91cJcvCekFEXPlkFL9LbONxwK3W+gS8eveawb0M9cugNU/suGz2l8WBzQjcGXBoEXdMmEW9XB9C08A+1EAgEs8gLv4010R2iPpVArNXQK7bFJYUgay0Ihd08QSjfk/BpZQUl2WHuUthXSajFHqniXtEOAy5FTVs/MYfe8WUZamF4MJx1vko7ZM6R/UFiTyTV66p/ATIB4VXKlY9WmsLA2DvS X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(180628864354917)(131327999870524)(788757137089); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3002001)(10201501046)(93006095)(93001095)(3231221)(944501327)(52105095)(6055026)(6041310)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123564045)(20161123558120)(6072148)(201708071742011); SRVR:AM2PR08MB0097; BCL:0; PCL:0; RULEID:; SRVR:AM2PR08MB0097; X-Forefront-PRVS: 0619D53754 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(366004)(376002)(39380400002)(396003)(39860400002)(377424004)(189003)(199004)(97736004)(72206003)(16586007)(7696005)(6666003)(86362001)(6916009)(2906002)(2950100002)(66066001)(47776003)(6486002)(25786009)(53936002)(51416003)(4326008)(106356001)(1076002)(8676002)(105586002)(478600001)(53416004)(6116002)(305945005)(50226002)(36756003)(386003)(7736002)(52116002)(3846002)(81156014)(81166006)(9686003)(68736007)(76176011)(50466002)(8936002)(186003)(2351001)(16526019)(85782001)(26005)(316002)(5660300001)(2361001)(48376002)(446003)(85772001); DIR:OUT; SFP:1101; SCL:1; SRVR:AM2PR08MB0097; H:C02TF0U7HF1T.arm.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM2PR08MB0097; 23:8QMDgPxq1icxpMzxWxMxsSJiGlgEKVR97uNdLX3eE?= =?us-ascii?Q?PNBk+HhDi7EFLdfBSifUt4++DGwbCDGh8teh6lDKcagj9Z4APpv+mW7FzdmW?= =?us-ascii?Q?+3P7IhZ9IxESbsqASXzZFSAXcay6p5jZR0vdX2GTISn6/OKlt80sjwfE6pV3?= =?us-ascii?Q?B4WACAcItbUJBekifW8tT0zZnM/i8oObVYLPev/BXVhAeVNywqpravCKNH9s?= =?us-ascii?Q?F7TUSyy3cn2WFqO4ZUwdqjcqfZChaS8HbLDWzRkK56HgMlZCD7fIrjvpM0Qh?= =?us-ascii?Q?94cWc/7GRYs/td2PIzWdXf6QSHje1XLx7CVZRN5oepUCgek3YuvTRAYXh3Ax?= =?us-ascii?Q?uPwW3yn4vXiZt6DEyvIt+sXBNXjFW6/ZKjUQNOixhlotJPtd3QDzwG6COeYE?= =?us-ascii?Q?BYDh46qAh8aWfm7NlxBrv/SxEFQwgvV66VcV8i1PB1gBH+Nu8QYhbbmulg8x?= =?us-ascii?Q?kFemu6HW2cdpiozrdzq7/FDFLvicyGDadIYLE051vlImnxW3leZMy3nHikdf?= =?us-ascii?Q?yJeyq4fWWzv7SqB0QYHpGw8q9Fter7hkVLGg4P73KWyn1pmo/FVLTrRhg+37?= =?us-ascii?Q?OLJDaPcLKuwa44YfIZtZqI+H4hfbWNjEqCwKm39nRIBqtotQ3rL7Z2kBm4+M?= =?us-ascii?Q?VbY7fjERldVosYG8KYl5fBvTz0qFB228+IXfarGR//KawACRagQPG14CzqHj?= =?us-ascii?Q?zKkpDKEyx2xbK2jMuKUWC4fOHdm5V5hcN77P9U3+nCuIrZN2IxVjOpzPzobM?= =?us-ascii?Q?f6Pyp4kIIjOebHyRXK8TwlF/KB5KSz8dSB/XU+3pwg4UfIxvQ8VGy4F8DIA2?= =?us-ascii?Q?IrH1AXVywqxtwwpERgAEywcW8dI0kU3QB6eYA6Xri2XmHhzavV0cCX4SXlY/?= =?us-ascii?Q?cDhRhfcifDGeHdE+nZQ3XXweAzRF8r0iRqpUorJ2p8KxhUmEuIafOOXm8MWk?= =?us-ascii?Q?zV735JQYoWMOw4ZkiDUM4C3f56/nkAqC+7p4IgaDXO8ONihMRspxCNcdQZXG?= =?us-ascii?Q?I2/+TFqAZGhiuNuPw2KSCKHlhcf9ljdh6/9CF2xdhK38tD5h0JWhEzHoOS61?= =?us-ascii?Q?CNagucMmgd/3NLo13vmck4nyiMkwZsmQZGUNhUkkYCisjxBsnx1Iq6zP9995?= =?us-ascii?Q?RyBKpJYhuDHPdBmcS1NCj2mXdp/xSVrCbQzgcDIl30VkIg732Yq0eS/Zr0rP?= =?us-ascii?Q?0yu7T82TK6uiWO7i7hlrgBkdoNqVXqBZEjH99WXCAPVdYpG9Y2gWZEk+Q3wV?= =?us-ascii?Q?5cobXrkSjj5xtXI8Vo8XV6N0SF25DfMG9+fWhQHhkLPO4fOO9JJiEHDFmGwk?= =?us-ascii?B?UT09?= X-Microsoft-Antispam-Message-Info: duSTJ8oTS4Tj3BsshEKTjirQVbStX/7XCwFXM6xSeEp0EMIrww/0VOBAMgafjSdpNCjwFzk4PyBEylt6oR11fivanv6kzN6rtz1fMvFAdaFVuoLrIR48BEahgs7zqt/8ZembcsXmz+9UQj1Dd3RUyZYCm0MElbdgz3k6w748GLYKnQPHRDgIco/LtQDEId5w X-Microsoft-Exchange-Diagnostics: 1; AM2PR08MB0097; 6:L1nZ77H45MaA/PZjVZN5S18fRD8XWNf6IRWWklT4WI5pBoA5umLdBMiymA5NsMfi+kkqustDbO8HV18K4+vI5MU3q9hyT0BNQzf/25MBvR9y+JjyRo/XcoAWcKXmHRMo3XPDzcuTNzJDtr8OyA/pzse8P15Chm3XCC6INHgZIcV8D/gOBW8IrEDSKWrm+ln3ocNhCRTP0kqvvH3o4H7gTcO7rY7tlcthpT8rSs+K2o3wp6B3epDoQZQzP8jVYTICjH2JekXOjfKTBMZqHyI13YfBzM4NUwRB/mXZmfxo81FGFx5p54iFIMnAUlC1XLPN5Aq3LSQSfyRyHm42nu1Fb6iZdmyxvppUzRU4iqHW/yPyRFKDlfOjZBgh5oe7z5mGwDk/3Bh9C0oxi4XViQZ+tTQj/Az1Aw3lRhXzWlSpXgqVAAusO/WbSGR7aKMIM0ui+7PSIrwq9DUg7OplL9RgTQ==; 5:zEJtHcVvd8RJYkdNzj7HZkrlqP0SZnf5XqeA52suZ+PAdZq0omDXMSdg+uzDwUD2kX74GQCp5gn0XubUOYWdOi1/l2c6YrH4hRaZAWqi2yQUm5f8kKc5RUF+8oCVXmARjRuIlgVdqI68Vt+K0LsETZQxJ56mq7VmZ3AGvdyoYpk=; 24:qSuUjRMKUzvd+wS9SeZpxpAysDH94BeiW3Hx2BJ/AJHh5MVqL2SVRpgR40xXt+r+oWMY3Ufh/dyIsAUPewAZR3TSMXk703RHeXKWrE0erd4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM2PR08MB0097; 7:eqRXrcLZuTCs0Uda1kods0JnKji8kIE5EvmLVgWwMpZ5vVP87WnQz5IQWoTIMIIslFLTJx5WKFUxdN3np/E1hzpT/bvUEB3ec96tMldPrTmoBNR5FF6+LHPro+KmVWQmPJUs/OZ6EaXKWeDfe2mzqB56zqMNIQxwvSYWn9KNBWizvutq00U1Z4nUE7KCzmGnlL3dFfieNzOrTEqkmVZFBdCx6/H617ArGUV3JlY+PZIJgfPwpw1yLSqCfLxuuIsz X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Mar 2018 08:44:53.5933 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a4e1f426-0ae7-4340-9e47-08d58fd12ec5 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM2PR08MB0097 X-IsSubscribed: yes From: Alan Hayward Following a suggestion from Philipp, this patch changes reg_defs in gdbserver tdesc so that it is a vector of objects instead of a vector of pointers. Updated uses of reg_defs to use references. This change reduces the number of small hunks allocated when building reg_defs. find_register_by_number() is only used by regcache, therefore I made it a static function and moved it earlier in the file so that find_regno() could use it. The eventual plan is to replace this with accessor functions in a common tdesc class. Alan. 2018-03-21 Alan Hayward gdb/gdbserver/ * regcache.c (find_register_by_number): Make static and return a ref. (find_regno): Use find_register_by_number (register_size): Use references. (register_data): Likewise. * regcache.h (struct reg): Remove declaration. * tdesc.c (target_desc::~target_desc): Remove free calls. (target_desc::operator==): Use references. (init_target_desc): Likewise. (tdesc_create_reg): Use references and resize in a single call. * tdesc.h (struct target_desc): Replace pointer with object. --- gdb/gdbserver/regcache.c | 27 +++++++++++---------------- gdb/gdbserver/regcache.h | 4 ---- gdb/gdbserver/tdesc.c | 30 ++++++++++++++---------------- gdb/gdbserver/tdesc.h | 2 +- 4 files changed, 26 insertions(+), 37 deletions(-) diff --git a/gdb/gdbserver/regcache.c b/gdb/gdbserver/regcache.c index 1bb15900dd..df5b9e9dd2 100644 --- a/gdb/gdbserver/regcache.c +++ b/gdb/gdbserver/regcache.c @@ -196,6 +196,13 @@ regcache_cpy (struct regcache *dst, struct regcache *src) dst->registers_valid = src->registers_valid; } +/* Return a reference to the description of register ``n''. */ + +static const struct reg & +find_register_by_number (const struct target_desc *tdesc, int n) +{ + return tdesc->reg_defs[n]; +} #ifndef IN_PROCESS_AGENT @@ -243,25 +250,13 @@ int find_regno (const struct target_desc *tdesc, const char *name) { for (int i = 0; i < tdesc->reg_defs.size (); ++i) - { - struct reg *reg = tdesc->reg_defs[i]; + if (strcmp (name, find_register_by_number (tdesc, i).name) == 0) + return i; - if (strcmp (name, reg->name) == 0) - return i; - } internal_error (__FILE__, __LINE__, "Unknown register %s requested", name); } -#endif - -struct reg * -find_register_by_number (const struct target_desc *tdesc, int n) -{ - return tdesc->reg_defs[n]; -} - -#ifndef IN_PROCESS_AGENT static void free_register_cache_thread (struct thread_info *thread) { @@ -292,7 +287,7 @@ register_cache_size (const struct target_desc *tdesc) int register_size (const struct target_desc *tdesc, int n) { - return find_register_by_number (tdesc, n)->size / 8; + return find_register_by_number (tdesc, n).size / 8; } /* See common/common-regcache.h. */ @@ -307,7 +302,7 @@ static unsigned char * register_data (struct regcache *regcache, int n, int fetch) { return (regcache->registers - + find_register_by_number (regcache->tdesc, n)->offset / 8); + + find_register_by_number (regcache->tdesc, n).offset / 8); } /* Supply register N, whose contents are stored in BUF, to REGCACHE. diff --git a/gdb/gdbserver/regcache.h b/gdb/gdbserver/regcache.h index 3a75ce3fe1..6ff13084b0 100644 --- a/gdb/gdbserver/regcache.h +++ b/gdb/gdbserver/regcache.h @@ -94,10 +94,6 @@ void registers_from_string (struct regcache *regcache, char *buf); void regcache_write_pc (struct regcache *regcache, CORE_ADDR pc); -/* Return a pointer to the description of register ``n''. */ - -struct reg *find_register_by_number (const struct target_desc *tdesc, int n); - int register_cache_size (const struct target_desc *tdesc); int register_size (const struct target_desc *tdesc, int n); diff --git a/gdb/gdbserver/tdesc.c b/gdb/gdbserver/tdesc.c index e50a848e2f..8e68a27c7c 100644 --- a/gdb/gdbserver/tdesc.c +++ b/gdb/gdbserver/tdesc.c @@ -25,9 +25,6 @@ target_desc::~target_desc () { int i; - for (reg *reg : reg_defs) - xfree (reg); - xfree ((char *) arch); xfree ((char *) osabi); @@ -45,10 +42,10 @@ bool target_desc::operator== (const target_desc &other) const for (int i = 0; i < reg_defs.size (); ++i) { - struct reg *reg = reg_defs[i]; - struct reg *reg2 = other.reg_defs[i]; + struct reg reg = reg_defs[i]; + struct reg reg2 = other.reg_defs[i]; - if (reg != reg2 && *reg != *reg2) + if (® != ®2 && reg != reg2) return false; } @@ -72,10 +69,10 @@ init_target_desc (struct target_desc *tdesc) { int offset = 0; - for (reg *reg : tdesc->reg_defs) + for (reg ® : tdesc->reg_defs) { - reg->offset = offset; - offset += reg->size; + reg.offset = offset; + offset += reg.size; } tdesc->registers_size = offset / 8; @@ -240,24 +237,25 @@ tdesc_create_reg (struct tdesc_feature *feature, const char *name, int bitsize, const char *type) { struct target_desc *tdesc = (struct target_desc *) feature; + int current_size = tdesc->reg_defs.size (); - while (tdesc->reg_defs.size () < regnum) - { - struct reg *reg = XCNEW (struct reg); + tdesc->reg_defs.resize (regnum != 0 ? regnum + 1 : current_size + 1); + while (current_size < regnum) + { + struct reg *reg = &tdesc->reg_defs[current_size]; reg->name = ""; reg->size = 0; - tdesc->reg_defs.push_back (reg); + current_size++; } gdb_assert (regnum == 0 - || regnum == tdesc->reg_defs.size ()); + || regnum + 1 == tdesc->reg_defs.size ()); - struct reg *reg = XCNEW (struct reg); + struct reg *reg = &tdesc->reg_defs.back (); reg->name = name; reg->size = bitsize; - tdesc->reg_defs.push_back (reg); } /* See common/tdesc.h. */ diff --git a/gdb/gdbserver/tdesc.h b/gdb/gdbserver/tdesc.h index 4513ea7423..a62544341c 100644 --- a/gdb/gdbserver/tdesc.h +++ b/gdb/gdbserver/tdesc.h @@ -34,7 +34,7 @@ struct target_desc : tdesc_feature { /* A vector of elements of register definitions that describe the inferior's register set. */ - std::vector reg_defs; + std::vector reg_defs; /* The register cache size, in bytes. */ int registers_size;