From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2045.outbound.protection.outlook.com [40.107.22.45]) by sourceware.org (Postfix) with ESMTPS id DFF16385742F for ; Mon, 23 May 2022 10:13:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org DFF16385742F ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=Y8Jo9u10pvZnkO0fgS2165ZAKaTTCO+PZBuGXRK0YkfB3NZC7QjPqic/+dHZyqoMzDkB8qdfzbJeCRsMLQv3kbvXPd1Xm6L1zWCn6xdfd1fmM+Xzi5VeIuXQ3yIFcIFUkQtjP7O0YyZL9pGOS7XkkYGH98dKNOJ9xxi+5LwlAeGvwhIrsM04fJ7VtALjZaXlfrZsTDz1rYQjocdNrWB3rPBJENM2SxDDdGpBJCm23YwPOpjyHkpx6I85B5MjkfELru/1Z71WI724WJeUHTGK9l7xSM7drfOCSobZRc17gs/FUVbKn/bAV59aU7hku4NFFdL6zNhrEvuVqK3vlfLBsg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=dw6J5nbQrcTDBJ6iYrd8DCfjSpAuiO0Cx4TPIo/0lGk=; b=UH/1f9FQPsyg6Xn7G0r0bVH9/HaDvxxynZ6NsyugQvo1Isz7Cd2OKSyn06mmJVDzg/8AAuI5alqNeQDpT2xfCfY70+sAocmfbDYBfgNXuiWT+1+TtHlEIu4rqYuTFNgbXGWuSKv4LnqjkIH6lYCKlOYhCs9GpsAfPRf8Gdm3Bxwi6vR1VEWNyGFqYVaE4eVtNe71jrWDM9hT0S0Fry67yGNXhNZWvhyaGlBM3wgZ4Kl60ofvlSEBaSWk43yAiCuyf8Jc4rNUiWNnqBMb7tTt3cCbZ7Z3WDNaswvVTrilrxiAwAQ9miAFLpEbST0Jq0JwcRzpC/XZWrzJtlWBORjesg== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=sourceware.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) Received: from DB6PR0202CA0014.eurprd02.prod.outlook.com (2603:10a6:4:29::24) by DB9PR08MB7023.eurprd08.prod.outlook.com (2603:10a6:10:2cb::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5273.14; Mon, 23 May 2022 10:13:09 +0000 Received: from DBAEUR03FT044.eop-EUR03.prod.protection.outlook.com (2603:10a6:4:29:cafe::fe) by DB6PR0202CA0014.outlook.office365.com (2603:10a6:4:29::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5273.22 via Frontend Transport; Mon, 23 May 2022 10:13:09 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DBAEUR03FT044.mail.protection.outlook.com (100.127.142.189) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5273.14 via Frontend Transport; Mon, 23 May 2022 10:13:09 +0000 Received: ("Tessian outbound c1f35bac1852:v119"); Mon, 23 May 2022 10:13:09 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: c2d5f1769eeaa1ca X-CR-MTA-TID: 64aa7808 Received: from 575cd1db38f9.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 2AF53C18-4D72-422C-B4A2-27BED0BE8802.1; Mon, 23 May 2022 10:13:01 +0000 Received: from EUR05-AM6-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 575cd1db38f9.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 23 May 2022 10:13:01 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=icu+lZg7ynWb2pzcPiN7jhlIC03sjfw8Gx/mzHGElMMBm/HT5T44kfaEgtdLE2ibzme5U//m0CiziQiXP8dXL6nMOxow70FIvHglFnIXGmlQFMTxi4DYlAKE6kTQG1VIJXF8Ay1Cg3ZqOIx+9SeOgTJB3lJxh9zPFwIdrD9HSK/d69yk46rO4Ub0lYmuA2CzPO8K+plVpqikHTEr+nSJ9jKaHgRGnRxMHuPNMHZUM5jXeXNnvCIBMdChpEPKHDGTX8qPukLq9/nKTDmYn4FaUshEAy4APaqJy8RrZFtKWLDSiJEN6cdChDpaQIsPb2h7SaZV0NPgBSLPQx3g4MLJOQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=dw6J5nbQrcTDBJ6iYrd8DCfjSpAuiO0Cx4TPIo/0lGk=; b=N5pbTAdWTKhDIQKwg7DxLuE1pyoL6076ZBsONLxN0kSxAXZ682tDSVY4tR2vAKoJF+/fh775ITKS+RfDpdkTK3lXCx3wGLlz7brzDdD+kcU7GLkKTXCjOiHfHsJMScEwv/1OcZG8NqsEqObhnF+4yof4qGPYQZ56JmYTVJnutjN+sreCNDHmUoAKiPBXDCPvl6KTIYESLBDsCfh8d2vKu+NB1eacDE+QKvs3zAcOxLv5sr5Fq3XrjTWxZ49H1Cw/tbMX/3PL7lWmj44OvY4dC6OMI9EHAGSL+TbGSjjZ9ywhzMN8Ke7eByfURUV5FeSp3NaeO2WaNbU9rvqVG6snAA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from VI1PR08MB3919.eurprd08.prod.outlook.com (2603:10a6:803:c4::31) by VE1PR08MB5663.eurprd08.prod.outlook.com (2603:10a6:800:1a4::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5273.14; Mon, 23 May 2022 10:13:00 +0000 Received: from VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::7080:6233:cf8f:a8a6]) by VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::7080:6233:cf8f:a8a6%7]) with mapi id 15.20.5273.022; Mon, 23 May 2022 10:12:59 +0000 Message-ID: <26f2f9f6-5dca-3641-82de-24ccee90fda6@arm.com> Date: Mon, 23 May 2022 11:12:57 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.1 Subject: Re: [PING][PATCH,v5] Fix reverse stepping multiple contiguous PC ranges over the line table Content-Language: en-US To: Carl Love , Bruno Larsen , gdb-patches@sourceware.org Cc: rogealve@br.ibm.com, Will Schmidt References: <20220506085506.9184-1-luis.machado@arm.com> <9e420536-01e0-7192-d585-747c52fdf4d5@redhat.com> <65abc453edc9d73df97a8630503420ebf8c5747b.camel@us.ibm.com> <3069b9009d09bb26a4b1878070e250993262636c.camel@us.ibm.com> From: Luis Machado In-Reply-To: <3069b9009d09bb26a4b1878070e250993262636c.camel@us.ibm.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-ClientProxiedBy: LO3P265CA0016.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:bb::21) To VI1PR08MB3919.eurprd08.prod.outlook.com (2603:10a6:803:c4::31) MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 0586da05-1340-4417-140a-08da3ca4d680 X-MS-TrafficTypeDiagnostic: VE1PR08MB5663:EE_|DBAEUR03FT044:EE_|DB9PR08MB7023:EE_ X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: VpWnoqCViyyYEbhUtNECjy9uOFd/20tlbDv8HzCqTR7KO+uyrGhEJfddveFGSmNhFx3oYnWaAp6iAHnUGDUmLxaSEb2Z8P+Y53pbD9xOWhBwl/z3L6tzTYt6/NiiEwZq+OjuZzOHoYUgXut6s+9au+QnLhXLJ2l4YHjJ0tQ90MpTcDmwciQu6DOKZ0yB931nUHUNZafmNbOJeqKgJZKTSHfimyLbKddSd1vn4ori/aYPfMAqwxxxlyN1gbpJ0gs2AIOn2MDQmvxfJxwRmETnoE+cSeuyxqtogIqNlIsOcoxZKoqWHrEuq9NuK9uZ61NmshcAYvDxOLVVekLwdqMdYBd/n1wvd/r+KbFF3jz7ET+/Whhi9hqEBrTDaYSTHsNg/EA757na8mJTlB6T6lNhtbuysehOSCf6NJUiEakLrVgiEcjHT563SNPbgue/HCjly/tzN0re2FZpLIR2Ql9ZAZnPbMCjJAyn5kNaeKWvUmcBlD2XG/Aa2r62H2wds3Pg/bx9wIw8n7vGth8eHLFe//vVm0dUS4JpLwjOQ/atmNW+8w/2leKbQI2SfUzNPAbj+ob1nMqBdvsoUHRfjwy6/6ApzIIgp89boEanXx3shNO6QTMwaVnjFWiP04fzUb7VE9jjTs3LmsPRgw6Bfj97jPzKV6WrMgIy9hbaaD7aB1xCLBVp0TEQ3S/I3irRcRSTsDAEmsqszhhsdPwJh4GuefKNEPaPL7Y83RKnkICcXYFfAZXB/HYn/33HLP2MznyBtQ31UhbZtYQCcU8Rfbv1ejq8IroAYv1qfsKVVQBNOmoo9Af0U69gKDB0dARDMU5hSM6Ivmfiw2B1HIBRd0Xgiw== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR08MB3919.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230001)(4636009)(366004)(5660300002)(26005)(38100700002)(66946007)(66556008)(8676002)(66476007)(2906002)(44832011)(30864003)(86362001)(31696002)(8936002)(4326008)(53546011)(6512007)(508600001)(966005)(6486002)(186003)(6506007)(83380400001)(2616005)(110136005)(316002)(31686004)(84970400001)(36756003)(2004002)(43740500002)(45980500001); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR08MB5663 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DBAEUR03FT044.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: c69fe147-c478-413d-341d-08da3ca4d01c X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: LBZa3Ce3DxLSjipg0n4Lub2Ky7H11dGrnlVx2Vbk+hwHAnOcThfS2mS3fix8pd5V0Oo/4qy2yr2T8fLH4EBxEhxE3DZjwysSkCm1t8FKcOegoJTraawIDsNRJHm5WUK+0ni1z3iXeHwc13PSzjj6IHErYtrgSUF+ZIyLeVGzIU3OSA8QG4RMdbExwKhQdMp6ts/W5XwRuBMho6dGjD7n4xmQ5iaHLJf0SMrQZZuOGOeb+xm0H7JyLYEkSybxrcKaM4XIIsuKKFYX1+vLpdZf1g3J+rOawSYOpKtznO9N5FO4p3FbC4peiB3T+xzsWP/dmn6BfQBlIEQtG972gEMmW0xQwnEy9UzQ5cnOAYR7l97mVygjSs6dKL/S70Dp3p5Qb2wrVJki4vmtoDzAuEIRR7RIYOfo4IcIWjI2w11ctbiPb0e7CFM1QpWFSeDWaGXEkVQBQ6nX+NM/mYEudDOv2HSV4rWqaWa33mdNUJn9AVJc6La6yQflKHAXL3nllMgQDI/zvrylCjnlmom9WMHHrQgU/wBjLiqDt5uMotlgBUSacKxqLgA7coS0SdTLw9CK/+f3ecM071lFT+fWXlFZQm/HUqgKJI4Nu/6Kudqea4AhY9SQObNP3LqZ5J9Mn6CIhfkd3n1sSqfQWTFamk+9Aj8LV4qsPl3EKets9LrrVTJ2rZ11Ylt8pDdvwTh1fKEkUi14x1mxMmTBNzuGY65fl+7fGmUrgjpUPRMwc/4s/4SfOd3jEAGiU6mwbC4YozPLgQNX4a/xy+TvfE9mwy2Rj51mEqu4ZHeUhl7LIudsovTWS3aCTUY3JVB6qKiDo1V2 X-Forefront-Antispam-Report: CIP:63.35.35.123; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:64aa7808-outbound-1.mta.getcheckrecipient.com; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; CAT:NONE; SFS:(13230001)(4636009)(40470700004)(46966006)(36840700001)(82310400005)(336012)(186003)(6506007)(47076005)(508600001)(966005)(6486002)(2616005)(110136005)(31686004)(84970400001)(36756003)(316002)(36860700001)(83380400001)(86362001)(2906002)(44832011)(30864003)(356005)(31696002)(26005)(5660300002)(70586007)(70206006)(8676002)(40460700003)(81166007)(53546011)(6512007)(8936002)(4326008)(2004002)(43740500002); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 May 2022 10:13:09.7211 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0586da05-1340-4417-140a-08da3ca4d680 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[63.35.35.123]; Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: DBAEUR03FT044.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR08MB7023 X-Spam-Status: No, score=-14.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, KAM_ASCII_DIVIDERS, KAM_SHORT, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 May 2022 10:13:16 -0000 Ping? On 5/13/22 18:00, Carl Love wrote: > GDB maintainers: > > We have addressed the comments from Bruno. Unfortunately, Bruno is not > a maintainer and can't give approval for the patch. We are hoping a > maintainer can review the patch and provide us feedback. > > Thank you for your time. > > Carl Love > --------------------------------------------------- > > On Fri, 2022-05-06 at 09:48 -0700, Carl Love via Gdb-patches wrote: >> Bruno, GDB maintainers: >> >> The patch has been updated per the comments on the testcase from >> Bruno. >> >> The patch was retested on Power 10 to ensure the test still works >> correctly. >> >> Please let us know if there are any additional comments or if the >> patch >> is ready to commit. We thank you for your help with this patch. >> >> Carl Love >> -------------------------------------------------------- >> Fix reverse stepping multiple contiguous PC ranges over the line >> table >> v5:- Updated test case comments on the purpose of the test.- Add test >> to check system supports record-replay.- Removed now unnecessary >> reord >> test when activating record. >> v4:- Updated testcase to make it a bit longer so it can exercise >> reverse-stepping multiple times.- Cleaned up debugging prints. >> v3:- Updated testcase. The format for writing the DWARF program body >> in the testcase expect file changed. See commit >> gdb/testsuite/dwarf: >> simplify line number program syntax (commit >> d4c4a2298cad06ca71cfef725f5248f68205f0be) >> v2:- Check if both the line and symtab match for a particular line >> table entry. >> -- >> When running GDB's testsuite on aarch64-linux/Ubuntu 20.04 (also >> spotted onthe ppc backend), I noticed some failures in >> gdb.reverse/solib-precsave.expand gdb.reverse/solib-reverse.exp. >> The failure happens around the following code: >> 38 b[1] = shr2(17); /* middle part two */40 b[0] = >> 6; b[1] = 9; /* generic statement, end part two */42 shr1 >> ("message >> 1\n"); /* shr1 one */ >> Normal execution: >> - step from line 38 will land on line 40.- step from line 40 will >> land >> on line 42. >> Reverse execution: >> - step from line 42 will land on line 40.- step from line 40 will >> land >> on line 40.- step from line 40 will land on line 38. >> The problem here is that line 40 contains two contiguous but >> distinctPC >> ranges in the line table, like so: >> Line 40 - [0x7ec ~ 0x7f4]Line 40 - [0x7f4 ~ 0x7fc] >> The two distinct ranges are generated because GCC started outputting >> sourcecolumn information, which GDB doesn't take into account at the >> moment. >> When stepping forward from line 40, we skip both of these ranges and >> land online 42. When stepping backward from line 42, we stop at the >> start PC of thesecond (or first, going backwards) range of line 40. >> This happens because we have this check in >> infrun.c:process_event_stop_test: >> /* When stepping backward, stop at beginning of line range >> (unless it's the function entry point, in which case keep going >> back to the call point). */ CORE_ADDR stop_pc = ecs- >>> event_thread->stop_pc (); if (stop_pc == ecs->event_thread- >>> control.step_range_start && stop_pc != ecs->stop_func_start >> && execution_direction == EXEC_REVERSE) end_stepping_range >> (ecs); else keep_going (ecs); >> Since we've reached ecs->event_thread->control.step_range_start, we >> stopstepping backwards. >> The right thing to do is to look for adjacent PC ranges for the same >> line,until we notice a line change. Then we take that as the start PC >> of therange. >> Another solution I thought about is to merge the contiguous ranges >> whenwe are reading the line tables. Though I'm not sure if we really >> want to processthat data as opposed to keeping it as the compiler >> created, and then workingaround that. >> In any case, the following patch addresses this problem. >> Validated on aarch64-linux and x86_64/Ubuntu 20.04/18.04. Carl Love >> hasverified that it does fix a similar issue on ppc. >> Ubuntu 18.04 doesn't actually run into these failures because the >> compilerdoesn't generate distinct PC ranges for the same line. >> I see similar failures on x86_64 in the gdb.reverse >> tests(gdb.reverse/step-reverse.exp and gdb.reverse/step-reverse.exp). >> Those arealso fixed by this patch. >> The included testcase (based on a test Carl wrote) exercises this >> problem forArm, ppc and x86. It shows full passes with the patch >> applied. >> Co-authored-by: Carl Love --- >> gdb/infrun.c | 22 ++- >> gdb/symtab.c | 49 ++++++ >> gdb/symtab.h | 16 ++ >> gdb/testsuite/gdb.reverse/map-to-same-line.c | 55 +++++++ >> .../gdb.reverse/map-to-same-line.exp | 141 >> ++++++++++++++++++ >> 5 files changed, 282 insertions(+), 1 deletion(-) create mode 100644 >> gdb/testsuite/gdb.reverse/map-to-same-line.c create mode 100644 >> gdb/testsuite/gdb.reverse/map-to-same-line.exp >> diff --git a/gdb/infrun.c b/gdb/infrun.cindex >> 6e5853ef42a..82c28961aeb >> 100644--- a/gdb/infrun.c+++ b/gdb/infrun.c@@ -6955,11 +6955,31 @@ if >> (ecs->event_thread->control.proceed_to_finish have software >> watchpoints). */ ecs->event_thread->control.may_range_step = >> 1; >> + /* When we are stepping inside a particular line range, in >> reverse,+ and we are sitting at the first address of that range, >> we need to+ check if this address also shows up in another line >> range as the+ end address.++ If so, we need to check what line >> such >> a step range points to.+ If it points to the same line as the >> current step range, that+ means we need to keep going in order >> to reach the first address+ of the line range. We repeat this >> until we eventually get to the+ first address of a particular >> line >> we're stepping through. */+ CORE_ADDR range_start = ecs- >>> event_thread->control.step_range_start;+ if >>> (execution_direction >> == EXEC_REVERSE)+ {+ gdb::optional >> real_range_start+ = find_line_range_start (ecs->event_thread- >>> stop_pc ());++ if (real_range_start.has_value ())+ >>> range_start >> = *real_range_start;+ }+ /* When stepping backward, stop at >> beginning of line range (unless it's the function entry point, >> in which case keep going back to the call >> point). */ CORE_ADDR stop_pc = ecs->event_thread->stop_pc >> ();- if (stop_pc == ecs->event_thread- >>> control.step_range_start+ if (stop_pc == range_start && >> stop_pc != ecs->stop_func_start && execution_direction == >> EXEC_REVERSE) end_stepping_range (ecs);diff --git >> a/gdb/symtab.c >> b/gdb/symtab.cindex 4b33d6c91af..de4cb5dd0eb 100644--- >> a/gdb/symtab.c+++ b/gdb/symtab.c@@ -3433,6 +3433,55 @@ find_pc_line >> (CORE_ADDR pc, int notcurrent) return sal; } +/* Compare two >> symtab_and_line entries. Return true if both have+ the same line >> number and the same symtab pointer. That means we+ are dealing >> with >> two entries from the same line and from the same+ source >> file.++ Return false otherwise. */++static >> bool+sal_line_symtab_matches_p (const symtab_and_line &sal1,+ >> const symtab_and_line &sal2)+{+ return (sal1.line == >> sal2.line && sal1.symtab == sal2.symtab);+}++/* See >> symtah.h. */++gdb::optional+find_line_range_start >> (CORE_ADDR pc)+{+ struct symtab_and_line current_sal = find_pc_line >> (pc, 0);++ if (current_sal.line == 0)+ return {};++ struct >> symtab_and_line prev_sal = find_pc_line (current_sal.pc - 1, >> 0);++ /* >> If the previous entry is for a different line, that means we are >> already+ at the entry with the start PC for this line. */+ if >> (!sal_line_symtab_matches_p (prev_sal, current_sal))+ return >> current_sal.pc;++ /* Otherwise, keep looking for entries for the >> same >> line but with+ smaller PC's. */+ bool done = false;+ CORE_ADDR >> prev_pc;+ while (!done)+ {+ prev_pc = >> prev_sal.pc;++ prev_sal = find_pc_line (prev_pc - 1, >> 0);++ /* >> Did we notice a line change? If so, we are done with the >> search. */+ if (!sal_line_symtab_matches_p (prev_sal, >> current_sal))+ done = true;+ }++ return prev_pc;+}+ /* See >> symtab.h. */ struct symtab *diff --git a/gdb/symtab.h >> b/gdb/symtab.hindex b1cf84f756f..226fe8803db 100644--- >> a/gdb/symtab.h+++ b/gdb/symtab.h@@ -2285,6 +2285,22 @@ extern struct >> symtab_and_line find_pc_line (CORE_ADDR, int); extern struct >> symtab_and_line find_pc_sect_line (CORE_ADDR, >> >> struct obj_section *, int); +/* Given PC, and assuming >> it is part of a range of addresses that is part of a+ line, go back >> through the linetable and find the starting PC of >> that+ line.++ For >> example, suppose we have 3 PC ranges for line X:++ Line X - [0x0 - >> 0x8]+ Line X - [0x8 - 0x10]+ Line X - [0x10 - 0x18]++ If we >> call >> the function with PC == 0x14, we want to return 0x0, as that >> is+ the >> starting PC of line X, and the ranges are contiguous.+*/++extern >> gdb::optional find_line_range_start (CORE_ADDR pc);+ /* >> Wrapper around find_pc_line to just return the symtab. */ extern >> struct symtab *find_pc_line_symtab (CORE_ADDR);diff --git >> a/gdb/testsuite/gdb.reverse/map-to-same-line.c >> b/gdb/testsuite/gdb.reverse/map-to-same-line.cnew file mode >> 100644index >> 00000000000..dd9f9f8a400--- /dev/null+++ >> b/gdb/testsuite/gdb.reverse/map-to-same-line.c@@ -0,0 +1,55 @@+/* >> Copyright 2022 Free Software Foundation, Inc.++ This program is >> free >> software; you can redistribute it and/or modify+ it under the terms >> of the GNU General Public License as published by+ the Free >> Software >> Foundation; either version 3 of the License, or+ (at your option) >> any >> later version.++ This program is distributed in the hope that it >> will >> be useful,+ but WITHOUT ANY WARRANTY; without even the implied >> warranty of+ MERCHANTABILITY or FITNESS FOR A PARTICULAR >> PURPOSE. See the+ GNU General Public License for more >> details.++ You should have received a copy of the GNU General >> Public >> License+ along with this program. If not, see < >> http://www.gnu.org/licenses/ >> >. */++/* The purpose of this test is to create a DWARF line table >> that contains two+ or more entries for the same line. When >> stepping >> (forwards or backwards),+ GDB should step over the entire line and >> not just a particular entry in the+ line table. */++int+main >> ()+{ /* TAG: main prologue */+ asm ("main_label: .globl >> main_label");+ int i = 1, j = 2, k;+ float f1 = 2.0, f2 = 4.1, >> f3;+ const char *str_1 = "foo", *str_2 = "bar", *str_3;++ asm >> ("line1: .globl line1");+ k = i; f3 = f1; str_3 = str_1; /* TAG: >> line 1 */++ asm ("line2: .globl line2");+ k = j; f3 = f2; str_3 = >> str_2; /* TAG: line 2 */++ asm ("line3: .globl line3");+ k = i; >> f3 >> = f1; str_3 = str_1; /* TAG: line 3 */++ asm ("line4: .globl >> line4");+ k = j; f3 = f2; str_3 = str_2; /* TAG: line 4 */++ asm >> ("line5: .globl line5");+ k = i; f3 = f1; str_3 = str_1; /* TAG: >> line 5 */++ asm ("line6: .globl line6");+ k = j; f3 = f2; str_3 = >> str_2; /* TAG: line 6 */++ asm ("line7: .globl line7");+ k = i; >> f3 >> = f1; str_3 = str_1; /* TAG: line 7 */++ asm ("line8: .globl >> line8");+ k = j; f3 = f2; str_3 = str_2; /* TAG: line 8 */++ asm >> ("main_return: .globl main_return");+ return 0; /* TAG: main return >> */+}diff --git a/gdb/testsuite/gdb.reverse/map-to-same-line.exp >> b/gdb/testsuite/gdb.reverse/map-to-same-line.expnew file mode >> 100644index 00000000000..c3fb859be55--- /dev/null+++ >> b/gdb/testsuite/gdb.reverse/map-to-same-line.exp@@ -0,0 +1,141 @@+# >> Copyright 2022 Free Software Foundation, Inc.++# This program is free >> software; you can redistribute it and/or modify+# it under the terms >> of >> the GNU General Public License as published by+# the Free Software >> Foundation; either version 3 of the License, or+# (at your option) >> any >> later version.+#+# This program is distributed in the hope that it >> will >> be useful,+# but WITHOUT ANY WARRANTY; without even the implied >> warranty of+# MERCHANTABILITY or FITNESS FOR A PARTICULAR >> PURPOSE. See >> the+# GNU General Public License for more details.+#+# You should >> have >> received a copy of the GNU General Public License+# along with this >> program. If not, see < >> http://www.gnu.org/licenses/ >> >.++# When stepping (forwards or backwards), GDB should step over >> the >> entire line+# and not just a particular entry in the line table. This >> test was added to+# verify the find_line_range_start function >> properly >> sets the step range for a+# line that consists of multiple >> statements, >> i.e. multiple entries in the line+# table. This test creates a DWARF >> line table that contains two entries for+# the same line to do the >> needed testing.++load_lib dwarf.exp++# This test can only be run on >> targets which support DWARF-2 and use gas.+if {![dwarf2_support]} >> {+ unsupported "dwarf2 support required for this test"+ return >> 0+}++if [get_compiler_info] {+ return -1+}++# The DWARF assembler >> requires the gcc compiler.+if {!$gcc_compiled} {+ unsupported "gcc >> is required for this test"+ return 0+}++# This test suitable only >> for process record-replay+if ![supports_process_record] >> {+ return+}++standard_testfile .c .S++if { [prepare_for_testing >> "failed to prepare" ${testfile} ${srcfile}] } {+ return -1+}++set >> asm_file [standard_output_file $srcfile2]+Dwarf::assemble $asm_file >> {+ global srcdir subdir srcfile+ declare_labels integer_label >> L++ # Find start address and length of program+ lassign >> [function_range main [list ${srcdir}/${subdir}/$srcfile]] \+ main_st >> art main_len+ set main_end "$main_start + $main_len"++ cu {} {+ >> >> compile_unit {+ {language @DW_LANG_C}+ {name >> map-to-same- >> line.c}+ {stmt_list $L DW_FORM_sec_offset}+ {low_pc 0 >> addr}+ } {+ subprogram {+ {external 1 >> flag}+ >> {name main}+ {low_pc $main_start addr}+ >> {high_pc $main_len DW_FORM_data4}+ }+ }+ }++ lines >> {version 2 default_is_stmt 1} L {+ include_dir >> "${srcdir}/${subdir}"+ file_name "$srcfile" 1++ # Generate >> the >> line table program with distinct source lines being+ # mapped to the >> same line entry. Line 1, 5 and 8 contain 1 statement+ # each. Line 2 >> contains 2 statements. Line 3 contains 3 statements.+ program >> {+ >> DW_LNE_set_address $main_start+ line [gdb_get_line_number >> "TAG: main prologue"]+ DW_LNS_copy+ DW_LNE_set_addres >> s >> line1+ line [gdb_get_line_number "TAG: line 1" ]+ D >> W_LNS_copy >> + DW_LNE_set_address line2+ line [gdb_get_line_number >> "TAG: line 2" ]+ DW_LNS_copy+ DW_LNE_set_address >> line3+ line [gdb_get_line_number "TAG: line 2" ]+ D >> W_LNS_copy >> + DW_LNE_set_address line4+ line [gdb_get_line_number >> "TAG: line 3" ]+ DW_LNS_copy+ DW_LNE_set_address >> line5+ line [gdb_get_line_number "TAG: line 3" ]+ D >> W_LNS_copy >> + DW_LNE_set_address line6+ line [gdb_get_line_number >> "TAG: line 3" ]+ DW_LNS_copy+ DW_LNE_set_address >> line7+ line [gdb_get_line_number "TAG: line 5" ]+ D >> W_LNS_copy >> + DW_LNE_set_address line8+ line [gdb_get_line_number >> "TAG: line 8" ]+ DW_LNS_copy+ DW_LNE_set_address >> main_return+ line [gdb_get_line_number "TAG: main return"]+ >> DW_LNS_copy+ DW_LNE_end_sequence+ }+ }+}++if { >> [prepare_for_testing "failed to prepare" ${testfile} \+ [list >> $srcfile >> $asm_file] {nodebug} ] } {+ return -1+}++if ![runto_main] >> {+ return -1+}++# Activate process >> record/replay+gdb_test_no_output >> "record" "turn on process record"++gdb_test "tbreak main_return" >> "Temporary breakpoint .*" "breakpoint at return"+gdb_test "continue" >> "Temporary breakpoint .*" "run to end of main"++# At this point, GDB >> has already recorded the execution up until the return+# >> statement. Reverse-step and test if GDB transitions between lines in >> the+# expected order. It should reverse-step across lines 8, 5, 3, 2 >> and 1.+foreach line {8 5 3 2 1} {+ gdb_test "reverse-step" ".*TAG: >> line $line.*" "reverse step to line $line"+}-- 2.31.1 >> >> >