From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28005 invoked by alias); 3 Jan 2008 15:45:39 -0000 Received: (qmail 27975 invoked by uid 22791); 3 Jan 2008 15:45:37 -0000 X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 03 Jan 2008 15:40:03 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 8874D2A9672 for ; Thu, 3 Jan 2008 10:40:00 -0500 (EST) 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 devqcQ2sZPdn for ; Thu, 3 Jan 2008 10:40:00 -0500 (EST) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id A90B02A9663 for ; Thu, 3 Jan 2008 10:39:59 -0500 (EST) Received: by joel.gnat.com (Postfix, from userid 1000) id 55450E7ACB; Thu, 3 Jan 2008 07:39:52 -0800 (PST) Date: Thu, 03 Jan 2008 15:45:00 -0000 From: Joel Brobecker To: gdb-patches@sourceware.org Subject: [RFA/DWARF] Set TYPE_FLAG_STUB for enum DIEs that are declarations only Message-ID: <20080103153952.GC582@adacore.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.2i Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-01/txt/msg00037.txt.bz2 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 * 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 * 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