From patchwork Wed Apr 1 08:52:25 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre-Marie de Rodat X-Patchwork-Id: 5945 Received: (qmail 38475 invoked by alias); 1 Apr 2015 08:52:30 -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 38463 invoked by uid 89); 1 Apr 2015 08:52:29 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 X-HELO: smtp.eu.adacore.com Received: from mel.act-europe.fr (HELO smtp.eu.adacore.com) (194.98.77.210) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 01 Apr 2015 08:52:27 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id 4BF8F2D48C80; Wed, 1 Apr 2015 10:52:25 +0200 (CEST) Received: from smtp.eu.adacore.com ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id qyxSHykjWKcB; Wed, 1 Apr 2015 10:52:25 +0200 (CEST) Received: from [10.10.1.112] (cacatoes.act-europe.fr [10.10.1.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.eu.adacore.com (Postfix) with ESMTPSA id 180FF2D48C7A; Wed, 1 Apr 2015 10:52:25 +0200 (CEST) Message-ID: <551BB1C9.10006@adacore.com> Date: Wed, 01 Apr 2015 10:52:25 +0200 From: Pierre-Marie de Rodat User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Joel Brobecker CC: GDB Patches Subject: Re: [PATCH] Do not consider reference types as dynamic References: <54FEDC09.3050106@adacore.com> <20150323133627.GG5438@adacore.com> In-Reply-To: <20150323133627.GG5438@adacore.com> X-IsSubscribed: yes Joel, On 03/23/2015 02:36 PM, Joel Brobecker wrote: > If it cannot pass without your GCC patch, let's add a setup_xfail. Done. > Mostly OK - a couple of minor comments below. > [...] > If the test "label" (3rd argument) is the same as the command being > sent, you do not need to explicitly specify it. So, the following > is equivalent to your version: > > gdb_test "p get (\"Hello world!\")" \ > "= \\(n => 12, s => \"Hello world!\"\\)" > >> +gdb_test "ptype get (\"Hello world!\")" \ >> + [multi_line "type = record" \ >> + " n: natural;" \ >> + " s: access array \\(1 \\.\\. n\\) of character;" \ >> + "end record"] \ >> + "ptype get (\"Hello world!\")" > > Same here. Fixed both. >> +++ b/gdb/testsuite/gdb.ada/funcall_ref/foo.adb >> @@ -0,0 +1,19 @@ >> +procedure Foo is > > Missing copyright header. Likewise. Here's the updated patch. Thank you for reviewing! From 5c456519c3651360120739d1ee6cf01d4a61adac Mon Sep 17 00:00:00 2001 From: Pierre-Marie de Rodat Date: Tue, 10 Mar 2015 09:18:45 +0100 Subject: [PATCH] Do not consider reference types as dynamic Even when referenced types are dynamic, the corresponding referencing type should not be considered as dynamic: it's only a pointer. This prevents reference type for values not in memory to be resolved. gdb/ChangeLog: 2015-03-23 Pierre-Marie de Rodat * gdbtypes.c (is_dynamic_type_internal): Remove special handling of TYPE_CODE_REF types so that they are not considered as dynamic depending on the referenced type. gdb/testsuite/ChangeLog: 2015-03-23 Pierre-Marie de Rodat * gdb.ada/funcall_ref.exp: New file. * gdb.ada/funcall_ref/foo.adb: New file. --- gdb/gdbtypes.c | 4 --- gdb/testsuite/gdb.ada/funcall_ref.exp | 44 +++++++++++++++++++++++++++++++ gdb/testsuite/gdb.ada/funcall_ref/foo.adb | 34 ++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 gdb/testsuite/gdb.ada/funcall_ref.exp create mode 100644 gdb/testsuite/gdb.ada/funcall_ref/foo.adb diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 217ec70..6c5a3bb 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -1752,10 +1752,6 @@ is_dynamic_type_internal (struct type *type, int top_level) { type = check_typedef (type); - /* We only want to recognize references at the outermost level. */ - if (top_level && TYPE_CODE (type) == TYPE_CODE_REF) - type = check_typedef (TYPE_TARGET_TYPE (type)); - /* Types that have a dynamic TYPE_DATA_LOCATION are considered dynamic, even if the type itself is statically defined. From a user's point of view, this may appear counter-intuitive; diff --git a/gdb/testsuite/gdb.ada/funcall_ref.exp b/gdb/testsuite/gdb.ada/funcall_ref.exp new file mode 100644 index 0000000..444e9d2 --- /dev/null +++ b/gdb/testsuite/gdb.ada/funcall_ref.exp @@ -0,0 +1,44 @@ +# Copyright 2008-2015 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" + +standard_ada_testfile foo + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable \ + [list debug]] != "" } { + return -1 +} + +clean_restart ${testfile} + +set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb] +runto "foo.adb:$bp_location" + +# Test printing and type-printing of a discriminated record that a function +# returns by reference. + +# Currently, GCC describes such functions as returning pointers (instead of +# references). +setup_xfail *-*-* +gdb_test "p get (\"Hello world!\")" \ + "= \\(n => 12, s => \"Hello world!\"\\)" \ + +setup_xfail *-*-* +gdb_test "ptype get (\"Hello world!\")" \ + [multi_line "type = record" \ + " n: natural;" \ + " s: access array \\(1 \\.\\. n\\) of character;" \ + "end record"] \ diff --git a/gdb/testsuite/gdb.ada/funcall_ref/foo.adb b/gdb/testsuite/gdb.ada/funcall_ref/foo.adb new file mode 100644 index 0000000..84655d3 --- /dev/null +++ b/gdb/testsuite/gdb.ada/funcall_ref/foo.adb @@ -0,0 +1,34 @@ +-- Copyright 2008-2015 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 . + +procedure Foo is + type Bar (N : Natural) is record + S : String (1 .. N); + end record; + + function Get (S : String) return Bar is + begin + return (N => S'Length, S => S); + end Get; + + procedure Do_Nothing (B : Bar) is + begin + null; + end Do_Nothing; + + B : Bar := Get ("Foo"); +begin + Do_Nothing (B); -- STOP +end Foo; -- 2.3.4