diff options
author | Pierre-Marie de Rodat <derodat@adacore.com> | 2015-04-03 10:40:52 +0200 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2015-04-03 15:23:49 +0200 |
commit | 961f41602529c9cd4f88af6c02fb61fb55100e27 (patch) | |
tree | ab5bd15848547f9a17611ed90c7b7a43b9ecfcff | |
parent | cbf0179287a799be27e278a41f7705d4c20d9f11 (diff) | |
download | gdb-961f41602529c9cd4f88af6c02fb61fb55100e27.zip gdb-961f41602529c9cd4f88af6c02fb61fb55100e27.tar.gz gdb-961f41602529c9cd4f88af6c02fb61fb55100e27.tar.bz2 |
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:
* 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.
(resolve_dynamic_type_internal): Likewise.
gdb/testsuite/ChangeLog:
* gdb.ada/funcall_ref.exp: New file.
* gdb.ada/funcall_ref/foo.adb: New file.
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/gdbtypes.c | 19 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/funcall_ref.exp | 44 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/funcall_ref/foo.adb | 34 |
5 files changed, 90 insertions, 19 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 73108a1..d8a684f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2015-04-03 Pierre-Marie de Rodat <derodat@adacore.com> + + * 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. + (resolve_dynamic_type_internal): Likewise. + 2015-04-02 H.J. Lu <hongjiu.lu@intel.com> * Makefile.in (top_srcdir): New. diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 217ec70..6fb2e9a 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; @@ -2045,21 +2041,6 @@ resolve_dynamic_type_internal (struct type *type, switch (TYPE_CODE (type)) { - case TYPE_CODE_REF: - { - struct property_addr_info pinfo; - - pinfo.type = check_typedef (TYPE_TARGET_TYPE (type)); - pinfo.addr = read_memory_typed_address (addr_stack->addr, type); - pinfo.next = addr_stack; - - resolved_type = copy_type (type); - TYPE_TARGET_TYPE (resolved_type) - = resolve_dynamic_type_internal (TYPE_TARGET_TYPE (type), - &pinfo, top_level); - break; - } - case TYPE_CODE_ARRAY: resolved_type = resolve_dynamic_array (type, addr_stack); break; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index cba2036..50afab5 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-04-03 Pierre-Marie de Rodat <derodat@adacore.com> + + * gdb.ada/funcall_ref.exp: New file. + * gdb.ada/funcall_ref/foo.adb: New file. + 2015-04-02 Yao Qi <yao.qi@linaro.org> * gdb.threads/no-unwaited-for-left.exp: Set up kfail if target 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 <http://www.gnu.org/licenses/>. + +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 = <ref> 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 <http://www.gnu.org/licenses/>. + +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; |