From patchwork Thu Apr 25 18:09:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 89011 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 34623384AB54 for ; Thu, 25 Apr 2024 18:11:26 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-io1-xd33.google.com (mail-io1-xd33.google.com [IPv6:2607:f8b0:4864:20::d33]) by sourceware.org (Postfix) with ESMTPS id 8C20E3858D38 for ; Thu, 25 Apr 2024 18:10:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8C20E3858D38 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=adacore.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 8C20E3858D38 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::d33 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714068653; cv=none; b=TDeJfW48RvD4CheNPNXJkiY6Ge8+2KeLGlgfhbFXp7a6/tqGuZyLi/0uiKAWkhBi/fTSDGW2wD9fCeX06OPH75JQtTg5efmtVKzQGcUScy1GhEFEllBtr2M0NBLE3AfMhaYDg88Zo/NXXDV1S5ceE210Wu3oL0wZC+JSYQjVBWM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714068653; c=relaxed/simple; bh=0djhzF8lZ59PN7AX90Z397JFL9rLD9aXrJW6ZLvDqXE=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=k76SxMB8Vj/Cj27oWCIT+BwI/2sX2RxAVxIMazRfLmVVmwEjBrF2R5vsOY7QmfzT6rEwsnZGXcBnINDxJOUBer9Fo94zeP84Z9FmfjkSFr0o+TYjYYPyHOg+wTpLMMIPB6T/PVFl/qNPdn77qUWrdSoz2sbHrgn/OUisJHrwDZk= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-io1-xd33.google.com with SMTP id ca18e2360f4ac-7d9480d96bdso61971439f.1 for ; Thu, 25 Apr 2024 11:10:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; t=1714068650; x=1714673450; darn=sourceware.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=6R4t75WmgWD30B9WU7uAV7dSe2KQjWV/L1LqEadlQjA=; b=YAVNLcsuqRp1DpqYK/TwRpaxGpzfMrqEoAAFK+kdRJ7aMl+C1SQUVwwrvcmt+doiQ1 LBMNPN7yCpdkk856qo0N24vkm2b05R0ZqvphTQCgOvLSGRWCBBG3NAcZx6sTrkcroWS/ UsOFfltszbJZr40gPI8BWAdReB//0CMqMJTRAFlFSibwsfF6hOJsBfkK1FcocEhi9Fov j9HqSP5cADrlFAyMfp4ZUOkwd7qc3jJHzglswLlEPPuVFHkQ6PDt7/S1sNB/bIwf9q97 Sx5mTayym2pE2lGmVSGjxjxeNNNHBpv4lovIpqsWbQ7wn+qZI7fwaGOKjEMXLLOrkrX2 NCBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714068650; x=1714673450; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=6R4t75WmgWD30B9WU7uAV7dSe2KQjWV/L1LqEadlQjA=; b=f3UDnHcLqtY8+3tLNRpjULLeSzjvehpDTfb7i9ShVHuXWOJDJbo1L37mpnHf8gLOkT gdBY2h86+jSb2gUhMe0VWdbjwtVKuhV0mJuI1r8VWWfhX9sL6x7oBXjxp/pJD6nI3F3R HZVQuQJKtKToVPMCe12PnWl5ZiKadmyqFf15LpmAePrYa0V8MHmSy5meHXaxcrcF6M4W awFY3S5x3nG7oB9DpP+/4jz8OndBMLTc3sDKD3hSywgI0dkI4LFNodZxsngXEgq0wdkK 7yibKwGz0644mt36NerA47sW+jb7IvJsGtHooQMKPcJFs93HOPWT3q2eJyzBMx28pCG1 +ArA== X-Gm-Message-State: AOJu0YxxXV9t69z2aoK1RQ0A++gQ3M+uoFNbovO/nKHQoBU/iPbTUKI2 FZa7rIWMzQ5slTWhc+/AhWy6Nui2LJ25ZRNk7x4NBG5cNhGqqCa/WPr0q+pDL05hGThui/SJSP4 = X-Google-Smtp-Source: AGHT+IHr43augWHEl4MWpNUccckiY3ZM/dpqyyO5owpDt3oMqK5S2STifmCD/Qr3HhW5XZlfu4LLOQ== X-Received: by 2002:a5d:9b07:0:b0:7d5:f3d4:2023 with SMTP id y7-20020a5d9b07000000b007d5f3d42023mr558651ion.18.1714068649443; Thu, 25 Apr 2024 11:10:49 -0700 (PDT) Received: from localhost.localdomain (97-122-86-252.hlrn.qwest.net. [97.122.86.252]) by smtp.gmail.com with ESMTPSA id jm1-20020a0566388c8100b004852136a4dfsm3146550jab.4.2024.04.25.11.10.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Apr 2024 11:10:49 -0700 (PDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 1/3] Simplify DAP make_source callers Date: Thu, 25 Apr 2024 12:09:57 -0600 Message-ID: <20240425181032.80275-2-tromey@adacore.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240425181032.80275-1-tromey@adacore.com> References: <20240425181032.80275-1-tromey@adacore.com> MIME-Version: 1.0 X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP 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.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org A couple callers of make_source call basename by hand. Rather than add another caller like this, I thought it would be better to put this ability into make_source itself. --- gdb/python/lib/gdb/dap/breakpoint.py | 3 +-- gdb/python/lib/gdb/dap/bt.py | 4 +--- gdb/python/lib/gdb/dap/sources.py | 8 ++++++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/gdb/python/lib/gdb/dap/breakpoint.py b/gdb/python/lib/gdb/dap/breakpoint.py index b2e74277ebd..1380f7decd4 100644 --- a/gdb/python/lib/gdb/dap/breakpoint.py +++ b/gdb/python/lib/gdb/dap/breakpoint.py @@ -13,7 +13,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import os import re from contextlib import contextmanager @@ -116,7 +115,7 @@ def _breakpoint_descriptor(bp): result.update( { - "source": make_source(filename, os.path.basename(filename)), + "source": make_source(filename), "line": line, } ) diff --git a/gdb/python/lib/gdb/dap/bt.py b/gdb/python/lib/gdb/dap/bt.py index e0c2e2a1751..668bcc7ce23 100644 --- a/gdb/python/lib/gdb/dap/bt.py +++ b/gdb/python/lib/gdb/dap/bt.py @@ -13,8 +13,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import os - # This is deprecated in 3.9, but required in older versions. from typing import Optional @@ -98,7 +96,7 @@ def _backtrace(thread_id, levels, startFrame, stack_format): name += ", module " + objfile.username filename = current_frame.filename() if filename is not None: - newframe["source"] = make_source(filename, os.path.basename(filename)) + newframe["source"] = make_source(filename) newframe["name"] = name frames.append(newframe) # Note that we do not calculate totalFrames here. Its absence diff --git a/gdb/python/lib/gdb/dap/sources.py b/gdb/python/lib/gdb/dap/sources.py index ee3464db679..ad0c913c8c1 100644 --- a/gdb/python/lib/gdb/dap/sources.py +++ b/gdb/python/lib/gdb/dap/sources.py @@ -32,16 +32,20 @@ _id_map = {} @in_gdb_thread -def make_source(fullname, filename): +def make_source(fullname, filename=None): """Return the Source for a given file name. FULLNAME is the full name. This is used as the key. - FILENAME is the base name. + FILENAME is the base name; if None (the default), then it is + computed from FULLNAME. """ global _source_map if fullname in _source_map: result = _source_map[fullname] else: + if filename is None: + filename = os.path.basename(fullname) + result = { "name": filename, "path": fullname, From patchwork Thu Apr 25 18:09:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 89010 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D68EC3849ACF for ; Thu, 25 Apr 2024 18:11:25 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-il1-x12d.google.com (mail-il1-x12d.google.com [IPv6:2607:f8b0:4864:20::12d]) by sourceware.org (Postfix) with ESMTPS id BF4A93858C41 for ; Thu, 25 Apr 2024 18:10:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BF4A93858C41 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=adacore.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org BF4A93858C41 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::12d ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714068653; cv=none; b=dN7/Zelw16Uo6ZHyme64p3asgwlsNEcSwjOtaBpiYHdAfds88Qyj5+Hbp8atY+ZFAQFEOyER2d5+UbEw2eN5efHOANgVy03INAxlQ03U3/C3aFn2BzzjrYQIvlV/M00isV32KWrvr59CS83tPLF/G0GoXOL81mz5mVTksZmP7TU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714068653; c=relaxed/simple; bh=+GkiDaBULTrRl+nmOK4enVQZGarWQ9rQMkHCPtmKmP4=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=pLk01fi/iecApBI082wO2LJDG6UqdwqzjZy5b/AKA/hkOAuW1s4EEug+8OqfAV5aPSN81HyJM2f6mTO4fuL+eTyatEDKf20xld5YQ+7jLXnVnqCYdkpAM6bgkeHwKJqww0Z6OjQkqQOxFEhHpXbTAmp0zWnWOQLHj1uA8ey8+kk= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-il1-x12d.google.com with SMTP id e9e14a558f8ab-36b2adedec7so5427065ab.1 for ; Thu, 25 Apr 2024 11:10:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; t=1714068650; x=1714673450; darn=sourceware.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Tf35t2psRkqoc9qUA7E9VTrUneYK4Xi2QR3RWu3vPYo=; b=R6Hq+h/59A4PAyTYgtGuts+WXvEYIE8MoJor96PpM+mLQtFovKm/UV8b348O3g//m2 kkXABaf7gu0CbOGjn4AVNsLjdingYihyr9sMRCh771a4NOk35M1YIEv1FoImzT5/1fEi qgBMUYsaIJK3rU/Jj1HvNBaiwOfYiysPPVMf1sw4iXq6WipXqex2uPcxDbQD0cqbawh6 2tNTduk7f3WXIq3G3vSV7Qsj/oHtiBEr2VFSdkKzY8uTwMjd1tzKnj631dlImu8KmG6C hiAUlK7tVDQNganIa8VcbT91Zbv4j6b55RXsL0jCn1RKneuIPpLTaNB3wGkLipHiDPaV JGzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714068650; x=1714673450; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Tf35t2psRkqoc9qUA7E9VTrUneYK4Xi2QR3RWu3vPYo=; b=J/18S5UYghcGtUDzOn992Jo6aa98Zq4MRRN92zFx5ENR7vhXMDTwnC8QmgmkecKUb8 8R4RhYayxkYgIcB6jga+ObJ7ZGl+82EqRP8un8z4ELvEIVZ77+PaxXwil9axGRNdmYmb jn0/Gi1lRzwqt18PncwXGJk8PM3lFCePJJVbiiqyt4GUdihHSK8NKPxmJ/EPk8QvTHkv tBhS1/qwgMLIKXeAlhWvcXLk/p0QuXRG0CzqHJ6Tpe61uYwkphcCAZrtcK5TpOsCCQkT RY4u04amexPBY4LtH2SLbGsGFUNbmVxx/cZkSPvS89GbRptI05RgudEFAKiOstbX+IYT 58dQ== X-Gm-Message-State: AOJu0YxC2ei2cVMZxNMue0UnQswOmijEsbXupHk+hMGfeUTF3sMDoprj Q+FHMUuH+BckrewT5wtrJoeilV/gBpInBOSrlAGq10V/BJDe+3F7rbNgd3irEIw21Fd3B4V3LHE = X-Google-Smtp-Source: AGHT+IGjZQUx5yNRDCPVIebdM6jI3Ux8PrFx6h8IfQ4hSSJp+KGZtg4L70bThYY7qtjh2614n+IPig== X-Received: by 2002:a05:6e02:158a:b0:36a:686:bc99 with SMTP id m10-20020a056e02158a00b0036a0686bc99mr711820ilu.4.1714068649982; Thu, 25 Apr 2024 11:10:49 -0700 (PDT) Received: from localhost.localdomain (97-122-86-252.hlrn.qwest.net. [97.122.86.252]) by smtp.gmail.com with ESMTPSA id jm1-20020a0566388c8100b004852136a4dfsm3146550jab.4.2024.04.25.11.10.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Apr 2024 11:10:49 -0700 (PDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 2/3] Implement tp_richcompare for gdb.Block Date: Thu, 25 Apr 2024 12:09:58 -0600 Message-ID: <20240425181032.80275-3-tromey@adacore.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240425181032.80275-1-tromey@adacore.com> References: <20240425181032.80275-1-tromey@adacore.com> MIME-Version: 1.0 X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP 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.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org I noticed that two gdb.Block objects will never compare as equal with '=='. This patch fixes the problem by implementing tp_richcompare, as was done for gdb.Frame. --- gdb/python/py-block.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/gdb/python/py-block.c b/gdb/python/py-block.c index 3e30faf0856..3de6200e7c2 100644 --- a/gdb/python/py-block.c +++ b/gdb/python/py-block.c @@ -452,6 +452,28 @@ blpy_repr (PyObject *self) name, str.c_str ()); } +/* Implements the equality comparison for Block objects. All other + comparison operators will throw NotImplemented, as they aren't + valid for blocks. */ + +static PyObject * +blpy_richcompare (PyObject *self, PyObject *other, int op) +{ + if (!PyObject_TypeCheck (other, &block_object_type) + || (op != Py_EQ && op != Py_NE)) + { + Py_INCREF (Py_NotImplemented); + return Py_NotImplemented; + } + + block_object *self_block = (block_object *) self; + block_object *other_block = (block_object *) other; + + bool expected = self_block->block == other_block->block; + bool equal = op == Py_EQ; + return PyBool_FromLong (equal == expected); +} + static int CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION gdbpy_initialize_blocks (void) { @@ -530,7 +552,7 @@ PyTypeObject block_object_type = { "GDB block object", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ - 0, /* tp_richcompare */ + blpy_richcompare, /* tp_richcompare */ 0, /* tp_weaklistoffset */ blpy_iter, /* tp_iter */ 0, /* tp_iternext */ From patchwork Thu Apr 25 18:09:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 89012 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 11188384AB53 for ; Thu, 25 Apr 2024 18:11:29 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-il1-x134.google.com (mail-il1-x134.google.com [IPv6:2607:f8b0:4864:20::134]) by sourceware.org (Postfix) with ESMTPS id 82F463858C42 for ; Thu, 25 Apr 2024 18:10:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 82F463858C42 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=adacore.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 82F463858C42 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::134 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714068654; cv=none; b=KgfeSOyIFyBkeV/dfs0JWSEf7pOv6wUtyfwLIksO53V3RYqZl8sfibgoI48ziUcGnmRZ99BB0FlspKXWilUzd3Wc9fnCLzoGdwnMk/F3tmr6NyLz+1d6KANQiiigqD3PNT3gxiymwUAgbtqsTpM+MJ8LJLTgOSMqTHR35f2QH1I= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714068654; c=relaxed/simple; bh=pR8xBOka5Jvd6Pe4PW81P61oY5AmbSWvg9CXXdVSgCI=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=PJsKpTGefNeVLmAqPigvzodhfWVfo/BY7uaZFAuzO8vcdu9pA0KzrmH46IytS0uzu/PGkGkFTM2tW8cTK6r3nza/FouIl2PpH0lDTI7yQaOZg2ogBEnt6Jpiy5oZUR6NqR/zd4rUrMIQwizu5dysoyObNbl7pubLVgKruBJ0sVo= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-il1-x134.google.com with SMTP id e9e14a558f8ab-36c2cf463e9so3943875ab.3 for ; Thu, 25 Apr 2024 11:10:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; t=1714068650; x=1714673450; darn=sourceware.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=q4I5r/8iyemzeJG8USUh3o2gT7miVRRTZ/iaXnkHHoA=; b=XxsQM3kOFEgSIuN9dqOcF2ioiNbBPt+4F9WHdDFOEwN/mHDVY0pbwYTLvpIQ0LTLq1 Twh8zMgxsOCZK2MWh3Rz10gGo5cZvNmO63bAxROLVisu3Nga7RJdDOhUb+ijDkbIyDGU Xftns8orN9TN/xwrxRttDkNSkZM9kCUwhmKeGLSm/1a7Rfwe6lKHL7RWTN+YUD6eCQaX gWBcN9/oZEpKCWWZmnbw6jbEgKUnJ+TfzF5yU5DZute7xqMg+fa8S1RanNXLl2IAwpOb t6cy4nk9bLDKmT6DcPOeyb/PrBenbpACcR3Lcpyq7SLjc/jcbtHxEa6SrjV4Pe9BDQun Rm5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714068650; x=1714673450; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=q4I5r/8iyemzeJG8USUh3o2gT7miVRRTZ/iaXnkHHoA=; b=W8zOlh2rv0+0NksjP+ZWiho6tuJHngCegUe9LrUEfagb3Q18K4VIaSvVHi3Q5b3FJM tczG8fJIz3nTpN+SlU5OfyjkAeCkyh9BjFyFZAKPjiNfGJrxgxCtQgfxbKUlrUOn8Psi Oi8CWBatzbmVlRlV1eWA/Pg4NkcSgf1n/iKbN/wBO7AiNotY7dmtH46rLB2JI418rY6+ Z4wffCBQGp8j4t3Tr40Qmf80c0F0yQNRKCkZbz/uCNcWSYjR2H+hJtDb6Jk8ktQkm6ck hmPfux37e1gpQSOv3Uy167BVrcoz2SE5zzp/MdhBf9iLVsdp5S25phDyhSyX4yOf00NF ZN9Q== X-Gm-Message-State: AOJu0Yy0MDqR15KOgDiL2M3HmVF7uxVf+PHHfRyI5SecLxTSMNuZoAnN 6CJuNReei969wkHTS+iuWF8qoh3K5VEbaLFgCDUlKePkF+uQC2/AhLSHBBZP4cRwqKzUczeba0c = X-Google-Smtp-Source: AGHT+IG3XmfDAV9iexShAwZW7PePkmurNv2fgsRguz0uvPNjdUSdzVkza+xib8llUkxh66m8GbezsQ== X-Received: by 2002:a05:6e02:1488:b0:36b:3af7:42d8 with SMTP id n8-20020a056e02148800b0036b3af742d8mr780066ilk.4.1714068650408; Thu, 25 Apr 2024 11:10:50 -0700 (PDT) Received: from localhost.localdomain (97-122-86-252.hlrn.qwest.net. [97.122.86.252]) by smtp.gmail.com with ESMTPSA id jm1-20020a0566388c8100b004852136a4dfsm3146550jab.4.2024.04.25.11.10.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Apr 2024 11:10:50 -0700 (PDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 3/3] Add symbol, line, and location to DAP disassemble result Date: Thu, 25 Apr 2024 12:09:59 -0600 Message-ID: <20240425181032.80275-4-tromey@adacore.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240425181032.80275-1-tromey@adacore.com> References: <20240425181032.80275-1-tromey@adacore.com> MIME-Version: 1.0 X-Spam-Status: No, score=-10.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, KAM_STOCKGEN, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP 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.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org The DAP spec allows a number of attributes on the resulting instructions that gdb currently does not emit. A user requested some of these, so this patch adds the 'symbol', 'line', and 'location' attributes. While the spec lets the implementation omit 'location' in some cases, it was simpler in the code to just always emit it, as then no extra tracking was needed. --- gdb/python/lib/gdb/dap/disassemble.py | 64 ++++++++++++++-- gdb/testsuite/gdb.dap/disassem.c | 52 +++++++++++++ gdb/testsuite/gdb.dap/disassem.exp | 105 ++++++++++++++++++++++++++ 3 files changed, 214 insertions(+), 7 deletions(-) create mode 100644 gdb/testsuite/gdb.dap/disassem.c create mode 100644 gdb/testsuite/gdb.dap/disassem.exp diff --git a/gdb/python/lib/gdb/dap/disassemble.py b/gdb/python/lib/gdb/dap/disassemble.py index 65bf3d4457b..035bc3f9356 100644 --- a/gdb/python/lib/gdb/dap/disassemble.py +++ b/gdb/python/lib/gdb/dap/disassemble.py @@ -16,6 +16,55 @@ import gdb from .server import capability, request +from .sources import make_source + + +# This tracks labels associated with a disassembly request and helps +# with updating individual instructions. +class _BlockTracker: + def __init__(self): + # Map from PC to symbol names. A given PC is assumed to have + # just one label -- DAP wouldn't let us return multiple labels + # anyway. + self.labels = {} + # List of blocks that have already been handled. Note that + # blocks aren't hashable so a set is not used. + self.blocks = [] + + # Add a gdb.Block and its superblocks, stopping before the static + # block. + def add_block(self, block): + if block in self.blocks: + return + self.blocks.append(block) + if block.function is not None: + self.labels[block.start] = block.function.name + for sym in block: + if sym.addr_class == gdb.SYMBOL_LOC_LABEL: + self.labels[int(sym.value())] = sym.name + sblock = block.superblock + if not sblock.is_static: + self.add_block(sblock) + + # Add PC to this tracker. Update RESULT as appropriate with + # information about the source and any label. + def add_pc(self, pc, result): + block = gdb.block_for_pc(pc) + if block is None: + # Nothing to do. + return + self.add_block(block) + if pc in self.labels: + result["symbol"] = self.labels[pc] + sal = gdb.find_pc_line(pc) + if sal.symtab is not None: + if sal.line != 0: + result["line"] = str(sal.line) + if sal.symtab.filename is not None: + # The spec says this can be omitted in some + # situations, but it's a little simpler to just always + # supply it. + result["location"] = make_source(sal.symtab.filename) @request("disassemble") @@ -35,17 +84,18 @@ def disassemble( except gdb.error: # Maybe there was no frame. arch = inf.architecture() + tracker = _BlockTracker() result = [] total_count = instructionOffset + instructionCount for elt in arch.disassemble(pc, count=total_count)[instructionOffset:]: mem = inf.read_memory(elt["addr"], elt["length"]) - result.append( - { - "address": hex(elt["addr"]), - "instruction": elt["asm"], - "instructionBytes": mem.hex(), - } - ) + insn = { + "address": hex(elt["addr"]), + "instruction": elt["asm"], + "instructionBytes": mem.hex(), + } + tracker.add_pc(elt["addr"], insn) + result.append(insn) return { "instructions": result, } diff --git a/gdb/testsuite/gdb.dap/disassem.c b/gdb/testsuite/gdb.dap/disassem.c new file mode 100644 index 00000000000..c0f5128c97d --- /dev/null +++ b/gdb/testsuite/gdb.dap/disassem.c @@ -0,0 +1,52 @@ +/* Copyright 2024 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +__attribute__((__noinline__)) static int +callee (int x) +{ + return x * 2; +} + +static inline int __attribute__((__always_inline__)) +compute (int x) +{ + return callee (x); +} + +static int +return_value (int x) +{ + int accum = 0; + + for (int i = 0; i < x; ++i) + { + int value = compute (i); + if (value < 0) + goto out_label; + } + + out_label: + + return accum; +} + +int +main () +{ + int value = return_value (23); + return value > 0 ? 0 : 1; +} diff --git a/gdb/testsuite/gdb.dap/disassem.exp b/gdb/testsuite/gdb.dap/disassem.exp new file mode 100644 index 00000000000..87fb516931a --- /dev/null +++ b/gdb/testsuite/gdb.dap/disassem.exp @@ -0,0 +1,105 @@ +# Copyright 2024 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 . + +# Test DAP disassembly. + +require allow_dap_tests + +load_lib dap-support.exp + +standard_testfile + +if {[build_executable ${testfile}.exp $testfile] == -1} { + return +} + +if {[dap_initialize] == ""} { + return +} + +set obj [dap_check_request_and_response "set breakpoint" \ + setFunctionBreakpoints \ + {o breakpoints [a [o name [s main]]]}] +set fn_bpno [dap_get_breakpoint_number $obj] + +dap_check_request_and_response "configurationDone" configurationDone + +if {[dap_launch $testfile] == ""} { + return +} +dap_wait_for_event_and_check "inferior started" thread "body reason" started + +dap_wait_for_event_and_check "stopped at line breakpoint" stopped \ + "body reason" breakpoint \ + "body hitBreakpointIds" $fn_bpno + +# Find out how many lines of disassembly we should request. This is +# kind of lame but DAP doesn't really provide tools to do this, and +# gdb's DAP implementation doesn't try to figure out what memory might +# not really be part of a function. +set obj [dap_check_request_and_response "disassemble using CLI" \ + evaluate {o expression [s {disassemble &return_value}] \ + context [s repl]}] +set output [dict get [lindex $obj 0] body result] +# The result will have literal "\" "n" sequences, turn these into +# newlines. +set with_nl [string map [list "\\n" "\n"] $output] +# The value we want is the number of lines starting with an address. +set insn_count 0 +foreach line [split $with_nl "\n"] { + if {[regexp "^ *0x" $line]} { + incr insn_count + } +} + +set obj [dap_check_request_and_response "find function address" \ + evaluate {o expression [s "&return_value"]}] +set pc [dict get [lindex $obj 0] body memoryReference] + +set obj [dap_check_request_and_response "disassemble the function" \ + disassemble \ + [format {o memoryReference [s %s] instructionCount [i %d]} \ + $pc $insn_count]] +set response [lindex $obj 0] + +set seen_labels(_) _ +set insn_no 1 +foreach insn [dict get $response body instructions] { + with_test_prefix $insn_no { + gdb_assert {[dict exists $insn line]} \ + "line in disassemble output" + gdb_assert {[dict exists $insn location]} \ + "location in disassemble output" + if {[dict exists $insn symbol]} { + set seen_labels([dict get $insn symbol]) 1 + } + } + incr insn_no +} + +proc require_label {name} { + global seen_labels + if {[info exists seen_labels($name)]} { + pass "saw label $name" + } else { + fail "saw label $name" + } +} + +require_label return_value +require_label compute +require_label out_label + +dap_shutdown