From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9227 invoked by alias); 17 Oct 2013 18:18:53 -0000 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 Received: (qmail 9218 invoked by uid 89); 17 Oct 2013 18:18:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.8 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 17 Oct 2013 18:18:51 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r9HIInHa028286 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 17 Oct 2013 14:18:50 -0400 Received: from valrhona.uglyboxes.com (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r9HIImDU027093 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 17 Oct 2013 14:18:49 -0400 Message-ID: <52602A08.4020705@redhat.com> Date: Thu, 17 Oct 2013 18:18:00 -0000 From: Keith Seitz User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130625 Thunderbird/17.0.7 MIME-Version: 1.0 To: "gdb-patches@sourceware.org ml" CC: Sergio Durigan Junior , Jan Kratochvil Subject: Re: Regression for gdb.pascal/* [Re: [RFA 4/4] Constify parse_linesepc] References: <5249C987.50809@redhat.com> <87d2no4uim.fsf@fleche.redhat.com> <524BA344.2070802@redhat.com> <20131016095743.GA17072@host2.jankratochvil.net> In-Reply-To: Content-Type: multipart/mixed; boundary="------------030005080908090309010305" X-IsSubscribed: yes X-SW-Source: 2013-10/txt/msg00530.txt.bz2 This is a multi-part message in MIME format. --------------030005080908090309010305 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 2367 On 10/16/2013 04:40 PM, Sergio Durigan Junior wrote: > I had a brief chat with Keith, who updated me on this. According to > him, there are many more places that need to be updated. He's already > talking to Pierre about this, so probably my patch is not > complete/correct. Thus, feel free to drop it if it is the case. Yeah, my apologies. I *thought* I had a pascal compiler installed, but I didn't. [Maybe I was thinking of Fortran?] In any case, my previous patch to pascal_lex does some really nasty things, like assigning to lexptr/stoken from an alloca'd block. Boo! This patch fixes the regressions by doing what I should have done the first time around: it changes pascal_lex to really take const input. There are two little sections of code, though, which violate const-ness of the input, and I've removed those, since they don't seem necessary. [This is the two loops that deal with changing the case of `tokstart' -- which can easily be removed because we already have a temporary buffer that is used for this.] I could not think of any reasons why pascal_lex would need to change the input. The only thing that came to mind was completion, and the behavior for that is, as far as I can tell, identical to how 7.0, 7.3, 7.4, 7.5, and 7.6 behave. [both case-sensitive 'on' and 'off'] [Perhaps Pierre knows? It was added here: commit 458d424149528912ee72f6b9b9a2afd578a17715 Author: Pierre Muller Date: Fri Nov 9 09:46:40 2001 +0000 2001-11-06 Pierre Muller * p-exp.y (yylex): Only change case of expression if symbol is found. Also check for GPC standard name form. ] In any case, IMO parsers should not be changing their input. If this turns out to be necessary, we should extend the API to support it. Comments? Keith ChangeLog 2013-10-17 Keith Seitz * p-exp.y (uptok): Make first parameter const. (yylex): Make `tokstart' and `tokptr' const. Don't copy the lexer input to a temporary buffer. Make `p' const. Remove const workaround ofr parse_escape. Create a temporary buffer for a convenience variable instead of doing in-place modification of the input. If a match is found with a different case from the input, do not change the input at all. Use `tmp' to construct the resultant stoken instead of `tokstart'. --------------030005080908090309010305 Content-Type: text/x-patch; name="p-exp_y-regressions.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="p-exp_y-regressions.patch" Content-length: 3864 diff --git a/gdb/p-exp.y b/gdb/p-exp.y index de14cbb..8cb98c0 100644 --- a/gdb/p-exp.y +++ b/gdb/p-exp.y @@ -125,7 +125,7 @@ static int yylex (void); void yyerror (char *); -static char * uptok (char *, int); +static char *uptok (const char *, int); %} /* Although the yacc "value" of an expression is not used, @@ -1105,7 +1105,7 @@ static const struct token tokentab2[] = /* Allocate uppercased var: */ /* make an uppercased copy of tokstart. */ static char * -uptok (char *tokstart, int namelen) +uptok (const char *tokstart, int namelen) { int i; char *uptokstart = (char *)malloc(namelen+1); @@ -1133,9 +1133,9 @@ yylex (void) int c; int namelen; unsigned int i; - char *tokstart; + const char *tokstart; char *uptokstart; - char *tokptr; + const char *tokptr; int explen, tempbufindex; static char *tempbuf; static int tempbufsize; @@ -1146,9 +1146,8 @@ yylex (void) prev_lexptr = lexptr; + tokstart = lexptr; explen = strlen (lexptr); - tokstart = alloca (explen + 1); - memcpy (tokstart, lexptr, explen + 1); /* See if it is a special token of length 3. */ if (explen > 2) @@ -1264,7 +1263,7 @@ yylex (void) { /* It's a number. */ int got_dot = 0, got_e = 0, toktype; - char *p = tokstart; + const char *p = tokstart; int hex = input_radix > 10; if (c == '0' && (p[1] == 'x' || p[1] == 'X')) @@ -1369,11 +1368,8 @@ yylex (void) break; case '\\': { - const char *s, *o; - - o = s = ++tokptr; - c = parse_escape (parse_gdbarch, &s); - *tokptr += s - o; + ++tokptr; + c = parse_escape (parse_gdbarch, &tokptr); if (c == -1) { continue; @@ -1511,17 +1507,17 @@ yylex (void) if (*tokstart == '$') { - char c; + char *tmp; + /* $ is the normal prefix for pascal hexadecimal values but this conflicts with the GDB use for debugger variables so in expression to enter hexadecimal values we still need to use C syntax with 0xff */ write_dollar_variable (yylval.sval); - c = tokstart[namelen]; - tokstart[namelen] = 0; - intvar = lookup_only_internalvar (++tokstart); - --tokstart; - tokstart[namelen] = c; + tmp = alloca (namelen + 1); + memcpy (tmp, tokstart, namelen); + tmp[namelen] = '\0'; + intvar = lookup_only_internalvar (tmp + 1); free (uptokstart); return VARIABLE; } @@ -1561,12 +1557,6 @@ yylex (void) else sym = lookup_symbol (tmp, expression_context_block, VAR_DOMAIN, &is_a_field_of_this); - if (sym || is_a_field_of_this.type != NULL || is_a_field) - for (i = 0; i <= namelen; i++) - { - if ((tokstart[i] >= 'a' && tokstart[i] <= 'z')) - tokstart[i] -= ('a'-'A'); - } } /* Third chance Capitalized (as GPC does). */ if (!sym && is_a_field_of_this.type == NULL && !is_a_field) @@ -1589,24 +1579,13 @@ yylex (void) else sym = lookup_symbol (tmp, expression_context_block, VAR_DOMAIN, &is_a_field_of_this); - if (sym || is_a_field_of_this.type != NULL || is_a_field) - for (i = 0; i <= namelen; i++) - { - if (i == 0) - { - if ((tokstart[i] >= 'a' && tokstart[i] <= 'z')) - tokstart[i] -= ('a'-'A'); - } - else - if ((tokstart[i] >= 'A' && tokstart[i] <= 'Z')) - tokstart[i] -= ('A'-'a'); - } } if (is_a_field) { tempbuf = (char *) realloc (tempbuf, namelen + 1); - strncpy (tempbuf, tokstart, namelen); tempbuf [namelen] = 0; + strncpy (tempbuf, tmp, namelen); + tempbuf [namelen] = 0; yylval.sval.ptr = tempbuf; yylval.sval.length = namelen; free (uptokstart); --------------030005080908090309010305--