From patchwork Thu Aug 22 13:13:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 34241 Received: (qmail 57582 invoked by alias); 22 Aug 2019 13:13:57 -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 56843 invoked by uid 89); 22 Aug 2019 13:13:57 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-22.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: rock.gnat.com Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 22 Aug 2019 13:13:55 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 8576311645A; Thu, 22 Aug 2019 09:13:53 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id a8esyqj8f8CE; Thu, 22 Aug 2019 09:13:53 -0400 (EDT) Received: from murgatroyd.Home (97-122-178-82.hlrn.qwest.net [97.122.178.82]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by rock.gnat.com (Postfix) with ESMTPSA id 30D86116429; Thu, 22 Aug 2019 09:13:53 -0400 (EDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH] Do not expose stub types to Python Date: Thu, 22 Aug 2019 07:13:50 -0600 Message-Id: <20190822131350.31757-1-tromey@adacore.com> MIME-Version: 1.0 dwarf2read.c will create stub types for Ada "Taft Amendment" types. These stub types can currently be exposed to Python code, where they show up as TYPE_CODE_VOID types (but that, mysteriously, can sometimes be used in other ways). While it's possible to work with such types by using strip_typedefs, this seemed unpleasant to me. This patch takes another approach instead, which is to try not to expose stub types to Python users. gdb/ChangeLog 2019-08-22 Tom Tromey * python/py-type.c (type_to_type_object): Call check_typedef for stub types. gdb/testsuite/ChangeLog 2019-08-22 Tom Tromey * gdb.ada/py_taft.exp: New file. * gdb.ada/py_taft/main.adb: New file. * gdb.ada/py_taft/pkg.adb: New file. * gdb.ada/py_taft/pkg.ads: New file. --- gdb/ChangeLog | 5 ++++ gdb/python/py-type.c | 11 ++++++++ gdb/testsuite/ChangeLog | 7 +++++ gdb/testsuite/gdb.ada/py_taft.exp | 38 ++++++++++++++++++++++++++ gdb/testsuite/gdb.ada/py_taft/main.adb | 22 +++++++++++++++ gdb/testsuite/gdb.ada/py_taft/pkg.adb | 27 ++++++++++++++++++ gdb/testsuite/gdb.ada/py_taft/pkg.ads | 22 +++++++++++++++ 7 files changed, 132 insertions(+) create mode 100644 gdb/testsuite/gdb.ada/py_taft.exp create mode 100644 gdb/testsuite/gdb.ada/py_taft/main.adb create mode 100644 gdb/testsuite/gdb.ada/py_taft/pkg.adb create mode 100644 gdb/testsuite/gdb.ada/py_taft/pkg.ads diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index e8af6f60e1e..134f76dafb0 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -1334,6 +1334,17 @@ type_to_type_object (struct type *type) { type_object *type_obj; + try + { + /* Try not to let stub types leak out to Python. */ + if (TYPE_STUB (type)) + type = check_typedef (type); + } + catch (...) + { + /* Just ignore failures in check_typedef. */ + } + type_obj = PyObject_New (type_object, &type_object_type); if (type_obj) set_type (type_obj, type); diff --git a/gdb/testsuite/gdb.ada/py_taft.exp b/gdb/testsuite/gdb.ada/py_taft.exp new file mode 100644 index 00000000000..71ac3327380 --- /dev/null +++ b/gdb/testsuite/gdb.ada/py_taft.exp @@ -0,0 +1,38 @@ +# Copyright 2019 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 . + +load_lib "ada.exp" +load_lib gdb-python.exp + +standard_ada_testfile main + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable debug] != ""} { + return -1 +} + +clean_restart ${testfile} + +# Skip this testcase if Python scripting is not enabled. +if { [skip_python_tests] } { continue } + +set bp_location [gdb_get_line_number "STOP" ${testdir}/main.adb] +runto "main.adb:$bp_location" + +gdb_test_no_output "python v = gdb.parse_and_eval('v')" + +gdb_test "python print(v.dereference().type.code is gdb.TYPE_CODE_VOID)" \ + "False" +gdb_test "python print(v.type.strip_typedefs().target().code is gdb.TYPE_CODE_VOID)" \ + "False" diff --git a/gdb/testsuite/gdb.ada/py_taft/main.adb b/gdb/testsuite/gdb.ada/py_taft/main.adb new file mode 100644 index 00000000000..b0ba8bdb90e --- /dev/null +++ b/gdb/testsuite/gdb.ada/py_taft/main.adb @@ -0,0 +1,22 @@ +-- Copyright 2019 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 . + +with Pkg; + +procedure Main is + V : Pkg.Value := Pkg.Create (42); +begin + null; -- STOP +end Main; diff --git a/gdb/testsuite/gdb.ada/py_taft/pkg.adb b/gdb/testsuite/gdb.ada/py_taft/pkg.adb new file mode 100644 index 00000000000..94ce4b1e851 --- /dev/null +++ b/gdb/testsuite/gdb.ada/py_taft/pkg.adb @@ -0,0 +1,27 @@ +-- Copyright 2019 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 . + +package body Pkg is + + type Value_Record is record + I : Integer; + end record; + + function Create (I : Integer) return Value is + begin + return new Value_Record'(I => I); + end Create; + +end Pkg; diff --git a/gdb/testsuite/gdb.ada/py_taft/pkg.ads b/gdb/testsuite/gdb.ada/py_taft/pkg.ads new file mode 100644 index 00000000000..daa4edbf1b1 --- /dev/null +++ b/gdb/testsuite/gdb.ada/py_taft/pkg.ads @@ -0,0 +1,22 @@ +-- Copyright 2019 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 . + +package Pkg is + type Value is private; + function Create (I : Integer) return Value; +private + type Value_Record; + type Value is access all Value_Record; +end Pkg;