* readelf.c (dynamic_info): Correct size of array.
[deliverable/binutils-gdb.git] / gdb / symtab.c
index f677ed0aeb5a0c4a96aac71043283688f973ac91..03586c37e57fd0559ed40082e8d8340fb5c2558c 100644 (file)
@@ -146,9 +146,6 @@ multiple_symbols_select_mode (void)
   return multiple_symbols_mode;
 }
 
-/* The single non-language-specific builtin type */
-struct type *builtin_type_error;
-
 /* Block in which the most recently searched-for symbol was found.
    Might be better to make this a parameter to lookup_symbol and
    value_of_this. */
@@ -693,6 +690,7 @@ symbol_search_name (const struct general_symbol_info *gsymbol)
 void
 init_sal (struct symtab_and_line *sal)
 {
+  sal->pspace = NULL;
   sal->symtab = 0;
   sal->section = 0;
   sal->line = 0;
@@ -1997,9 +1995,12 @@ find_pc_sect_symtab (CORE_ADDR pc, struct obj_section *section)
   struct symtab *best_s = NULL;
   struct partial_symtab *ps;
   struct objfile *objfile;
+  struct program_space *pspace;
   CORE_ADDR distance = 0;
   struct minimal_symbol *msymbol;
 
+  pspace = current_program_space;
+
   /* If we know that this is not a text address, return failure.  This is
      necessary because we loop based on the block's high and low code
      addresses, which do not include the data ranges, and because
@@ -2082,8 +2083,8 @@ find_pc_sect_symtab (CORE_ADDR pc, struct obj_section *section)
           will cause a core dump), but maybe we can successfully
           continue, so let's not.  */
        warning (_("\
-(Internal error: pc 0x%s in read in psymtab, but not in symtab.)\n"),
-                paddr_nz (pc));
+(Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
+                paddress (get_objfile_arch (ps->objfile), pc));
       s = PSYMTAB_TO_SYMTAB (ps);
     }
   return (s);
@@ -2155,6 +2156,8 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
 
   init_sal (&val);             /* initialize to zeroes */
 
+  val.pspace = current_program_space;
+
   /* It's tempting to assume that, if we can't find debugging info for
      any function enclosing PC, that we shouldn't search for line
      number info, either.  However, GAS can emit line number info for
@@ -2659,6 +2662,11 @@ find_function_start_sal (struct symbol *sym, int funfirstline)
   struct symtab_and_line sal;
   struct block *b, *function_block;
 
+  struct cleanup *old_chain;
+
+  old_chain = save_current_space_and_thread ();
+  switch_to_program_space_and_thread (objfile->pspace);
+
   pc = BLOCK_START (block);
   fixup_symbol_section (sym, objfile);
   if (funfirstline)
@@ -2710,6 +2718,7 @@ find_function_start_sal (struct symbol *sym, int funfirstline)
     }
 
   sal.pc = pc;
+  sal.pspace = objfile->pspace;
 
   /* Check if we are now inside an inlined function.  If we can,
      use the call site of the function instead.  */
@@ -2730,6 +2739,7 @@ find_function_start_sal (struct symbol *sym, int funfirstline)
       sal.symtab = SYMBOL_SYMTAB (BLOCK_FUNCTION (function_block));
     }
 
+  do_cleanups (old_chain);
   return sal;
 }
 
@@ -3246,6 +3256,8 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
     {
       ALL_MSYMBOLS (objfile, msymbol)
       {
+        QUIT;
+
        if (MSYMBOL_TYPE (msymbol) == ourtype ||
            MSYMBOL_TYPE (msymbol) == ourtype2 ||
            MSYMBOL_TYPE (msymbol) == ourtype3 ||
@@ -3336,6 +3348,8 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
     {
       ALL_MSYMBOLS (objfile, msymbol)
       {
+        QUIT;
+
        if (MSYMBOL_TYPE (msymbol) == ourtype ||
            MSYMBOL_TYPE (msymbol) == ourtype2 ||
            MSYMBOL_TYPE (msymbol) == ourtype3 ||
@@ -3835,7 +3849,8 @@ default_make_symbol_completion_list (char *text, char *word)
           which are in symbols.  */
        while (p > text)
          {
-           if (isalnum (p[-1]) || p[-1] == '_' || p[-1] == '\0')
+           if (isalnum (p[-1]) || p[-1] == '_' || p[-1] == '\0'
+               || p[-1] == ':')
              --p;
            else
              break;
@@ -4558,6 +4573,7 @@ symtab_observer_executable_changed (void)
    initializing it from SYMTAB, LINENO and PC.  */
 static void
 append_expanded_sal (struct symtabs_and_lines *sal,
+                    struct program_space *pspace,
                     struct symtab *symtab,
                     int lineno, CORE_ADDR pc)
 {
@@ -4565,6 +4581,7 @@ append_expanded_sal (struct symtabs_and_lines *sal,
                        sizeof (sal->sals[0])
                        * (sal->nelts + 1));
   init_sal (sal->sals + sal->nelts);
+  sal->sals[sal->nelts].pspace = pspace;
   sal->sals[sal->nelts].symtab = symtab;
   sal->sals[sal->nelts].section = NULL;
   sal->sals[sal->nelts].end = 0;
@@ -4584,14 +4601,16 @@ append_exact_match_to_sals (char *filename, int lineno,
                            struct linetable_entry **best_item,
                            struct symtab **best_symtab)
 {
+  struct program_space *pspace;
   struct objfile *objfile;
   struct symtab *symtab;
   int exact = 0;
   int j;
   *best_item = 0;
   *best_symtab = 0;
-  
-  ALL_SYMTABS (objfile, symtab)
+
+  ALL_PSPACES (pspace)
+    ALL_PSPACE_SYMTABS (pspace, objfile, symtab)
     {
       if (strcmp (filename, symtab->filename) == 0)
        {
@@ -4609,7 +4628,8 @@ append_exact_match_to_sals (char *filename, int lineno,
              if (item->line == lineno)
                {
                  exact = 1;
-                 append_expanded_sal (ret, symtab, lineno, item->pc);
+                 append_expanded_sal (ret, objfile->pspace,
+                                      symtab, lineno, item->pc);
                }
              else if (!exact && item->line > lineno
                       && (*best_item == NULL
@@ -4624,11 +4644,10 @@ append_exact_match_to_sals (char *filename, int lineno,
   return exact;
 }
 
-/* Compute a set of all sals in
-   the entire program that correspond to same file
-   and line as SAL and return those.  If there
-   are several sals that belong to the same block,
-   only one sal for the block is included in results.  */
+/* Compute a set of all sals in all program spaces that correspond to
+   same file and line as SAL and return those.  If there are several
+   sals that belong to the same block, only one sal for the block is
+   included in results.  */
 
 struct symtabs_and_lines
 expand_line_sal (struct symtab_and_line sal)
@@ -4642,10 +4661,12 @@ expand_line_sal (struct symtab_and_line sal)
   int deleted = 0;
   struct block **blocks = NULL;
   int *filter;
+  struct cleanup *old_chain;
 
   ret.nelts = 0;
   ret.sals = NULL;
 
+  /* Only expand sals that represent file.c:line.  */
   if (sal.symtab == NULL || sal.line == 0 || sal.pc != 0)
     {
       ret.sals = xmalloc (sizeof (struct symtab_and_line));
@@ -4655,11 +4676,14 @@ expand_line_sal (struct symtab_and_line sal)
     }
   else
     {
+      struct program_space *pspace;
       struct linetable_entry *best_item = 0;
       struct symtab *best_symtab = 0;
       int exact = 0;
+      char *match_filename;
 
       lineno = sal.line;
+      match_filename = sal.symtab->filename;
 
       /* We need to find all symtabs for a file which name
         is described by sal.  We cannot just directly
@@ -4672,17 +4696,23 @@ expand_line_sal (struct symtab_and_line sal)
         the right name.  Then, we iterate over symtabs, knowing
         that all symtabs we're interested in are loaded.  */
 
-      ALL_PSYMTABS (objfile, psymtab)
+      old_chain = save_current_program_space ();
+      ALL_PSPACES (pspace)
+       ALL_PSPACE_PSYMTABS (pspace, objfile, psymtab)
        {
-         if (strcmp (sal.symtab->filename,
-                     psymtab->filename) == 0)
-           PSYMTAB_TO_SYMTAB (psymtab);
+         if (strcmp (match_filename, psymtab->filename) == 0)
+           {
+             set_current_program_space (pspace);
+
+             PSYMTAB_TO_SYMTAB (psymtab);
+           }
        }
+      do_cleanups (old_chain);
 
       /* Now search the symtab for exact matches and append them.  If
         none is found, append the best_item and all its exact
         matches.  */
-      exact = append_exact_match_to_sals (sal.symtab->filename, lineno,
+      exact = append_exact_match_to_sals (match_filename, lineno,
                                          &ret, &best_item, &best_symtab);
       if (!exact && best_item)
        append_exact_match_to_sals (best_symtab->filename, best_item->line,
@@ -4698,13 +4728,21 @@ expand_line_sal (struct symtab_and_line sal)
      blocks -- for each PC found above we see if there are other PCs
      that are in the same block.  If yes, the other PCs are filtered out.  */
 
+  old_chain = save_current_program_space ();
   filter = alloca (ret.nelts * sizeof (int));
   blocks = alloca (ret.nelts * sizeof (struct block *));
   for (i = 0; i < ret.nelts; ++i)
     {
+      struct blockvector *bl;
+      struct block *b;
+
+      set_current_program_space (ret.sals[i].pspace);
+
       filter[i] = 1;
-      blocks[i] = block_for_pc (ret.sals[i].pc);
+      blocks[i] = block_for_pc_sect (ret.sals[i].pc, ret.sals[i].section);
+
     }
+  do_cleanups (old_chain);
 
   for (i = 0; i < ret.nelts; ++i)
     if (blocks[i] != NULL)
@@ -4779,9 +4817,5 @@ Show how the debugger handles ambiguities in expressions."), _("\
 Valid values are \"ask\", \"all\", \"cancel\", and the default is \"all\"."),
                         NULL, NULL, &setlist, &showlist);
 
-  /* Initialize the one built-in type that isn't language dependent... */
-  builtin_type_error = init_type (TYPE_CODE_ERROR, 0, 0,
-                                 "<unknown type>", (struct objfile *) NULL);
-
   observer_attach_executable_changed (symtab_observer_executable_changed);
 }
This page took 0.028845 seconds and 4 git commands to generate.