gdb: Fix build failure with GCC 7
[deliverable/binutils-gdb.git] / gdb / go-exp.y
index 18669fc68536102e74fe88747e9113c64f9d02dc..f2f359609cd783b40f73f329619d674c585dbe3e 100644 (file)
@@ -1,6 +1,6 @@
 /* YACC parser for Go expressions, for GDB.
 
-   Copyright (C) 2012 Free Software Foundation, Inc.
+   Copyright (C) 2012-2017 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -52,7 +52,6 @@
 %{
 
 #include "defs.h"
-#include "gdb_string.h"
 #include <ctype.h>
 #include "expression.h"
 #include "value.h"
 #include "charset.h"
 #include "block.h"
 
-#define parse_type builtin_type (parse_gdbarch)
-
-/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
-   as well as gratuitiously global symbol names, so we can have multiple
-   yacc generated parsers in gdb.  Note that these are only the variables
-   produced by yacc.  If other parser generators (bison, byacc, etc) produce
-   additional global names that conflict at link time, then those parser
-   generators need to be fixed instead of adding those names to this list.  */
-
-#define        yymaxdepth go_maxdepth
-#define        yyparse go_parse_internal
-#define        yylex   go_lex
-#define        yyerror go_error
-#define        yylval  go_lval
-#define        yychar  go_char
-#define        yydebug go_debug
-#define        yypact  go_pact
-#define        yyr1    go_r1
-#define        yyr2    go_r2
-#define        yydef   go_def
-#define        yychk   go_chk
-#define        yypgo   go_pgo
-#define        yyact   go_act
-#define        yyexca  go_exca
-#define yyerrflag go_errflag
-#define yynerrs        go_nerrs
-#define        yyps    go_ps
-#define        yypv    go_pv
-#define        yys     go_s
-#define        yy_yys  go_yys
-#define        yystate go_state
-#define        yytmp   go_tmp
-#define        yyv     go_v
-#define        yy_yyv  go_yyv
-#define        yyval   go_val
-#define        yylloc  go_lloc
-#define yyreds go_reds         /* With YYDEBUG defined */
-#define yytoks go_toks         /* With YYDEBUG defined */
-#define yyname go_name         /* With YYDEBUG defined */
-#define yyrule go_rule         /* With YYDEBUG defined */
-#define yylhs  go_yylhs
-#define yylen  go_yylen
-#define yydefred go_yydefred
-#define yydgoto        go_yydgoto
-#define yysindex go_yysindex
-#define yyrindex go_yyrindex
-#define yygindex go_yygindex
-#define yytable         go_yytable
-#define yycheck         go_yycheck
-
-#ifndef YYDEBUG
-#define        YYDEBUG 1               /* Default to yydebug support */
-#endif
-
-#define YYFPRINTF parser_fprintf
+#define parse_type(ps) builtin_type (parse_gdbarch (ps))
+
+/* Remap normal yacc parser interface names (yyparse, yylex, yyerror,
+   etc).  */
+#define GDB_YY_REMAP_PREFIX go_
+#include "yy-remap.h"
+
+/* The state of the parser, used internally when we are parsing the
+   expression.  */
+
+static struct parser_state *pstate = NULL;
 
 int yyparse (void);
 
 static int yylex (void);
 
-void yyerror (char *);
+void yyerror (const char *);
 
 %}
 
@@ -158,7 +113,8 @@ void yyerror (char *);
 
 %{
 /* YYSTYPE gets defined by %union.  */
-static int parse_number (char *, int, int, YYSTYPE *);
+static int parse_number (struct parser_state *,
+                        const char *, int, int, YYSTYPE *);
 static int parse_go_float (struct gdbarch *gdbarch, const char *p, int len,
                           DOUBLEST *d, struct type **t);
 %}
@@ -239,77 +195,77 @@ start   : exp1
        ;
 
 type_exp:      type
-                       { write_exp_elt_opcode(OP_TYPE);
-                         write_exp_elt_type($1);
-                         write_exp_elt_opcode(OP_TYPE); }
+                       { write_exp_elt_opcode (pstate, OP_TYPE);
+                         write_exp_elt_type (pstate, $1);
+                         write_exp_elt_opcode (pstate, OP_TYPE); }
        ;
 
 /* Expressions, including the comma operator.  */
 exp1   :       exp
        |       exp1 ',' exp
-                       { write_exp_elt_opcode (BINOP_COMMA); }
+                       { write_exp_elt_opcode (pstate, BINOP_COMMA); }
        ;
 
 /* Expressions, not including the comma operator.  */
 exp    :       '*' exp    %prec UNARY
-                       { write_exp_elt_opcode (UNOP_IND); }
+                       { write_exp_elt_opcode (pstate, UNOP_IND); }
        ;
 
 exp    :       '&' exp    %prec UNARY
-                       { write_exp_elt_opcode (UNOP_ADDR); }
+                       { write_exp_elt_opcode (pstate, UNOP_ADDR); }
        ;
 
 exp    :       '-' exp    %prec UNARY
-                       { write_exp_elt_opcode (UNOP_NEG); }
+                       { write_exp_elt_opcode (pstate, UNOP_NEG); }
        ;
 
 exp    :       '+' exp    %prec UNARY
-                       { write_exp_elt_opcode (UNOP_PLUS); }
+                       { write_exp_elt_opcode (pstate, UNOP_PLUS); }
        ;
 
 exp    :       '!' exp    %prec UNARY
-                       { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
+                       { write_exp_elt_opcode (pstate, UNOP_LOGICAL_NOT); }
        ;
 
 exp    :       '^' exp    %prec UNARY
-                       { write_exp_elt_opcode (UNOP_COMPLEMENT); }
+                       { write_exp_elt_opcode (pstate, UNOP_COMPLEMENT); }
        ;
 
 exp    :       exp INCREMENT    %prec UNARY
-                       { write_exp_elt_opcode (UNOP_POSTINCREMENT); }
+                       { write_exp_elt_opcode (pstate, UNOP_POSTINCREMENT); }
        ;
 
 exp    :       exp DECREMENT    %prec UNARY
-                       { write_exp_elt_opcode (UNOP_POSTDECREMENT); }
+                       { write_exp_elt_opcode (pstate, UNOP_POSTDECREMENT); }
        ;
 
 /* foo->bar is not in Go.  May want as a gdb extension.  Later.  */
 
 exp    :       exp '.' name_not_typename
-                       { write_exp_elt_opcode (STRUCTOP_STRUCT);
-                         write_exp_string ($3.stoken);
-                         write_exp_elt_opcode (STRUCTOP_STRUCT); }
+                       { write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
+                         write_exp_string (pstate, $3.stoken);
+                         write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); }
        ;
 
 exp    :       exp '.' name_not_typename COMPLETE
-                       { mark_struct_expression ();
-                         write_exp_elt_opcode (STRUCTOP_STRUCT);
-                         write_exp_string ($3.stoken);
-                         write_exp_elt_opcode (STRUCTOP_STRUCT); }
+                       { mark_struct_expression (pstate);
+                         write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
+                         write_exp_string (pstate, $3.stoken);
+                         write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); }
        ;
 
 exp    :       exp '.' COMPLETE
                        { struct stoken s;
-                         mark_struct_expression ();
-                         write_exp_elt_opcode (STRUCTOP_STRUCT);
+                         mark_struct_expression (pstate);
+                         write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
                          s.ptr = "";
                          s.length = 0;
-                         write_exp_string (s);
-                         write_exp_elt_opcode (STRUCTOP_STRUCT); }
+                         write_exp_string (pstate, s);
+                         write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); }
        ;
 
 exp    :       exp '[' exp1 ']'
-                       { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
+                       { write_exp_elt_opcode (pstate, BINOP_SUBSCRIPT); }
        ;
 
 exp    :       exp '('
@@ -317,9 +273,10 @@ exp        :       exp '('
                           being accumulated by an outer function call.  */
                        { start_arglist (); }
                arglist ')'     %prec LEFT_ARROW
-                       { write_exp_elt_opcode (OP_FUNCALL);
-                         write_exp_elt_longcst ((LONGEST) end_arglist ());
-                         write_exp_elt_opcode (OP_FUNCALL); }
+                       { write_exp_elt_opcode (pstate, OP_FUNCALL);
+                         write_exp_elt_longcst (pstate,
+                                                (LONGEST) end_arglist ());
+                         write_exp_elt_opcode (pstate, OP_FUNCALL); }
        ;
 
 lcurly :       '{'
@@ -342,15 +299,15 @@ rcurly    :       '}'
        ;
 
 exp    :       lcurly type rcurly exp  %prec UNARY
-                       { write_exp_elt_opcode (UNOP_MEMVAL);
-                         write_exp_elt_type ($2);
-                         write_exp_elt_opcode (UNOP_MEMVAL); }
+                       { write_exp_elt_opcode (pstate, UNOP_MEMVAL);
+                         write_exp_elt_type (pstate, $2);
+                         write_exp_elt_opcode (pstate, UNOP_MEMVAL); }
        ;
 
 exp    :       type '(' exp ')'  %prec UNARY
-                       { write_exp_elt_opcode (UNOP_CAST);
-                         write_exp_elt_type ($1);
-                         write_exp_elt_opcode (UNOP_CAST); }
+                       { write_exp_elt_opcode (pstate, UNOP_CAST);
+                         write_exp_elt_type (pstate, $1);
+                         write_exp_elt_opcode (pstate, UNOP_CAST); }
        ;
 
 exp    :       '(' exp1 ')'
@@ -360,100 +317,100 @@ exp     :       '(' exp1 ')'
 /* Binary operators in order of decreasing precedence.  */
 
 exp    :       exp '@' exp
-                       { write_exp_elt_opcode (BINOP_REPEAT); }
+                       { write_exp_elt_opcode (pstate, BINOP_REPEAT); }
        ;
 
 exp    :       exp '*' exp
-                       { write_exp_elt_opcode (BINOP_MUL); }
+                       { write_exp_elt_opcode (pstate, BINOP_MUL); }
        ;
 
 exp    :       exp '/' exp
-                       { write_exp_elt_opcode (BINOP_DIV); }
+                       { write_exp_elt_opcode (pstate, BINOP_DIV); }
        ;
 
 exp    :       exp '%' exp
-                       { write_exp_elt_opcode (BINOP_REM); }
+                       { write_exp_elt_opcode (pstate, BINOP_REM); }
        ;
 
 exp    :       exp '+' exp
-                       { write_exp_elt_opcode (BINOP_ADD); }
+                       { write_exp_elt_opcode (pstate, BINOP_ADD); }
        ;
 
 exp    :       exp '-' exp
-                       { write_exp_elt_opcode (BINOP_SUB); }
+                       { write_exp_elt_opcode (pstate, BINOP_SUB); }
        ;
 
 exp    :       exp LSH exp
-                       { write_exp_elt_opcode (BINOP_LSH); }
+                       { write_exp_elt_opcode (pstate, BINOP_LSH); }
        ;
 
 exp    :       exp RSH exp
-                       { write_exp_elt_opcode (BINOP_RSH); }
+                       { write_exp_elt_opcode (pstate, BINOP_RSH); }
        ;
 
 exp    :       exp EQUAL exp
-                       { write_exp_elt_opcode (BINOP_EQUAL); }
+                       { write_exp_elt_opcode (pstate, BINOP_EQUAL); }
        ;
 
 exp    :       exp NOTEQUAL exp
-                       { write_exp_elt_opcode (BINOP_NOTEQUAL); }
+                       { write_exp_elt_opcode (pstate, BINOP_NOTEQUAL); }
        ;
 
 exp    :       exp LEQ exp
-                       { write_exp_elt_opcode (BINOP_LEQ); }
+                       { write_exp_elt_opcode (pstate, BINOP_LEQ); }
        ;
 
 exp    :       exp GEQ exp
-                       { write_exp_elt_opcode (BINOP_GEQ); }
+                       { write_exp_elt_opcode (pstate, BINOP_GEQ); }
        ;
 
 exp    :       exp '<' exp
-                       { write_exp_elt_opcode (BINOP_LESS); }
+                       { write_exp_elt_opcode (pstate, BINOP_LESS); }
        ;
 
 exp    :       exp '>' exp
-                       { write_exp_elt_opcode (BINOP_GTR); }
+                       { write_exp_elt_opcode (pstate, BINOP_GTR); }
        ;
 
 exp    :       exp '&' exp
-                       { write_exp_elt_opcode (BINOP_BITWISE_AND); }
+                       { write_exp_elt_opcode (pstate, BINOP_BITWISE_AND); }
        ;
 
 exp    :       exp '^' exp
-                       { write_exp_elt_opcode (BINOP_BITWISE_XOR); }
+                       { write_exp_elt_opcode (pstate, BINOP_BITWISE_XOR); }
        ;
 
 exp    :       exp '|' exp
-                       { write_exp_elt_opcode (BINOP_BITWISE_IOR); }
+                       { write_exp_elt_opcode (pstate, BINOP_BITWISE_IOR); }
        ;
 
 exp    :       exp ANDAND exp
-                       { write_exp_elt_opcode (BINOP_LOGICAL_AND); }
+                       { write_exp_elt_opcode (pstate, BINOP_LOGICAL_AND); }
        ;
 
 exp    :       exp OROR exp
-                       { write_exp_elt_opcode (BINOP_LOGICAL_OR); }
+                       { write_exp_elt_opcode (pstate, BINOP_LOGICAL_OR); }
        ;
 
 exp    :       exp '?' exp ':' exp     %prec '?'
-                       { write_exp_elt_opcode (TERNOP_COND); }
+                       { write_exp_elt_opcode (pstate, TERNOP_COND); }
        ;
 
 exp    :       exp '=' exp
-                       { write_exp_elt_opcode (BINOP_ASSIGN); }
+                       { write_exp_elt_opcode (pstate, BINOP_ASSIGN); }
        ;
 
 exp    :       exp ASSIGN_MODIFY exp
-                       { write_exp_elt_opcode (BINOP_ASSIGN_MODIFY);
-                         write_exp_elt_opcode ($2);
-                         write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); }
+                       { write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY);
+                         write_exp_elt_opcode (pstate, $2);
+                         write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY); }
        ;
 
 exp    :       INT
-                       { write_exp_elt_opcode (OP_LONG);
-                         write_exp_elt_type ($1.type);
-                         write_exp_elt_longcst ((LONGEST)($1.val));
-                         write_exp_elt_opcode (OP_LONG); }
+                       { write_exp_elt_opcode (pstate, OP_LONG);
+                         write_exp_elt_type (pstate, $1.type);
+                         write_exp_elt_longcst (pstate, (LONGEST)($1.val));
+                         write_exp_elt_opcode (pstate, OP_LONG); }
        ;
 
 exp    :       CHAR
@@ -461,28 +418,28 @@ exp       :       CHAR
                          struct stoken_vector vec;
                          vec.len = 1;
                          vec.tokens = &$1;
-                         write_exp_string_vector ($1.type, &vec);
+                         write_exp_string_vector (pstate, $1.type, &vec);
                        }
        ;
 
 exp    :       NAME_OR_INT
                        { YYSTYPE val;
-                         parse_number ($1.stoken.ptr, $1.stoken.length,
-                                       0, &val);
-                         write_exp_elt_opcode (OP_LONG);
-                         write_exp_elt_type (val.typed_val_int.type);
-                         write_exp_elt_longcst ((LONGEST)
+                         parse_number (pstate, $1.stoken.ptr,
+                                       $1.stoken.length, 0, &val);
+                         write_exp_elt_opcode (pstate, OP_LONG);
+                         write_exp_elt_type (pstate, val.typed_val_int.type);
+                         write_exp_elt_longcst (pstate, (LONGEST)
                                                 val.typed_val_int.val);
-                         write_exp_elt_opcode (OP_LONG);
+                         write_exp_elt_opcode (pstate, OP_LONG);
                        }
        ;
 
 
 exp    :       FLOAT
-                       { write_exp_elt_opcode (OP_DOUBLE);
-                         write_exp_elt_type ($1.type);
-                         write_exp_elt_dblcst ($1.dval);
-                         write_exp_elt_opcode (OP_DOUBLE); }
+                       { write_exp_elt_opcode (pstate, OP_DOUBLE);
+                         write_exp_elt_type (pstate, $1.type);
+                         write_exp_elt_dblcst (pstate, $1.dval);
+                         write_exp_elt_opcode (pstate, OP_DOUBLE); }
        ;
 
 exp    :       variable
@@ -490,26 +447,29 @@ exp       :       variable
 
 exp    :       DOLLAR_VARIABLE
                        {
-                         write_dollar_variable ($1);
+                         write_dollar_variable (pstate, $1);
                        }
        ;
 
 exp    :       SIZEOF_KEYWORD '(' type ')'  %prec UNARY
                        {
                          /* TODO(dje): Go objects in structs.  */
-                         write_exp_elt_opcode (OP_LONG);
+                         write_exp_elt_opcode (pstate, OP_LONG);
                          /* TODO(dje): What's the right type here?  */
-                         write_exp_elt_type (parse_type->builtin_unsigned_int);
-                         CHECK_TYPEDEF ($3);
-                         write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
-                         write_exp_elt_opcode (OP_LONG);
+                         write_exp_elt_type
+                           (pstate,
+                            parse_type (pstate)->builtin_unsigned_int);
+                         $3 = check_typedef ($3);
+                         write_exp_elt_longcst (pstate,
+                                                (LONGEST) TYPE_LENGTH ($3));
+                         write_exp_elt_opcode (pstate, OP_LONG);
                        }
        ;
 
 exp    :       SIZEOF_KEYWORD  '(' exp ')'  %prec UNARY
                        {
                          /* TODO(dje): Go objects in structs.  */
-                         write_exp_elt_opcode (UNOP_SIZEOF);
+                         write_exp_elt_opcode (pstate, UNOP_SIZEOF);
                        }
 
 string_exp:
@@ -526,7 +486,7 @@ string_exp:
 
                          vec->type = $1.type;
                          vec->length = $1.length;
-                         vec->ptr = malloc ($1.length + 1);
+                         vec->ptr = (char *) malloc ($1.length + 1);
                          memcpy (vec->ptr, $1.ptr, $1.length + 1);
                        }
 
@@ -536,10 +496,10 @@ string_exp:
                             for convenience.  */
                          char *p;
                          ++$$.len;
-                         $$.tokens = realloc ($$.tokens,
-                                              $$.len * sizeof (struct typed_stoken));
+                         $$.tokens = XRESIZEVEC (struct typed_stoken,
+                                                 $$.tokens, $$.len);
 
-                         p = malloc ($3.length + 1);
+                         p = (char *) malloc ($3.length + 1);
                          memcpy (p, $3.ptr, $3.length + 1);
 
                          $$.tokens[$$.len - 1].type = $3.type;
@@ -552,7 +512,8 @@ exp :       string_exp  %prec ABOVE_COMMA
                        {
                          int i;
 
-                         write_exp_string_vector (0 /*always utf8*/, &$1);
+                         write_exp_string_vector (pstate, 0 /*always utf8*/,
+                                                  &$1);
                          for (i = 0; i < $1.len; ++i)
                            free ($1.tokens[i].ptr);
                          free ($1.tokens);
@@ -560,19 +521,19 @@ exp       :       string_exp  %prec ABOVE_COMMA
        ;
 
 exp    :       TRUE_KEYWORD
-                       { write_exp_elt_opcode (OP_BOOL);
-                         write_exp_elt_longcst ((LONGEST) $1);
-                         write_exp_elt_opcode (OP_BOOL); }
+                       { write_exp_elt_opcode (pstate, OP_BOOL);
+                         write_exp_elt_longcst (pstate, (LONGEST) $1);
+                         write_exp_elt_opcode (pstate, OP_BOOL); }
        ;
 
 exp    :       FALSE_KEYWORD
-                       { write_exp_elt_opcode (OP_BOOL);
-                         write_exp_elt_longcst ((LONGEST) $1);
-                         write_exp_elt_opcode (OP_BOOL); }
+                       { write_exp_elt_opcode (pstate, OP_BOOL);
+                         write_exp_elt_longcst (pstate, (LONGEST) $1);
+                         write_exp_elt_opcode (pstate, OP_BOOL); }
        ;
 
 variable:      name_not_typename ENTRY
-                       { struct symbol *sym = $1.sym;
+                       { struct symbol *sym = $1.sym.symbol;
 
                          if (sym == NULL
                              || !SYMBOL_IS_ARGUMENT (sym)
@@ -581,32 +542,29 @@ variable: name_not_typename ENTRY
                                     "parameters, not for \"%s\""),
                                   copy_name ($1.stoken));
 
-                         write_exp_elt_opcode (OP_VAR_ENTRY_VALUE);
-                         write_exp_elt_sym (sym);
-                         write_exp_elt_opcode (OP_VAR_ENTRY_VALUE);
+                         write_exp_elt_opcode (pstate, OP_VAR_ENTRY_VALUE);
+                         write_exp_elt_sym (pstate, sym);
+                         write_exp_elt_opcode (pstate, OP_VAR_ENTRY_VALUE);
                        }
        ;
 
 variable:      name_not_typename
-                       { struct symbol *sym = $1.sym;
+                       { struct block_symbol sym = $1.sym;
 
-                         if (sym)
+                         if (sym.symbol)
                            {
-                             if (symbol_read_needs_frame (sym))
+                             if (symbol_read_needs_frame (sym.symbol))
                                {
                                  if (innermost_block == 0
-                                     || contained_in (block_found,
+                                     || contained_in (sym.block,
                                                       innermost_block))
-                                   innermost_block = block_found;
+                                   innermost_block = sym.block;
                                }
 
-                             write_exp_elt_opcode (OP_VAR_VALUE);
-                             /* We want to use the selected frame, not
-                                another more inner frame which happens to
-                                be in the same block.  */
-                             write_exp_elt_block (NULL);
-                             write_exp_elt_sym (sym);
-                             write_exp_elt_opcode (OP_VAR_VALUE);
+                             write_exp_elt_opcode (pstate, OP_VAR_VALUE);
+                             write_exp_elt_block (pstate, sym.block);
+                             write_exp_elt_sym (pstate, sym.symbol);
+                             write_exp_elt_opcode (pstate, OP_VAR_VALUE);
                            }
                          else if ($1.is_a_field_of_this)
                            {
@@ -616,13 +574,13 @@ variable: name_not_typename
                            }
                          else
                            {
-                             struct minimal_symbol *msymbol;
+                             struct bound_minimal_symbol msymbol;
                              char *arg = copy_name ($1.stoken);
 
                              msymbol =
-                               lookup_minimal_symbol (arg, NULL, NULL);
-                             if (msymbol != NULL)
-                               write_exp_msymbol (msymbol);
+                               lookup_bound_minimal_symbol (arg);
+                             if (msymbol.minsym != NULL)
+                               write_exp_msymbol (pstate, msymbol);
                              else if (!have_full_symbols ()
                                       && !have_partial_symbols ())
                                error (_("No symbol table is loaded.  "
@@ -652,7 +610,7 @@ type  /* Implements (approximately): [*] type-specifier */
                                              expression_context_block); }
 */
        |       BYTE_KEYWORD
-                       { $$ = builtin_go_type (parse_gdbarch)
+                       { $$ = builtin_go_type (parse_gdbarch (pstate))
                            ->builtin_uint8; }
        ;
 
@@ -704,7 +662,8 @@ 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 (struct parser_state *par_state,
+             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.  */
@@ -729,7 +688,7 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
 
   if (parsed_float)
     {
-      if (! parse_go_float (parse_gdbarch, p, len,
+      if (! parse_go_float (parse_gdbarch (par_state), p, len,
                            &putithere->typed_val_float.dval,
                            &putithere->typed_val_float.type))
        return ERROR;
@@ -845,9 +804,10 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
 
   un = (ULONGEST)n >> 2;
   if (long_p == 0
-      && (un >> (gdbarch_int_bit (parse_gdbarch) - 2)) == 0)
+      && (un >> (gdbarch_int_bit (parse_gdbarch (par_state)) - 2)) == 0)
     {
-      high_bit = ((ULONGEST)1) << (gdbarch_int_bit (parse_gdbarch) - 1);
+      high_bit
+        = ((ULONGEST)1) << (gdbarch_int_bit (parse_gdbarch (par_state)) - 1);
 
       /* A large decimal (not hex or octal) constant (between INT_MAX
         and UINT_MAX) is a long or unsigned long, according to ANSI,
@@ -855,28 +815,29 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
         int.  This probably should be fixed.  GCC gives a warning on
         such constants.  */
 
-      unsigned_type = parse_type->builtin_unsigned_int;
-      signed_type = parse_type->builtin_int;
+      unsigned_type = parse_type (par_state)->builtin_unsigned_int;
+      signed_type = parse_type (par_state)->builtin_int;
     }
   else if (long_p <= 1
-          && (un >> (gdbarch_long_bit (parse_gdbarch) - 2)) == 0)
+          && (un >> (gdbarch_long_bit (parse_gdbarch (par_state)) - 2)) == 0)
     {
-      high_bit = ((ULONGEST)1) << (gdbarch_long_bit (parse_gdbarch) - 1);
-      unsigned_type = parse_type->builtin_unsigned_long;
-      signed_type = parse_type->builtin_long;
+      high_bit
+       = ((ULONGEST)1) << (gdbarch_long_bit (parse_gdbarch (par_state)) - 1);
+      unsigned_type = parse_type (par_state)->builtin_unsigned_long;
+      signed_type = parse_type (par_state)->builtin_long;
     }
   else
     {
       int shift;
       if (sizeof (ULONGEST) * HOST_CHAR_BIT
-         < gdbarch_long_long_bit (parse_gdbarch))
+         < gdbarch_long_long_bit (parse_gdbarch (par_state)))
        /* A long long does not fit in a LONGEST.  */
        shift = (sizeof (ULONGEST) * HOST_CHAR_BIT - 1);
       else
-       shift = (gdbarch_long_long_bit (parse_gdbarch) - 1);
+       shift = (gdbarch_long_long_bit (parse_gdbarch (par_state)) - 1);
       high_bit = (ULONGEST) 1 << shift;
-      unsigned_type = parse_type->builtin_unsigned_long_long;
-      signed_type = parse_type->builtin_long_long;
+      unsigned_type = parse_type (par_state)->builtin_unsigned_long_long;
+      signed_type = parse_type (par_state)->builtin_long_long;
     }
 
    putithere->typed_val_int.val = n;
@@ -908,8 +869,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;
 
@@ -965,7 +926,7 @@ parse_string_or_char (char *tokptr, char **outptr, struct typed_stoken *value,
   ++tokptr;
 
   value->type = C_STRING | (quote == '\'' ? C_CHAR : 0); /*FIXME*/
-  value->ptr = obstack_base (&tempbuf);
+  value->ptr = (char *) obstack_base (&tempbuf);
   value->length = obstack_object_size (&tempbuf);
 
   *outptr = tokptr;
@@ -975,7 +936,7 @@ parse_string_or_char (char *tokptr, char **outptr, struct typed_stoken *value,
 
 struct token
 {
-  char *operator;
+  const char *oper;
   int token;
   enum exp_opcode opcode;
 };
@@ -1044,12 +1005,12 @@ static int last_was_structop;
 /* Read one token, getting characters through lexptr.  */
 
 static int
-lex_one_token (void)
+lex_one_token (struct parser_state *par_state)
 {
   int c;
   int namelen;
   unsigned int i;
-  char *tokstart;
+  const char *tokstart;
   int saw_structop = last_was_structop;
   char *copy;
 
@@ -1062,7 +1023,7 @@ lex_one_token (void)
   tokstart = lexptr;
   /* See if it is a special token of length 3.  */
   for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++)
-    if (strncmp (tokstart, tokentab3[i].operator, 3) == 0)
+    if (strncmp (tokstart, tokentab3[i].oper, 3) == 0)
       {
        lexptr += 3;
        yylval.opcode = tokentab3[i].opcode;
@@ -1071,7 +1032,7 @@ lex_one_token (void)
 
   /* See if it is a special token of length 2.  */
   for (i = 0; i < sizeof (tokentab2) / sizeof (tokentab2[0]); i++)
-    if (strncmp (tokstart, tokentab2[i].operator, 2) == 0)
+    if (strncmp (tokstart, tokentab2[i].oper, 2) == 0)
       {
        lexptr += 2;
        yylval.opcode = tokentab2[i].opcode;
@@ -1124,7 +1085,7 @@ lex_one_token (void)
       /* Might be a floating point number.  */
       if (lexptr[1] < '0' || lexptr[1] > '9')
        {
-         if (in_parse_field)
+         if (parse_completion)
            last_was_structop = 1;
          goto symbol;          /* Nope, must be a symbol. */
        }
@@ -1143,7 +1104,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'))
@@ -1175,7 +1136,8 @@ lex_one_token (void)
                                  && (*p < 'A' || *p > 'Z')))
              break;
          }
-       toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval);
+       toktype = parse_number (par_state, tokstart, p - tokstart,
+                               got_dot|got_e, &yylval);
         if (toktype == ERROR)
          {
            char *err_copy = (char *) alloca (p - tokstart + 1);
@@ -1190,7 +1152,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 +1245,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')
@@ -1300,7 +1263,7 @@ lex_one_token (void)
   /* Catch specific keywords.  */
   copy = copy_name (yylval.sval);
   for (i = 0; i < sizeof (ident_tokens) / sizeof (ident_tokens[0]); i++)
-    if (strcmp (copy, ident_tokens[i].operator) == 0)
+    if (strcmp (copy, ident_tokens[i].oper) == 0)
       {
        /* It is ok to always set this, even though we don't always
           strictly need to.  */
@@ -1311,7 +1274,7 @@ lex_one_token (void)
   if (*tokstart == '$')
     return DOLLAR_VARIABLE;
 
-  if (in_parse_field && *lexptr == '\0')
+  if (parse_completion && *lexptr == '\0')
     saw_name_at_eof = 1;
   return NAME;
 }
@@ -1334,7 +1297,7 @@ static int popping;
 
 /* Temporary storage for yylex; this holds symbol names as they are
    built up.  */
-static struct obstack name_obstack;
+static auto_obstack name_obstack;
 
 /* Build "package.name" in name_obstack.
    For convenience of the caller, the name is NUL-terminated,
@@ -1346,12 +1309,12 @@ build_packaged_name (const char *package, int package_len,
 {
   struct stoken result;
 
-  obstack_free (&name_obstack, obstack_base (&name_obstack));
+  name_obstack.clear ();
   obstack_grow (&name_obstack, package, package_len);
   obstack_grow_str (&name_obstack, ".");
   obstack_grow (&name_obstack, name, name_len);
   obstack_grow (&name_obstack, "", 1);
-  result.ptr = obstack_base (&name_obstack);
+  result.ptr = (char *) obstack_base (&name_obstack);
   result.length = obstack_object_size (&name_obstack) - 1;
 
   return result;
@@ -1365,9 +1328,9 @@ static int
 package_name_p (const char *name, const struct block *block)
 {
   struct symbol *sym;
-  int is_a_field_of_this;
+  struct field_of_this_result is_a_field_of_this;
 
-  sym = lookup_symbol (name, block, STRUCT_DOMAIN, &is_a_field_of_this);
+  sym = lookup_symbol (name, block, STRUCT_DOMAIN, &is_a_field_of_this).symbol;
 
   if (sym
       && SYMBOL_CLASS (sym) == LOC_TYPEDEF
@@ -1405,17 +1368,17 @@ static int
 classify_packaged_name (const struct block *block)
 {
   char *copy;
-  struct symbol *sym;
-  int is_a_field_of_this = 0;
+  struct block_symbol sym;
+  struct field_of_this_result is_a_field_of_this;
 
   copy = copy_name (yylval.sval);
 
   sym = lookup_symbol (copy, block, VAR_DOMAIN, &is_a_field_of_this);
 
-  if (sym)
+  if (sym.symbol)
     {
       yylval.ssym.sym = sym;
-      yylval.ssym.is_a_field_of_this = is_a_field_of_this;
+      yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
     }
 
   return NAME;
@@ -1430,18 +1393,19 @@ classify_packaged_name (const struct block *block)
    The result is one of NAME, NAME_OR_INT, or TYPENAME.  */
 
 static int
-classify_name (const struct block *block)
+classify_name (struct parser_state *par_state, const struct block *block)
 {
   struct type *type;
-  struct symbol *sym;
+  struct block_symbol sym;
   char *copy;
-  int is_a_field_of_this = 0;
+  struct field_of_this_result is_a_field_of_this;
 
   copy = copy_name (yylval.sval);
 
   /* Try primitive types first so they win over bad/weird debug info.  */
-  type = language_lookup_primitive_type_by_name (parse_language,
-                                                parse_gdbarch, copy);
+  type = language_lookup_primitive_type (parse_language (par_state),
+                                        parse_gdbarch (par_state),
+                                        copy);
   if (type != NULL)
     {
       /* NOTE: We take advantage of the fact that yylval coming in was a
@@ -1455,10 +1419,10 @@ classify_name (const struct block *block)
 
   sym = lookup_symbol (copy, block, VAR_DOMAIN, &is_a_field_of_this);
 
-  if (sym)
+  if (sym.symbol)
     {
       yylval.ssym.sym = sym;
-      yylval.ssym.is_a_field_of_this = is_a_field_of_this;
+      yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
       return NAME;
     }
 
@@ -1480,11 +1444,11 @@ classify_name (const struct block *block)
        xfree (current_package_name);
        sym = lookup_symbol (sval.ptr, block, VAR_DOMAIN,
                             &is_a_field_of_this);
-       if (sym)
+       if (sym.symbol)
          {
            yylval.ssym.stoken = sval;
            yylval.ssym.sym = sym;
-           yylval.ssym.is_a_field_of_this = is_a_field_of_this;
+           yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
            return NAME;
          }
       }
@@ -1497,16 +1461,19 @@ classify_name (const struct block *block)
       || (copy[0] >= 'A' && copy[0] < 'A' + input_radix - 10))
     {
       YYSTYPE newlval; /* Its value is ignored.  */
-      int hextype = parse_number (copy, yylval.sval.length, 0, &newlval);
+      int hextype = parse_number (par_state, copy, yylval.sval.length,
+                                 0, &newlval);
       if (hextype == INT)
        {
-         yylval.ssym.sym = NULL;
+         yylval.ssym.sym.symbol = NULL;
+         yylval.ssym.sym.block = NULL;
          yylval.ssym.is_a_field_of_this = 0;
          return NAME_OR_INT;
        }
     }
 
-  yylval.ssym.sym = NULL;
+  yylval.ssym.sym.symbol = NULL;
+  yylval.ssym.sym.block = NULL;
   yylval.ssym.is_a_field_of_this = 0;
   return NAME;
 }
@@ -1530,7 +1497,7 @@ yylex (void)
     }
   popping = 0;
 
-  current.token = lex_one_token ();
+  current.token = lex_one_token (pstate);
 
   /* TODO: Need a way to force specifying name1 as a package.
      .name1.name2 ?  */
@@ -1541,14 +1508,14 @@ yylex (void)
   /* See if we have "name1 . name2".  */
 
   current.value = yylval;
-  next.token = lex_one_token ();
+  next.token = lex_one_token (pstate);
   next.value = yylval;
 
   if (next.token == '.')
     {
       token_and_value name2;
 
-      name2.token = lex_one_token ();
+      name2.token = lex_one_token (pstate);
       name2.value = yylval;
 
       if (name2.token == NAME)
@@ -1587,17 +1554,26 @@ yylex (void)
 
   popping = 1;
   yylval = current.value;
-  return classify_name (expression_context_block);
+  return classify_name (pstate, expression_context_block);
 }
 
 int
-go_parse (void)
+go_parse (struct parser_state *par_state)
 {
   int result;
-  struct cleanup *back_to = make_cleanup (null_cleanup, NULL);
+  struct cleanup *back_to;
+
+  /* Setting up the parser state.  */
+  gdb_assert (par_state != NULL);
+  pstate = par_state;
+
+  /* Note that parsing (within yyparse) freely installs cleanups
+     assuming they'll be run here (below).  */
+  back_to = make_cleanup (null_cleanup, NULL);
 
-  make_cleanup_restore_integer (&yydebug);
-  yydebug = parser_debug;
+  scoped_restore restore_yydebug = make_scoped_restore (&yydebug,
+                                                       parser_debug);
+  make_cleanup_clear_parser_state (&pstate);
 
   /* Initialize some state used by the lexer.  */
   last_was_structop = 0;
@@ -1605,8 +1581,7 @@ go_parse (void)
 
   VEC_free (token_and_value, token_fifo);
   popping = 0;
-  obstack_init (&name_obstack);
-  make_cleanup_obstack_free (&name_obstack);
+  name_obstack.clear ();
 
   result = yyparse ();
   do_cleanups (back_to);
@@ -1614,7 +1589,7 @@ go_parse (void)
 }
 
 void
-yyerror (char *msg)
+yyerror (const char *msg)
 {
   if (prev_lexptr)
     lexptr = prev_lexptr;
This page took 0.041155 seconds and 4 git commands to generate.