This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [patch] Fix internal error on optimized-out values (regression by me)
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: Tom Tromey <tromey at redhat dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Mon, 10 Oct 2011 22:54:08 +0200
- Subject: Re: [patch] Fix internal error on optimized-out values (regression by me)
- References: <20110926191132.GA30401@host1.jankratochvil.net> <20110927125250.GA27966@host1.jankratochvil.net> <m3k48lswcn.fsf@fleche.redhat.com>
On Mon, 03 Oct 2011 21:34:16 +0200, Tom Tromey wrote:
> >>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:
>
> Jan> ((struct) <optimized out>).field should be IMO still <optimized
> Jan> out>; just it became internal-error now.
>
> Maybe I am misunderstanding what you are saying -- I think this should
> also throw. I think the rule should be that any attempt to access any
> "invalid" contents of a value, for purposes of computation, should throw
> an exception.
Here is problematic the term "for purposes of computation".
I agree that any computation with content of <optimized out> must throw.
But here the content is not interpreted in any way. Only a smaller subset of
it is used.
But I do not have any argument why the former <optimized out> value is better
than this "value has been optimized out", unaware if there is a precedent for
either way in current codebase. Changed it as you suggest.
No regressions on {x86_64,x86_64-m32,i686}-fedora16pre-linux-gnu.
Thanks,
Jan
gdb/
2011-10-10 Jan Kratochvil <jan.kratochvil@redhat.com>
Fix internal error regression.
* value.c (value_primitive_field): Add require_not_optimized_out.
gdb/testsuite/
2011-10-10 Jan Kratochvil <jan.kratochvil@redhat.com>
Fix internal error regression.
* gdb.dwarf2/implptr-optimized-out.S: New file.
* gdb.dwarf2/implptr-optimized-out.exp: New file.
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -2477,6 +2477,8 @@ value_primitive_field (struct value *arg1, int offset,
struct value *v;
struct type *type;
+ require_not_optimized_out (arg1);
+
CHECK_TYPEDEF (arg_type);
type = TYPE_FIELD_TYPE (arg_type, fieldno);
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/implptr-optimized-out.S
@@ -0,0 +1,166 @@
+/* Copyright 2010, 2011 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/>. */
+
+ .section .debug_info
+d:
+ .long debug_end - 1f /* Length of Compilation Unit Info */
+1:
+ .2byte 0x3 /* DWARF version number */
+ .long .Ldebug_abbrev0 /* Offset Into Abbrev. Section */
+ .byte 0x4 /* Pointer Size (in bytes) */
+ .uleb128 0x1 /* (DIE (0xb) DW_TAG_compile_unit) */
+ .ascii "GNU C 4.4.3\0" /* DW_AT_producer */
+ .byte 0x1 /* DW_AT_language */
+ .ascii "1.c\0" /* DW_AT_name */
+
+.Ltype_int:
+ .uleb128 0x7 /* DW_TAG_base_type */
+ .byte 0x4 /* DW_AT_byte_size */
+ .byte 0x5 /* DW_AT_encoding */
+ .ascii "int\0" /* DW_AT_name */
+
+.Ltype_struct:
+ .uleb128 0x2 /* DW_TAG_structure_type */
+ .ascii "s\0" /* DW_AT_name */
+ .byte 4 /* DW_AT_byte_size */
+
+ .uleb128 0x3 /* DW_TAG_member */
+ .ascii "f\0" /* DW_AT_name */
+ .4byte .Ltype_int - d /* DW_AT_type */
+ .byte 0 /* DW_AT_data_member_location */
+
+ .byte 0x0 /* end of children of DW_TAG_structure_type */
+
+ .uleb128 6 /* Abbrev: DW_TAG_subprogram */
+ .ascii "main\0" /* DW_AT_name */
+ .4byte main /* DW_AT_low_pc */
+ .4byte main + 0x100 /* DW_AT_high_pc */
+ .4byte .Ltype_int - d /* DW_AT_type */
+ .byte 1 /* DW_AT_external */
+
+.Ltype_structptr:
+ .uleb128 0x5 /* DW_TAG_pointer_type */
+ .byte 0x4 /* DW_AT_byte_size */
+ .long .Ltype_struct - d /* DW_AT_type */
+
+.Lvar_out:
+ .uleb128 0x4 /* (DW_TAG_variable) */
+ .ascii "v\0" /* DW_AT_name */
+ .byte 0 /* DW_AT_location: DW_FORM_block1 */
+ .4byte .Ltype_struct - d /* DW_AT_type */
+
+ .uleb128 0x4 /* (DW_TAG_variable) */
+ .ascii "p\0" /* DW_AT_name */
+ .byte 2f - 1f /* DW_AT_location: DW_FORM_block1 */
+1:
+ .byte 0xf2 /* DW_OP_GNU_implicit_pointer */
+ .4byte .Lvar_out - d /* referenced DIE */
+ .sleb128 0 /* offset */
+2:
+ .4byte .Ltype_structptr - d /* DW_AT_type */
+
+ .byte 0x0 /* end of children of main */
+
+ .byte 0x0 /* end of children of CU */
+debug_end:
+
+ .section .debug_abbrev
+.Ldebug_abbrev0:
+
+ .uleb128 0x1 /* (abbrev code) */
+ .uleb128 0x11 /* (TAG: DW_TAG_compile_unit) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x25 /* (DW_AT_producer) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x13 /* (DW_AT_language) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .byte 0x0
+ .byte 0x0
+
+ .uleb128 0x2 /* (abbrev code) */
+ .uleb128 0x13 /* (TAG: DW_TAG_structure_type) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0xb /* (DW_AT_byte_size) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0x3 /* (abbrev code) */
+ .uleb128 0xd /* (TAG: DW_TAG_member) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x38 /* (DW_AT_data_member_location) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0x4 /* (abbrev code) */
+ .uleb128 0x34 /* (TAG: DW_TAG_variable) */
+ .byte 0x0 /* DW_children_yes */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x02 /* (DW_AT_location) */
+ .uleb128 0xa /* (DW_FORM_block1) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .byte 0x0
+ .byte 0x0
+
+ .uleb128 0x5 /* (abbrev code) */
+ .uleb128 0xf /* (TAG: DW_TAG_pointer_type) */
+ .byte 0x0 /* DW_children_no */
+ .uleb128 0xb /* (DW_AT_byte_size) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .byte 0x0
+ .byte 0x0
+
+ .uleb128 6 /* Abbrev code */
+ .uleb128 0x2e /* DW_TAG_subprogram */
+ .byte 1 /* has_children */
+ .uleb128 0x3 /* DW_AT_name */
+ .uleb128 0x8 /* DW_FORM_string */
+ .uleb128 0x11 /* DW_AT_low_pc */
+ .uleb128 0x1 /* DW_FORM_addr */
+ .uleb128 0x12 /* DW_AT_high_pc */
+ .uleb128 0x1 /* DW_FORM_addr */
+ .uleb128 0x49 /* DW_AT_type */
+ .uleb128 0x13 /* DW_FORM_ref4 */
+ .uleb128 0x3f /* DW_AT_external */
+ .uleb128 0xc /* DW_FORM_flag */
+ .byte 0x0 /* Terminator */
+ .byte 0x0 /* Terminator */
+
+ .uleb128 0x7 /* (abbrev code) */
+ .uleb128 0x24 /* (TAG: DW_TAG_base_type) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0xb /* (DW_AT_byte_size) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3e /* (DW_AT_encoding) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .byte 0
+ .byte 0
+
+ .byte 0x0
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/implptr-optimized-out.exp
@@ -0,0 +1,37 @@
+# Copyright 2011 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 dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+ return 0
+}
+
+set testfile "implptr-optimized-out"
+set srcfile ${testfile}.S
+set mainfile main.c
+set executable ${testfile}
+set binfile ${objdir}/${subdir}/${executable}
+
+if [prepare_for_testing ${testfile}.exp $executable "${srcfile} ${mainfile}" {}] {
+ return -1
+}
+
+# DW_OP_GNU_implicit_pointer implementation requires a valid frame.
+if ![runto_main] {
+ return -1
+}
+
+gdb_test "p p->f" "value has been optimized out"