record-btrace: extend unwinder
[deliverable/binutils-gdb.git] / gdb / ada-exp.y
index 226cc1d8f11d22814bd486e896be87b8b52350c9..4273f1dc4d6492ce1918e212f3c9c65e63531d3a 100644 (file)
@@ -1,6 +1,5 @@
 /* YACC parser for Ada expressions, for GDB.
-   Copyright (C) 1986, 1989-1991, 1993-1994, 1997, 2000, 2003-2004,
-   2007-2012 Free Software Foundation, Inc.
+   Copyright (C) 1986-2014 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -37,7 +36,7 @@
 %{
 
 #include "defs.h"
-#include "gdb_string.h"
+#include <string.h>
 #include <ctype.h>
 #include "expression.h"
 #include "value.h"
 #define yytoks ada_toks                /* With YYDEBUG defined */
 #define yyname ada_name                /* With YYDEBUG defined */
 #define yyrule ada_rule                /* With YYDEBUG defined */
+#define yyss   ada_yyss
+#define yysslim        ada_yysslim
+#define yyssp  ada_yyssp
+#define yystacksize ada_yystacksize
+#define yyvs   ada_yyvs
+#define yyvsp  ada_yyvsp
 
 #ifndef YYDEBUG
 #define        YYDEBUG 1               /* Default to yydebug support */
@@ -120,24 +125,22 @@ static int yylex (void);
 
 void yyerror (char *);
 
-static struct stoken string_to_operator (struct stoken);
-
 static void write_int (LONGEST, struct type *);
 
-static void write_object_renaming (struct block *, const char *, int,
+static void write_object_renaming (const struct block *, const char *, int,
                                   const char *, int);
 
-static struct type* write_var_or_type (struct block *, struct stoken);
+static struct type* write_var_or_type (const struct block *, struct stoken);
 
 static void write_name_assoc (struct stoken);
 
 static void write_exp_op_with_string (enum exp_opcode, struct stoken);
 
-static struct block *block_lookup (struct block *, char *);
+static struct block *block_lookup (struct block *, const char *);
 
 static LONGEST convert_char_literal (struct type *, LONGEST);
 
-static void write_ambiguous_var (struct block *, char *, int);
+static void write_ambiguous_var (const struct block *, char *, int);
 
 static struct type *type_int (void);
 
@@ -781,39 +784,11 @@ yyerror (char *msg)
   error (_("Error in expression, near `%s'."), lexptr);
 }
 
-/* The operator name corresponding to operator symbol STRING (adds
-   quotes and maps to lower-case).  Destroys the previous contents of
-   the array pointed to by STRING.ptr.  Error if STRING does not match
-   a valid Ada operator.  Assumes that STRING.ptr points to a
-   null-terminated string and that, if STRING is a valid operator
-   symbol, the array pointed to by STRING.ptr contains at least
-   STRING.length+3 characters.  */
-
-static struct stoken
-string_to_operator (struct stoken string)
-{
-  int i;
-
-  for (i = 0; ada_opname_table[i].encoded != NULL; i += 1)
-    {
-      if (string.length == strlen (ada_opname_table[i].decoded)-2
-         && strncasecmp (string.ptr, ada_opname_table[i].decoded+1,
-                         string.length) == 0)
-       {
-         strncpy (string.ptr, ada_opname_table[i].decoded,
-                  string.length+2);
-         string.length += 2;
-         return string;
-       }
-    }
-  error (_("Invalid operator symbol `%s'"), string.ptr);
-}
-
 /* Emit expression to access an instance of SYM, in block BLOCK (if
  * non-NULL), and with :: qualification ORIG_LEFT_CONTEXT.  */
 static void
-write_var_from_sym (struct block *orig_left_context,
-                   struct block *block,
+write_var_from_sym (const struct block *orig_left_context,
+                   const struct block *block,
                    struct symbol *sym)
 {
   if (orig_left_context == NULL && symbol_read_needs_frame (sym))
@@ -861,14 +836,13 @@ write_exp_op_with_string (enum exp_opcode opcode, struct stoken token)
  * new encoding entirely (FIXME pnh 7/20/2007).  */
 
 static void
-write_object_renaming (struct block *orig_left_context,
+write_object_renaming (const struct block *orig_left_context,
                       const char *renamed_entity, int renamed_entity_len,
                       const char *renaming_expr, int max_depth)
 {
   char *name;
   enum { SIMPLE_INDEX, LOWER_BOUND, UPPER_BOUND } slice_state;
-  struct symbol *sym;
-  struct block *block;
+  struct ada_symbol_info sym_info;
 
   if (max_depth <= 0)
     error (_("Could not find renamed symbol"));
@@ -876,30 +850,29 @@ write_object_renaming (struct block *orig_left_context,
   if (orig_left_context == NULL)
     orig_left_context = get_selected_block (NULL);
 
-  name = obsavestring (renamed_entity, renamed_entity_len, &temp_parse_space);
-  sym = ada_lookup_encoded_symbol (name, orig_left_context, VAR_DOMAIN, 
-                                  &block);
-  if (sym == NULL)
+  name = obstack_copy0 (&temp_parse_space, renamed_entity, renamed_entity_len);
+  ada_lookup_encoded_symbol (name, orig_left_context, VAR_DOMAIN, &sym_info);
+  if (sym_info.sym == NULL)
     error (_("Could not find renamed variable: %s"), ada_decode (name));
-  else if (SYMBOL_CLASS (sym) == LOC_TYPEDEF)
+  else if (SYMBOL_CLASS (sym_info.sym) == LOC_TYPEDEF)
     /* We have a renaming of an old-style renaming symbol.  Don't
        trust the block information.  */
-    block = orig_left_context;
+    sym_info.block = orig_left_context;
 
   {
     const char *inner_renamed_entity;
     int inner_renamed_entity_len;
     const char *inner_renaming_expr;
 
-    switch (ada_parse_renaming (sym, &inner_renamed_entity, 
+    switch (ada_parse_renaming (sym_info.sym, &inner_renamed_entity,
                                &inner_renamed_entity_len,
                                &inner_renaming_expr))
       {
       case ADA_NOT_RENAMING:
-       write_var_from_sym (orig_left_context, block, sym);
+       write_var_from_sym (orig_left_context, sym_info.block, sym_info.sym);
        break;
       case ADA_OBJECT_RENAMING:
-       write_object_renaming (block,
+       write_object_renaming (sym_info.block,
                               inner_renamed_entity, inner_renamed_entity_len,
                               inner_renaming_expr, max_depth - 1);
        break;
@@ -939,25 +912,26 @@ write_object_renaming (struct block *orig_left_context,
          {
            const char *end;
            char *index_name;
-           struct symbol *index_sym;
+           struct ada_symbol_info index_sym_info;
 
            end = strchr (renaming_expr, 'X');
            if (end == NULL)
              end = renaming_expr + strlen (renaming_expr);
 
            index_name =
-             obsavestring (renaming_expr, end - renaming_expr,
-                           &temp_parse_space);
+             obstack_copy0 (&temp_parse_space, renaming_expr,
+                            end - renaming_expr);
            renaming_expr = end;
 
-           index_sym = ada_lookup_encoded_symbol (index_name, NULL,
-                                                  VAR_DOMAIN, &block);
-           if (index_sym == NULL)
+           ada_lookup_encoded_symbol (index_name, NULL, VAR_DOMAIN,
+                                      &index_sym_info);
+           if (index_sym_info.sym == NULL)
              error (_("Could not find %s"), index_name);
-           else if (SYMBOL_CLASS (index_sym) == LOC_TYPEDEF)
+           else if (SYMBOL_CLASS (index_sym_info.sym) == LOC_TYPEDEF)
              /* Index is an old-style renaming symbol.  */
-             block = orig_left_context;
-           write_var_from_sym (NULL, block, index_sym);
+             index_sym_info.block = orig_left_context;
+           write_var_from_sym (NULL, index_sym_info.block,
+                               index_sym_info.sym);
          }
        if (slice_state == SIMPLE_INDEX)
          {
@@ -978,6 +952,8 @@ write_object_renaming (struct block *orig_left_context,
        {
          struct stoken field_name;
          const char *end;
+         char *buf;
+
          renaming_expr += 1;
 
          if (slice_state != SIMPLE_INDEX)
@@ -986,9 +962,10 @@ write_object_renaming (struct block *orig_left_context,
          if (end == NULL)
            end = renaming_expr + strlen (renaming_expr);
          field_name.length = end - renaming_expr;
-         field_name.ptr = malloc (end - renaming_expr + 1);
-         strncpy (field_name.ptr, renaming_expr, end - renaming_expr);
-         field_name.ptr[end - renaming_expr] = '\000';
+         buf = malloc (end - renaming_expr + 1);
+         field_name.ptr = buf;
+         strncpy (buf, renaming_expr, end - renaming_expr);
+         buf[end - renaming_expr] = '\000';
          renaming_expr = end;
          write_exp_op_with_string (STRUCTOP_STRUCT, field_name);
          break;
@@ -1006,9 +983,9 @@ write_object_renaming (struct block *orig_left_context,
 }
 
 static struct block*
-block_lookup (struct block *context, char *raw_name)
+block_lookup (struct block *context, const char *raw_name)
 {
-  char *name;
+  const char *name;
   struct ada_symbol_info *syms;
   int nsyms;
   struct symtab *symtab;
@@ -1021,7 +998,7 @@ block_lookup (struct block *context, char *raw_name)
   else
     name = ada_encode (raw_name);
 
-  nsyms = ada_lookup_symbol_list (name, context, VAR_DOMAIN, &syms, 1);
+  nsyms = ada_lookup_symbol_list (name, context, VAR_DOMAIN, &syms);
   if (context == NULL
       && (nsyms == 0 || SYMBOL_CLASS (syms[0].sym) != LOC_BLOCK))
     symtab = lookup_symtab (name);
@@ -1156,13 +1133,13 @@ write_selectors (char *sels)
    a temporary symbol that is valid until the next call to ada_parse.
    */
 static void
-write_ambiguous_var (struct block *block, char *name, int len)
+write_ambiguous_var (const struct block *block, char *name, int len)
 {
   struct symbol *sym =
     obstack_alloc (&temp_parse_space, sizeof (struct symbol));
   memset (sym, 0, sizeof (struct symbol));
   SYMBOL_DOMAIN (sym) = UNDEF_DOMAIN;
-  SYMBOL_LINKAGE_NAME (sym) = obsavestring (name, len, &temp_parse_space);
+  SYMBOL_LINKAGE_NAME (sym) = obstack_copy0 (&temp_parse_space, name, len);
   SYMBOL_LANGUAGE (sym) = language_ada;
 
   write_exp_elt_opcode (OP_VAR_VALUE);
@@ -1248,7 +1225,7 @@ get_symbol_field_type (struct symbol *sym, char *encoded_field_name)
    identifier).  */
 
 static struct type*
-write_var_or_type (struct block *block, struct stoken name0)
+write_var_or_type (const struct block *block, struct stoken name0)
 {
   int depth;
   char *encoded_name;
@@ -1259,7 +1236,7 @@ write_var_or_type (struct block *block, struct stoken name0)
 
   encoded_name = ada_encode (name0.ptr);
   name_len = strlen (encoded_name);
-  encoded_name = obsavestring (encoded_name, name_len, &temp_parse_space);
+  encoded_name = obstack_copy0 (&temp_parse_space, encoded_name, name_len);
   for (depth = 0; depth < MAX_RENAMING_CHAIN_LENGTH; depth += 1)
     {
       int tail_index;
@@ -1278,7 +1255,7 @@ write_var_or_type (struct block *block, struct stoken name0)
 
          encoded_name[tail_index] = '\0';
          nsyms = ada_lookup_symbol_list (encoded_name, block,
-                                         VAR_DOMAIN, &syms, 1);
+                                         VAR_DOMAIN, &syms);
          encoded_name[tail_index] = terminator;
 
          /* A single symbol may rename a package or object. */
@@ -1365,9 +1342,9 @@ write_var_or_type (struct block *block, struct stoken name0)
            }
          else if (nsyms == 0) 
            {
-             struct minimal_symbol *msym 
+             struct bound_minimal_symbol msym
                = ada_lookup_simple_minsym (encoded_name);
-             if (msym != NULL)
+             if (msym.minsym != NULL)
                {
                  write_exp_msymbol (msym);
                  /* Maybe cause error here rather than later? FIXME? */
@@ -1426,7 +1403,7 @@ write_name_assoc (struct stoken name)
     {
       struct ada_symbol_info *syms;
       int nsyms = ada_lookup_symbol_list (name.ptr, expression_context_block,
-                                         VAR_DOMAIN, &syms, 1);
+                                         VAR_DOMAIN, &syms);
       if (nsyms != 1 || SYMBOL_CLASS (syms[0].sym) == LOC_TYPEDEF)
        write_exp_op_with_string (OP_NAME, name);
       else
@@ -1458,7 +1435,7 @@ convert_char_literal (struct type *type, LONGEST val)
   for (f = 0; f < TYPE_NFIELDS (type); f += 1)
     {
       if (strcmp (name, TYPE_FIELD_NAME (type, f)) == 0)
-       return TYPE_FIELD_BITPOS (type, f);
+       return TYPE_FIELD_ENUMVAL (type, f);
     }
   return val;
 }
@@ -1529,12 +1506,3 @@ _initialize_ada_exp (void)
 {
   obstack_init (&temp_parse_space);
 }
-
-/* FIXME: hilfingr/2004-10-05: Hack to remove warning.  The function
-   string_to_operator is supposed to be used for cases where one
-   calls an operator function with prefix notation, as in 
-   "+" (a, b), but at some point, this code seems to have gone
-   missing. */
-
-struct stoken (*dummy_string_to_ada_operator) (struct stoken) 
-     = string_to_operator;
This page took 0.042375 seconds and 4 git commands to generate.