From patchwork Sun Sep 3 09:05:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 22590 Received: (qmail 113924 invoked by alias); 3 Sep 2017 09:05:51 -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 113906 invoked by uid 89); 3 Sep 2017 09:05:49 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.3 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.2 spammy=adv, 91110, explanations, stitching X-HELO: sessmg23.ericsson.net Received: from sessmg23.ericsson.net (HELO sessmg23.ericsson.net) (193.180.251.45) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 03 Sep 2017 09:05:43 +0000 Received: from ESESSHC019.ericsson.se (Unknown_Domain [153.88.183.75]) by sessmg23.ericsson.net (Symantec Mail Security) with SMTP id 4A.D2.22436.5E5CBA95; Sun, 3 Sep 2017 11:05:41 +0200 (CEST) Received: from EUR03-AM5-obe.outbound.protection.outlook.com (153.88.183.145) by oa.msg.ericsson.com (153.88.183.75) with Microsoft SMTP Server (TLS) id 14.3.352.0; Sun, 3 Sep 2017 11:05:40 +0200 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=simon.marchi@ericsson.com; Received: from elxacz23q12.localdomain (80.216.43.226) by AM3PR07MB308.eurprd07.prod.outlook.com (2a01:111:e400:881b::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.35.3; Sun, 3 Sep 2017 09:05:37 +0000 From: Simon Marchi To: CC: , , Simon Marchi Subject: [PATCH] btrace: Store btrace_insn in an std::vector Date: Sun, 3 Sep 2017 11:05:30 +0200 Message-ID: <1504429530-27720-1-git-send-email-simon.marchi@ericsson.com> MIME-Version: 1.0 X-ClientProxiedBy: DB6PR07CA0095.eurprd07.prod.outlook.com (2603:10a6:6:2b::33) To AM3PR07MB308.eurprd07.prod.outlook.com (2a01:111:e400:881b::19) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: dedd7393-876d-4963-82f7-08d4f2aaf1e8 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:AM3PR07MB308; X-Microsoft-Exchange-Diagnostics: 1; AM3PR07MB308; 3:Skgj0hT2WjgTtc51x7uFg/d+EZHu0/YaHqz/PvXbC7VJFM7l14QVMEvX8YcYxQ9J/lMEtWIVEgkRvK3Z4TzBJ4RAudqFvvmW5sOL5jtyVDogDkXSLJJ65uXzSf5U/DjWFB2uFmXaFnJ/U8pK7OIxCn+IJnV9i4J/znEfsRHrqNSGurdCToFQ5A4EEmBHFpoysU0jAOUCNZ+drPlWJ73oK3fKGsRwfI6WCh2memY41TbqT6CmrvkbZFYPXQyBU4Aj; 25:BTChHtUpZv2F4eqVVGFvNwQ+8M1x6lIo4fUstLXq0OMQj0qN0ICXMjoEoBf4X008rsv3QInp7ImIfnor7qtdPvSvYsloEPX3+m9nQRJc3RpnNe/FbJSVWHyJxTWpLihBVl3WheSrOC6Q+ZFhyHLJK7WqOBOKLag/2ykapmYIXO+aBVWIuNr6ywdn/cHKYEm1whidN8FV0Phh2jE0Aqpo0k7f3+/GaMlhvEbcuhDaXi/8t0admJnTSAMagNFch9hnmL+g477rfB+SPBXpearOiOocH5/ExKzx3p+Fo5YvA7o7awh88QCsEyKr55BFwp4ZLlwlDNNLStAhe7YV6bvyiw==; 31:kEGhQe9ZiHN6gQaMgj/ozxCCBRxmIVkWjKzE9qTqq0LElwe2Q3meXOh9n98+xgJa8+5tzdDrh6o3uDLac4O4JM4BntclfkVg1rNTDeGi69iTtt9VqTbK8UMMp24jDwl97GxbtWHzHKOaKVAli2V8wCLF24ljtXq4rD7xgUjBAYHjf549NnZnCCbEPVHqLYaq6zv3CcbNxhfkoX2n/DC4OtE8X00ZrbZPCogr4TPTOXY= X-MS-TrafficTypeDiagnostic: AM3PR07MB308: X-Microsoft-Exchange-Diagnostics: 1; AM3PR07MB308; 20:N1eisJSnBrtX6FRGyszv5vEEQJ57QpPcOr1AhhNJGBQxZkHJLwI+kHfALV+iQ9pTeYkxYW1+WeuvPOHBvvSwodfjUOejlM5bEiFL0slGCMmm160ILVOMCCPuPIThX8b+va3R+tZAnAUgf6geAin6LqG50BHgFffL29QK0Ch89UoR1O2Odzs3rH0vtiUIVKl57mGXkc8wx8ksOzmjcO0w5r6iju609kDvPH+rYIqrYt2RU4xhQZoVCL1tGjp8p9ZeBXB4XTmFUW50XqNLRHN7V4xm2RKtYjwxE9uM+k9bnfHpcHfzwOQ+PdiAwnmeefG2FktELKQM5Kd88HyMV4sCfjxcQsTz9c50WZfurAQBKcL1Z52xzsdyFdtSEjrGhjq6Ehb6pv/wAoHq0T6v9WtrcntyhtNwregS6qeVSYE7Bif1ZDAqS3doeNjm36cZsUxHq8Oeu+3VS+eDNkiAGhPr2UGXTNikkXC7DnVjs7ecBeNPuLBTVIG5z9hEBOiH6vQ4; 4:9ZAI7RhZWkmMZX3avPCXX1+YSzTDU3JPqJOYQQhWG+VYsDTBT090OP2c+mXvzoILngAm792+G+wozrRPWcmkeGf86w42Z4N91hk0/6bTx2p7CK6K8TMV+9LEI2fZrGr1hknLs8T6muZzRklhM6rQxQd0KLKKboCzh0oTLFGKYGDw2PHo/w1VpHjtU1CMKAHZ5i5ofNY3iRWzav/XWLnKZe5N+0bihcks5gTz2gqyK4ZM3Ce0BvsgprSn9N2RW/zm4Q98OINUo9TZSsKLfbPh0/s+3ZNpYzANnzz/CcHf5QQ= X-Exchange-Antispam-Report-Test: UriScan:(788757137089); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(100000703101)(100105400095)(93006095)(93001095)(6041248)(20161123558100)(20161123555025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(20161123562025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:AM3PR07MB308; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:AM3PR07MB308; X-Forefront-PRVS: 041963B986 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(7370300001)(4630300001)(6009001)(199003)(54534003)(189002)(2906002)(478600001)(7350300001)(42186005)(3846002)(53936002)(5003940100001)(6116002)(97736004)(25786009)(6916009)(6666003)(2351001)(2361001)(6512007)(105586002)(106356001)(33646002)(110136004)(107886003)(86362001)(5660300001)(101416001)(50986999)(68736007)(50466002)(48376002)(4326008)(7736002)(305945005)(50226002)(6506006)(6486002)(189998001)(47776003)(66066001)(36756003)(8676002)(81156014)(81166006); DIR:OUT; SFP:1101; SCL:1; SRVR:AM3PR07MB308; H:elxacz23q12.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: ericsson.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM3PR07MB308; 23:KUPA9w5QVoyHqM2Jw5dP/cU8dOhEEwQ154nnyAYYUX?= =?us-ascii?Q?nQYHxj0wxDVR2BE+RxgbO5yHWtoB75DJWvrXWm+CbDXeqNexdgb1jUOoBf9I?= =?us-ascii?Q?s8goDxUGlNWszZTNW1UXyBr3NT/v0un9z43+dDdebRQAZ39KOhfgHzoYVj+Z?= =?us-ascii?Q?0RZx8xrdY0Uu3OuV7VHpRaKDFOgyaTaEdVkgWNY/GroGQqHBfP53yDdtDbA2?= =?us-ascii?Q?FSESiuRhphm40AQo5mLGOWxchWLsA5viJFIMtZEwohL67FGFof1Zu7pSgw/A?= =?us-ascii?Q?HwwsWWql3qioIEeeva+Szt6GLoJ9DUE90ZADUYQUmJRT46WHyQ6kAtG5XZu+?= =?us-ascii?Q?haneQFidvfH/oFarZ5WUQLOqvjChF130H02slhy5jER71pBm4iXlLr66lMUz?= =?us-ascii?Q?Fjcg8Jo/UUUULYONkKct2YA9aKvsYNFUiVcDYVO9kZZQAfhO7YEZlhjd1yIW?= =?us-ascii?Q?MQJm4fe7GmrO5TG6DZrfl4WTzuUxFaTZkpFTkm4i3VqKCjRvXu9xVniWQJ8i?= =?us-ascii?Q?TTkJW+t7UfXq4grxvFcHUZSa3YGV2x5SOeSz2KjHHalkmTOdp7HNxmp6bNOM?= =?us-ascii?Q?ZyZMQVgLIqIAxgcy0xpuklV61gCY1XYaFtUUGobhUOh63hUStc6JHM1oOM5S?= =?us-ascii?Q?EpBcnuDZhbqgZVVkpzNdkMgeYlQW5ulSg9b3iaw4NXQOPqwVYIrK9nKoEbDY?= =?us-ascii?Q?N1eiEYidpsT0GUq9J3+RNXZtN133M0GDthTzQ6qD5SbLckVcMSY2ObVILqO0?= =?us-ascii?Q?ySwBdXDiey42mq3mMsXjMICbniG06MXwCKlae//bNybUj394F1mYneqVdQ6t?= =?us-ascii?Q?JoYPlw5ht/82G6LIYmv/ehcRraT/TvJkrUzBfwdmJ7nRFdeD66f1/Hu73YLP?= =?us-ascii?Q?4SJVhtxqJ99wHGeeBAaxdTbcLLZRk30nTw6ptLld9JUSeT21iw2eF2ua8ij7?= =?us-ascii?Q?kSOJvhkEojOSAw9/k0nBdD7SClye/qS9a5meTngKTLzC4f03UlYSpcBWI56V?= =?us-ascii?Q?HJyK8XiJNekTJTXaUvW8oRfP4ivPzmah2gEkWMcHOEwNxH4K2En8NGH6c4vn?= =?us-ascii?Q?fI/DDET/miw2o9WJ1kEyyOS0nzhupgXB+ORoWn0VLwy5DMeTh/KRwMCYcuAX?= =?us-ascii?Q?U7PC0EJpU=3D?= X-Microsoft-Exchange-Diagnostics: 1; AM3PR07MB308; 6:tQJoK5xg/Y/ZdUeyBEa7COqFUIZTLjbyCXBUI+iqjhunPvf0PvJDQuU3Jpw+IhFl+Br2bNABsvcweEqCcGuyCa52ql5sprZwXZEvF7Nxj7sQ0WCRADzk7E3phATGnqGcl7+bTWcM+zna5dC4tgzXonRsfmlCVsbFO6oLjS/AWmyrU+MJqbiKhI6ty9+oA+vgoB/XyPrblq/MmMMW6D46HNyAG3B8mHmG+dPylYW5vyFAjFvdsJtEqTQzwUcPqVYkcSKZfscl5S8IjlWD37A9AdpqVWb62sCXkH14E/5NjqEOhWrwDUGiCBG8wEPhDyXZqim8WYXpU68y8wnmQd3C2w==; 5:1emCfBpdJ3dsGdTDIdhmzQMFkpF+dnh/RtCyfLeC5KYGjsRoubfDvHo1rK+xSJeiWBJp5WWiq03nqTXneBEzpsp3061h3KnvdluqPWREUS9fvGpMUeAlwYr8bGfERwhhYP22OE+Z0AJNQ8Q9VoCVkw==; 24:VCUngBzRKbJf9CZTdNuWv9CifxnnVUJRNxKh09LJ4lcqwmBaYPbeKoA1jdevo9iJd6hPGBRfkYDUA5stuyI01b1i+UKKab4iX1aAi2oE/KU=; 7:TgYCd/6vRSgOWnCco3q0VNspr8HMdoSvZe8Uv/XZEYiD1paHXGUTnJvJt/1Bqm1boQa/DP4AX1/QZ9E9n6WP1eKBkMilddsp5bAKU1RZeBxKd/pw4Llyv91pcBK4JpHVTpEAyncfSZP8JDsEQwPPrAVsSkj8rlDDEtmrms1FSprcrLrQjBnDfLXmFl3FoRHQvIEW4xcjhlv92fl5dEyTU2rlFSO2cum8LTM5c0ZIU1M= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Sep 2017 09:05:37.7522 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR07MB308 X-OriginatorOrg: ericsson.com X-IsSubscribed: yes Because it contains a non-POD type field (flags), the type btrace_insn should be new'ed/delete'd. Replace the VEC (btrace_insn_s) in btrace_function with an std::vector. gdb/ChangeLog: * btrace.h (btrace_insn_s, DEF_VEC_O (btrace_insn_s)): Remove. (btrace_function) : Change type to use std::vector. * btrace.c (ftrace_debug, ftrace_call_num_insn, ftrace_find_call, ftrace_new_gap, ftrace_update_function, ftrace_update_insns, ftrace_compute_global_level_offset, btrace_stitch_bts, btrace_clear, btrace_insn_get, btrace_insn_end, btrace_insn_next, btrace_insn_prev): Adjust to change to std::vector. (ftrace_update_insns): Adjust to change to std::vector, change type of INSN parameter. (btrace_compute_ftrace_bts): Adjust call to ftrace_update_insns. * record-btrace.c (btrace_call_history_insn_range, btrace_compute_src_line_range, record_btrace_frame_prev_register): Adjust to change to std::vector. * python/py-record-btrace.c (recpy_bt_func_instructions): Adjust to change to std::vector. --- gdb/btrace.c | 59 +++++++++++++++++++------------------------ gdb/btrace.h | 6 +---- gdb/python/py-record-btrace.c | 2 +- gdb/record-btrace.c | 18 ++++--------- 4 files changed, 33 insertions(+), 52 deletions(-) diff --git a/gdb/btrace.c b/gdb/btrace.c index 2a83e1b..6d2a9c4 100644 --- a/gdb/btrace.c +++ b/gdb/btrace.c @@ -131,7 +131,7 @@ ftrace_debug (const struct btrace_function *bfun, const char *prefix) level = bfun->level; ibegin = bfun->insn_offset; - iend = ibegin + VEC_length (btrace_insn_s, bfun->insn); + iend = ibegin + bfun->insn.size (); DEBUG_FTRACE ("%s: fun = %s, file = %s, level = %d, insn = [%u; %u)", prefix, fun, file, level, ibegin, iend); @@ -149,7 +149,7 @@ ftrace_call_num_insn (const struct btrace_function* bfun) if (bfun->errcode != 0) return 1; - return VEC_length (btrace_insn_s, bfun->insn); + return bfun->insn.size (); } /* Return the function segment with the given NUMBER or NULL if no such segment @@ -390,15 +390,13 @@ ftrace_find_call (struct btrace_thread_info *btinfo, { for (; bfun != NULL; bfun = ftrace_find_call_by_number (btinfo, bfun->up)) { - struct btrace_insn *last; - /* Skip gaps. */ if (bfun->errcode != 0) continue; - last = VEC_last (btrace_insn_s, bfun->insn); + btrace_insn &last = bfun->insn.back (); - if (last->iclass == BTRACE_INSN_CALL) + if (last.iclass == BTRACE_INSN_CALL) break; } @@ -528,7 +526,7 @@ ftrace_new_gap (struct btrace_thread_info *btinfo, int errcode, { /* We hijack the previous function segment if it was empty. */ bfun = &btinfo->functions.back (); - if (bfun->errcode != 0 || !VEC_empty (btrace_insn_s, bfun->insn)) + if (bfun->errcode != 0 || !bfun->insn.empty ()) bfun = ftrace_new_function (btinfo, NULL, NULL); } @@ -550,7 +548,6 @@ ftrace_update_function (struct btrace_thread_info *btinfo, CORE_ADDR pc) struct bound_minimal_symbol bmfun; struct minimal_symbol *mfun; struct symbol *fun; - struct btrace_insn *last; struct btrace_function *bfun; /* Try to determine the function we're in. We use both types of symbols @@ -575,9 +572,9 @@ ftrace_update_function (struct btrace_thread_info *btinfo, CORE_ADDR pc) /* Check the last instruction, if we have one. We do this check first, since it allows us to fill in the call stack links in addition to the normal flow links. */ - last = NULL; - if (!VEC_empty (btrace_insn_s, bfun->insn)) - last = VEC_last (btrace_insn_s, bfun->insn); + btrace_insn *last = NULL; + if (!bfun->insn.empty ()) + last = &bfun->insn.back (); if (last != NULL) { @@ -648,10 +645,9 @@ ftrace_update_function (struct btrace_thread_info *btinfo, CORE_ADDR pc) /* Add the instruction at PC to BFUN's instructions. */ static void -ftrace_update_insns (struct btrace_function *bfun, - const struct btrace_insn *insn) +ftrace_update_insns (struct btrace_function *bfun, const btrace_insn &insn) { - VEC_safe_push (btrace_insn_s, bfun->insn, insn); + bfun->insn.push_back (insn); if (record_debug > 1) ftrace_debug (bfun, "update insn"); @@ -747,7 +743,7 @@ ftrace_compute_global_level_offset (struct btrace_thread_info *btinfo) really part of the trace. If it contains just this one instruction, we ignore the segment. */ struct btrace_function *last = &btinfo->functions.back(); - if (VEC_length (btrace_insn_s, last->insn) != 1) + if (last->insn.size () != 1) level = std::min (level, last->level); DEBUG_FTRACE ("setting global level offset: %d", -level); @@ -1104,7 +1100,7 @@ btrace_compute_ftrace_bts (struct thread_info *tp, insn.iclass = ftrace_classify_insn (gdbarch, pc); insn.flags = 0; - ftrace_update_insns (bfun, &insn); + ftrace_update_insns (bfun, insn); /* We're done once we pushed the instruction at the end. */ if (block->end == pc) @@ -1682,7 +1678,6 @@ btrace_stitch_bts (struct btrace_data_bts *btrace, struct thread_info *tp) { struct btrace_thread_info *btinfo; struct btrace_function *last_bfun; - struct btrace_insn *last_insn; btrace_block_s *first_new_block; btinfo = &tp->btrace; @@ -1694,7 +1689,7 @@ btrace_stitch_bts (struct btrace_data_bts *btrace, struct thread_info *tp) /* If the existing trace ends with a gap, we just glue the traces together. We need to drop the last (i.e. chronologically first) block of the new trace, though, since we can't fill in the start address.*/ - if (VEC_empty (btrace_insn_s, last_bfun->insn)) + if (last_bfun->insn.empty ()) { VEC_pop (btrace_block_s, btrace->blocks); return 0; @@ -1704,7 +1699,7 @@ btrace_stitch_bts (struct btrace_data_bts *btrace, struct thread_info *tp) chronologically first block in the new trace is the last block in the new trace's block vector. */ first_new_block = VEC_last (btrace_block_s, btrace->blocks); - last_insn = VEC_last (btrace_insn_s, last_bfun->insn); + const btrace_insn &last_insn = last_bfun->insn.back (); /* If the current PC at the end of the block is the same as in our current trace, there are two explanations: @@ -1714,19 +1709,19 @@ btrace_stitch_bts (struct btrace_data_bts *btrace, struct thread_info *tp) entries. In the second case, the delta trace vector should contain exactly one entry for the partial block containing the current PC. Remove it. */ - if (first_new_block->end == last_insn->pc + if (first_new_block->end == last_insn.pc && VEC_length (btrace_block_s, btrace->blocks) == 1) { VEC_pop (btrace_block_s, btrace->blocks); return 0; } - DEBUG ("stitching %s to %s", ftrace_print_insn_addr (last_insn), + DEBUG ("stitching %s to %s", ftrace_print_insn_addr (&last_insn), core_addr_to_string_nz (first_new_block->end)); /* Do a simple sanity check to make sure we don't accidentally end up with a bad block. This should not occur in practice. */ - if (first_new_block->end < last_insn->pc) + if (first_new_block->end < last_insn.pc) { warning (_("Error while trying to read delta trace. Falling back to " "a full read.")); @@ -1735,16 +1730,16 @@ btrace_stitch_bts (struct btrace_data_bts *btrace, struct thread_info *tp) /* We adjust the last block to start at the end of our current trace. */ gdb_assert (first_new_block->begin == 0); - first_new_block->begin = last_insn->pc; + first_new_block->begin = last_insn.pc; /* We simply pop the last insn so we can insert it again as part of the normal branch trace computation. Since instruction iterators are based on indices in the instructions vector, we don't leave any pointers dangling. */ DEBUG ("pruning insn at %s for stitching", - ftrace_print_insn_addr (last_insn)); + ftrace_print_insn_addr (&last_insn)); - VEC_pop (btrace_insn_s, last_bfun->insn); + last_bfun->insn.pop_back (); /* The instructions vector may become empty temporarily if this has been the only instruction in this function segment. @@ -1755,7 +1750,7 @@ btrace_stitch_bts (struct btrace_data_bts *btrace, struct thread_info *tp) of just that one instruction. If we remove it, we might turn the now empty btrace function segment into a gap. But we don't want gaps at the beginning. To avoid this, we remove the entire old trace. */ - if (last_bfun->number == 1 && VEC_empty (btrace_insn_s, last_bfun->insn)) + if (last_bfun->number == 1 && last_bfun->insn.empty ()) btrace_clear (tp); return 0; @@ -1980,8 +1975,6 @@ btrace_clear (struct thread_info *tp) reinit_frame_cache (); btinfo = &tp->btrace; - for (auto &bfun : btinfo->functions) - VEC_free (btrace_insn_s, bfun.insn); btinfo->functions.clear (); btinfo->ngaps = 0; @@ -2337,11 +2330,11 @@ btrace_insn_get (const struct btrace_insn_iterator *it) return NULL; /* The index is within the bounds of this function's instruction vector. */ - end = VEC_length (btrace_insn_s, bfun->insn); + end = bfun->insn.size (); gdb_assert (0 < end); gdb_assert (index < end); - return VEC_index (btrace_insn_s, bfun->insn, index); + return &bfun->insn[index]; } /* See btrace.h. */ @@ -2387,7 +2380,7 @@ btrace_insn_end (struct btrace_insn_iterator *it, error (_("No trace.")); bfun = &btinfo->functions.back (); - length = VEC_length (btrace_insn_s, bfun->insn); + length = bfun->insn.size (); /* The last function may either be a gap or it contains the current instruction, which is one past the end of the execution trace; ignore @@ -2416,7 +2409,7 @@ btrace_insn_next (struct btrace_insn_iterator *it, unsigned int stride) { unsigned int end, space, adv; - end = VEC_length (btrace_insn_s, bfun->insn); + end = bfun->insn.size (); /* An empty function segment represents a gap in the trace. We count it as one instruction. */ @@ -2509,7 +2502,7 @@ btrace_insn_prev (struct btrace_insn_iterator *it, unsigned int stride) /* We point to one after the last instruction in the new function. */ bfun = prev; - index = VEC_length (btrace_insn_s, bfun->insn); + index = bfun->insn.size (); /* An empty function segment represents a gap in the trace. We count it as one instruction. */ diff --git a/gdb/btrace.h b/gdb/btrace.h index 9fde919..df6e895 100644 --- a/gdb/btrace.h +++ b/gdb/btrace.h @@ -81,10 +81,6 @@ struct btrace_insn btrace_insn_flags flags; }; -/* A vector of branch trace instructions. */ -typedef struct btrace_insn btrace_insn_s; -DEF_VEC_O (btrace_insn_s); - /* Flags for btrace function segments. */ enum btrace_function_flag { @@ -161,7 +157,7 @@ struct btrace_function /* The instructions in this function segment. The instruction vector will be empty if the function segment represents a decode error. */ - VEC (btrace_insn_s) *insn = NULL; + std::vector insn; /* The error code of a decode error that led to a gap. Must be zero unless INSN is empty; non-zero otherwise. */ diff --git a/gdb/python/py-record-btrace.c b/gdb/python/py-record-btrace.c index cd2be9f..220990b 100644 --- a/gdb/python/py-record-btrace.c +++ b/gdb/python/py-record-btrace.c @@ -376,7 +376,7 @@ recpy_bt_func_instructions (PyObject *self, void *closure) if (func == NULL) return NULL; - len = VEC_length (btrace_insn_s, func->insn); + len = func->insn.size (); /* Gaps count as one instruction. */ if (len == 0) diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index 6ac8573..d35800b 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -891,7 +891,7 @@ btrace_call_history_insn_range (struct ui_out *uiout, { unsigned int begin, end, size; - size = VEC_length (btrace_insn_s, bfun->insn); + size = bfun->insn.size (); gdb_assert (size > 0); begin = bfun->insn_offset; @@ -911,10 +911,8 @@ static void btrace_compute_src_line_range (const struct btrace_function *bfun, int *pbegin, int *pend) { - struct btrace_insn *insn; struct symtab *symtab; struct symbol *sym; - unsigned int idx; int begin, end; begin = INT_MAX; @@ -926,11 +924,11 @@ btrace_compute_src_line_range (const struct btrace_function *bfun, symtab = symbol_symtab (sym); - for (idx = 0; VEC_iterate (btrace_insn_s, bfun->insn, idx, insn); ++idx) + for (const btrace_insn &insn : bfun->insn) { struct symtab_and_line sal; - sal = find_pc_line (insn->pc, 0); + sal = find_pc_line (insn.pc, 0); if (sal.symtab != symtab || sal.line == 0) continue; @@ -1615,7 +1613,6 @@ record_btrace_frame_prev_register (struct frame_info *this_frame, { const struct btrace_frame_cache *cache; const struct btrace_function *bfun, *caller; - const struct btrace_insn *insn; struct btrace_call_iterator it; struct gdbarch *gdbarch; CORE_ADDR pc; @@ -1638,15 +1635,10 @@ record_btrace_frame_prev_register (struct frame_info *this_frame, caller = btrace_call_get (&it); if ((bfun->flags & BFUN_UP_LINKS_TO_RET) != 0) - { - insn = VEC_index (btrace_insn_s, caller->insn, 0); - pc = insn->pc; - } + pc = caller->insn.front ().pc; else { - insn = VEC_last (btrace_insn_s, caller->insn); - pc = insn->pc; - + pc = caller->insn.back ().pc; pc += gdb_insn_length (gdbarch, pc); }