public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [RFA 1/4] Constify LEXPTR
@ 2013-09-30 18:56 Keith Seitz
  2013-10-01  4:06 ` Sergio Durigan Junior
  0 siblings, 1 reply; 5+ messages in thread
From: Keith Seitz @ 2013-09-30 18:56 UTC (permalink / raw)
  To: gdb-patches@sourceware.org ml

[-- Attachment #1: Type: text/plain, Size: 3249 bytes --]

Hi,

I am submitting four patches which aim to constify 
parser-defs.h/parse.c's LEXPTR.

This patch is broken into four relatively simple patches, each building 
on the previous patch, typically eliminating a temporary cast to/from 
const. By the end, all of these temporary casts will be eliminated. [I'm 
using the solely as a way to make this more digestible.]

Sadly, this first patch is still relatively large. It makes lexptr 
const, and adds temporary casts when dealing with struct stoken.ptr. 
This will be the subject of the next patch.

I know maintainers have little choice, but even so, I would appreciate 
an additional pair of eyes on this for newb mistakes. This stuff can get 
a little mindless after a while.

Tested, regression-free, on x86_64-linux (Fedora 18) native and gdbserver.

Keith

ChangeLog
2013-09-24  Keith Seitz  <keiths@redhat.com>

	* c-exp.y (parse_number): Make first argument const.
	Make a copy of the input to manipulate.
	(c_parse_escape): Make first argument const.
	Make local variable 'tokptr' const.
	(parse_string_or_char): Make first two arguments const.
	(macro_original_text): Make const.
	(lex_one_token): Make local variable 'tokstart' const.
	Likewise for local variables named 'p'.
	Cast away const for struct stoken (temporary).
	* c-lang.h (c_parse_escpae): Make first argument const.
	* cli/cli-cmds.c (echo_command): Make local variable 'p'
	const.
	* cli/cli-setshow.c (do_set_command): Likewise for 'p' in
	var_string case.
	* f-exp.y (parse_number): Make first argument const.
	(match_string_literal): Make local variable 'tokstart'
	const.
	(yylex): Make local variable 'p' const.
	Cast away const for struct stoken (temporary).
	* go-exp.y (parse_number): Make first argument const.
	(parse_string_or_char): Likewise.
	Make local variable 'tokstart' const.
	(lex_one_token): Likewise for numerous locals called 'p'.
	Cast away const for struct stoken (temporary).
	* jv-exp.y (parse_number): Make first argument const.
	Make local variables 'tokstart' and 'tokptr' const.
	Cast away const for call to skip_quoted (temporary).
	(yylex): Make local variable 'p' const.
	Cast away const for struct stoken (temporary).
	* m2-exp.y (parse_number): Make local variable 'p' const.
	(yylex): Likewise for 'tokstart'.
	Cast away const for struct stoken (temporary).
	Make local variable 'p' const.
	* macroexp.c (get_character_constant): Pass a const string
	to c_parse_escape.
	(get_string_literal): Likewise.
	(macro_expand_next): Make first argument const.
	Cast away const for init_shared_buffer.
	* macroexp.h (macro_expand_next): Make first argument const.
	* p-exp.y (yylex): Make a local copy of 'lexptr'.
	Pass a const string to c_parse_escape.
	Make local variables 'p' and 'namestart' const.
	* parse.c (lexptr): Make const.
	(prev_lexptr): Likewise.
	(find_template_name_end): Return const.
	Make argument const, too.
	(parse_exp_in_context): Make first argument const.
	Remove the entire const_hack.
	(parse_exp_in_context_1): Make first argument const.
	* parser-defs.h (find_template_name_end): Return const.
	Make argument const, too.
	(lexptr): Make const.
	(prev_lexptr): Likewise.
	* utils.c (parse_escape): Make second argument const.
	* utils.h (parse_escape): Likewise.




[-- Attachment #2: constify-lexptr.patch --]
[-- Type: text/x-patch, Size: 19065 bytes --]

diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index 3a51878..ea19178 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -164,7 +164,7 @@ void yyerror (char *);
 
 %{
 /* YYSTYPE gets defined by %union */
-static int parse_number (char *, int, int, YYSTYPE *);
+static int parse_number (const char *, int, int, YYSTYPE *);
 static struct stoken operator_stoken (const char *);
 static void check_parameter_typelist (VEC (type_ptr) *);
 static void write_destructor_name (struct stoken);
@@ -1699,7 +1699,7 @@ check_parameter_typelist (VEC (type_ptr) *params)
 /*** Needs some error checking for the float case ***/
 
 static int
-parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
+parse_number (const char *buf, int len, int parsed_float, YYSTYPE *putithere)
 {
   /* FIXME: Shouldn't these be unsigned?  We don't deal with negative values
      here, and we do kind of silly things like cast to unsigned.  */
@@ -1722,6 +1722,9 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
   struct type *signed_type;
   struct type *unsigned_type;
 
+  char *p = alloca (len);
+  memcpy (p, buf, len);
+
   if (parsed_float)
     {
       /* If it ends at "df", "dd" or "dl", take it as type of decimal floating
@@ -1941,9 +1944,9 @@ static int tempbuf_init;
    character was emitted, 0 otherwise.  */
 
 int
-c_parse_escape (char **ptr, struct obstack *output)
+c_parse_escape (const char **ptr, struct obstack *output)
 {
-  char *tokptr = *ptr;
+  const char *tokptr = *ptr;
   int result = 1;
 
   /* Some escape sequences undergo character set conversion.  Those we
@@ -2102,8 +2105,8 @@ c_parse_escape (char **ptr, struct obstack *output)
    CHAR, depending on what was parsed.  *HOST_CHARS is set to the
    number of host characters in the literal.  */
 static int
-parse_string_or_char (char *tokptr, char **outptr, struct typed_stoken *value,
-		      int *host_chars)
+parse_string_or_char (const char *tokptr, const char **outptr,
+		      struct typed_stoken *value, int *host_chars)
 {
   int quote;
   enum c_string_type type;
@@ -2321,7 +2324,7 @@ static const struct token ident_tokens[] =
    we evaluate ADDRESS in the scope of the current frame, but we
    evaluate CONDITION in the scope of the breakpoint's location.  So
    it's simply wrong to try to macro-expand the whole thing at once.  */
-static char *macro_original_text;
+static const char *macro_original_text;
 
 /* We save all intermediate macro expansions on this obstack for the
    duration of a single parse.  The expansion text may sometimes have
@@ -2411,7 +2414,7 @@ lex_one_token (void)
   int c;
   int namelen;
   unsigned int i;
-  char *tokstart;
+  const char *tokstart;
   int saw_structop = last_was_structop;
   char *copy;
 
@@ -2538,7 +2541,7 @@ lex_one_token (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'))
@@ -2590,7 +2593,7 @@ lex_one_token (void)
 
     case '@':
       {
-	char *p = &tokstart[1];
+	const char *p = &tokstart[1];
 	size_t len = strlen ("entry");
 
 	if (parse_language->la_language == language_objc)
@@ -2692,7 +2695,8 @@ lex_one_token (void)
 		 characters; for comparison expressions, e.g. "a < b > c",
 		 there must be spaces before the '<', etc. */
                
-	      char * p = find_template_name_end (tokstart + namelen);
+	      const char *p = find_template_name_end (tokstart + namelen);
+
 	      if (p)
 		namelen = p - tokstart;
 	    }
@@ -2723,7 +2727,7 @@ lex_one_token (void)
       && (tokstart[namelen] == ' ' || tokstart[namelen] == '\t')
       && ! scanning_macro_expansion ())
     {
-      char *p = tokstart + namelen + 1;
+      const char *p = tokstart + namelen + 1;
       while (*p == ' ' || *p == '\t')
 	p++;
       if (*p >= '0' && *p <= '9')
@@ -2734,7 +2738,7 @@ lex_one_token (void)
 
   tryname:
 
-  yylval.sval.ptr = tokstart;
+  yylval.sval.ptr = (char *) tokstart;
   yylval.sval.length = namelen;
 
   /* Catch specific keywords.  */
diff --git a/gdb/c-lang.h b/gdb/c-lang.h
index 6bf6591..9f8f50d 100644
--- a/gdb/c-lang.h
+++ b/gdb/c-lang.h
@@ -61,7 +61,7 @@ extern int c_parse (void);
 
 extern void c_error (char *);
 
-extern int c_parse_escape (char **, struct obstack *);
+extern int c_parse_escape (const char **, struct obstack *);
 
 /* Defined in c-typeprint.c */
 extern void c_print_type (struct type *, const char *,
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index 4317ea3..886ba7a 100644
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -666,7 +666,7 @@ source_command (char *args, int from_tty)
 static void
 echo_command (char *text, int from_tty)
 {
-  char *p = text;
+  const char *p = text;
   int c;
 
   if (text)
diff --git a/gdb/cli/cli-setshow.c b/gdb/cli/cli-setshow.c
index 3e41fd4..45df6f6 100644
--- a/gdb/cli/cli-setshow.c
+++ b/gdb/cli/cli-setshow.c
@@ -160,7 +160,7 @@ do_set_command (char *arg, int from_tty, struct cmd_list_element *c)
     case var_string:
       {
 	char *new;
-	char *p;
+	const char *p;
 	char *q;
 	int ch;
 
diff --git a/gdb/f-exp.y b/gdb/f-exp.y
index 296a7fe..9a82230 100644
--- a/gdb/f-exp.y
+++ b/gdb/f-exp.y
@@ -157,7 +157,7 @@ static int match_string_literal (void);
 
 %{
 /* YYSTYPE gets defined by %union */
-static int parse_number (char *, int, int, YYSTYPE *);
+static int parse_number (const char *, int, int, YYSTYPE *);
 %}
 
 %type <voidval> exp  type_exp start variable 
@@ -669,7 +669,7 @@ name_not_typename :	NAME
 /*** Needs some error checking for the float case ***/
 
 static int
-parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
+parse_number (const char *p, int len, int parsed_float, YYSTYPE *putithere)
 {
   LONGEST n = 0;
   LONGEST prevn = 0;
@@ -920,7 +920,7 @@ growbuf_by_size (int count)
 static int
 match_string_literal (void)
 {
-  char *tokptr = lexptr;
+  const char *tokptr = lexptr;
 
   for (tempbufindex = 0, tokptr++; *tokptr != '\0'; tokptr++)
     {
@@ -955,7 +955,7 @@ yylex (void)
   int c;
   int namelen;
   unsigned int i,token;
-  char *tokstart;
+  const char *tokstart;
   
  retry:
  
@@ -1054,7 +1054,7 @@ yylex (void)
       {
         /* It's a number.  */
 	int got_dot = 0, got_e = 0, got_d = 0, toktype;
-	char *p = tokstart;
+	const char *p = tokstart;
 	int hex = input_radix > 10;
 	
 	if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
@@ -1159,7 +1159,7 @@ yylex (void)
 	return f77_keywords[i].token;
       }
   
-  yylval.sval.ptr = tokstart;
+  yylval.sval.ptr = (char *) tokstart;
   yylval.sval.length = namelen;
   
   if (*tokstart == '$')
diff --git a/gdb/go-exp.y b/gdb/go-exp.y
index 2ccb394..166d380 100644
--- a/gdb/go-exp.y
+++ b/gdb/go-exp.y
@@ -158,7 +158,7 @@ void yyerror (char *);
 
 %{
 /* YYSTYPE gets defined by %union.  */
-static int parse_number (char *, int, int, YYSTYPE *);
+static int parse_number (const char *, int, int, YYSTYPE *);
 static int parse_go_float (struct gdbarch *gdbarch, const char *p, int len,
 			   DOUBLEST *d, struct type **t);
 %}
@@ -704,7 +704,7 @@ parse_go_float (struct gdbarch *gdbarch, const char *p, int len,
    as our YYSTYPE is different than c-exp.y's  */
 
 static int
-parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
+parse_number (const char *p, int len, int parsed_float, YYSTYPE *putithere)
 {
   /* FIXME: Shouldn't these be unsigned?  We don't deal with negative values
      here, and we do kind of silly things like cast to unsigned.  */
@@ -908,8 +908,8 @@ static int tempbuf_init;
    number of host characters in the literal.  */
 
 static int
-parse_string_or_char (char *tokptr, char **outptr, struct typed_stoken *value,
-		      int *host_chars)
+parse_string_or_char (const char *tokptr, const char **outptr,
+		      struct typed_stoken *value, int *host_chars)
 {
   int quote;
 
@@ -1049,7 +1049,7 @@ lex_one_token (void)
   int c;
   int namelen;
   unsigned int i;
-  char *tokstart;
+  const char *tokstart;
   int saw_structop = last_was_structop;
   char *copy;
 
@@ -1143,7 +1143,7 @@ lex_one_token (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'))
@@ -1190,7 +1190,7 @@ lex_one_token (void)
 
     case '@':
       {
-	char *p = &tokstart[1];
+	const char *p = &tokstart[1];
 	size_t len = strlen ("entry");
 
 	while (isspace (*p))
@@ -1283,7 +1283,8 @@ lex_one_token (void)
       && strncmp (tokstart, "thread", namelen) == 0
       && (tokstart[namelen] == ' ' || tokstart[namelen] == '\t'))
     {
-      char *p = tokstart + namelen + 1;
+      const char *p = tokstart + namelen + 1;
+
       while (*p == ' ' || *p == '\t')
 	p++;
       if (*p >= '0' && *p <= '9')
@@ -1294,7 +1295,7 @@ lex_one_token (void)
 
   tryname:
 
-  yylval.sval.ptr = tokstart;
+  yylval.sval.ptr = (char *) tokstart;
   yylval.sval.length = namelen;
 
   /* Catch specific keywords.  */
diff --git a/gdb/jv-exp.y b/gdb/jv-exp.y
index a4e1253..c69caf5 100644
--- a/gdb/jv-exp.y
+++ b/gdb/jv-exp.y
@@ -154,7 +154,7 @@ static void insert_exp (int, struct expression *);
 
 %{
 /* YYSTYPE gets defined by %union */
-static int parse_number (char *, int, int, YYSTYPE *);
+static int parse_number (const char *, int, int, YYSTYPE *);
 %}
 
 %type <lval> rcurly Dims Dims_opt
@@ -696,7 +696,7 @@ Expression:
 /*** Needs some error checking for the float case ***/
 
 static int
-parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
+parse_number (const char *p, int len, int parsed_float, YYSTYPE *putithere)
 {
   ULONGEST n = 0;
   ULONGEST limit, limit_div_base;
@@ -858,8 +858,8 @@ yylex (void)
   int c;
   int namelen;
   unsigned int i;
-  char *tokstart;
-  char *tokptr;
+  const char *tokstart;
+  const char *tokptr;
   int tempbufindex;
   static char *tempbuf;
   static int tempbufsize;
@@ -915,7 +915,7 @@ yylex (void)
       c = *lexptr++;
       if (c != '\'')
 	{
-	  namelen = skip_quoted (tokstart) - tokstart;
+	  namelen = skip_quoted ((char *) tokstart) - tokstart;
 	  if (namelen > 2)
 	    {
 	      lexptr = tokstart + namelen;
@@ -966,7 +966,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'))
@@ -1175,7 +1175,7 @@ yylex (void)
       break;
     }
 
-  yylval.sval.ptr = tokstart;
+  yylval.sval.ptr = (char *) tokstart;
   yylval.sval.length = namelen;
 
   if (*tokstart == '$')
diff --git a/gdb/m2-exp.y b/gdb/m2-exp.y
index eaa5a23..47ea640 100644
--- a/gdb/m2-exp.y
+++ b/gdb/m2-exp.y
@@ -662,7 +662,7 @@ type
 static int
 parse_number (int olen)
 {
-  char *p = lexptr;
+  const char *p = lexptr;
   LONGEST n = 0;
   LONGEST prevn = 0;
   int c,i,ischar=0;
@@ -814,7 +814,7 @@ yylex (void)
   int c;
   int namelen;
   int i;
-  char *tokstart;
+  const char *tokstart;
   char quote;
 
  retry:
@@ -907,7 +907,7 @@ yylex (void)
 	  }
       if(c != quote)
 	 error (_("Unterminated string or character constant."));
-      yylval.sval.ptr = tokstart + 1;
+      yylval.sval.ptr = (char *) (tokstart + 1);
       yylval.sval.length = namelen - 1;
       lexptr += namelen + 1;
 
@@ -927,7 +927,7 @@ yylex (void)
     {
       /* It's a number.  */
       int got_dot = 0, got_e = 0;
-      char *p = tokstart;
+      const char *p = tokstart;
       int toktype;
 
       for (++p ;; ++p)
@@ -987,7 +987,7 @@ yylex (void)
 	 && strncmp (tokstart, keytab[i].keyw, namelen) == 0)
 	   return keytab[i].token;
 
-  yylval.sval.ptr = tokstart;
+  yylval.sval.ptr = (char *) tokstart;
   yylval.sval.length = namelen;
 
   if (*tokstart == '$')
diff --git a/gdb/macroexp.c b/gdb/macroexp.c
index d88dac3..14c4994 100644
--- a/gdb/macroexp.c
+++ b/gdb/macroexp.c
@@ -360,8 +360,11 @@ get_character_constant (struct macro_buffer *tok, char *p, char *end)
             }
           else if (*p == '\\')
             {
-              p++;
-	      char_count += c_parse_escape (&p, NULL);
+	      const char *s, *o;
+
+              s = o = ++p;
+	      char_count += c_parse_escape (&s, NULL);
+	      p += s - o;
             }
           else
 	    {
@@ -414,8 +417,11 @@ get_string_literal (struct macro_buffer *tok, char *p, char *end)
                    "constants."));
           else if (*p == '\\')
             {
-              p++;
-              c_parse_escape (&p, NULL);
+	      const char *s, *o;
+
+              s = o = ++p;
+              c_parse_escape (&s, NULL);
+	      p += s - o;
             }
           else
             p++;
@@ -1434,7 +1440,7 @@ macro_expand_once (const char *source,
 
 
 char *
-macro_expand_next (char **lexptr,
+macro_expand_next (const char **lexptr,
                    macro_lookup_ftype *lookup_func,
                    void *lookup_baton)
 {
@@ -1442,7 +1448,7 @@ macro_expand_next (char **lexptr,
   struct cleanup *back_to;
 
   /* Set up SRC to refer to the input text, pointed to by *lexptr.  */
-  init_shared_buffer (&src, *lexptr, strlen (*lexptr));
+  init_shared_buffer (&src, (char *) *lexptr, strlen (*lexptr));
 
   /* Set up DEST to receive the expansion, if there is one.  */
   init_buffer (&dest, 0);
diff --git a/gdb/macroexp.h b/gdb/macroexp.h
index cbe9629..8bf4b7f 100644
--- a/gdb/macroexp.h
+++ b/gdb/macroexp.h
@@ -80,7 +80,7 @@ char *macro_expand_once (const char *source,
    much have to do tokenization to find the end of the string that
    needs to be macro-expanded.  Our C/C++ tokenizer isn't really
    designed to be called by anything but the yacc parser engine.  */
-char *macro_expand_next (char **lexptr,
+char *macro_expand_next (const char **lexptr,
                          macro_lookup_ftype *lookup_func,
                          void *lookup_baton);
 
diff --git a/gdb/p-exp.y b/gdb/p-exp.y
index da8d5f7..e0abd07 100644
--- a/gdb/p-exp.y
+++ b/gdb/p-exp.y
@@ -1141,8 +1141,10 @@ 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)
     for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++)
@@ -1361,13 +1363,18 @@ yylex (void)
 	    /* Do nothing, loop will terminate.  */
 	    break;
 	  case '\\':
-	    tokptr++;
-	    c = parse_escape (parse_gdbarch, &tokptr);
-	    if (c == -1)
-	      {
-		continue;
-	      }
-	    tempbuf[tempbufindex++] = c;
+	    {
+	      const char *s, *o;
+
+	      o = s = ++tokptr;
+	      c = parse_escape (parse_gdbarch, &s);
+	      *tokptr += s - o;
+	      if (c == -1)
+		{
+		  continue;
+		}
+	      tempbuf[tempbufindex++] = c;
+	    }
 	    break;
 	  default:
 	    tempbuf[tempbufindex++] = *tokptr++;
@@ -1623,8 +1630,8 @@ yylex (void)
 	     distinction) named x, then this code incorrectly thinks we
 	     are dealing with nested types rather than a member function.  */
 
-	  char *p;
-	  char *namestart;
+	  const char *p;
+	  const char *namestart;
 	  struct symbol *best_sym;
 
 	  /* Look ahead to detect nested types.  This probably should be
diff --git a/gdb/parse.c b/gdb/parse.c
index 674342b..07c1765 100644
--- a/gdb/parse.c
+++ b/gdb/parse.c
@@ -75,8 +75,8 @@ CORE_ADDR expression_context_pc;
 const struct block *innermost_block;
 int arglist_len;
 static struct type_stack type_stack;
-char *lexptr;
-char *prev_lexptr;
+const char *lexptr;
+const char *prev_lexptr;
 int paren_depth;
 int comma_terminates;
 
@@ -123,7 +123,7 @@ static int prefixify_subexp (struct expression *, struct expression *, int,
 static struct expression *parse_exp_in_context (const char **, CORE_ADDR,
 						const struct block *, int, 
 						int, int *);
-static struct expression *parse_exp_in_context_1 (char **, CORE_ADDR,
+static struct expression *parse_exp_in_context_1 (const char **, CORE_ADDR,
 						  const struct block *, int,
 						  int, int *);
 
@@ -733,8 +733,8 @@ handle_register:
 }
 
 
-char *
-find_template_name_end (char *p)
+const char *
+find_template_name_end (const char *p)
 {
   int depth = 1;
   int just_seen_right = 0;
@@ -1142,16 +1142,8 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
 		      const struct block *block,
 		      int comma, int void_context_p, int *out_subexp)
 {
-  struct expression *expr;
-  char *const_hack = *stringptr ? xstrdup (*stringptr) : NULL;
-  char *orig = const_hack;
-  struct cleanup *back_to = make_cleanup (xfree, const_hack);
-
-  expr = parse_exp_in_context_1 (&const_hack, pc, block, comma,
+  return parse_exp_in_context_1 (stringptr, pc, block, comma,
 				 void_context_p, out_subexp);
-  (*stringptr) += const_hack - orig;
-  do_cleanups (back_to);
-  return expr;
 }
 
 /* As for parse_exp_1, except that if VOID_CONTEXT_P, then
@@ -1162,7 +1154,7 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
    is left untouched.  */
 
 static struct expression *
-parse_exp_in_context_1 (char **stringptr, CORE_ADDR pc,
+parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc,
 			const struct block *block,
 			int comma, int void_context_p, int *out_subexp)
 {
diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h
index 92daca9..aaefe3f 100644
--- a/gdb/parser-defs.h
+++ b/gdb/parser-defs.h
@@ -201,7 +201,7 @@ extern void write_dollar_variable (struct stoken str);
 
 extern void mark_struct_expression (void);
 
-extern char *find_template_name_end (char *);
+extern const char *find_template_name_end (const char *);
 
 extern void start_arglist (void);
 
@@ -264,11 +264,11 @@ extern int parse_c_float (struct gdbarch *gdbarch, const char *p, int len,
 /* During parsing of a C expression, the pointer to the next character
    is in this variable.  */
 
-extern char *lexptr;
+extern const char *lexptr;
 
 /* After a token has been recognized, this variable points to it.
    Currently used only for error reporting.  */
-extern char *prev_lexptr;
+extern const char *prev_lexptr;
 
 /* Current depth in parentheses within the expression.  */
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 0652197..26879ec 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1412,7 +1412,7 @@ host_char_to_target (struct gdbarch *gdbarch, int c, int *target_c)
    after the zeros.  A value of 0 does not mean end of string.  */
 
 int
-parse_escape (struct gdbarch *gdbarch, char **string_ptr)
+parse_escape (struct gdbarch *gdbarch, const char **string_ptr)
 {
   int target_char = -2;	/* Initialize to avoid GCC warnings.  */
   int c = *(*string_ptr)++;
diff --git a/gdb/utils.h b/gdb/utils.h
index 143cd6b..3492f09 100644
--- a/gdb/utils.h
+++ b/gdb/utils.h
@@ -64,7 +64,7 @@ struct timeval get_prompt_for_continue_wait_time (void);
 
 extern int parse_pid_to_attach (char *args);
 
-extern int parse_escape (struct gdbarch *, char **);
+extern int parse_escape (struct gdbarch *, const char **);
 
 char **gdb_buildargv (const char *);
 \f



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA 1/4] Constify LEXPTR
  2013-09-30 18:56 [RFA 1/4] Constify LEXPTR Keith Seitz
@ 2013-10-01  4:06 ` Sergio Durigan Junior
  2013-10-01 17:48   ` Keith Seitz
  2013-10-01 20:04   ` Tom Tromey
  0 siblings, 2 replies; 5+ messages in thread
From: Sergio Durigan Junior @ 2013-10-01  4:06 UTC (permalink / raw)
  To: Keith Seitz; +Cc: gdb-patches@sourceware.org ml

On Monday, September 30 2013, Keith Seitz wrote:

> Hi,
>
> I am submitting four patches which aim to constify
> parser-defs.h/parse.c's LEXPTR.

Hey!

Thanks for the patch.  I've messed around with this code some time ago,
and I appreciate the effort you've made to make it less ugly :-).  Your
patch actually made me remember of another (buried) project of mine
which was to make the expout* variables non-global.  Maybe it's time to
ressurrect it once and for all!

> This patch is broken into four relatively simple patches, each
> building on the previous patch, typically eliminating a temporary cast
> to/from const. By the end, all of these temporary casts will be
> eliminated. [I'm using the solely as a way to make this more
> digestible.]
>
> Sadly, this first patch is still relatively large. It makes lexptr
> const, and adds temporary casts when dealing with struct
> stoken.ptr. This will be the subject of the next patch.

I don't know how you're planning to commit that, but I'd vote for push
the final result of applying all patches, because I don't see a strong
reason to commit each patch separately in this specific case.  WDYT?
But IANAM.

> I know maintainers have little choice, but even so, I would appreciate
> an additional pair of eyes on this for newb mistakes. This stuff can
> get a little mindless after a while.

FWIW, 

> Tested, regression-free, on x86_64-linux (Fedora 18) native and gdbserver.
>
> Keith
>
> ChangeLog
> 2013-09-24  Keith Seitz  <keiths@redhat.com>
>
> 	* c-exp.y (parse_number): Make first argument const.
> 	Make a copy of the input to manipulate.
> 	(c_parse_escape): Make first argument const.
> 	Make local variable 'tokptr' const.
> 	(parse_string_or_char): Make first two arguments const.
> 	(macro_original_text): Make const.
> 	(lex_one_token): Make local variable 'tokstart' const.
> 	Likewise for local variables named 'p'.
> 	Cast away const for struct stoken (temporary).
> 	* c-lang.h (c_parse_escpae): Make first argument const.
> 	* cli/cli-cmds.c (echo_command): Make local variable 'p'
> 	const.
> 	* cli/cli-setshow.c (do_set_command): Likewise for 'p' in
> 	var_string case.
> 	* f-exp.y (parse_number): Make first argument const.
> 	(match_string_literal): Make local variable 'tokstart'
> 	const.
> 	(yylex): Make local variable 'p' const.
> 	Cast away const for struct stoken (temporary).
> 	* go-exp.y (parse_number): Make first argument const.
> 	(parse_string_or_char): Likewise.
> 	Make local variable 'tokstart' const.
> 	(lex_one_token): Likewise for numerous locals called 'p'.
> 	Cast away const for struct stoken (temporary).
> 	* jv-exp.y (parse_number): Make first argument const.
> 	Make local variables 'tokstart' and 'tokptr' const.
> 	Cast away const for call to skip_quoted (temporary).
> 	(yylex): Make local variable 'p' const.
> 	Cast away const for struct stoken (temporary).
> 	* m2-exp.y (parse_number): Make local variable 'p' const.
> 	(yylex): Likewise for 'tokstart'.
> 	Cast away const for struct stoken (temporary).
> 	Make local variable 'p' const.
> 	* macroexp.c (get_character_constant): Pass a const string
> 	to c_parse_escape.
> 	(get_string_literal): Likewise.
> 	(macro_expand_next): Make first argument const.
> 	Cast away const for init_shared_buffer.
> 	* macroexp.h (macro_expand_next): Make first argument const.
> 	* p-exp.y (yylex): Make a local copy of 'lexptr'.
> 	Pass a const string to c_parse_escape.
> 	Make local variables 'p' and 'namestart' const.
> 	* parse.c (lexptr): Make const.
> 	(prev_lexptr): Likewise.
> 	(find_template_name_end): Return const.
> 	Make argument const, too.
> 	(parse_exp_in_context): Make first argument const.
> 	Remove the entire const_hack.
> 	(parse_exp_in_context_1): Make first argument const.
> 	* parser-defs.h (find_template_name_end): Return const.
> 	Make argument const, too.
> 	(lexptr): Make const.
> 	(prev_lexptr): Likewise.
> 	* utils.c (parse_escape): Make second argument const.
> 	* utils.h (parse_escape): Likewise.
> diff --git a/gdb/c-exp.y b/gdb/c-exp.y
> index 3a51878..ea19178 100644
> --- a/gdb/c-exp.y
> +++ b/gdb/c-exp.y
> @@ -164,7 +164,7 @@ void yyerror (char *);
>  
>  %{
>  /* YYSTYPE gets defined by %union */
> -static int parse_number (char *, int, int, YYSTYPE *);
> +static int parse_number (const char *, int, int, YYSTYPE *);
>  static struct stoken operator_stoken (const char *);
>  static void check_parameter_typelist (VEC (type_ptr) *);
>  static void write_destructor_name (struct stoken);
> @@ -1699,7 +1699,7 @@ check_parameter_typelist (VEC (type_ptr) *params)
>  /*** Needs some error checking for the float case ***/
>  
>  static int
> -parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
> +parse_number (const char *buf, int len, int parsed_float, YYSTYPE *putithere)
>  {
>    /* FIXME: Shouldn't these be unsigned?  We don't deal with negative values
>       here, and we do kind of silly things like cast to unsigned.  */
> @@ -1722,6 +1722,9 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
>    struct type *signed_type;
>    struct type *unsigned_type;
>  
> +  char *p = alloca (len);
> +  memcpy (p, buf, len);

I think the declaration of "p" should go together with the other
declarations.  And there should be a newline between the declaration and
memcpy.

> +
>    if (parsed_float)
>      {
>        /* If it ends at "df", "dd" or "dl", take it as type of decimal floating
> @@ -1941,9 +1944,9 @@ static int tempbuf_init;
>     character was emitted, 0 otherwise.  */
>  
>  int
> -c_parse_escape (char **ptr, struct obstack *output)
> +c_parse_escape (const char **ptr, struct obstack *output)
>  {
> -  char *tokptr = *ptr;
> +  const char *tokptr = *ptr;
>    int result = 1;
>  
>    /* Some escape sequences undergo character set conversion.  Those we
> @@ -2102,8 +2105,8 @@ c_parse_escape (char **ptr, struct obstack *output)
>     CHAR, depending on what was parsed.  *HOST_CHARS is set to the
>     number of host characters in the literal.  */
>  static int
> -parse_string_or_char (char *tokptr, char **outptr, struct typed_stoken *value,
> -		      int *host_chars)
> +parse_string_or_char (const char *tokptr, const char **outptr,
> +		      struct typed_stoken *value, int *host_chars)
>  {
>    int quote;
>    enum c_string_type type;
> @@ -2321,7 +2324,7 @@ static const struct token ident_tokens[] =
>     we evaluate ADDRESS in the scope of the current frame, but we
>     evaluate CONDITION in the scope of the breakpoint's location.  So
>     it's simply wrong to try to macro-expand the whole thing at once.  */
> -static char *macro_original_text;
> +static const char *macro_original_text;
>  
>  /* We save all intermediate macro expansions on this obstack for the
>     duration of a single parse.  The expansion text may sometimes have
> @@ -2411,7 +2414,7 @@ lex_one_token (void)
>    int c;
>    int namelen;
>    unsigned int i;
> -  char *tokstart;
> +  const char *tokstart;
>    int saw_structop = last_was_structop;
>    char *copy;
>  
> @@ -2538,7 +2541,7 @@ lex_one_token (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'))
> @@ -2590,7 +2593,7 @@ lex_one_token (void)
>  
>      case '@':
>        {
> -	char *p = &tokstart[1];
> +	const char *p = &tokstart[1];
>  	size_t len = strlen ("entry");
>  
>  	if (parse_language->la_language == language_objc)
> @@ -2692,7 +2695,8 @@ lex_one_token (void)
>  		 characters; for comparison expressions, e.g. "a < b > c",
>  		 there must be spaces before the '<', etc. */
>                 
> -	      char * p = find_template_name_end (tokstart + namelen);
> +	      const char *p = find_template_name_end (tokstart + namelen);
> +
>  	      if (p)
>  		namelen = p - tokstart;
>  	    }
> @@ -2723,7 +2727,7 @@ lex_one_token (void)
>        && (tokstart[namelen] == ' ' || tokstart[namelen] == '\t')
>        && ! scanning_macro_expansion ())
>      {
> -      char *p = tokstart + namelen + 1;
> +      const char *p = tokstart + namelen + 1;
>        while (*p == ' ' || *p == '\t')

Newline between declaration and the "while" (you add this in the other
hunks :-)).

>  	p++;
>        if (*p >= '0' && *p <= '9')
> @@ -2734,7 +2738,7 @@ lex_one_token (void)
>  
>    tryname:
>  
> -  yylval.sval.ptr = tokstart;
> +  yylval.sval.ptr = (char *) tokstart;
>    yylval.sval.length = namelen;
>  
>    /* Catch specific keywords.  */
> diff --git a/gdb/c-lang.h b/gdb/c-lang.h
> index 6bf6591..9f8f50d 100644
> --- a/gdb/c-lang.h
> +++ b/gdb/c-lang.h
> @@ -61,7 +61,7 @@ extern int c_parse (void);
>  
>  extern void c_error (char *);
>  
> -extern int c_parse_escape (char **, struct obstack *);
> +extern int c_parse_escape (const char **, struct obstack *);
>  
>  /* Defined in c-typeprint.c */
>  extern void c_print_type (struct type *, const char *,
> diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
> index 4317ea3..886ba7a 100644
> --- a/gdb/cli/cli-cmds.c
> +++ b/gdb/cli/cli-cmds.c
> @@ -666,7 +666,7 @@ source_command (char *args, int from_tty)
>  static void
>  echo_command (char *text, int from_tty)
>  {
> -  char *p = text;
> +  const char *p = text;
>    int c;
>  
>    if (text)
> diff --git a/gdb/cli/cli-setshow.c b/gdb/cli/cli-setshow.c
> index 3e41fd4..45df6f6 100644
> --- a/gdb/cli/cli-setshow.c
> +++ b/gdb/cli/cli-setshow.c
> @@ -160,7 +160,7 @@ do_set_command (char *arg, int from_tty, struct cmd_list_element *c)
>      case var_string:
>        {
>  	char *new;
> -	char *p;
> +	const char *p;
>  	char *q;
>  	int ch;
>  
> diff --git a/gdb/f-exp.y b/gdb/f-exp.y
> index 296a7fe..9a82230 100644
> --- a/gdb/f-exp.y
> +++ b/gdb/f-exp.y
> @@ -157,7 +157,7 @@ static int match_string_literal (void);
>  
>  %{
>  /* YYSTYPE gets defined by %union */
> -static int parse_number (char *, int, int, YYSTYPE *);
> +static int parse_number (const char *, int, int, YYSTYPE *);
>  %}
>  
>  %type <voidval> exp  type_exp start variable 
> @@ -669,7 +669,7 @@ name_not_typename :	NAME
>  /*** Needs some error checking for the float case ***/
>  
>  static int
> -parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
> +parse_number (const char *p, int len, int parsed_float, YYSTYPE *putithere)
>  {
>    LONGEST n = 0;
>    LONGEST prevn = 0;
> @@ -920,7 +920,7 @@ growbuf_by_size (int count)
>  static int
>  match_string_literal (void)
>  {
> -  char *tokptr = lexptr;
> +  const char *tokptr = lexptr;
>  
>    for (tempbufindex = 0, tokptr++; *tokptr != '\0'; tokptr++)
>      {
> @@ -955,7 +955,7 @@ yylex (void)
>    int c;
>    int namelen;
>    unsigned int i,token;
> -  char *tokstart;
> +  const char *tokstart;
>    
>   retry:
>   
> @@ -1054,7 +1054,7 @@ yylex (void)
>        {
>          /* It's a number.  */
>  	int got_dot = 0, got_e = 0, got_d = 0, toktype;
> -	char *p = tokstart;
> +	const char *p = tokstart;
>  	int hex = input_radix > 10;
>  	
>  	if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
> @@ -1159,7 +1159,7 @@ yylex (void)
>  	return f77_keywords[i].token;
>        }
>    
> -  yylval.sval.ptr = tokstart;
> +  yylval.sval.ptr = (char *) tokstart;
>    yylval.sval.length = namelen;
>    
>    if (*tokstart == '$')
> diff --git a/gdb/go-exp.y b/gdb/go-exp.y
> index 2ccb394..166d380 100644
> --- a/gdb/go-exp.y
> +++ b/gdb/go-exp.y
> @@ -158,7 +158,7 @@ void yyerror (char *);
>  
>  %{
>  /* YYSTYPE gets defined by %union.  */
> -static int parse_number (char *, int, int, YYSTYPE *);
> +static int parse_number (const char *, int, int, YYSTYPE *);
>  static int parse_go_float (struct gdbarch *gdbarch, const char *p, int len,
>  			   DOUBLEST *d, struct type **t);
>  %}
> @@ -704,7 +704,7 @@ parse_go_float (struct gdbarch *gdbarch, const char *p, int len,
>     as our YYSTYPE is different than c-exp.y's  */
>  
>  static int
> -parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
> +parse_number (const char *p, int len, int parsed_float, YYSTYPE *putithere)
>  {
>    /* FIXME: Shouldn't these be unsigned?  We don't deal with negative values
>       here, and we do kind of silly things like cast to unsigned.  */
> @@ -908,8 +908,8 @@ static int tempbuf_init;
>     number of host characters in the literal.  */
>  
>  static int
> -parse_string_or_char (char *tokptr, char **outptr, struct typed_stoken *value,
> -		      int *host_chars)
> +parse_string_or_char (const char *tokptr, const char **outptr,
> +		      struct typed_stoken *value, int *host_chars)
>  {
>    int quote;
>  
> @@ -1049,7 +1049,7 @@ lex_one_token (void)
>    int c;
>    int namelen;
>    unsigned int i;
> -  char *tokstart;
> +  const char *tokstart;
>    int saw_structop = last_was_structop;
>    char *copy;
>  
> @@ -1143,7 +1143,7 @@ lex_one_token (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'))
> @@ -1190,7 +1190,7 @@ lex_one_token (void)
>  
>      case '@':
>        {
> -	char *p = &tokstart[1];
> +	const char *p = &tokstart[1];
>  	size_t len = strlen ("entry");
>  
>  	while (isspace (*p))
> @@ -1283,7 +1283,8 @@ lex_one_token (void)
>        && strncmp (tokstart, "thread", namelen) == 0
>        && (tokstart[namelen] == ' ' || tokstart[namelen] == '\t'))
>      {
> -      char *p = tokstart + namelen + 1;
> +      const char *p = tokstart + namelen + 1;
> +
>        while (*p == ' ' || *p == '\t')
>  	p++;
>        if (*p >= '0' && *p <= '9')
> @@ -1294,7 +1295,7 @@ lex_one_token (void)
>  
>    tryname:
>  
> -  yylval.sval.ptr = tokstart;
> +  yylval.sval.ptr = (char *) tokstart;
>    yylval.sval.length = namelen;
>  
>    /* Catch specific keywords.  */
> diff --git a/gdb/jv-exp.y b/gdb/jv-exp.y
> index a4e1253..c69caf5 100644
> --- a/gdb/jv-exp.y
> +++ b/gdb/jv-exp.y
> @@ -154,7 +154,7 @@ static void insert_exp (int, struct expression *);
>  
>  %{
>  /* YYSTYPE gets defined by %union */
> -static int parse_number (char *, int, int, YYSTYPE *);
> +static int parse_number (const char *, int, int, YYSTYPE *);
>  %}
>  
>  %type <lval> rcurly Dims Dims_opt
> @@ -696,7 +696,7 @@ Expression:
>  /*** Needs some error checking for the float case ***/
>  
>  static int
> -parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
> +parse_number (const char *p, int len, int parsed_float, YYSTYPE *putithere)
>  {
>    ULONGEST n = 0;
>    ULONGEST limit, limit_div_base;
> @@ -858,8 +858,8 @@ yylex (void)
>    int c;
>    int namelen;
>    unsigned int i;
> -  char *tokstart;
> -  char *tokptr;
> +  const char *tokstart;
> +  const char *tokptr;
>    int tempbufindex;
>    static char *tempbuf;
>    static int tempbufsize;
> @@ -915,7 +915,7 @@ yylex (void)
>        c = *lexptr++;
>        if (c != '\'')
>  	{
> -	  namelen = skip_quoted (tokstart) - tokstart;
> +	  namelen = skip_quoted ((char *) tokstart) - tokstart;
>  	  if (namelen > 2)
>  	    {
>  	      lexptr = tokstart + namelen;
> @@ -966,7 +966,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'))
> @@ -1175,7 +1175,7 @@ yylex (void)
>        break;
>      }
>  
> -  yylval.sval.ptr = tokstart;
> +  yylval.sval.ptr = (char *) tokstart;
>    yylval.sval.length = namelen;
>  
>    if (*tokstart == '$')
> diff --git a/gdb/m2-exp.y b/gdb/m2-exp.y
> index eaa5a23..47ea640 100644
> --- a/gdb/m2-exp.y
> +++ b/gdb/m2-exp.y
> @@ -662,7 +662,7 @@ type
>  static int
>  parse_number (int olen)
>  {
> -  char *p = lexptr;
> +  const char *p = lexptr;
>    LONGEST n = 0;
>    LONGEST prevn = 0;
>    int c,i,ischar=0;
> @@ -814,7 +814,7 @@ yylex (void)
>    int c;
>    int namelen;
>    int i;
> -  char *tokstart;
> +  const char *tokstart;
>    char quote;
>  
>   retry:
> @@ -907,7 +907,7 @@ yylex (void)
>  	  }
>        if(c != quote)
>  	 error (_("Unterminated string or character constant."));
> -      yylval.sval.ptr = tokstart + 1;
> +      yylval.sval.ptr = (char *) (tokstart + 1);
>        yylval.sval.length = namelen - 1;
>        lexptr += namelen + 1;
>  
> @@ -927,7 +927,7 @@ yylex (void)
>      {
>        /* It's a number.  */
>        int got_dot = 0, got_e = 0;
> -      char *p = tokstart;
> +      const char *p = tokstart;
>        int toktype;
>  
>        for (++p ;; ++p)
> @@ -987,7 +987,7 @@ yylex (void)
>  	 && strncmp (tokstart, keytab[i].keyw, namelen) == 0)
>  	   return keytab[i].token;
>  
> -  yylval.sval.ptr = tokstart;
> +  yylval.sval.ptr = (char *) tokstart;
>    yylval.sval.length = namelen;
>  
>    if (*tokstart == '$')
> diff --git a/gdb/macroexp.c b/gdb/macroexp.c
> index d88dac3..14c4994 100644
> --- a/gdb/macroexp.c
> +++ b/gdb/macroexp.c
> @@ -360,8 +360,11 @@ get_character_constant (struct macro_buffer *tok, char *p, char *end)
>              }
>            else if (*p == '\\')
>              {
> -              p++;
> -	      char_count += c_parse_escape (&p, NULL);
> +	      const char *s, *o;
> +
> +              s = o = ++p;

This line is indented wrongly (only spaces).

> +	      char_count += c_parse_escape (&s, NULL);
> +	      p += s - o;
>              }
>            else
>  	    {
> @@ -414,8 +417,11 @@ get_string_literal (struct macro_buffer *tok, char *p, char *end)
>                     "constants."));
>            else if (*p == '\\')
>              {
> -              p++;
> -              c_parse_escape (&p, NULL);
> +	      const char *s, *o;
> +
> +              s = o = ++p;
> +              c_parse_escape (&s, NULL);

Wrong indentation (only spaces).

> +	      p += s - o;
>              }
>            else
>              p++;
> @@ -1434,7 +1440,7 @@ macro_expand_once (const char *source,
>  
>  
>  char *
> -macro_expand_next (char **lexptr,
> +macro_expand_next (const char **lexptr,
>                     macro_lookup_ftype *lookup_func,
>                     void *lookup_baton)
>  {
> @@ -1442,7 +1448,7 @@ macro_expand_next (char **lexptr,
>    struct cleanup *back_to;
>  
>    /* Set up SRC to refer to the input text, pointed to by *lexptr.  */
> -  init_shared_buffer (&src, *lexptr, strlen (*lexptr));
> +  init_shared_buffer (&src, (char *) *lexptr, strlen (*lexptr));
>  
>    /* Set up DEST to receive the expansion, if there is one.  */
>    init_buffer (&dest, 0);
> diff --git a/gdb/macroexp.h b/gdb/macroexp.h
> index cbe9629..8bf4b7f 100644
> --- a/gdb/macroexp.h
> +++ b/gdb/macroexp.h
> @@ -80,7 +80,7 @@ char *macro_expand_once (const char *source,
>     much have to do tokenization to find the end of the string that
>     needs to be macro-expanded.  Our C/C++ tokenizer isn't really
>     designed to be called by anything but the yacc parser engine.  */
> -char *macro_expand_next (char **lexptr,
> +char *macro_expand_next (const char **lexptr,
>                           macro_lookup_ftype *lookup_func,
>                           void *lookup_baton);
>  
> diff --git a/gdb/p-exp.y b/gdb/p-exp.y
> index da8d5f7..e0abd07 100644
> --- a/gdb/p-exp.y
> +++ b/gdb/p-exp.y
> @@ -1141,8 +1141,10 @@ 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)
>      for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++)
> @@ -1361,13 +1363,18 @@ yylex (void)
>  	    /* Do nothing, loop will terminate.  */
>  	    break;
>  	  case '\\':
> -	    tokptr++;
> -	    c = parse_escape (parse_gdbarch, &tokptr);
> -	    if (c == -1)
> -	      {
> -		continue;
> -	      }
> -	    tempbuf[tempbufindex++] = c;
> +	    {
> +	      const char *s, *o;
> +
> +	      o = s = ++tokptr;
> +	      c = parse_escape (parse_gdbarch, &s);
> +	      *tokptr += s - o;
> +	      if (c == -1)
> +		{
> +		  continue;
> +		}
> +	      tempbuf[tempbufindex++] = c;
> +	    }
>  	    break;
>  	  default:
>  	    tempbuf[tempbufindex++] = *tokptr++;
> @@ -1623,8 +1630,8 @@ yylex (void)
>  	     distinction) named x, then this code incorrectly thinks we
>  	     are dealing with nested types rather than a member function.  */
>  
> -	  char *p;
> -	  char *namestart;
> +	  const char *p;
> +	  const char *namestart;
>  	  struct symbol *best_sym;
>  
>  	  /* Look ahead to detect nested types.  This probably should be
> diff --git a/gdb/parse.c b/gdb/parse.c
> index 674342b..07c1765 100644
> --- a/gdb/parse.c
> +++ b/gdb/parse.c
> @@ -75,8 +75,8 @@ CORE_ADDR expression_context_pc;
>  const struct block *innermost_block;
>  int arglist_len;
>  static struct type_stack type_stack;
> -char *lexptr;
> -char *prev_lexptr;
> +const char *lexptr;
> +const char *prev_lexptr;
>  int paren_depth;
>  int comma_terminates;
>  
> @@ -123,7 +123,7 @@ static int prefixify_subexp (struct expression *, struct expression *, int,
>  static struct expression *parse_exp_in_context (const char **, CORE_ADDR,
>  						const struct block *, int, 
>  						int, int *);
> -static struct expression *parse_exp_in_context_1 (char **, CORE_ADDR,
> +static struct expression *parse_exp_in_context_1 (const char **, CORE_ADDR,
>  						  const struct block *, int,
>  						  int, int *);
>  
> @@ -733,8 +733,8 @@ handle_register:
>  }
>  
>  
> -char *
> -find_template_name_end (char *p)
> +const char *
> +find_template_name_end (const char *p)
>  {
>    int depth = 1;
>    int just_seen_right = 0;
> @@ -1142,16 +1142,8 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
>  		      const struct block *block,
>  		      int comma, int void_context_p, int *out_subexp)
>  {
> -  struct expression *expr;
> -  char *const_hack = *stringptr ? xstrdup (*stringptr) : NULL;
> -  char *orig = const_hack;
> -  struct cleanup *back_to = make_cleanup (xfree, const_hack);
> -
> -  expr = parse_exp_in_context_1 (&const_hack, pc, block, comma,
> +  return parse_exp_in_context_1 (stringptr, pc, block, comma,
>  				 void_context_p, out_subexp);
> -  (*stringptr) += const_hack - orig;
> -  do_cleanups (back_to);
> -  return expr;

Nice!  :-)

>  }
>  
>  /* As for parse_exp_1, except that if VOID_CONTEXT_P, then
> @@ -1162,7 +1154,7 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
>     is left untouched.  */
>  
>  static struct expression *
> -parse_exp_in_context_1 (char **stringptr, CORE_ADDR pc,
> +parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc,
>  			const struct block *block,
>  			int comma, int void_context_p, int *out_subexp)
>  {
> diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h
> index 92daca9..aaefe3f 100644
> --- a/gdb/parser-defs.h
> +++ b/gdb/parser-defs.h
> @@ -201,7 +201,7 @@ extern void write_dollar_variable (struct stoken str);
>  
>  extern void mark_struct_expression (void);
>  
> -extern char *find_template_name_end (char *);
> +extern const char *find_template_name_end (const char *);
>  
>  extern void start_arglist (void);
>  
> @@ -264,11 +264,11 @@ extern int parse_c_float (struct gdbarch *gdbarch, const char *p, int len,
>  /* During parsing of a C expression, the pointer to the next character
>     is in this variable.  */
>  
> -extern char *lexptr;
> +extern const char *lexptr;
>  
>  /* After a token has been recognized, this variable points to it.
>     Currently used only for error reporting.  */
> -extern char *prev_lexptr;
> +extern const char *prev_lexptr;
>  
>  /* Current depth in parentheses within the expression.  */
>  
> diff --git a/gdb/utils.c b/gdb/utils.c
> index 0652197..26879ec 100644
> --- a/gdb/utils.c
> +++ b/gdb/utils.c
> @@ -1412,7 +1412,7 @@ host_char_to_target (struct gdbarch *gdbarch, int c, int *target_c)
>     after the zeros.  A value of 0 does not mean end of string.  */
>  
>  int
> -parse_escape (struct gdbarch *gdbarch, char **string_ptr)
> +parse_escape (struct gdbarch *gdbarch, const char **string_ptr)
>  {
>    int target_char = -2;	/* Initialize to avoid GCC warnings.  */
>    int c = *(*string_ptr)++;
> diff --git a/gdb/utils.h b/gdb/utils.h
> index 143cd6b..3492f09 100644
> --- a/gdb/utils.h
> +++ b/gdb/utils.h
> @@ -64,7 +64,7 @@ struct timeval get_prompt_for_continue_wait_time (void);
>  
>  extern int parse_pid_to_attach (char *args);
>  
> -extern int parse_escape (struct gdbarch *, char **);
> +extern int parse_escape (struct gdbarch *, const char **);
>  
>  char **gdb_buildargv (const char *);
>  \f

Otherwise, looks good to me (thanks for doing that!), but I can't
approve it :-).

-- 
Sergio

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA 1/4] Constify LEXPTR
  2013-10-01  4:06 ` Sergio Durigan Junior
@ 2013-10-01 17:48   ` Keith Seitz
  2013-10-01 20:04     ` Tom Tromey
  2013-10-01 20:04   ` Tom Tromey
  1 sibling, 1 reply; 5+ messages in thread
From: Keith Seitz @ 2013-10-01 17:48 UTC (permalink / raw)
  To: Sergio Durigan Junior; +Cc: gdb-patches@sourceware.org ml

[-- Attachment #1: Type: text/plain, Size: 7116 bytes --]

Hi, Sergio,

On 09/30/2013 09:06 PM, Sergio Durigan Junior wrote:
> On Monday, September 30 2013, Keith Seitz wrote:
> I don't know how you're planning to commit that, but I'd vote for push
> the final result of applying all patches, because I don't see a strong
> reason to commit each patch separately in this specific case.  WDYT?
> But IANAM.

Yeah, I would probably commit as one big one. That's how I usually test 
on patchsets anyway. I just split them up to try and make them more 
manageable for reviewers. [Notice I said, "try." I seem to seldom 
succeed lately!]

[ChangeLog hasn't changed, so I'm just leaving it in this reply.]

>> ChangeLog
>> 2013-09-24  Keith Seitz  <keiths@redhat.com>
>>
>> 	* c-exp.y (parse_number): Make first argument const.
>> 	Make a copy of the input to manipulate.
>> 	(c_parse_escape): Make first argument const.
>> 	Make local variable 'tokptr' const.
>> 	(parse_string_or_char): Make first two arguments const.
>> 	(macro_original_text): Make const.
>> 	(lex_one_token): Make local variable 'tokstart' const.
>> 	Likewise for local variables named 'p'.
>> 	Cast away const for struct stoken (temporary).
>> 	* c-lang.h (c_parse_escpae): Make first argument const.
>> 	* cli/cli-cmds.c (echo_command): Make local variable 'p'
>> 	const.
>> 	* cli/cli-setshow.c (do_set_command): Likewise for 'p' in
>> 	var_string case.
>> 	* f-exp.y (parse_number): Make first argument const.
>> 	(match_string_literal): Make local variable 'tokstart'
>> 	const.
>> 	(yylex): Make local variable 'p' const.
>> 	Cast away const for struct stoken (temporary).
>> 	* go-exp.y (parse_number): Make first argument const.
>> 	(parse_string_or_char): Likewise.
>> 	Make local variable 'tokstart' const.
>> 	(lex_one_token): Likewise for numerous locals called 'p'.
>> 	Cast away const for struct stoken (temporary).
>> 	* jv-exp.y (parse_number): Make first argument const.
>> 	Make local variables 'tokstart' and 'tokptr' const.
>> 	Cast away const for call to skip_quoted (temporary).
>> 	(yylex): Make local variable 'p' const.
>> 	Cast away const for struct stoken (temporary).
>> 	* m2-exp.y (parse_number): Make local variable 'p' const.
>> 	(yylex): Likewise for 'tokstart'.
>> 	Cast away const for struct stoken (temporary).
>> 	Make local variable 'p' const.
>> 	* macroexp.c (get_character_constant): Pass a const string
>> 	to c_parse_escape.
>> 	(get_string_literal): Likewise.
>> 	(macro_expand_next): Make first argument const.
>> 	Cast away const for init_shared_buffer.
>> 	* macroexp.h (macro_expand_next): Make first argument const.
>> 	* p-exp.y (yylex): Make a local copy of 'lexptr'.
>> 	Pass a const string to c_parse_escape.
>> 	Make local variables 'p' and 'namestart' const.
>> 	* parse.c (lexptr): Make const.
>> 	(prev_lexptr): Likewise.
>> 	(find_template_name_end): Return const.
>> 	Make argument const, too.
>> 	(parse_exp_in_context): Make first argument const.
>> 	Remove the entire const_hack.
>> 	(parse_exp_in_context_1): Make first argument const.
>> 	* parser-defs.h (find_template_name_end): Return const.
>> 	Make argument const, too.
>> 	(lexptr): Make const.
>> 	(prev_lexptr): Likewise.
>> 	* utils.c (parse_escape): Make second argument const.
>> 	* utils.h (parse_escape): Likewise.

>> diff --git a/gdb/c-exp.y b/gdb/c-exp.y
>> index 3a51878..ea19178 100644
>> --- a/gdb/c-exp.y
>> +++ b/gdb/c-exp.y
[snip]
>> @@ -1699,7 +1699,7 @@ check_parameter_typelist (VEC (type_ptr) *params)
>>   /*** Needs some error checking for the float case ***/
>>
>>   static int
>> -parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
>> +parse_number (const char *buf, int len, int parsed_float, YYSTYPE *putithere)
>>   {
>>     /* FIXME: Shouldn't these be unsigned?  We don't deal with negative values
>>        here, and we do kind of silly things like cast to unsigned.  */
>> @@ -1722,6 +1722,9 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
>>     struct type *signed_type;
>>     struct type *unsigned_type;
>>
>> +  char *p = alloca (len);
>> +  memcpy (p, buf, len);
>
> I think the declaration of "p" should go together with the other
> declarations.  And there should be a newline between the declaration and
> memcpy.

Yes, you are correct! I've fixed this. [See, I *did* warn about the 
tediousness of these sort of operations. Fortunately, only a handful of 
things escaped my attention.]

>> @@ -2723,7 +2727,7 @@ lex_one_token (void)
>>         && (tokstart[namelen] == ' ' || tokstart[namelen] == '\t')
>>         && ! scanning_macro_expansion ())
>>       {
>> -      char *p = tokstart + namelen + 1;
>> +      const char *p = tokstart + namelen + 1;
>>         while (*p == ' ' || *p == '\t')
>
> Newline between declaration and the "while" (you add this in the other
> hunks :-)).

Fixed. [Yes, I did fix the other occurrences since I was already editing 
that line anyway.]

>> diff --git a/gdb/macroexp.c b/gdb/macroexp.c
>> index d88dac3..14c4994 100644
>> --- a/gdb/macroexp.c
>> +++ b/gdb/macroexp.c
>> @@ -360,8 +360,11 @@ get_character_constant (struct macro_buffer *tok, char *p, char *end)
>>               }
>>             else if (*p == '\\')
>>               {
>> -              p++;
>> -	      char_count += c_parse_escape (&p, NULL);
>> +	      const char *s, *o;
>> +
>> +              s = o = ++p;
>
> This line is indented wrongly (only spaces).

Fixed.

>
>> +	      char_count += c_parse_escape (&s, NULL);
>> +	      p += s - o;
>>               }
>>             else
>>   	    {
>> @@ -414,8 +417,11 @@ get_string_literal (struct macro_buffer *tok, char *p, char *end)
>>                      "constants."));
>>             else if (*p == '\\')
>>               {
>> -              p++;
>> -              c_parse_escape (&p, NULL);
>> +	      const char *s, *o;
>> +
>> +              s = o = ++p;
>> +              c_parse_escape (&s, NULL);
>
> Wrong indentation (only spaces).
>

Fixed.

>> +	      p += s - o;
>>               }
>>             else
>>               p++;
>> diff --git a/gdb/parse.c b/gdb/parse.c
>> index 674342b..07c1765 100644
>> --- a/gdb/parse.c
>> +++ b/gdb/parse.c
>> @@ -1142,16 +1142,8 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
>>   		      const struct block *block,
>>   		      int comma, int void_context_p, int *out_subexp)
>>   {
>> -  struct expression *expr;
>> -  char *const_hack = *stringptr ? xstrdup (*stringptr) : NULL;
>> -  char *orig = const_hack;
>> -  struct cleanup *back_to = make_cleanup (xfree, const_hack);
>> -
>> -  expr = parse_exp_in_context_1 (&const_hack, pc, block, comma,
>> +  return parse_exp_in_context_1 (stringptr, pc, block, comma,
>>   				 void_context_p, out_subexp);
>> -  (*stringptr) += const_hack - orig;
>> -  do_cleanups (back_to);
>> -  return expr;
>
> Nice!  :-)
>

Mission accomplished! :-)

>>   }
>>
>>   /* As for parse_exp_1, except that if VOID_CONTEXT_P, then

> Otherwise, looks good to me (thanks for doing that!), but I can't
> approve it :-).

For the record, here is update with the aforementioned fixes.

Thank you for taking a look!

Keith

[ChangeLog is above]




[-- Attachment #2: constify-lexptr-2.patch --]
[-- Type: text/x-patch, Size: 18993 bytes --]

diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index 3a51878..a4b1e2a 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -164,7 +164,7 @@ void yyerror (char *);
 
 %{
 /* YYSTYPE gets defined by %union */
-static int parse_number (char *, int, int, YYSTYPE *);
+static int parse_number (const char *, int, int, YYSTYPE *);
 static struct stoken operator_stoken (const char *);
 static void check_parameter_typelist (VEC (type_ptr) *);
 static void write_destructor_name (struct stoken);
@@ -1699,7 +1699,7 @@ check_parameter_typelist (VEC (type_ptr) *params)
 /*** Needs some error checking for the float case ***/
 
 static int
-parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
+parse_number (const char *buf, int len, int parsed_float, YYSTYPE *putithere)
 {
   /* FIXME: Shouldn't these be unsigned?  We don't deal with negative values
      here, and we do kind of silly things like cast to unsigned.  */
@@ -1721,6 +1721,10 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
   ULONGEST high_bit;
   struct type *signed_type;
   struct type *unsigned_type;
+  char *p;
+
+  p = alloca (len);
+  memcpy (p, buf, len);
 
   if (parsed_float)
     {
@@ -1941,9 +1945,9 @@ static int tempbuf_init;
    character was emitted, 0 otherwise.  */
 
 int
-c_parse_escape (char **ptr, struct obstack *output)
+c_parse_escape (const char **ptr, struct obstack *output)
 {
-  char *tokptr = *ptr;
+  const char *tokptr = *ptr;
   int result = 1;
 
   /* Some escape sequences undergo character set conversion.  Those we
@@ -2102,8 +2106,8 @@ c_parse_escape (char **ptr, struct obstack *output)
    CHAR, depending on what was parsed.  *HOST_CHARS is set to the
    number of host characters in the literal.  */
 static int
-parse_string_or_char (char *tokptr, char **outptr, struct typed_stoken *value,
-		      int *host_chars)
+parse_string_or_char (const char *tokptr, const char **outptr,
+		      struct typed_stoken *value, int *host_chars)
 {
   int quote;
   enum c_string_type type;
@@ -2321,7 +2325,7 @@ static const struct token ident_tokens[] =
    we evaluate ADDRESS in the scope of the current frame, but we
    evaluate CONDITION in the scope of the breakpoint's location.  So
    it's simply wrong to try to macro-expand the whole thing at once.  */
-static char *macro_original_text;
+static const char *macro_original_text;
 
 /* We save all intermediate macro expansions on this obstack for the
    duration of a single parse.  The expansion text may sometimes have
@@ -2411,7 +2415,7 @@ lex_one_token (void)
   int c;
   int namelen;
   unsigned int i;
-  char *tokstart;
+  const char *tokstart;
   int saw_structop = last_was_structop;
   char *copy;
 
@@ -2538,7 +2542,7 @@ lex_one_token (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'))
@@ -2590,7 +2594,7 @@ lex_one_token (void)
 
     case '@':
       {
-	char *p = &tokstart[1];
+	const char *p = &tokstart[1];
 	size_t len = strlen ("entry");
 
 	if (parse_language->la_language == language_objc)
@@ -2692,7 +2696,8 @@ lex_one_token (void)
 		 characters; for comparison expressions, e.g. "a < b > c",
 		 there must be spaces before the '<', etc. */
                
-	      char * p = find_template_name_end (tokstart + namelen);
+	      const char *p = find_template_name_end (tokstart + namelen);
+
 	      if (p)
 		namelen = p - tokstart;
 	    }
@@ -2723,7 +2728,8 @@ lex_one_token (void)
       && (tokstart[namelen] == ' ' || tokstart[namelen] == '\t')
       && ! scanning_macro_expansion ())
     {
-      char *p = tokstart + namelen + 1;
+      const char *p = tokstart + namelen + 1;
+
       while (*p == ' ' || *p == '\t')
 	p++;
       if (*p >= '0' && *p <= '9')
@@ -2734,7 +2740,7 @@ lex_one_token (void)
 
   tryname:
 
-  yylval.sval.ptr = tokstart;
+  yylval.sval.ptr = (char *) tokstart;
   yylval.sval.length = namelen;
 
   /* Catch specific keywords.  */
diff --git a/gdb/c-lang.h b/gdb/c-lang.h
index 6bf6591..9f8f50d 100644
--- a/gdb/c-lang.h
+++ b/gdb/c-lang.h
@@ -61,7 +61,7 @@ extern int c_parse (void);
 
 extern void c_error (char *);
 
-extern int c_parse_escape (char **, struct obstack *);
+extern int c_parse_escape (const char **, struct obstack *);
 
 /* Defined in c-typeprint.c */
 extern void c_print_type (struct type *, const char *,
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index 4317ea3..886ba7a 100644
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -666,7 +666,7 @@ source_command (char *args, int from_tty)
 static void
 echo_command (char *text, int from_tty)
 {
-  char *p = text;
+  const char *p = text;
   int c;
 
   if (text)
diff --git a/gdb/cli/cli-setshow.c b/gdb/cli/cli-setshow.c
index 3e41fd4..45df6f6 100644
--- a/gdb/cli/cli-setshow.c
+++ b/gdb/cli/cli-setshow.c
@@ -160,7 +160,7 @@ do_set_command (char *arg, int from_tty, struct cmd_list_element *c)
     case var_string:
       {
 	char *new;
-	char *p;
+	const char *p;
 	char *q;
 	int ch;
 
diff --git a/gdb/f-exp.y b/gdb/f-exp.y
index 296a7fe..9a82230 100644
--- a/gdb/f-exp.y
+++ b/gdb/f-exp.y
@@ -157,7 +157,7 @@ static int match_string_literal (void);
 
 %{
 /* YYSTYPE gets defined by %union */
-static int parse_number (char *, int, int, YYSTYPE *);
+static int parse_number (const char *, int, int, YYSTYPE *);
 %}
 
 %type <voidval> exp  type_exp start variable 
@@ -669,7 +669,7 @@ name_not_typename :	NAME
 /*** Needs some error checking for the float case ***/
 
 static int
-parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
+parse_number (const char *p, int len, int parsed_float, YYSTYPE *putithere)
 {
   LONGEST n = 0;
   LONGEST prevn = 0;
@@ -920,7 +920,7 @@ growbuf_by_size (int count)
 static int
 match_string_literal (void)
 {
-  char *tokptr = lexptr;
+  const char *tokptr = lexptr;
 
   for (tempbufindex = 0, tokptr++; *tokptr != '\0'; tokptr++)
     {
@@ -955,7 +955,7 @@ yylex (void)
   int c;
   int namelen;
   unsigned int i,token;
-  char *tokstart;
+  const char *tokstart;
   
  retry:
  
@@ -1054,7 +1054,7 @@ yylex (void)
       {
         /* It's a number.  */
 	int got_dot = 0, got_e = 0, got_d = 0, toktype;
-	char *p = tokstart;
+	const char *p = tokstart;
 	int hex = input_radix > 10;
 	
 	if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
@@ -1159,7 +1159,7 @@ yylex (void)
 	return f77_keywords[i].token;
       }
   
-  yylval.sval.ptr = tokstart;
+  yylval.sval.ptr = (char *) tokstart;
   yylval.sval.length = namelen;
   
   if (*tokstart == '$')
diff --git a/gdb/go-exp.y b/gdb/go-exp.y
index 2ccb394..166d380 100644
--- a/gdb/go-exp.y
+++ b/gdb/go-exp.y
@@ -158,7 +158,7 @@ void yyerror (char *);
 
 %{
 /* YYSTYPE gets defined by %union.  */
-static int parse_number (char *, int, int, YYSTYPE *);
+static int parse_number (const char *, int, int, YYSTYPE *);
 static int parse_go_float (struct gdbarch *gdbarch, const char *p, int len,
 			   DOUBLEST *d, struct type **t);
 %}
@@ -704,7 +704,7 @@ parse_go_float (struct gdbarch *gdbarch, const char *p, int len,
    as our YYSTYPE is different than c-exp.y's  */
 
 static int
-parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
+parse_number (const char *p, int len, int parsed_float, YYSTYPE *putithere)
 {
   /* FIXME: Shouldn't these be unsigned?  We don't deal with negative values
      here, and we do kind of silly things like cast to unsigned.  */
@@ -908,8 +908,8 @@ static int tempbuf_init;
    number of host characters in the literal.  */
 
 static int
-parse_string_or_char (char *tokptr, char **outptr, struct typed_stoken *value,
-		      int *host_chars)
+parse_string_or_char (const char *tokptr, const char **outptr,
+		      struct typed_stoken *value, int *host_chars)
 {
   int quote;
 
@@ -1049,7 +1049,7 @@ lex_one_token (void)
   int c;
   int namelen;
   unsigned int i;
-  char *tokstart;
+  const char *tokstart;
   int saw_structop = last_was_structop;
   char *copy;
 
@@ -1143,7 +1143,7 @@ lex_one_token (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'))
@@ -1190,7 +1190,7 @@ lex_one_token (void)
 
     case '@':
       {
-	char *p = &tokstart[1];
+	const char *p = &tokstart[1];
 	size_t len = strlen ("entry");
 
 	while (isspace (*p))
@@ -1283,7 +1283,8 @@ lex_one_token (void)
       && strncmp (tokstart, "thread", namelen) == 0
       && (tokstart[namelen] == ' ' || tokstart[namelen] == '\t'))
     {
-      char *p = tokstart + namelen + 1;
+      const char *p = tokstart + namelen + 1;
+
       while (*p == ' ' || *p == '\t')
 	p++;
       if (*p >= '0' && *p <= '9')
@@ -1294,7 +1295,7 @@ lex_one_token (void)
 
   tryname:
 
-  yylval.sval.ptr = tokstart;
+  yylval.sval.ptr = (char *) tokstart;
   yylval.sval.length = namelen;
 
   /* Catch specific keywords.  */
diff --git a/gdb/jv-exp.y b/gdb/jv-exp.y
index a4e1253..c69caf5 100644
--- a/gdb/jv-exp.y
+++ b/gdb/jv-exp.y
@@ -154,7 +154,7 @@ static void insert_exp (int, struct expression *);
 
 %{
 /* YYSTYPE gets defined by %union */
-static int parse_number (char *, int, int, YYSTYPE *);
+static int parse_number (const char *, int, int, YYSTYPE *);
 %}
 
 %type <lval> rcurly Dims Dims_opt
@@ -696,7 +696,7 @@ Expression:
 /*** Needs some error checking for the float case ***/
 
 static int
-parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
+parse_number (const char *p, int len, int parsed_float, YYSTYPE *putithere)
 {
   ULONGEST n = 0;
   ULONGEST limit, limit_div_base;
@@ -858,8 +858,8 @@ yylex (void)
   int c;
   int namelen;
   unsigned int i;
-  char *tokstart;
-  char *tokptr;
+  const char *tokstart;
+  const char *tokptr;
   int tempbufindex;
   static char *tempbuf;
   static int tempbufsize;
@@ -915,7 +915,7 @@ yylex (void)
       c = *lexptr++;
       if (c != '\'')
 	{
-	  namelen = skip_quoted (tokstart) - tokstart;
+	  namelen = skip_quoted ((char *) tokstart) - tokstart;
 	  if (namelen > 2)
 	    {
 	      lexptr = tokstart + namelen;
@@ -966,7 +966,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'))
@@ -1175,7 +1175,7 @@ yylex (void)
       break;
     }
 
-  yylval.sval.ptr = tokstart;
+  yylval.sval.ptr = (char *) tokstart;
   yylval.sval.length = namelen;
 
   if (*tokstart == '$')
diff --git a/gdb/m2-exp.y b/gdb/m2-exp.y
index eaa5a23..47ea640 100644
--- a/gdb/m2-exp.y
+++ b/gdb/m2-exp.y
@@ -662,7 +662,7 @@ type
 static int
 parse_number (int olen)
 {
-  char *p = lexptr;
+  const char *p = lexptr;
   LONGEST n = 0;
   LONGEST prevn = 0;
   int c,i,ischar=0;
@@ -814,7 +814,7 @@ yylex (void)
   int c;
   int namelen;
   int i;
-  char *tokstart;
+  const char *tokstart;
   char quote;
 
  retry:
@@ -907,7 +907,7 @@ yylex (void)
 	  }
       if(c != quote)
 	 error (_("Unterminated string or character constant."));
-      yylval.sval.ptr = tokstart + 1;
+      yylval.sval.ptr = (char *) (tokstart + 1);
       yylval.sval.length = namelen - 1;
       lexptr += namelen + 1;
 
@@ -927,7 +927,7 @@ yylex (void)
     {
       /* It's a number.  */
       int got_dot = 0, got_e = 0;
-      char *p = tokstart;
+      const char *p = tokstart;
       int toktype;
 
       for (++p ;; ++p)
@@ -987,7 +987,7 @@ yylex (void)
 	 && strncmp (tokstart, keytab[i].keyw, namelen) == 0)
 	   return keytab[i].token;
 
-  yylval.sval.ptr = tokstart;
+  yylval.sval.ptr = (char *) tokstart;
   yylval.sval.length = namelen;
 
   if (*tokstart == '$')
diff --git a/gdb/macroexp.c b/gdb/macroexp.c
index d88dac3..3d98550 100644
--- a/gdb/macroexp.c
+++ b/gdb/macroexp.c
@@ -360,8 +360,11 @@ get_character_constant (struct macro_buffer *tok, char *p, char *end)
             }
           else if (*p == '\\')
             {
-              p++;
-	      char_count += c_parse_escape (&p, NULL);
+	      const char *s, *o;
+
+	      s = o = ++p;
+	      char_count += c_parse_escape (&s, NULL);
+	      p += s - o;
             }
           else
 	    {
@@ -414,8 +417,11 @@ get_string_literal (struct macro_buffer *tok, char *p, char *end)
                    "constants."));
           else if (*p == '\\')
             {
-              p++;
-              c_parse_escape (&p, NULL);
+	      const char *s, *o;
+
+	      s = o = ++p;
+	      c_parse_escape (&s, NULL);
+	      p += s - o;
             }
           else
             p++;
@@ -1434,7 +1440,7 @@ macro_expand_once (const char *source,
 
 
 char *
-macro_expand_next (char **lexptr,
+macro_expand_next (const char **lexptr,
                    macro_lookup_ftype *lookup_func,
                    void *lookup_baton)
 {
@@ -1442,7 +1448,7 @@ macro_expand_next (char **lexptr,
   struct cleanup *back_to;
 
   /* Set up SRC to refer to the input text, pointed to by *lexptr.  */
-  init_shared_buffer (&src, *lexptr, strlen (*lexptr));
+  init_shared_buffer (&src, (char *) *lexptr, strlen (*lexptr));
 
   /* Set up DEST to receive the expansion, if there is one.  */
   init_buffer (&dest, 0);
diff --git a/gdb/macroexp.h b/gdb/macroexp.h
index cbe9629..8bf4b7f 100644
--- a/gdb/macroexp.h
+++ b/gdb/macroexp.h
@@ -80,7 +80,7 @@ char *macro_expand_once (const char *source,
    much have to do tokenization to find the end of the string that
    needs to be macro-expanded.  Our C/C++ tokenizer isn't really
    designed to be called by anything but the yacc parser engine.  */
-char *macro_expand_next (char **lexptr,
+char *macro_expand_next (const char **lexptr,
                          macro_lookup_ftype *lookup_func,
                          void *lookup_baton);
 
diff --git a/gdb/p-exp.y b/gdb/p-exp.y
index da8d5f7..e0abd07 100644
--- a/gdb/p-exp.y
+++ b/gdb/p-exp.y
@@ -1141,8 +1141,10 @@ 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)
     for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++)
@@ -1361,13 +1363,18 @@ yylex (void)
 	    /* Do nothing, loop will terminate.  */
 	    break;
 	  case '\\':
-	    tokptr++;
-	    c = parse_escape (parse_gdbarch, &tokptr);
-	    if (c == -1)
-	      {
-		continue;
-	      }
-	    tempbuf[tempbufindex++] = c;
+	    {
+	      const char *s, *o;
+
+	      o = s = ++tokptr;
+	      c = parse_escape (parse_gdbarch, &s);
+	      *tokptr += s - o;
+	      if (c == -1)
+		{
+		  continue;
+		}
+	      tempbuf[tempbufindex++] = c;
+	    }
 	    break;
 	  default:
 	    tempbuf[tempbufindex++] = *tokptr++;
@@ -1623,8 +1630,8 @@ yylex (void)
 	     distinction) named x, then this code incorrectly thinks we
 	     are dealing with nested types rather than a member function.  */
 
-	  char *p;
-	  char *namestart;
+	  const char *p;
+	  const char *namestart;
 	  struct symbol *best_sym;
 
 	  /* Look ahead to detect nested types.  This probably should be
diff --git a/gdb/parse.c b/gdb/parse.c
index 674342b..07c1765 100644
--- a/gdb/parse.c
+++ b/gdb/parse.c
@@ -75,8 +75,8 @@ CORE_ADDR expression_context_pc;
 const struct block *innermost_block;
 int arglist_len;
 static struct type_stack type_stack;
-char *lexptr;
-char *prev_lexptr;
+const char *lexptr;
+const char *prev_lexptr;
 int paren_depth;
 int comma_terminates;
 
@@ -123,7 +123,7 @@ static int prefixify_subexp (struct expression *, struct expression *, int,
 static struct expression *parse_exp_in_context (const char **, CORE_ADDR,
 						const struct block *, int, 
 						int, int *);
-static struct expression *parse_exp_in_context_1 (char **, CORE_ADDR,
+static struct expression *parse_exp_in_context_1 (const char **, CORE_ADDR,
 						  const struct block *, int,
 						  int, int *);
 
@@ -733,8 +733,8 @@ handle_register:
 }
 
 
-char *
-find_template_name_end (char *p)
+const char *
+find_template_name_end (const char *p)
 {
   int depth = 1;
   int just_seen_right = 0;
@@ -1142,16 +1142,8 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
 		      const struct block *block,
 		      int comma, int void_context_p, int *out_subexp)
 {
-  struct expression *expr;
-  char *const_hack = *stringptr ? xstrdup (*stringptr) : NULL;
-  char *orig = const_hack;
-  struct cleanup *back_to = make_cleanup (xfree, const_hack);
-
-  expr = parse_exp_in_context_1 (&const_hack, pc, block, comma,
+  return parse_exp_in_context_1 (stringptr, pc, block, comma,
 				 void_context_p, out_subexp);
-  (*stringptr) += const_hack - orig;
-  do_cleanups (back_to);
-  return expr;
 }
 
 /* As for parse_exp_1, except that if VOID_CONTEXT_P, then
@@ -1162,7 +1154,7 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
    is left untouched.  */
 
 static struct expression *
-parse_exp_in_context_1 (char **stringptr, CORE_ADDR pc,
+parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc,
 			const struct block *block,
 			int comma, int void_context_p, int *out_subexp)
 {
diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h
index 92daca9..aaefe3f 100644
--- a/gdb/parser-defs.h
+++ b/gdb/parser-defs.h
@@ -201,7 +201,7 @@ extern void write_dollar_variable (struct stoken str);
 
 extern void mark_struct_expression (void);
 
-extern char *find_template_name_end (char *);
+extern const char *find_template_name_end (const char *);
 
 extern void start_arglist (void);
 
@@ -264,11 +264,11 @@ extern int parse_c_float (struct gdbarch *gdbarch, const char *p, int len,
 /* During parsing of a C expression, the pointer to the next character
    is in this variable.  */
 
-extern char *lexptr;
+extern const char *lexptr;
 
 /* After a token has been recognized, this variable points to it.
    Currently used only for error reporting.  */
-extern char *prev_lexptr;
+extern const char *prev_lexptr;
 
 /* Current depth in parentheses within the expression.  */
 
diff --git a/gdb/utils.c b/gdb/utils.c
index 0652197..26879ec 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1412,7 +1412,7 @@ host_char_to_target (struct gdbarch *gdbarch, int c, int *target_c)
    after the zeros.  A value of 0 does not mean end of string.  */
 
 int
-parse_escape (struct gdbarch *gdbarch, char **string_ptr)
+parse_escape (struct gdbarch *gdbarch, const char **string_ptr)
 {
   int target_char = -2;	/* Initialize to avoid GCC warnings.  */
   int c = *(*string_ptr)++;
diff --git a/gdb/utils.h b/gdb/utils.h
index 143cd6b..3492f09 100644
--- a/gdb/utils.h
+++ b/gdb/utils.h
@@ -64,7 +64,7 @@ struct timeval get_prompt_for_continue_wait_time (void);
 
 extern int parse_pid_to_attach (char *args);
 
-extern int parse_escape (struct gdbarch *, char **);
+extern int parse_escape (struct gdbarch *, const char **);
 
 char **gdb_buildargv (const char *);
 \f

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA 1/4] Constify LEXPTR
  2013-10-01  4:06 ` Sergio Durigan Junior
  2013-10-01 17:48   ` Keith Seitz
@ 2013-10-01 20:04   ` Tom Tromey
  1 sibling, 0 replies; 5+ messages in thread
From: Tom Tromey @ 2013-10-01 20:04 UTC (permalink / raw)
  To: Sergio Durigan Junior; +Cc: Keith Seitz, gdb-patches@sourceware.org ml

>>>>> "Sergio" == Sergio Durigan Junior <sergiodj@redhat.com> writes:

Sergio> Your patch actually made me remember of another (buried) project
Sergio> of mine which was to make the expout* variables non-global.
Sergio> Maybe it's time to ressurrect it once and for all!

It would be nice to have :)

I also have a few half-finished cleanups I should flush out.

Tom

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFA 1/4] Constify LEXPTR
  2013-10-01 17:48   ` Keith Seitz
@ 2013-10-01 20:04     ` Tom Tromey
  0 siblings, 0 replies; 5+ messages in thread
From: Tom Tromey @ 2013-10-01 20:04 UTC (permalink / raw)
  To: Keith Seitz; +Cc: Sergio Durigan Junior, gdb-patches@sourceware.org ml

>>>>> "Keith" == Keith Seitz <keiths@redhat.com> writes:

Keith> [ChangeLog hasn't changed, so I'm just leaving it in this reply.]

This patch is ok.  Thanks.

Tom

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-10-01 20:04 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-09-30 18:56 [RFA 1/4] Constify LEXPTR Keith Seitz
2013-10-01  4:06 ` Sergio Durigan Junior
2013-10-01 17:48   ` Keith Seitz
2013-10-01 20:04     ` Tom Tromey
2013-10-01 20:04   ` Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).