From patchwork Wed Nov 1 17:09:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 78887 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 821E73858C01 for ; Wed, 1 Nov 2023 17:10:51 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-io1-xd32.google.com (mail-io1-xd32.google.com [IPv6:2607:f8b0:4864:20::d32]) by sourceware.org (Postfix) with ESMTPS id 60AB23858D38 for ; Wed, 1 Nov 2023 17:09:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 60AB23858D38 Authentication-Results: sourceware.org; dmarc=pass (p=none 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 60AB23858D38 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::d32 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698858590; cv=none; b=ujvjvPj/812l/r+HI2IG1zG5OVdun49Q7Blffzjznfa3/bpQeXjLlN1aaorCikOq8iR4cM80L4lQZ0bxV9NMce59ERCokZCOZ7rSblKo4Pa9nWiJYXS+cUv0cm5wUVb4izgJgoplDfaP7pH+nb7ZRhdZK+ZWs793PvPWyHuqRkw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698858590; c=relaxed/simple; bh=2YfJMavKTaay5zIO2IVyxWmtfWdG+P+ljMYwZP48Q5Y=; h=DKIM-Signature:From:Date:Subject:MIME-Version:Message-Id:To; b=KBlOeJVjLJWbHSUKd37NZOfFJFGYhGL2wnXGR4CdWiHDxrfg1PH9jUc/diOG1xD/ENdMXewIUmh4pIi9V/lUh3ofWY6Wp5dlgGkEBG+p7XgtECKnfZcJt7McqjySHP8Rlw55maKacpwkhTHu0N5a2FAItIO8Z/mn3V99fT5EgtI= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-io1-xd32.google.com with SMTP id ca18e2360f4ac-7a996357550so245162639f.2 for ; Wed, 01 Nov 2023 10:09:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; t=1698858580; x=1699463380; darn=sourceware.org; h=to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ffxN3Y7nnrv7dTHjFHVXVZDthCSrPPTkaZoadIUNOTM=; b=jdxh8EChYq4CACg4+aro5KCUqSV8bO2hHdXKqODc2FLTeqkbP5Bq/i8PL4kIlX9vuL 7747cCCCpfTLY5XPvDv/Elv1vqqxFCB0xkvDjdMNOvZRm9cMQjqS04xfTe+qGQd4uVDi DamRdWId0o9kMW3ewx/qHAN0e7ywAU4ZSKO+IC9/tBih73y7ZgC4wvz1PS7ZSWjuP5lp r0pCzZY0/FkTy6cwzxXWMG9GtaiafUCg7PAZ8QHb4Sn6kxgXhC4AxfEb5jtRcdjyGGIo NDUqVKoiU8/Mhx5vRfzMPdomYXN+n3exmmF3YdJMBXQWoGQe43GmLoY+BITiAGohjNJn uAXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698858580; x=1699463380; h=to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ffxN3Y7nnrv7dTHjFHVXVZDthCSrPPTkaZoadIUNOTM=; b=EedM5K6kTmghsUfV0wL0ChQBYQGxrzWEZ68W8jThV+RKNc+K+jeoczSF3vo/AXe6Zz b74usP4Jx7qpu2kS1vEQaEsiA+BgmcmzPeD7LIXRkekF/2bhv8RVwOrT0BodgQSxvpdX /nGdOSsDukUzToVrHHh+8lDyD4RMf+lbRJbbVDEDuVQxRr3irhJire5mzHGzYqKCgrON +ZZOujPUPcraRA8PSHJEFtLUH+dJrl0SeqEet35dfc3dZUY4F+F+4mBeUkSQFXqzkVf6 bBY0Q05pGwNdwLLOb6XX7KNoe36OJ3uLAZbug4qF+8b+YzYedUCN7zfTtp+7gKIS5739 6Yrg== X-Gm-Message-State: AOJu0Yy2LocKZ7v2coZC6YTyKvuYJ5cq6j8SgwGSE67eSon8M2rEWer6 koYY12Jth6FrHws27KFO4ZDOZVqy1UiC6GKYGoQ2WQ== X-Google-Smtp-Source: AGHT+IGShJscVvbw5i1ky1ZHIPzcAQKAYOH0iYvAtSypCP/C8nqSorQupS30T4RcLrrBHp97L54Psw== X-Received: by 2002:a6b:ea0a:0:b0:79f:99b6:63 with SMTP id m10-20020a6bea0a000000b0079f99b60063mr15875694ioc.9.1698858580548; Wed, 01 Nov 2023 10:09:40 -0700 (PDT) Received: from localhost.localdomain (97-122-77-73.hlrn.qwest.net. [97.122.77.73]) by smtp.gmail.com with ESMTPSA id gm2-20020a0566382b8200b0042b3a328ee0sm1017019jab.166.2023.11.01.10.09.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Nov 2023 10:09:40 -0700 (PDT) From: Tom Tromey Date: Wed, 01 Nov 2023 11:09:36 -0600 Subject: [PATCH 4/7] Add gdb.Frame.static_link method MIME-Version: 1.0 Message-Id: <20231101-dap-nested-function-v1-4-0b0c3b228ac7@adacore.com> References: <20231101-dap-nested-function-v1-0-0b0c3b228ac7@adacore.com> In-Reply-To: <20231101-dap-nested-function-v1-0-0b0c3b228ac7@adacore.com> To: gdb-patches@sourceware.org X-Mailer: b4 0.12.4 X-Spam-Status: No, score=-11.8 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, T_SCC_BODY_TEXT_LINE 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 This adds a new gdb.Frame.static_link method to the gdb Python layer. This can be used to find the static link frame for a given frame. Reviewed-By: Eli Zaretskii --- gdb/NEWS | 3 +++ gdb/doc/python.texi | 10 ++++++++++ gdb/python/py-frame.c | 26 ++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/gdb/NEWS b/gdb/NEWS index 95663433f1c..503f53a2ea1 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -17,6 +17,9 @@ ** New read/write attribute gdb.Value.bytes that contains a bytes object holding the contents of this value. + ** New method gdb.Frame.static_link that returns the outer frame + of a nested function frame. + *** Changes in GDB 14 * GDB now supports the AArch64 Scalable Matrix Extension 2 (SME2), which diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 8cc3f92cbfe..afe447644c5 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -5732,6 +5732,16 @@ Set this frame to be the selected frame. @xref{Stack, ,Examining the Stack}. @end defun +@defun Frame.static_link () +In some languages (e.g., Ada, but also a GNU C extension), a nested +function can access the variables in the outer scope. This is done +via a ``static link'', which is a reference from the nested frame to +the appropriate outer frame. + +This method returns this frame's static link frame, if one exists. If +there is no static link, this method returns @code{None}. +@end defun + @defun Frame.level () Return an integer, the stack frame level for this frame. @xref{Frames, ,Stack Frames}. @end defun diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c index 1a55e514e39..0a7e10f09ff 100644 --- a/gdb/python/py-frame.c +++ b/gdb/python/py-frame.c @@ -622,6 +622,30 @@ frapy_language (PyObject *self, PyObject *args) Py_RETURN_NONE; } +/* The static link for this frame. */ + +static PyObject * +frapy_static_link (PyObject *self, PyObject *args) +{ + frame_info_ptr link; + + try + { + FRAPY_REQUIRE_VALID (self, link); + + link = frame_follow_static_link (link); + } + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + + if (link == nullptr) + Py_RETURN_NONE; + + return frame_info_to_frame_object (link); +} + /* Implementation of gdb.newest_frame () -> gdb.Frame. Returns the newest frame object. */ @@ -800,6 +824,8 @@ Return the value of the variable in this frame." }, "The stack level of this frame." }, { "language", frapy_language, METH_NOARGS, "The language of this frame." }, + { "static_link", frapy_static_link, METH_NOARGS, + "The static link of this frame, or None." }, {NULL} /* Sentinel */ };