From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id YHyNMWt9WWhu1xoAWB0awg (envelope-from ) for ; Mon, 23 Jun 2025 12:14:35 -0400 Received: by simark.ca (Postfix, from userid 112) id C4DC71E11C; Mon, 23 Jun 2025 12:14:35 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-9.0 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED, RCVD_IN_VALIDITY_RPBL,RCVD_IN_VALIDITY_SAFE autolearn=ham autolearn_force=no version=4.0.1 Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id EECE91E0C2 for ; Mon, 23 Jun 2025 12:14:34 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 9B337384671B for ; Mon, 23 Jun 2025 16:14:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9B337384671B Received: from us-smtp-delivery-114.mimecast.com (us-smtp-delivery-114.mimecast.com [170.10.133.114]) by sourceware.org (Postfix) with ESMTP id E6F573846E63 for ; Mon, 23 Jun 2025 16:11:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E6F573846E63 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=labware.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=labware.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org E6F573846E63 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.114 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1750695064; cv=none; b=wOOrUAZq/yymdSkTM4sRovu4TChHVeqCH5s6E9x5hjmV5ZuPGWQbOegCqsMuiW1YXcfOMAvnvUEvyCkgzhmm3bOYnTySnI0I46GeZusa1zD7CLaBGLxQPVHOy32zYOL/PVuXBXNKSYAczbcZ6+CdKY9p2rmcj7SHSQ6BBa0DZes= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1750695064; c=relaxed/simple; bh=6Uuj47CcDCFl47eUliulR/R2EOyCsIw75eR1XXgEjAY=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=TLCxc8/GcIktLw5sQUCJQjkepU9PfEdqXhzQGhAlGNJSCTOdK6s8p3eHmYebst7wCbypA2HujOxwi5uabBDdl0eepnOCAemP+EnwDM2A3RzZGfGIyBEioBoFsigtzCjGZyx5+YeYJ71xljskmENGDuo0yq7RuA/slVrFqiXuR9M= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E6F573846E63 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2119.outbound.protection.outlook.com [40.107.237.119]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-630-cx3aAsJ7OfqadQnOnGHTsw-1; Mon, 23 Jun 2025 12:11:01 -0400 X-MC-Unique: cx3aAsJ7OfqadQnOnGHTsw-1 X-Mimecast-MFC-AGG-ID: cx3aAsJ7OfqadQnOnGHTsw_1750695061 Received: from SA1PR17MB5365.namprd17.prod.outlook.com (2603:10b6:806:1d8::11) by PH0PR17MB4637.namprd17.prod.outlook.com (2603:10b6:510:81::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8857.29; Mon, 23 Jun 2025 16:10:59 +0000 Received: from SA1PR17MB5365.namprd17.prod.outlook.com ([fe80::6398:7dc0:7d88:5a4d]) by SA1PR17MB5365.namprd17.prod.outlook.com ([fe80::6398:7dc0:7d88:5a4d%5]) with mapi id 15.20.8857.026; Mon, 23 Jun 2025 16:10:59 +0000 From: Jan Vrany To: gdb-patches@sourceware.org CC: Jan Vrany , Eli Zaretskii Subject: [RFC v5 08/18] gdb/python: allow instantiation of gdb.Objfile from Python Date: Mon, 23 Jun 2025 17:10:03 +0100 Message-ID: <20250623161013.650814-9-jan.vrany@labware.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250623161013.650814-1-jan.vrany@labware.com> References: <20250623161013.650814-1-jan.vrany@labware.com> X-ClientProxiedBy: LO4P123CA0308.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:197::7) To SA1PR17MB5365.namprd17.prod.outlook.com (2603:10b6:806:1d8::11) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SA1PR17MB5365:EE_|PH0PR17MB4637:EE_ X-MS-Office365-Filtering-Correlation-Id: 0c6d1bb4-b415-49dc-da2a-08ddb2708ae8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024 X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?pjxTHfDeC0s/9Zb1B81zWrUBQVxkSqajw8K8W8mLpjuPonCG2b2YWnTL5ZtT?= =?us-ascii?Q?8EhcYSDKc5y3hW5oaBo0ntH59cor78+Tth2F7yCwKlHjJJJH3lLOdWbECsi6?= =?us-ascii?Q?T/9Cj/1JRy9iFM9JKtdRKtAb35kC8LROp4uomc949UY9KD69uj8T/qXRqbbx?= =?us-ascii?Q?9q8rUwZeg5p1gg7UqFVAxbmNmUUi8aIlSXr5saByWOPOO1NhDUZX1/pri/1s?= =?us-ascii?Q?teW2ocnKrhlMGdtMFBZasMqa3ZiFDU2fQ0Yb+PqyMTsi+j0xax3WQKuari6r?= =?us-ascii?Q?HVO2f4KZTpL82RIlZMTf6gAvhPHQRWKERRWWpwqAvX0Yg6Bl1vjFIW6p3s6Z?= =?us-ascii?Q?O/jme6itBlERz4c2e5eKKqgvOVp6RmUFpzxYrUULw2D3nUqPGqg6Q7510XGL?= =?us-ascii?Q?x2DI1SNy8o3ozUFoR0WM81hOWjlYkzFSJieWWdLeonlCCCRuSjoxgq+YQcoL?= =?us-ascii?Q?BpM7OcYbkE+r4qQbol9OPfZHfV1YMMNHRHBE/B07wvv+NAiZTP/gvRXEBWwD?= =?us-ascii?Q?gIDLHO9b1OGJw2EtRixwK5jOBa3KlurtN4dl7fgXKeynTogRGr6HXOYbAgB/?= =?us-ascii?Q?Dk3RN26hcdgvEJeicB3m+J+AJb5ZqK8aKMOYwyIwOxh94trmOeSnj0kD6VXa?= =?us-ascii?Q?TcgjT5Z1JdVMBrHA+INbHMJtq5mbsFYapQztTltm9qwtELL9CYzbiKWkVLh0?= =?us-ascii?Q?WNBX4mpmBX93gbF3590d93BtXYFOU1oJsDQeu6CBwN1216u2zqALnHj6nYE4?= =?us-ascii?Q?MhVUFjl+JwTQIdoRdMroh9s7kACzm9Vysdxj/CVqVyhX9CAlVv+8m4SUTSAw?= =?us-ascii?Q?pAyMA17F5J8TT3dQUmlnC2mmjWeDvqlANa5JH9tBxk7NC2dc4WuBfdiHI6+n?= =?us-ascii?Q?xRrVNHzp5aUUTHGSA5femrtYMEJIL1rcB0FQo+y15b+mSUM40pnYVHBnvvpm?= =?us-ascii?Q?VojsQLs2lHmWNdWHb8qvfVl5Q6TYVGXK77o1mwUAifP9INGMZaKxD3+OojPp?= =?us-ascii?Q?iGah9dkeZOkX38GzYzpE33KizKO/kilrfbOohtOTUI+IB2kPUxMg9odDjHrV?= =?us-ascii?Q?PnP7+DEjf8xyJDIalV2xmDqQxnPronVI6RE6D7sla+TxA+1gMt6RIj+SxhT1?= =?us-ascii?Q?qJDPox0oXSD0C9xR6FtsW6POy1rIkbTI8y7RUdZMTnJn4nqBw99tIHKAzhYf?= =?us-ascii?Q?wq8BLp4FTDmo2V634+o3H62BjhvBpZRfONX0E2VzQWxYCcvnEqrrKcVJ19pV?= =?us-ascii?Q?956p51LqXy/eXbJmOMGdxBQccshSI+s41oYzqQgoh1saKsbM9FKw/hH+Kkog?= =?us-ascii?Q?Kkr9Kjkg+6cxROMLVKDp/xZbJMspdLQYBQKnsStjG99XcJNiq4MyT7ALRdna?= =?us-ascii?Q?Uub4FcXB2vl/GWQx5E/xPWfdB6j8pjVRS9ZmI6kyW3/ClPWDhLyGqB4nbvYX?= =?us-ascii?Q?xXuQYHIiI9E=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SA1PR17MB5365.namprd17.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(376014)(1800799024); DIR:OUT; SFP:1102 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?KTHF4eB8A4OYShCuFCK8A/FPZECnealqHqZ1sPo7mYDB2Uhst0j8QIxW+ieW?= =?us-ascii?Q?ttYK95cQUt1O4MbNmYDAGCuYBcCSgB8kUx1deKPQxT1jpATeePaYCEFWKtc/?= =?us-ascii?Q?8LXMr5V5wmv52bnD6scbtKbZe+AH+ce/P1o/68gw00eFJ2cH5/7s7aHmdh/l?= =?us-ascii?Q?8uAj9nvTHRO08GLqhAOH4wqQbWWN4K8CWuWTmon0/ozYiXqQ5Or9KRLXuOE7?= =?us-ascii?Q?s+4hoxB8GaDg+U6i0P7bCSIqmH0JpwbICMywjXDof05r0dXETbjLmOcZB7s3?= =?us-ascii?Q?O3qA0CI9FUYW09B/UB/PH5L5scnLssnbdpo3KhCWmN8VOfAspjzwquzidb9G?= =?us-ascii?Q?551ElzdzH0GV42NICygwd054oQK4gEzDjecwbsljeWmN7sfz53ASzJWySJcl?= =?us-ascii?Q?HumMv8c3mPTzhWYh+mo/Ynn7JzMYZtPth2oLQ8lO+sI2grv5TyNVg28zrF/3?= =?us-ascii?Q?Jga01xovM52RMVMTUH2vgVrFeR9Zbn9QNJXmeTX/VnEvpbtiwHm3GuwLCjo0?= =?us-ascii?Q?dPwCzXfZI8+OrZCV4OCjIRwrllpNAk5RDUPNQzbWi3hg/Q8e7rSBdKlFiEEs?= =?us-ascii?Q?OuqPeJxX2HgHStQEQKZDKy4akTD8ilIYA1H8SOLMCvOCiyQ0oJiiovWAGPAH?= =?us-ascii?Q?jDbLfy9NUrE4Pq3wSvHDg00gWgLpgYoq2oAx/YAcuraZtMRGjHA6xDesjVYP?= =?us-ascii?Q?QEYAoScgrlLTjI4/Jxvh/C2tqigZL7hSn5NNlCESpdUhlOcNPd3/5tAMw3n4?= =?us-ascii?Q?sGy/+pwrRuGziXvxvEcmOh1HUNihlnPOkyu1hXxG5987WvLquCTWVOZzIc0a?= =?us-ascii?Q?4R3m6KOXUq47iL9+xXxp4NCl3s6rpwDL0YrTNblqg7hHnoBiVuI6LtCFq6ue?= =?us-ascii?Q?Gbw3YPcNMZ+ZQhKCla3zuS9FOGf6bxD/KKAv7B9F1c+0mDqgax9wYrXKJ7qm?= =?us-ascii?Q?aCrgyuHDEwBe+fvHH/zsyavpG869EShF9TJUhtbM3wgTEtNbNLFhl8lCAsGc?= =?us-ascii?Q?QVfMEQnPFsRUcIXF5yskgnNGoi28iNNDw5+AOs/rAutw1fz1pN4UdBYRsxwV?= =?us-ascii?Q?3lnV6Boh4K6mt9TsFbTV6FEAr5MAKoBdixMdBW7iU9FQAv53uunbObnQ/EeU?= =?us-ascii?Q?uv0v4xCzP4Gj74FU3KLe6wv3zwqDoaChvhvl4hO144iJfwx64ngjYlA4Jp0Q?= =?us-ascii?Q?VuQ7CczvzC5Vbd7l9ILwoUt1yg/VldVTEux/hkl0kpSfhdSjHR/CbAIXEazL?= =?us-ascii?Q?oxQdg9MMQaZ7OX5U1sGjVwW6v1ACPOhs80jf77G+t1GrdLysa3M1bvvpOydp?= =?us-ascii?Q?woYVVhY1VGAUT0mypCdVIL1MrVq67aaHZOjWRMkbaX+M+g/7Kkwcp+tzxwzW?= =?us-ascii?Q?kB/zPsHcRHYUo2qERpWFDeNy31DDAUwLn+K7DznOfPX145fQkJ5YSHK6otFj?= =?us-ascii?Q?TfabJcS4isShQT73A1ZuZL5yQwJdSUCouyQR9o++BVAVnICDj5lZNOSfuUHA?= =?us-ascii?Q?s5T03B9a7WD+cVs3qEHA2vLbWMYalwQSfHyW+fB5/vXdlEkt8nIb6mhbBe2a?= =?us-ascii?Q?C5xzfRH94j/djTIf9pKdOIsugJNMGaprqKwOf0Ao?= X-OriginatorOrg: labware.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0c6d1bb4-b415-49dc-da2a-08ddb2708ae8 X-MS-Exchange-CrossTenant-AuthSource: SA1PR17MB5365.namprd17.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jun 2025 16:10:59.4110 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b5db0322-1aa0-4c0a-859c-ad0f96966f4c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: aEx04rveICIpE5huWjJ4MOD/bDMphtmwndd8376yXINbgkF0TXLIP8jyji7wVaJupjF8xu7S5jxjjgCn0VbMSg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR17MB4637 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: ZAbTRwRk9-hec1XIPIzYHlBXVvO6a3P-NJqdX9u75MI_1750695061 X-Mimecast-Originator: labware.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=WINDOWS-1252 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~public-inbox=simark.ca@sourceware.org This commit adds code to allow user extension to instantiate gdb.Objfile. This is a step towards a Python support for dynamically generated code (JIT) in GDB. Reviewed-By: Eli Zaretskii --- gdb/doc/python.texi | 13 +++ gdb/python/py-inferior.c | 10 +++ gdb/python/py-objfile.c | 111 +++++++++++++++++++++++- gdb/python/python-internal.h | 1 + gdb/testsuite/gdb.python/py-objfile.exp | 38 +++++++- 5 files changed, 169 insertions(+), 4 deletions(-) diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 3ef3699d355..ad9d65636b7 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -5793,6 +5793,19 @@ Reading symbols from ./hello... =20 A @code{gdb.Objfile} object has the following methods: =20 +@defun Objfile.__init__ (filename @r{[}, inferior @r{][}, arch @r{]}) +Create a new objfile with given @var{filename}. + +The optional @var{inferior} argument specifies the inferior to which the n= ewly +created objfile is added. Defaults to currently selected inferior. +@pxref{Inferiors In Python}. + +The optional @var{arch} argument specifies the architectore to associate w= ith +the newly created objfile. Defaults to inferior's architecture. +@xref{Architectures In Python}. + +@end defun + @defun Objfile.is_valid () Returns @code{True} if the @code{gdb.Objfile} object is valid, @code{False} if not. A @code{gdb.Objfile} object can become invalid diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index 2aa11d3160d..250e16fa0d0 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -225,6 +225,16 @@ python_free_objfile (struct objfile *objfile) gdbpy_print_stack (); } =20 +/* Return inferior reference that is wrapped by this object. */ + +inferior * +inferior_object_to_inferior (PyObject *obj) +{ + if (! PyObject_TypeCheck (obj, &inferior_object_type)) + return nullptr; + return ((inferior_object *) obj)->inferior; +} + /* Return a reference to the Python object of type Inferior representing INFERIOR. If the object has already been created, return it and increment the reference count, otherwise, create it. diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c index b76f57e818d..6403db583a7 100644 --- a/gdb/python/py-objfile.c +++ b/gdb/python/py-objfile.c @@ -25,6 +25,7 @@ #include "symtab.h" #include "python.h" #include "inferior.h" +#include "observable.h" =20 struct objfile_object { @@ -251,6 +252,84 @@ objfpy_new (PyTypeObject *type, PyObject *args, PyObje= ct *keywords) return (PyObject *) self.release (); } =20 +/* Object initializer; creates new a objfile. + + Use: __init__(FILENAME [, INFERIOR [,ARCH]]). */ + +static int +objfpy_init (PyObject *zelf, PyObject *args, PyObject *kw) +{ + struct objfile_object *self =3D (struct objfile_object*) zelf; + + if (self->objfile) + { + PyErr_Format (PyExc_RuntimeError, +=09=09 _("Objfile object already initialized.")); + return -1; + } + + static const char *keywords[] =3D { "filename", "inferior", "arch", null= ptr }; + const char *filename; + PyObject* inf_obj =3D nullptr; + PyObject* arch_obj =3D nullptr; + + + if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|OO", keywords, +=09=09=09=09=09&filename, &inf_obj, &arch_obj)) + return -1; + + inferior *inf =3D nullptr; + if (inf_obj) + { + inf =3D inferior_object_to_inferior (inf_obj); + if (! inf) +=09{ +=09 PyErr_Format (PyExc_TypeError, +=09=09 _("The inferior argument is not gdb.Inferior object")); +=09 return -1; +=09} + } + else + { + inf =3D current_inferior (); + } + + gdbarch *arch =3D nullptr; + if (arch_obj) + { + if (! gdbpy_is_architecture (arch_obj)) +=09{ +=09 PyErr_Format (PyExc_TypeError, +=09=09 _("The arch argument is not gdb.Architecture object")); +=09 return -1; +=09} + arch =3D arch_object_to_gdbarch (arch_obj); + } + else + { + arch =3D inf->arch (); + } + + if (!objfpy_initialize (self)) + { + PyErr_Format (PyExc_RuntimeError, +=09=09 _("Failed to initialize Objfile object.")); + return -1; + } + + struct objfile *objfile; + + objfile =3D objfile::make (nullptr, inf->pspace, filename, OBJF_NOT_FILE= NAME | OBJF_READNOW); + objfile->per_bfd->gdbarch =3D arch; + + self->objfile =3D objfile; + objfpy_objfile_data_key.set(objfile, self); + /* Increment refcount on self as it is now referenced from objfile! */ + Py_INCREF (self); + + return 0; +} + PyObject * objfpy_get_printers (PyObject *o, void *ignore) { @@ -733,6 +812,32 @@ objfile_to_objfile_object (struct objfile *objfile) return gdbpy_ref<>::new_reference (result); } =20 +/* This function remove any dynamic objfiles left over when the + inferior exits. */ + +static void +objfpy_inferior_exit_hook (struct inferior *inf) +{ + for (objfile *objf : current_program_space->objfiles_safe ()) + { + if (objf->obfd =3D=3D nullptr) +=09{ +=09 /* Following check is to only unlink dynamic objfiles created by +=09 Python code. Dynamic objfiles created by JIT reader API are +=09 unlinked in jit_inferior_exit_hook (). */ +=09 if (objf->jited_data =3D=3D nullptr || objf->jited_data->addr !=3D 0) +=09 objf->unlink (); +=09} + } +} + +void _initialize_py_objfile (); +void +_initialize_py_objfile () +{ + gdb::observers::inferior_exit.attach (objfpy_inferior_exit_hook, "py-obj= file"); +} + static int CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION gdbpy_initialize_objfile (void) { @@ -837,8 +942,8 @@ PyTypeObject objfile_object_type =3D 0,=09=09=09=09 /* tp_dict */ 0,=09=09=09=09 /* tp_descr_get */ 0,=09=09=09=09 /* tp_descr_set */ - offsetof (objfile_object, dict), /* tp_dictoffset */ - 0,=09=09=09=09 /* tp_init */ + offsetof (objfile_object, dict),/* tp_dictoffset */ + objfpy_init,=09 /* tp_init */ 0,=09=09=09=09 /* tp_alloc */ - objfpy_new,=09=09=09 /* tp_new */ + objfpy_new, =09=09 /* tp_new */ }; diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 99e362c5221..18b78a7d235 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -567,6 +567,7 @@ struct symtab_and_line *sal_object_to_symtab_and_line (= PyObject *obj); frame_info_ptr frame_object_to_frame_info (PyObject *frame_obj); struct gdbarch *arch_object_to_gdbarch (PyObject *obj); struct compunit_symtab *compunit_object_to_compunit (PyObject *obj); +inferior *inferior_object_to_inferior(PyObject *obj); =20 extern PyObject *gdbpy_execute_mi_command (PyObject *self, PyObject *args, =09=09=09=09=09 PyObject *kw); diff --git a/gdb/testsuite/gdb.python/py-objfile.exp b/gdb/testsuite/gdb.py= thon/py-objfile.exp index 8d1102896fa..055a35cea41 100644 --- a/gdb/testsuite/gdb.python/py-objfile.exp +++ b/gdb/testsuite/gdb.python/py-objfile.exp @@ -173,4 +173,40 @@ if ![ishost *-*-mingw*] { gdb_py_test_silent_cmd "python objfile =3D gdb.objfiles()\[0\]" \ "get first objfile" 1 gdb_file_cmd ${binfile} -gdb_test "python print(objfile)" "" +gdb_test "python print(objfile)" "" "print in= valid objfile" + +# Test creating objfile dynamically from Python +gdb_py_test_silent_cmd "python objfile =3D gdb.Objfile(\"Test objfile\")" = \ +=09"create objfile" 1 + +gdb_test "python print(objfile)" \ +=09"" \ +=09"print dynamic objfile" + +gdb_test "python print(objfile.is_file)" \ +=09"False" \ +=09"(dynamic) objfile.is_file" + +gdb_test "python print(objfile.is_valid())" \ +=09"True" \ +=09"(dynamic) objfile.is_valid()" + +gdb_test "python print(objfile in gdb.objfiles())" \ +=09"True" \ +=09"(dynamic) objfile in gdb.objfiles()" + +gdb_test "python print( gdb.Objfile(\"Test objfile 2\", gdb.selected_infer= ior()))" \ +=09"" \ +=09"create objfile with inferior" + +gdb_test "python print( gdb.Objfile(\"Test objfile 3\", gdb.selected_infer= ior(), gdb.selected_inferior().architecture()))" \ +=09"" \ +=09"create objfile with inferior and arch" + +gdb_test "python print( gdb.Objfile(\"Test objfile 4\", gdb))" \ +=09"TypeError.*:.*" \ +=09"create objfile with invalid inferior" + +gdb_test "python print( gdb.Objfile(\"Test objfile 5\", gdb.selected_infer= ior(), gdb.selected_inferior()))" \ +=09"TypeError.*:.*" \ +=09"create objfile with valid inferior but invalid arch" --=20 2.47.2