From patchwork Thu Jan 8 08:53:13 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre Muller X-Patchwork-Id: 4567 Received: (qmail 29932 invoked by alias); 8 Jan 2015 08:53:23 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 29914 invoked by uid 89); 8 Jan 2015 08:53:21 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.6 required=5.0 tests=AWL, BAYES_00, MSGID_MULTIPLE_AT autolearn=no version=3.3.2 X-HELO: mailhost.u-strasbg.fr Received: from mailhost.u-strasbg.fr (HELO mailhost.u-strasbg.fr) (130.79.222.211) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 08 Jan 2015 08:53:20 +0000 Received: from mailhost.u-strasbg.fr (localhost [127.0.0.1]) by antispam (Postfix) with ESMTP id 4F876221DD9 for ; Thu, 8 Jan 2015 09:53:17 +0100 (CET) Received: from mailhost.u-strasbg.fr (localhost [127.0.0.1]) by antivirus (Postfix) with ESMTP id 3F310221DDD for ; Thu, 8 Jan 2015 09:53:17 +0100 (CET) Received: from lmr.u-strasbg.fr (lmr4.u-strasbg.fr [172.30.21.4]) by mr1.u-strasbg.fr (Postfix) with ESMTP id 2E784221DD9 for ; Thu, 8 Jan 2015 09:53:16 +0100 (CET) Received: from lmr.u-strasbg.fr (localhost [127.0.0.1]) by antivirus (Postfix) with ESMTP id 077EB9A for ; Thu, 8 Jan 2015 09:53:16 +0100 (CET) Received: from E6510Muller (lec67-4-82-230-53-140.fbx.proxad.net [82.230.53.140]) (Authenticated sender: mullerp) by lmr4.u-strasbg.fr (Postfix) with ESMTPSA id B820DC7 for ; Thu, 8 Jan 2015 09:53:14 +0100 (CET) From: "Pierre Muller" To: "'gdb-patches'" Subject: [RFA] Fix pascal behavior for class fields Date: Thu, 8 Jan 2015 09:53:13 +0100 Message-ID: <004201d02b20$8a243180$9e6c9480$@muller@ics-cnrs.unistra.fr> MIME-Version: 1.0 This is the problem that triggered my previous RFA, as I discovered it while debugging this problem. In the pascal parser, there is special code that will try to emulate case-insensivity despite the fact that pascal is not registered as a 'case-insensitive' language. This code does not work as expected for fields of a class, for which exact casing is currently required. See: https://sourceware.org/bugzilla/show_bug.cgi?id=17815 for source code: # Compile attached source code, using Free Pascal compiler fpc -gs -Mobjfpc test-class-pascal.pas # Debug it gdb ./test-class-pascal ....... (gdb) b TA__CHECK Breakpoint 1 at 0x40154c: file test-class-pascal.pas, line 23. (gdb) r Starting program: E:\pas\test\test-class-pascal.exe [New Thread 6700.0x1ae0] Breakpoint 1, TA__CHECK (B=0x1572ee0, this=) at test-class-pascal.pas:23 23 check:=(x < b.x); (gdb) p this $1 = (TA) 0x1572ed0 (gdb) p this^ warning: can't find linker symbol for virtual table for `TA' value $2 = { = {_vptr$ = {0x408014, 0x43}}, X = 67, Y = 33} (gdb) p X warning: can't find linker symbol for virtual table for `TA' value $3 = 67 (gdb) p B.X warning: can't find linker symbol for virtual table for `TA' value $4 = -1 (gdb) p b.x warning: can't find linker symbol for virtual table for `TA' value $5 = -1 (gdb) p x Type TA has no component named x. (gdb) The patch below fixes this odd behavior, if there is no approval nor comments about it, I will commit it in a few days (before 7.9 branching) as pascal language maintainer. But, of course, don't hesitate to give feedback! Pierre Muller 2015-01-07 Pierre Muller PR pascal/17815 * p-exp.y (yylex): Remember the case pattern that allowed finding a field of this. diff --git a/gdb/p-exp.y b/gdb/p-exp.y index a1c78bf..3a4905a 100644 --- a/gdb/p-exp.y +++ b/gdb/p-exp.y @@ -1598,7 +1598,7 @@ yylex (void) VAR_DOMAIN, &is_a_field_of_this); } - if (is_a_field) + if (is_a_field || (is_a_field_of_this.type != NULL)) { tempbuf = (char *) realloc (tempbuf, namelen + 1); strncpy (tempbuf, tmp, namelen); @@ -1606,7 +1606,11 @@ yylex (void) yylval.sval.ptr = tempbuf; yylval.sval.length = namelen; free (uptokstart); - return FIELDNAME; + yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL; + if (is_a_field) + return FIELDNAME; + else + return NAME; } /* Call lookup_symtab, not lookup_partial_symtab, in case there are no psymtabs (coff, xcoff, or some future change to blow away the @@ -1739,7 +1743,6 @@ yylex (void) free(uptokstart); /* Any other kind of symbol. */ yylval.ssym.sym = sym; - yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL; return NAME; } }