From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14800 invoked by alias); 24 May 2012 22:13:09 -0000 Received: (qmail 14783 invoked by uid 22791); 24 May 2012 22:13:07 -0000 X-SWARE-Spam-Status: No, hits=-6.2 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,SPF_HELO_PASS,TW_GD,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 24 May 2012 22:12:49 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q4OMCR7p027602 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 24 May 2012 18:12:27 -0400 Received: from host2.jankratochvil.net (ovpn-116-78.ams2.redhat.com [10.36.116.78]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q4OMCJbl019241 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 24 May 2012 18:12:22 -0400 Date: Thu, 24 May 2012 22:13:00 -0000 From: Jan Kratochvil To: John Steele Scott Cc: Tom Tromey , gdb-patches@sourceware.org, Joel Brobecker Subject: [commit] [patch] PR symtab/13277: Resolving opaque structures in ICC generated binaries. Message-ID: <20120524221219.GB516@host2.jankratochvil.net> References: <4EBFB451.8030503@toojays.net> <4FA4912E.9050709@toojays.net> <20120512183722.GA20606@host2.jankratochvil.net> <4FB10DD8.7040501@toojays.net> <20120518144642.GA19690@host2.jankratochvil.net> <4FB8E4BD.6000501@toojays.net> <20120520130919.GA6990@host2.jankratochvil.net> <20120520131719.GB7416@host2.jankratochvil.net> <87ipfmxyro.fsf@quantum.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87ipfmxyro.fsf@quantum.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes 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: 2012-05/txt/msg00950.txt.bz2 On Thu, 24 May 2012 01:28:59 +0200, John Steele Scott wrote: > Two tests in gdb.base/type-opaque effectively changed polarity: previously > "opaque {struct,union} type resolving" failed, now those pass and "empty > {struct,union} type resolving" fail. As previously discussed, this is the > lesser of the two evils as far as I'm concerned. This is a bug of ICC, GDB cannot do anything with it. To be absolutely correct the testfile should check the output is generated by ICC and XFAIL (X = that it depends on environment = compiler) such testcase. Personally I care only about XFAILs/KFAILs for GCC. main.c - where GDB searches from: struct struct_libtype_empty {}; lib.c: struct struct_libtype_empty { int libfield_empty; }; ptype pointer_struct_empty type = volatile struct struct_libtype_empty { - + int libfield_empty; } * -(gdb) PASS: gdb.base/type-opaque.exp: empty struct type resolving +(gdb) FAIL: gdb.base/type-opaque.exp: empty struct type resolving > The patch at http://sourceware.org/ml/gdb-patches/2012-05/msg00739.html is > still required to fix my non-trivial case, I hope that (or something like it) > can be committed soon. Going to commit it now. > +static int > +producer_is_gxx_lt_4_6 (struct dwarf2_cu *cu) > +{ > + if (!cu->checked_producer) > + check_producer(cu); Missing space: check_producer (cu); > + > + return cu->producer_is_gxx_lt_4_6; > } [...] > +static int > +producer_is_icc (struct dwarf2_cu *cu) > +{ > + if (!cu->checked_producer) > + check_producer(cu); Missing space: check_producer (cu); > + > + return cu->producer_is_icc; > +} Checked in. Thanks, Jan http://sourceware.org/ml/gdb-cvs/2012-05/msg00186.html - the code part: --- src/gdb/ChangeLog 2012/05/24 17:03:20 1.14292 +++ src/gdb/ChangeLog 2012/05/24 22:09:18 1.14293 @@ -1,3 +1,14 @@ +2012-05-24 John Steele Scott + + PR symtab/13277: Resolving opaque structures in ICC generated binaries. + * dwarf2read.c (struct dwarf2_cu) : New field. + (producer_is_gxx_lt_4_6): Move the checking and caching to... + (check_producer): ... this new function, which also checks for ICC + and caches the result. + (producer_is_icc): New function. + (read_structure_type): Don't set TYPE_STUB_SUPPORTED if the + producer was ICC. + 2012-05-24 Pedro Alves PR gdb/7205 --- src/gdb/dwarf2read.c 2012/05/22 18:45:22 1.655 +++ src/gdb/dwarf2read.c 2012/05/24 22:09:20 1.656 @@ -429,12 +429,13 @@ unoptimized code. For a future better test see GCC PR other/32998. */ unsigned int has_loclist : 1; - /* These cache the results of producer_is_gxx_lt_4_6. - CHECKED_PRODUCER is set if PRODUCER_IS_GXX_LT_4_6 is valid. This - information is cached because profiling CU expansion showed - excessive time spent in producer_is_gxx_lt_4_6. */ + /* These cache the results for producer_is_gxx_lt_4_6 and producer_is_icc. + CHECKED_PRODUCER is set if both PRODUCER_IS_GXX_LT_4_6 and PRODUCER_IS_ICC + are valid. This information is cached because profiling CU expansion + showed excessive time spent in producer_is_gxx_lt_4_6. */ unsigned int checked_producer : 1; unsigned int producer_is_gxx_lt_4_6 : 1; + unsigned int producer_is_icc : 1; /* Non-zero if DW_AT_addr_base was found. Used when processing DWO files. */ @@ -8271,16 +8272,14 @@ } } -/* Check for GCC PR debug/45124 fix which is not present in any G++ version up - to 4.5.any while it is present already in G++ 4.6.0 - the PR has been fixed - during 4.6.0 experimental. */ +/* Check whether the producer field indicates either of GCC < 4.6, or the + Intel C/C++ compiler, and cache the result in CU. */ -static int -producer_is_gxx_lt_4_6 (struct dwarf2_cu *cu) +static void +check_producer (struct dwarf2_cu *cu) { const char *cs; int major, minor, release; - int result = 0; if (cu->producer == NULL) { @@ -8292,22 +8291,11 @@ for their space efficiency GDB cannot workaround gcc-4.5.x -gdwarf-4 combination. gcc-4.5.x -gdwarf-4 binaries have DW_AT_accessibility interpreted incorrectly by GDB now - GCC PR debug/48229. */ - - return 0; - } - - if (cu->checked_producer) - return cu->producer_is_gxx_lt_4_6; - - /* Skip any identifier after "GNU " - such as "C++" or "Java". */ - - if (strncmp (cu->producer, "GNU ", strlen ("GNU ")) != 0) - { - /* For non-GCC compilers expect their behavior is DWARF version - compliant. */ } - else + else if (strncmp (cu->producer, "GNU ", strlen ("GNU ")) == 0) { + /* Skip any identifier after "GNU " - such as "C++" or "Java". */ + cs = &cu->producer[strlen ("GNU ")]; while (*cs && !isdigit (*cs)) cs++; @@ -8316,13 +8304,30 @@ /* Not recognized as GCC. */ } else - result = major < 4 || (major == 4 && minor < 6); + cu->producer_is_gxx_lt_4_6 = major < 4 || (major == 4 && minor < 6); + } + else if (strncmp (cu->producer, "Intel(R) C", strlen ("Intel(R) C")) == 0) + cu->producer_is_icc = 1; + else + { + /* For other non-GCC compilers, expect their behavior is DWARF version + compliant. */ } cu->checked_producer = 1; - cu->producer_is_gxx_lt_4_6 = result; +} - return result; +/* Check for GCC PR debug/45124 fix which is not present in any G++ version up + to 4.5.any while it is present already in G++ 4.6.0 - the PR has been fixed + during 4.6.0 experimental. */ + +static int +producer_is_gxx_lt_4_6 (struct dwarf2_cu *cu) +{ + if (!cu->checked_producer) + check_producer (cu); + + return cu->producer_is_gxx_lt_4_6; } /* Return the default accessibility type if it is not overriden by @@ -9005,6 +9010,18 @@ smash_to_methodptr_type (type, new_type); } +/* Return non-zero if the CU's PRODUCER string matches the Intel C/C++ compiler + (icc). */ + +static int +producer_is_icc (struct dwarf2_cu *cu) +{ + if (!cu->checked_producer) + check_producer (cu); + + return cu->producer_is_icc; +} + /* Called when we find the DIE that starts a structure or union scope (definition) to create a type for the structure or union. Fill in the type's name and general properties; the members will not be @@ -9107,7 +9124,14 @@ TYPE_LENGTH (type) = 0; } - TYPE_STUB_SUPPORTED (type) = 1; + if (producer_is_icc (cu)) + { + /* ICC does not output the required DW_AT_declaration + on incomplete types, but gives them a size of zero. */ + } + else + TYPE_STUB_SUPPORTED (type) = 1; + if (die_is_declaration (die, cu)) TYPE_STUB (type) = 1; else if (attr == NULL && die->child == NULL