* read.c (read_a_source_file): Rearrange evaluation order when
[deliverable/binutils-gdb.git] / gdb / c-exp.y
index bd04dc28b6a2bfacb7f3e4de8ce71c7e0bbfcb6d..153e2be3cf8a188549d81c65452d8e2270209c66 100644 (file)
@@ -55,6 +55,8 @@ Boston, MA 02110-1301, USA.  */
 #include "cp-support.h"
 #include "dfp.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
@@ -182,7 +184,7 @@ static int parse_number (char *, int, int, YYSTYPE *);
 %token <ssym> NAME /* BLOCKNAME defined below to give it higher precedence. */
 %token <voidval> COMPLETE
 %token <tsym> TYPENAME
-%type <sval> name
+%type <sval> name string_exp
 %type <ssym> name_not_typename
 %type <tsym> typename
 
@@ -554,13 +556,40 @@ exp       :       VARIABLE
 
 exp    :       SIZEOF '(' type ')'     %prec UNARY
                        { write_exp_elt_opcode (OP_LONG);
-                         write_exp_elt_type (builtin_type (current_gdbarch)->builtin_int);
+                         write_exp_elt_type (parse_type->builtin_int);
                          CHECK_TYPEDEF ($3);
                          write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
                          write_exp_elt_opcode (OP_LONG); }
        ;
 
-exp    :       STRING
+string_exp:
+               STRING
+                       {
+                         /* We copy the string here, and not in the
+                            lexer, to guarantee that we do not leak a
+                            string.  Note that we follow the
+                            NUL-termination convention of the
+                            lexer.  */
+                         $$.length = $1.length;
+                         $$.ptr = malloc ($1.length + 1);
+                         memcpy ($$.ptr, $1.ptr, $1.length + 1);
+                       }
+
+       |       string_exp STRING
+                       {
+                         /* Note that we NUL-terminate here, but just
+                            for convenience.  */
+                         struct stoken t;
+                         t.length = $1.length + $2.length;
+                         t.ptr = malloc (t.length + 1);
+                         memcpy (t.ptr, $1.ptr, $1.length);
+                         memcpy (t.ptr + $1.length, $2.ptr, $2.length + 1);
+                         free ($1.ptr);
+                         $$ = t;
+                       }
+               ;
+
+exp    :       string_exp
                        { /* C strings are converted into array constants with
                             an explicit null byte added at the end.  Thus
                             the array upper bound is the string length.
@@ -570,31 +599,33 @@ exp       :       STRING
                          while (count-- > 0)
                            {
                              write_exp_elt_opcode (OP_LONG);
-                             write_exp_elt_type (builtin_type (current_gdbarch)->builtin_char);
+                             write_exp_elt_type (parse_type->builtin_char);
                              write_exp_elt_longcst ((LONGEST)(*sp++));
                              write_exp_elt_opcode (OP_LONG);
                            }
                          write_exp_elt_opcode (OP_LONG);
-                         write_exp_elt_type (builtin_type (current_gdbarch)->builtin_char);
+                         write_exp_elt_type (parse_type->builtin_char);
                          write_exp_elt_longcst ((LONGEST)'\0');
                          write_exp_elt_opcode (OP_LONG);
                          write_exp_elt_opcode (OP_ARRAY);
                          write_exp_elt_longcst ((LONGEST) 0);
                          write_exp_elt_longcst ((LONGEST) ($1.length));
-                         write_exp_elt_opcode (OP_ARRAY); }
+                         write_exp_elt_opcode (OP_ARRAY);
+                         free ($1.ptr);
+                       }
        ;
 
 /* C++.  */
 exp     :       TRUEKEYWORD    
                         { write_exp_elt_opcode (OP_LONG);
-                          write_exp_elt_type (builtin_type (current_gdbarch)->builtin_bool);
+                          write_exp_elt_type (parse_type->builtin_bool);
                           write_exp_elt_longcst ((LONGEST) 1);
                           write_exp_elt_opcode (OP_LONG); }
        ;
 
 exp     :       FALSEKEYWORD   
                         { write_exp_elt_opcode (OP_LONG);
-                          write_exp_elt_type (builtin_type (current_gdbarch)->builtin_bool);
+                          write_exp_elt_type (parse_type->builtin_bool);
                           write_exp_elt_longcst ((LONGEST) 0);
                           write_exp_elt_opcode (OP_LONG); }
        ;
@@ -700,16 +731,11 @@ variable: qualified_name
 
                          msymbol = lookup_minimal_symbol (name, NULL, NULL);
                          if (msymbol != NULL)
-                           {
-                             write_exp_msymbol (msymbol,
-                                                lookup_function_type (builtin_type (current_gdbarch)->builtin_int),
-                                                builtin_type (current_gdbarch)->builtin_int);
-                           }
+                           write_exp_msymbol (msymbol);
+                         else if (!have_full_symbols () && !have_partial_symbols ())
+                           error ("No symbol table is loaded.  Use the \"file\" command.");
                          else
-                           if (!have_full_symbols () && !have_partial_symbols ())
-                             error ("No symbol table is loaded.  Use the \"file\" command.");
-                           else
-                             error ("No symbol \"%s\" in current context.", name);
+                           error ("No symbol \"%s\" in current context.", name);
                        }
        ;
 
@@ -756,11 +782,7 @@ variable:  name_not_typename
                              msymbol =
                                lookup_minimal_symbol (arg, NULL, NULL);
                              if (msymbol != NULL)
-                               {
-                                 write_exp_msymbol (msymbol,
-                                                    lookup_function_type (builtin_type (current_gdbarch)->builtin_int),
-                                                    builtin_type (current_gdbarch)->builtin_int);
-                               }
+                               write_exp_msymbol (msymbol);
                              else if (!have_full_symbols () && !have_partial_symbols ())
                                error ("No symbol table is loaded.  Use the \"file\" command.");
                              else
@@ -850,61 +872,61 @@ typebase  /* Implements (approximately): (type-qualifier)* type-specifier */
        :       TYPENAME
                        { $$ = $1.type; }
        |       INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_int; }
+                       { $$ = parse_type->builtin_int; }
        |       LONG
-                       { $$ = builtin_type (current_gdbarch)->builtin_long; }
+                       { $$ = parse_type->builtin_long; }
        |       SHORT
-                       { $$ = builtin_type (current_gdbarch)->builtin_short; }
+                       { $$ = parse_type->builtin_short; }
        |       LONG INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_long; }
+                       { $$ = parse_type->builtin_long; }
        |       LONG SIGNED_KEYWORD INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_long; }
+                       { $$ = parse_type->builtin_long; }
        |       LONG SIGNED_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_long; }
+                       { $$ = parse_type->builtin_long; }
        |       SIGNED_KEYWORD LONG INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_long; }
+                       { $$ = parse_type->builtin_long; }
        |       UNSIGNED LONG INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_unsigned_long; }
+                       { $$ = parse_type->builtin_unsigned_long; }
        |       LONG UNSIGNED INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_unsigned_long; }
+                       { $$ = parse_type->builtin_unsigned_long; }
        |       LONG UNSIGNED
-                       { $$ = builtin_type (current_gdbarch)->builtin_unsigned_long; }
+                       { $$ = parse_type->builtin_unsigned_long; }
        |       LONG LONG
-                       { $$ = builtin_type (current_gdbarch)->builtin_long_long; }
+                       { $$ = parse_type->builtin_long_long; }
        |       LONG LONG INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_long_long; }
+                       { $$ = parse_type->builtin_long_long; }
        |       LONG LONG SIGNED_KEYWORD INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_long_long; }
+                       { $$ = parse_type->builtin_long_long; }
        |       LONG LONG SIGNED_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_long_long; }
+                       { $$ = parse_type->builtin_long_long; }
        |       SIGNED_KEYWORD LONG LONG
-                       { $$ = builtin_type (current_gdbarch)->builtin_long_long; }
+                       { $$ = parse_type->builtin_long_long; }
        |       SIGNED_KEYWORD LONG LONG INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_long_long; }
+                       { $$ = parse_type->builtin_long_long; }
        |       UNSIGNED LONG LONG
-                       { $$ = builtin_type (current_gdbarch)->builtin_unsigned_long_long; }
+                       { $$ = parse_type->builtin_unsigned_long_long; }
        |       UNSIGNED LONG LONG INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_unsigned_long_long; }
+                       { $$ = parse_type->builtin_unsigned_long_long; }
        |       LONG LONG UNSIGNED
-                       { $$ = builtin_type (current_gdbarch)->builtin_unsigned_long_long; }
+                       { $$ = parse_type->builtin_unsigned_long_long; }
        |       LONG LONG UNSIGNED INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_unsigned_long_long; }
+                       { $$ = parse_type->builtin_unsigned_long_long; }
        |       SHORT INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_short; }
+                       { $$ = parse_type->builtin_short; }
        |       SHORT SIGNED_KEYWORD INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_short; }
+                       { $$ = parse_type->builtin_short; }
        |       SHORT SIGNED_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_short; }
+                       { $$ = parse_type->builtin_short; }
        |       UNSIGNED SHORT INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_unsigned_short; }
+                       { $$ = parse_type->builtin_unsigned_short; }
        |       SHORT UNSIGNED 
-                       { $$ = builtin_type (current_gdbarch)->builtin_unsigned_short; }
+                       { $$ = parse_type->builtin_unsigned_short; }
        |       SHORT UNSIGNED INT_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_unsigned_short; }
+                       { $$ = parse_type->builtin_unsigned_short; }
        |       DOUBLE_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_double; }
+                       { $$ = parse_type->builtin_double; }
        |       LONG DOUBLE_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_long_double; }
+                       { $$ = parse_type->builtin_long_double; }
        |       STRUCT name
                        { $$ = lookup_struct (copy_name ($2),
                                              expression_context_block); }
@@ -920,11 +942,11 @@ typebase  /* Implements (approximately): (type-qualifier)* type-specifier */
        |       UNSIGNED typename
                        { $$ = lookup_unsigned_typename (TYPE_NAME($2.type)); }
        |       UNSIGNED
-                       { $$ = builtin_type (current_gdbarch)->builtin_unsigned_int; }
+                       { $$ = parse_type->builtin_unsigned_int; }
        |       SIGNED_KEYWORD typename
                        { $$ = lookup_signed_typename (TYPE_NAME($2.type)); }
        |       SIGNED_KEYWORD
-                       { $$ = builtin_type (current_gdbarch)->builtin_int; }
+                       { $$ = parse_type->builtin_int; }
                 /* It appears that this rule for templates is never
                    reduced; template recognition happens by lookahead
                    in the token processing code in yylex. */         
@@ -1014,19 +1036,19 @@ typename:       TYPENAME
                {
                  $$.stoken.ptr = "int";
                  $$.stoken.length = 3;
-                 $$.type = builtin_type (current_gdbarch)->builtin_int;
+                 $$.type = parse_type->builtin_int;
                }
        |       LONG
                {
                  $$.stoken.ptr = "long";
                  $$.stoken.length = 4;
-                 $$.type = builtin_type (current_gdbarch)->builtin_long;
+                 $$.type = parse_type->builtin_long;
                }
        |       SHORT
                {
                  $$.stoken.ptr = "short";
                  $$.stoken.length = 5;
-                 $$.type = builtin_type (current_gdbarch)->builtin_short;
+                 $$.type = parse_type->builtin_short;
                }
        ;
 
@@ -1129,7 +1151,7 @@ parse_number (p, len, parsed_float, putithere)
        {
          p[len - 2] = '\0';
          putithere->typed_val_decfloat.type
-           = builtin_type (current_gdbarch)->builtin_decfloat;
+           = parse_type->builtin_decfloat;
          decimal_from_string (putithere->typed_val_decfloat.val, 4, p);
          p[len - 2] = 'd';
          return DECFLOAT;
@@ -1139,7 +1161,7 @@ parse_number (p, len, parsed_float, putithere)
        {
          p[len - 2] = '\0';
          putithere->typed_val_decfloat.type
-           = builtin_type (current_gdbarch)->builtin_decdouble;
+           = parse_type->builtin_decdouble;
          decimal_from_string (putithere->typed_val_decfloat.val, 8, p);
          p[len - 2] = 'd';
          return DECFLOAT;
@@ -1149,7 +1171,7 @@ parse_number (p, len, parsed_float, putithere)
        {
          p[len - 2] = '\0';
          putithere->typed_val_decfloat.type
-           = builtin_type (current_gdbarch)->builtin_declong;
+           = parse_type->builtin_declong;
          decimal_from_string (putithere->typed_val_decfloat.val, 16, p);
          p[len - 2] = 'd';
          return DECFLOAT;
@@ -1164,7 +1186,7 @@ parse_number (p, len, parsed_float, putithere)
 
       if (num == 1)
        putithere->typed_val_float.type = 
-         builtin_type (current_gdbarch)->builtin_double;
+         parse_type->builtin_double;
 
       if (num == 2 )
        {
@@ -1172,10 +1194,10 @@ parse_number (p, len, parsed_float, putithere)
             double.  */
          if (!strcasecmp (s, "f"))
            putithere->typed_val_float.type = 
-             builtin_type (current_gdbarch)->builtin_float;
+             parse_type->builtin_float;
          else if (!strcasecmp (s, "l"))
            putithere->typed_val_float.type = 
-             builtin_type (current_gdbarch)->builtin_long_double;
+             parse_type->builtin_long_double;
          else
            {
              free (s);
@@ -1286,9 +1308,9 @@ parse_number (p, len, parsed_float, putithere)
 
   un = (ULONGEST)n >> 2;
   if (long_p == 0
-      && (un >> (gdbarch_int_bit (current_gdbarch) - 2)) == 0)
+      && (un >> (gdbarch_int_bit (parse_gdbarch) - 2)) == 0)
     {
-      high_bit = ((ULONGEST)1) << (gdbarch_int_bit (current_gdbarch) - 1);
+      high_bit = ((ULONGEST)1) << (gdbarch_int_bit (parse_gdbarch) - 1);
 
       /* A large decimal (not hex or octal) constant (between INT_MAX
         and UINT_MAX) is a long or unsigned long, according to ANSI,
@@ -1296,28 +1318,28 @@ parse_number (p, len, parsed_float, putithere)
         int.  This probably should be fixed.  GCC gives a warning on
         such constants.  */
 
-      unsigned_type = builtin_type (current_gdbarch)->builtin_unsigned_int;
-      signed_type = builtin_type (current_gdbarch)->builtin_int;
+      unsigned_type = parse_type->builtin_unsigned_int;
+      signed_type = parse_type->builtin_int;
     }
   else if (long_p <= 1
-          && (un >> (gdbarch_long_bit (current_gdbarch) - 2)) == 0)
+          && (un >> (gdbarch_long_bit (parse_gdbarch) - 2)) == 0)
     {
-      high_bit = ((ULONGEST)1) << (gdbarch_long_bit (current_gdbarch) - 1);
-      unsigned_type = builtin_type (current_gdbarch)->builtin_unsigned_long;
-      signed_type = builtin_type (current_gdbarch)->builtin_long;
+      high_bit = ((ULONGEST)1) << (gdbarch_long_bit (parse_gdbarch) - 1);
+      unsigned_type = parse_type->builtin_unsigned_long;
+      signed_type = parse_type->builtin_long;
     }
   else
     {
       int shift;
       if (sizeof (ULONGEST) * HOST_CHAR_BIT 
-         < gdbarch_long_long_bit (current_gdbarch))
+         < gdbarch_long_long_bit (parse_gdbarch))
        /* A long long does not fit in a LONGEST.  */
        shift = (sizeof (ULONGEST) * HOST_CHAR_BIT - 1);
       else
-       shift = (gdbarch_long_long_bit (current_gdbarch) - 1);
+       shift = (gdbarch_long_long_bit (parse_gdbarch) - 1);
       high_bit = (ULONGEST) 1 << shift;
-      unsigned_type = builtin_type (current_gdbarch)->builtin_unsigned_long_long;
-      signed_type = builtin_type (current_gdbarch)->builtin_long_long;
+      unsigned_type = parse_type->builtin_unsigned_long_long;
+      signed_type = parse_type->builtin_long_long;
     }
 
    putithere->typed_val_int.val = n;
@@ -1490,7 +1512,7 @@ yylex ()
         }
 
       yylval.typed_val_int.val = c;
-      yylval.typed_val_int.type = builtin_type (current_gdbarch)->builtin_char;
+      yylval.typed_val_int.type = parse_type->builtin_char;
 
       c = *lexptr++;
       if (c != '\'')
@@ -1742,7 +1764,7 @@ yylex ()
     case 8:
       if (strncmp (tokstart, "unsigned", 8) == 0)
        return UNSIGNED;
-      if (current_language->la_language == language_cplus
+      if (parse_language->la_language == language_cplus
          && strncmp (tokstart, "template", 8) == 0)
        return TEMPLATE;
       if (strncmp (tokstart, "volatile", 8) == 0)
@@ -1759,7 +1781,7 @@ yylex ()
        return DOUBLE_KEYWORD;
       break;
     case 5:
-      if (current_language->la_language == language_cplus)
+      if (parse_language->la_language == language_cplus)
         {
           if (strncmp (tokstart, "false", 5) == 0)
             return FALSEKEYWORD;
@@ -1778,7 +1800,7 @@ yylex ()
        return ENUM;
       if (strncmp (tokstart, "long", 4) == 0)
        return LONG;
-      if (current_language->la_language == language_cplus)
+      if (parse_language->la_language == language_cplus)
           {
             if (strncmp (tokstart, "true", 4) == 0)
               return TRUEKEYWORD;
@@ -1814,7 +1836,7 @@ yylex ()
 
     sym = lookup_symbol (tmp, expression_context_block,
                         VAR_DOMAIN,
-                        current_language->la_language == language_cplus
+                        parse_language->la_language == language_cplus
                         ? &is_a_field_of_this : (int *) NULL);
     /* Call lookup_symtab, not lookup_partial_symtab, in case there are
        no psymtabs (coff, xcoff, or some future change to blow away the
@@ -1847,8 +1869,8 @@ yylex ()
          return TYPENAME;
         }
     yylval.tsym.type
-      = language_lookup_primitive_type_by_name (current_language,
-                                               current_gdbarch, tmp);
+      = language_lookup_primitive_type_by_name (parse_language,
+                                               parse_gdbarch, tmp);
     if (yylval.tsym.type != NULL)
       return TYPENAME;
 
This page took 0.032512 seconds and 4 git commands to generate.