*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / ada-lang.c
index 8206f943023a3f4b3736e54c8af553cebd795a05..0eecd90aadaf35655e812d3ff342a747841329fe 100644 (file)
@@ -115,13 +115,12 @@ static struct value *make_array_descriptor (struct type *, struct value *,
 
 static void ada_add_block_symbols (struct obstack *,
                                    struct block *, const char *,
-                                   domain_enum, struct objfile *,
-                                   struct symtab *, int);
+                                   domain_enum, struct objfile *, int);
 
 static int is_nonfunction (struct ada_symbol_info *, int);
 
 static void add_defn_to_vec (struct obstack *, struct symbol *,
-                             struct block *, struct symtab *);
+                             struct block *);
 
 static int num_defns_collected (struct obstack *);
 
@@ -2253,6 +2252,7 @@ ada_value_assign (struct value *toval, struct value *fromval)
     {
       int len = (value_bitpos (toval)
                 + bits + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT;
+      int from_size;
       char *buffer = (char *) alloca (len);
       struct value *val;
       CORE_ADDR to_addr = VALUE_ADDRESS (toval) + value_offset (toval);
@@ -2261,11 +2261,12 @@ ada_value_assign (struct value *toval, struct value *fromval)
         fromval = value_cast (type, fromval);
 
       read_memory (to_addr, buffer, len);
+      from_size = value_bitsize (fromval);
+      if (from_size == 0)
+       from_size = TYPE_LENGTH (value_type (fromval)) * TARGET_CHAR_BIT;
       if (gdbarch_bits_big_endian (current_gdbarch))
         move_bits (buffer, value_bitpos (toval),
-                   value_contents (fromval),
-                   TYPE_LENGTH (value_type (fromval)) * TARGET_CHAR_BIT -
-                   bits, bits);
+                  value_contents (fromval), from_size - bits, bits);
       else
         move_bits (buffer, value_bitpos (toval), value_contents (fromval),
                    0, bits);
@@ -2891,14 +2892,9 @@ resolve_subexp (struct expression **expp, int *pos, int deprocedure_p,
                   case LOC_REGISTER:
                   case LOC_ARG:
                   case LOC_REF_ARG:
-                  case LOC_REGPARM:
                   case LOC_REGPARM_ADDR:
                   case LOC_LOCAL:
-                  case LOC_LOCAL_ARG:
-                  case LOC_BASEREG:
-                  case LOC_BASEREG_ARG:
                   case LOC_COMPUTED:
-                  case LOC_COMPUTED_ARG:
                     goto FoundNonType;
                   default:
                     break;
@@ -3976,15 +3972,14 @@ make_array_descriptor (struct type *type, struct value *arr, CORE_ADDR *sp)
 
 static int
 lookup_cached_symbol (const char *name, domain_enum namespace,
-                      struct symbol **sym, struct block **block,
-                      struct symtab **symtab)
+                      struct symbol **sym, struct block **block)
 {
   return 0;
 }
 
 static void
 cache_symbol (const char *name, domain_enum namespace, struct symbol *sym,
-              struct block *block, struct symtab *symtab)
+              struct block *block)
 {
 }
 \f
@@ -3998,13 +3993,11 @@ standard_lookup (const char *name, const struct block *block,
                  domain_enum domain)
 {
   struct symbol *sym;
-  struct symtab *symtab;
 
-  if (lookup_cached_symbol (name, domain, &sym, NULL, NULL))
+  if (lookup_cached_symbol (name, domain, &sym, NULL))
     return sym;
-  sym =
-    lookup_symbol_in_language (name, block, domain, language_c, 0, &symtab);
-  cache_symbol (name, domain, sym, block_found, symtab);
+  sym = lookup_symbol_in_language (name, block, domain, language_c, 0);
+  cache_symbol (name, domain, sym, block_found);
   return sym;
 }
 
@@ -4089,7 +4082,7 @@ lesseq_defined_than (struct symbol *sym0, struct symbol *sym1)
 static void
 add_defn_to_vec (struct obstack *obstackp,
                  struct symbol *sym,
-                 struct block *block, struct symtab *symtab)
+                 struct block *block)
 {
   int i;
   size_t tmp;
@@ -4112,7 +4105,6 @@ add_defn_to_vec (struct obstack *obstackp,
         {
           prevDefns[i].sym = sym;
           prevDefns[i].block = block;
-          prevDefns[i].symtab = symtab;
           return;
         }
     }
@@ -4122,7 +4114,6 @@ add_defn_to_vec (struct obstack *obstackp,
 
     info.sym = sym;
     info.block = block;
-    info.symtab = symtab;
     obstack_grow (obstackp, &info, sizeof (struct ada_symbol_info));
   }
 }
@@ -4324,15 +4315,10 @@ symtab_for_sym (struct symbol *sym)
       case LOC_REGISTER:
       case LOC_ARG:
       case LOC_REF_ARG:
-      case LOC_REGPARM:
       case LOC_REGPARM_ADDR:
       case LOC_LOCAL:
       case LOC_TYPEDEF:
-      case LOC_LOCAL_ARG:
-      case LOC_BASEREG:
-      case LOC_BASEREG_ARG:
       case LOC_COMPUTED:
-      case LOC_COMPUTED_ARG:
         for (j = FIRST_LOCAL_BLOCK;
              j < BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (s)); j += 1)
           {
@@ -4639,7 +4625,7 @@ remove_irrelevant_renamings (struct ada_symbol_info *syms,
   if (current_block == NULL)
     return nsyms;
 
-  current_function = block_function (current_block);
+  current_function = block_linkage_function (current_block);
   if (current_function == NULL)
     return nsyms;
 
@@ -4672,7 +4658,7 @@ remove_irrelevant_renamings (struct ada_symbol_info *syms,
 
 /* Find symbols in DOMAIN matching NAME0, in BLOCK0 and enclosing
    scope and in global scopes, returning the number of matches.  Sets
-   *RESULTS to point to a vector of (SYM,BLOCK,SYMTAB) triples,
+   *RESULTS to point to a vector of (SYM,BLOCK) tuples,
    indicating the symbols found and the blocks and symbol tables (if
    any) in which they were found.  This vector are transient---good only to 
    the next call of ada_lookup_symbol_list.  Any non-function/non-enumeral 
@@ -4726,7 +4712,7 @@ ada_lookup_symbol_list (const char *name0, const struct block *block0,
     {
       block_depth += 1;
       ada_add_block_symbols (&symbol_list_obstack, block, name,
-                             namespace, NULL, NULL, wild_match);
+                             namespace, NULL, wild_match);
 
       /* If we found a non-function match, assume that's the one.  */
       if (is_nonfunction (defns_collected (&symbol_list_obstack, 0),
@@ -4748,10 +4734,10 @@ ada_lookup_symbol_list (const char *name0, const struct block *block0,
     goto done;
 
   cacheIfUnique = 1;
-  if (lookup_cached_symbol (name0, namespace, &sym, &block, &s))
+  if (lookup_cached_symbol (name0, namespace, &sym, &block))
     {
       if (sym != NULL)
-        add_defn_to_vec (&symbol_list_obstack, sym, block, s);
+        add_defn_to_vec (&symbol_list_obstack, sym, block);
       goto done;
     }
 
@@ -4764,7 +4750,7 @@ ada_lookup_symbol_list (const char *name0, const struct block *block0,
     bv = BLOCKVECTOR (s);
     block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
     ada_add_block_symbols (&symbol_list_obstack, block, name, namespace,
-                           objfile, s, wild_match);
+                           objfile, wild_match);
   }
 
   if (namespace == VAR_DOMAIN)
@@ -4787,14 +4773,14 @@ ada_lookup_symbol_list (const char *name0, const struct block *block0,
                     block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
                     ada_add_block_symbols (&symbol_list_obstack, block,
                                            SYMBOL_LINKAGE_NAME (msymbol),
-                                           namespace, objfile, s, wild_match);
+                                           namespace, objfile, wild_match);
 
                     if (num_defns_collected (&symbol_list_obstack) == ndefns0)
                       {
                         block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
                         ada_add_block_symbols (&symbol_list_obstack, block,
                                                SYMBOL_LINKAGE_NAME (msymbol),
-                                               namespace, objfile, s,
+                                               namespace, objfile,
                                                wild_match);
                       }
                   }
@@ -4815,7 +4801,7 @@ ada_lookup_symbol_list (const char *name0, const struct block *block0,
         bv = BLOCKVECTOR (s);
         block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
         ada_add_block_symbols (&symbol_list_obstack, block, name,
-                               namespace, objfile, s, wild_match);
+                               namespace, objfile, wild_match);
       }
   }
 
@@ -4832,7 +4818,7 @@ ada_lookup_symbol_list (const char *name0, const struct block *block0,
         bv = BLOCKVECTOR (s);
         block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
         ada_add_block_symbols (&symbol_list_obstack, block, name, namespace,
-                               objfile, s, wild_match);
+                               objfile, wild_match);
       }
 
       ALL_PSYMTABS (objfile, ps)
@@ -4847,7 +4833,7 @@ ada_lookup_symbol_list (const char *name0, const struct block *block0,
               continue;
             block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
             ada_add_block_symbols (&symbol_list_obstack, block, name,
-                                   namespace, objfile, s, wild_match);
+                                   namespace, objfile, wild_match);
           }
       }
     }
@@ -4859,11 +4845,10 @@ done:
   ndefns = remove_extra_symbols (*results, ndefns);
 
   if (ndefns == 0)
-    cache_symbol (name0, namespace, NULL, NULL, NULL);
+    cache_symbol (name0, namespace, NULL, NULL);
 
   if (ndefns == 1 && cacheIfUnique)
-    cache_symbol (name0, namespace, (*results)[0].sym, (*results)[0].block,
-                  (*results)[0].symtab);
+    cache_symbol (name0, namespace, (*results)[0].sym, (*results)[0].block);
 
   ndefns = remove_irrelevant_renamings (*results, ndefns, block0);
 
@@ -4872,8 +4857,7 @@ done:
 
 struct symbol *
 ada_lookup_encoded_symbol (const char *name, const struct block *block0,
-                          domain_enum namespace, 
-                          struct block **block_found, struct symtab **symtab)
+                          domain_enum namespace, struct block **block_found)
 {
   struct ada_symbol_info *candidates;
   int n_candidates;
@@ -4886,40 +4870,7 @@ ada_lookup_encoded_symbol (const char *name, const struct block *block0,
   if (block_found != NULL)
     *block_found = candidates[0].block;
 
-  if (symtab != NULL)
-    {
-      *symtab = candidates[0].symtab;
-      if (*symtab == NULL && candidates[0].block != NULL)
-        {
-          struct objfile *objfile;
-          struct symtab *s;
-          struct block *b;
-          struct blockvector *bv;
-
-          /* Search the list of symtabs for one which contains the
-             address of the start of this block.  */
-          ALL_PRIMARY_SYMTABS (objfile, s)
-          {
-            bv = BLOCKVECTOR (s);
-            b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
-            if (BLOCK_START (b) <= BLOCK_START (candidates[0].block)
-                && BLOCK_END (b) > BLOCK_START (candidates[0].block))
-              {
-                *symtab = s;
-                return fixup_symbol_section (candidates[0].sym, objfile);
-              }
-          }
-          /* FIXME: brobecker/2004-11-12: I think that we should never
-             reach this point.  I don't see a reason why we would not
-             find a symtab for a given block, so I suggest raising an
-             internal_error exception here.  Otherwise, we end up
-             returning a symbol but no symtab, which certain parts of
-             the code that rely (indirectly) on this function do not
-             expect, eventually causing a SEGV.  */
-          return fixup_symbol_section (candidates[0].sym, NULL);
-        }
-    }
-  return candidates[0].sym;
+  return fixup_symbol_section (candidates[0].sym, NULL);
 }  
 
 /* Return a symbol in DOMAIN matching NAME, in BLOCK0 and enclosing
@@ -4931,27 +4882,26 @@ ada_lookup_encoded_symbol (const char *name, const struct block *block0,
    assignments occur only if the pointers are non-null).  */
 struct symbol *
 ada_lookup_symbol (const char *name, const struct block *block0,
-                   domain_enum namespace, int *is_a_field_of_this,
-                   struct symtab **symtab)
+                   domain_enum namespace, int *is_a_field_of_this)
 {
   if (is_a_field_of_this != NULL)
     *is_a_field_of_this = 0;
 
   return
     ada_lookup_encoded_symbol (ada_encode (ada_fold_name (name)),
-                              block0, namespace, NULL, symtab);
+                              block0, namespace, NULL);
 }
 
 static struct symbol *
 ada_lookup_symbol_nonlocal (const char *name,
                             const char *linkage_name,
                             const struct block *block,
-                            const domain_enum domain, struct symtab **symtab)
+                            const domain_enum domain)
 {
   if (linkage_name == NULL)
     linkage_name = name;
   return ada_lookup_symbol (linkage_name, block_static_block (block), domain,
-                            NULL, symtab);
+                            NULL);
 }
 
 
@@ -5240,7 +5190,7 @@ static void
 ada_add_block_symbols (struct obstack *obstackp,
                        struct block *block, const char *name,
                        domain_enum domain, struct objfile *objfile,
-                       struct symtab *symtab, int wild)
+                       int wild)
 {
   struct dict_iterator iter;
   int name_len = strlen (name);
@@ -5261,25 +5211,16 @@ ada_add_block_symbols (struct obstack *obstackp,
                                    SYMBOL_DOMAIN (sym), domain)
             && wild_match (name, name_len, SYMBOL_LINKAGE_NAME (sym)))
           {
-            switch (SYMBOL_CLASS (sym))
-              {
-              case LOC_ARG:
-              case LOC_LOCAL_ARG:
-              case LOC_REF_ARG:
-              case LOC_REGPARM:
-              case LOC_REGPARM_ADDR:
-              case LOC_BASEREG_ARG:
-              case LOC_COMPUTED_ARG:
-                arg_sym = sym;
-                break;
-              case LOC_UNRESOLVED:
-                continue;
-              default:
+           if (SYMBOL_CLASS (sym) == LOC_UNRESOLVED)
+             continue;
+           else if (SYMBOL_IS_ARGUMENT (sym))
+             arg_sym = sym;
+           else
+             {
                 found_sym = 1;
                 add_defn_to_vec (obstackp,
                                  fixup_symbol_section (sym, objfile),
-                                 block, symtab);
-                break;
+                                 block);
               }
           }
       }
@@ -5295,26 +5236,18 @@ ada_add_block_symbols (struct obstack *obstackp,
             if (cmp == 0
                 && is_name_suffix (SYMBOL_LINKAGE_NAME (sym) + name_len))
               {
-                switch (SYMBOL_CLASS (sym))
-                  {
-                  case LOC_ARG:
-                  case LOC_LOCAL_ARG:
-                  case LOC_REF_ARG:
-                  case LOC_REGPARM:
-                  case LOC_REGPARM_ADDR:
-                  case LOC_BASEREG_ARG:
-                  case LOC_COMPUTED_ARG:
-                    arg_sym = sym;
-                    break;
-                  case LOC_UNRESOLVED:
-                    break;
-                  default:
-                    found_sym = 1;
-                    add_defn_to_vec (obstackp,
-                                     fixup_symbol_section (sym, objfile),
-                                     block, symtab);
-                    break;
-                  }
+               if (SYMBOL_CLASS (sym) != LOC_UNRESOLVED)
+                 {
+                   if (SYMBOL_IS_ARGUMENT (sym))
+                     arg_sym = sym;
+                   else
+                     {
+                       found_sym = 1;
+                       add_defn_to_vec (obstackp,
+                                        fixup_symbol_section (sym, objfile),
+                                        block);
+                     }
+                 }
               }
           }
       }
@@ -5324,7 +5257,7 @@ ada_add_block_symbols (struct obstack *obstackp,
     {
       add_defn_to_vec (obstackp,
                        fixup_symbol_section (arg_sym, objfile),
-                       block, symtab);
+                       block);
     }
 
   if (!wild)
@@ -5351,26 +5284,18 @@ ada_add_block_symbols (struct obstack *obstackp,
             if (cmp == 0
                 && is_name_suffix (SYMBOL_LINKAGE_NAME (sym) + name_len + 5))
               {
-                switch (SYMBOL_CLASS (sym))
-                  {
-                  case LOC_ARG:
-                  case LOC_LOCAL_ARG:
-                  case LOC_REF_ARG:
-                  case LOC_REGPARM:
-                  case LOC_REGPARM_ADDR:
-                  case LOC_BASEREG_ARG:
-                  case LOC_COMPUTED_ARG:
-                    arg_sym = sym;
-                    break;
-                  case LOC_UNRESOLVED:
-                    break;
-                  default:
-                    found_sym = 1;
-                    add_defn_to_vec (obstackp,
-                                     fixup_symbol_section (sym, objfile),
-                                     block, symtab);
-                    break;
-                  }
+               if (SYMBOL_CLASS (sym) != LOC_UNRESOLVED)
+                 {
+                   if (SYMBOL_IS_ARGUMENT (sym))
+                     arg_sym = sym;
+                   else
+                     {
+                       found_sym = 1;
+                       add_defn_to_vec (obstackp,
+                                        fixup_symbol_section (sym, objfile),
+                                        block);
+                     }
+                 }
               }
           }
       }
@@ -5381,7 +5306,7 @@ ada_add_block_symbols (struct obstack *obstackp,
         {
           add_defn_to_vec (obstackp,
                            fixup_symbol_section (arg_sym, objfile),
-                           block, symtab);
+                           block);
         }
     }
 }
@@ -6796,7 +6721,7 @@ ada_find_renaming_symbol (const char *name, struct block *block)
 static struct symbol *
 find_old_style_renaming_symbol (const char *name, struct block *block)
 {
-  const struct symbol *function_sym = block_function (block);
+  const struct symbol *function_sym = block_linkage_function (block);
   char *rename;
 
   if (function_sym != NULL)
@@ -8558,7 +8483,14 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
            return arg1;
          return ada_value_assign (arg1, arg1);
        }
-      arg2 = evaluate_subexp (value_type (arg1), exp, pos, noside);
+      /* Force the evaluation of the rhs ARG2 to the type of the lhs ARG1,
+         except if the lhs of our assignment is a convenience variable.
+         In the case of assigning to a convenience variable, the lhs
+         should be exactly the result of the evaluation of the rhs.  */
+      type = value_type (arg1);
+      if (VALUE_LVAL (arg1) == lval_internalvar)
+         type = NULL;
+      arg2 = evaluate_subexp (type, exp, pos, noside);
       if (noside == EVAL_SKIP || noside == EVAL_AVOID_SIDE_EFFECTS)
         return arg1;
       if (ada_is_fixed_point_type (value_type (arg1)))
This page took 0.030815 seconds and 4 git commands to generate.