From: Joel Brobecker <brobecker@adacore.com>
To: gdb-patches@sourceware.org
Subject: [RFA/DWARF] Set TYPE_FLAG_STUB for enum DIEs that are declarations only
Date: Thu, 03 Jan 2008 15:46:00 -0000 [thread overview]
Message-ID: <20080103154055.GD582@adacore.com> (raw)
In-Reply-To: <20080103153952.GC582@adacore.com>
[-- Attachment #1: Type: text/plain, Size: 2005 bytes --]
[resending with the patch, sorry...]
Long explaination but small patch :-).
For those who are not familiar with Ada, the declaration of types
whose implementation must be opaque is done as follow:
type My_Opaque type is private;
And then the language expects that you provide the definition
of that type in the private section of your package spec, like so:
private
type My_Opaque is (One, Two, Three);
But there has been a small amendment to that which allows a developer
to provide the actual definition not in the spec, but in the body.
This is an approach that is not used very often, but still legitimate.
These types are called "Taft Amendment Types" (TAT) because they were
introduced by Tucker Taft, I believe.
Unfortunately, we found out that this can cause trouble in the debugger.
When compiling a unit that uses a TAT, the compiler does not look
inside the package body, but only in the package spec. So it knows that
we have an object of that type, but it doesn't know what that type is.
As a result, it generates a bogus "stub" enumeration type and sets
its AT_declaration attribute. The debugger missed that part, and so
we ended up thinking that our object was a degenerated enum type,
and printed its value accordingly:
(gdb) p w.e.all
$1 = 0
The expected output is:
(gdb) p w.e.all
$1 = (month => 8, year => 1974)
The fix is to flag the type as a TYPE_FLAG_STUB, so that we will
know to lookup the complete definition.
2008-01-03 Joel Brobecker <brobecker@adacore.com>
* dwarf2read.c (read_enumeration_type): Flag type as stub if
the given die is a declaration.
I also wrote a small testcase that reproduces the issue:
2008-01-03 Joel Brobecker <brobecker@adacore.com>
* gdb.ada/taft_type/pck.ads, gdb.ada/taft_type/pck.adb,
gdb.ada/taft_type/p.adb: New files.
* gdb.ada/taft_type.exp: New testcase.
Tested on x86-linux. No regression.
OK to apply?
Thanks,
--
Joel
[-- Attachment #2: taft.diff --]
[-- Type: text/plain, Size: 372 bytes --]
Index: dwarf2read.c
===================================================================
--- dwarf2read.c (revision 59)
+++ dwarf2read.c (revision 60)
@@ -4237,6 +4237,9 @@ read_enumeration_type (struct die_info *
TYPE_LENGTH (type) = 0;
}
+ if (die_is_declaration (die, cu))
+ TYPE_FLAGS (type) |= TYPE_FLAG_STUB;
+
set_die_type (die, type, cu);
}
[-- Attachment #3: taft-tc.diff --]
[-- Type: text/plain, Size: 4959 bytes --]
Index: gdb.ada/taft_type.exp
===================================================================
--- gdb.ada/taft_type.exp (revision 0)
+++ gdb.ada/taft_type.exp (revision 61)
@@ -0,0 +1,46 @@
+# Copyright 2008 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/>.
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+load_lib "ada.exp"
+
+set testdir "taft_type"
+set testfile "${testdir}/p"
+set srcfile ${srcdir}/${subdir}/${testfile}.adb
+set binfile ${objdir}/${subdir}/${testfile}
+
+file mkdir ${objdir}/${subdir}/${testdir}
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } {
+ return -1
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+set bp_location [gdb_get_line_number "START" ${testdir}/p.adb]
+if ![runto "p.adb:$bp_location" ] then {
+ perror "Couldn't run ${testfile}"
+ return
+}
+
+gdb_test "print w.e.all" \
+ "\\(month => 8, year => 1974\\)" \
+ "print w.e.all"
+
Index: gdb.ada/taft_type/pck.adb
===================================================================
--- gdb.ada/taft_type/pck.adb (revision 0)
+++ gdb.ada/taft_type/pck.adb (revision 61)
@@ -0,0 +1,29 @@
+-- Copyright 2008 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/>.
+
+
+package body Pck is
+
+ type Empty is record
+ Month : Integer;
+ Year : Integer;
+ end record;
+
+ function Create return Wrap is
+ begin
+ return (E => new Empty'(Month => 8, Year => 1974));
+ end Create;
+
+end Pck;
Index: gdb.ada/taft_type/pck.ads
===================================================================
--- gdb.ada/taft_type/pck.ads (revision 0)
+++ gdb.ada/taft_type/pck.ads (revision 61)
@@ -0,0 +1,31 @@
+-- Copyright 2008 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/>.
+
+package Pck is
+
+ type Wrap is private;
+
+ function Create return Wrap;
+
+private
+
+ type Empty;
+ type Empty_Access is access Empty;
+
+ type Wrap is record
+ E : Empty_Access;
+ end record;
+
+end Pck;
Index: gdb.ada/taft_type/p.adb
===================================================================
--- gdb.ada/taft_type/p.adb (revision 0)
+++ gdb.ada/taft_type/p.adb (revision 61)
@@ -0,0 +1,23 @@
+-- Copyright 2008 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/>.
+
+with Pck; use Pck;
+
+procedure P is
+ W : Wrap;
+begin
+ W := Create;
+end P; -- START
+
next prev parent reply other threads:[~2008-01-03 15:46 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-03 15:45 Joel Brobecker
2008-01-03 15:46 ` Joel Brobecker [this message]
2008-01-03 16:02 ` Daniel Jacobowitz
2008-01-03 17:38 ` Joel Brobecker
2008-01-05 12:33 ` Eli Zaretskii
2008-01-05 15:05 ` Joel Brobecker
2008-01-05 15:17 ` Eli Zaretskii
2008-01-05 15:37 ` Joel Brobecker
2008-01-08 5:57 ` Joel Brobecker
2008-01-08 20:25 ` Eli Zaretskii
2008-01-09 4:31 ` Joel Brobecker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080103154055.GD582@adacore.com \
--to=brobecker@adacore.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox