* [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 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
* 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
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).