include/opcode/
[deliverable/binutils-gdb.git] / gdb / symtab.c
index 33efe129239e1c3f356b9bd8427b397cad281d32..0466490edd99dc2c41b9538f371e30d18cbf5cfd 100644 (file)
@@ -86,29 +86,25 @@ static struct symbol *lookup_symbol_aux (const char *name,
                                         const struct block *block,
                                         const domain_enum domain,
                                         enum language language,
-                                        int *is_a_field_of_this,
-                                        struct symtab **symtab);
+                                        int *is_a_field_of_this);
 
 static
 struct symbol *lookup_symbol_aux_local (const char *name,
                                        const char *linkage_name,
                                        const struct block *block,
-                                       const domain_enum domain,
-                                       struct symtab **symtab);
+                                       const domain_enum domain);
 
 static
 struct symbol *lookup_symbol_aux_symtabs (int block_index,
                                          const char *name,
                                          const char *linkage_name,
-                                         const domain_enum domain,
-                                         struct symtab **symtab);
+                                         const domain_enum domain);
 
 static
 struct symbol *lookup_symbol_aux_psymtabs (int block_index,
                                           const char *name,
                                           const char *linkage_name,
-                                          const domain_enum domain,
-                                          struct symtab **symtab);
+                                          const domain_enum domain);
 
 static int file_matches (char *, char **, int);
 
@@ -1120,7 +1116,6 @@ fixup_symbol_section (struct symbol *sym, struct objfile *objfile)
     {
     case LOC_STATIC:
     case LOC_LABEL:
-    case LOC_INDIRECT:
       addr = SYMBOL_VALUE_ADDRESS (sym);
       break;
     case LOC_BLOCK:
@@ -1155,7 +1150,6 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
     {
     case LOC_STATIC:
     case LOC_LABEL:
-    case LOC_INDIRECT:
     case LOC_BLOCK:
       addr = SYMBOL_VALUE_ADDRESS (psym);
       break;
@@ -1173,8 +1167,6 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
 /* Find the definition for a specified symbol name NAME
    in domain DOMAIN, visible from lexical block BLOCK.
    Returns the struct symbol pointer, or zero if no symbol is found.
-   If SYMTAB is non-NULL, store the symbol table in which the
-   symbol was found there, or NULL if not found.
    C++: if IS_A_FIELD_OF_THIS is nonzero on entry, check to see if
    NAME is a field of the current implied argument `this'.  If so set
    *IS_A_FIELD_OF_THIS to 1, otherwise set it to zero. 
@@ -1194,8 +1186,7 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
 struct symbol *
 lookup_symbol_in_language (const char *name, const struct block *block,
                           const domain_enum domain, enum language lang,
-                          int *is_a_field_of_this,
-                          struct symtab **symtab)
+                          int *is_a_field_of_this)
 {
   char *demangled_name = NULL;
   const char *modified_name = NULL;
@@ -1243,15 +1234,10 @@ lookup_symbol_in_language (const char *name, const struct block *block,
     }
 
   returnval = lookup_symbol_aux (modified_name, mangled_name, block,
-                                domain, lang,
-                                is_a_field_of_this, symtab);
+                                domain, lang, is_a_field_of_this);
   if (needtofreename)
     xfree (demangled_name);
 
-  /* Override the returned symtab with the symbol's specific one.  */
-  if (returnval != NULL && symtab != NULL)
-    *symtab = SYMBOL_SYMTAB (returnval);
-
   return returnval;     
 }
 
@@ -1260,12 +1246,11 @@ lookup_symbol_in_language (const char *name, const struct block *block,
 
 struct symbol *
 lookup_symbol (const char *name, const struct block *block,
-              domain_enum domain, int *is_a_field_of_this,
-              struct symtab **symtab)
+              domain_enum domain, int *is_a_field_of_this)
 {
   return lookup_symbol_in_language (name, block, domain,
                                    current_language->la_language,
-                                   is_a_field_of_this, symtab);
+                                   is_a_field_of_this);
 }
 
 /* Behave like lookup_symbol except that NAME is the natural name
@@ -1276,8 +1261,7 @@ lookup_symbol (const char *name, const struct block *block,
 static struct symbol *
 lookup_symbol_aux (const char *name, const char *linkage_name,
                   const struct block *block, const domain_enum domain,
-                  enum language language,
-                  int *is_a_field_of_this, struct symtab **symtab)
+                  enum language language, int *is_a_field_of_this)
 {
   struct symbol *sym;
   const struct language_defn *langdef;
@@ -1293,8 +1277,7 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
   /* Search specified block and its superiors.  Don't search
      STATIC_BLOCK or GLOBAL_BLOCK.  */
 
-  sym = lookup_symbol_aux_local (name, linkage_name, block, domain,
-                                symtab);
+  sym = lookup_symbol_aux_local (name, linkage_name, block, domain);
   if (sym != NULL)
     return sym;
 
@@ -1334,8 +1317,6 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
          if (check_field (t, name))
            {
              *is_a_field_of_this = 1;
-             if (symtab != NULL)
-               *symtab = NULL;
              return NULL;
            }
        }
@@ -1344,8 +1325,7 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
   /* Now do whatever is appropriate for LANGUAGE to look
      up static and global variables.  */
 
-  sym = langdef->la_lookup_symbol_nonlocal (name, linkage_name,
-                                            block, domain, symtab);
+  sym = langdef->la_lookup_symbol_nonlocal (name, linkage_name, block, domain);
   if (sym != NULL)
     return sym;
 
@@ -1355,18 +1335,14 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
      desired name as a file-level static, then do psymtab-to-symtab
      conversion on the fly and return the found symbol. */
 
-  sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, linkage_name,
-                                  domain, symtab);
+  sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, linkage_name, domain);
   if (sym != NULL)
     return sym;
   
-  sym = lookup_symbol_aux_psymtabs (STATIC_BLOCK, name, linkage_name,
-                                   domain, symtab);
+  sym = lookup_symbol_aux_psymtabs (STATIC_BLOCK, name, linkage_name, domain);
   if (sym != NULL)
     return sym;
 
-  if (symtab != NULL)
-    *symtab = NULL;
   return NULL;
 }
 
@@ -1376,8 +1352,7 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
 static struct symbol *
 lookup_symbol_aux_local (const char *name, const char *linkage_name,
                         const struct block *block,
-                        const domain_enum domain,
-                        struct symtab **symtab)
+                        const domain_enum domain)
 {
   struct symbol *sym;
   const struct block *static_block = block_static_block (block);
@@ -1389,8 +1364,7 @@ lookup_symbol_aux_local (const char *name, const char *linkage_name,
 
   while (block != static_block)
     {
-      sym = lookup_symbol_aux_block (name, linkage_name, block, domain,
-                                    symtab);
+      sym = lookup_symbol_aux_block (name, linkage_name, block, domain);
       if (sym != NULL)
        return sym;
       block = BLOCK_SUPERBLOCK (block);
@@ -1421,42 +1395,21 @@ lookup_objfile_from_block (const struct block *block)
   return NULL;
 }
 
-/* Look up a symbol in a block; if found, locate its symtab, fixup the
-   symbol, and set block_found appropriately.  */
+/* Look up a symbol in a block; if found, fixup the symbol, and set
+   block_found appropriately.  */
 
 struct symbol *
 lookup_symbol_aux_block (const char *name, const char *linkage_name,
                         const struct block *block,
-                        const domain_enum domain,
-                        struct symtab **symtab)
+                        const domain_enum domain)
 {
   struct symbol *sym;
-  struct objfile *objfile = NULL;
-  struct blockvector *bv;
-  struct block *b;
-  struct symtab *s = NULL;
 
   sym = lookup_block_symbol (block, name, linkage_name, domain);
   if (sym)
     {
       block_found = block;
-      if (symtab != NULL)
-       {
-         /* 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 (block)
-                 && BLOCK_END (b) > BLOCK_START (block))
-               goto found;
-           }
-       found:
-         *symtab = s;
-       }
-      
-      return fixup_symbol_section (sym, objfile);
+      return fixup_symbol_section (sym, NULL);
     }
 
   return NULL;
@@ -1469,8 +1422,7 @@ struct symbol *
 lookup_global_symbol_from_objfile (const struct objfile *objfile,
                                   const char *name,
                                   const char *linkage_name,
-                                  const domain_enum domain,
-                                  struct symtab **symtab)
+                                  const domain_enum domain)
 {
   struct symbol *sym;
   struct blockvector *bv;
@@ -1487,8 +1439,6 @@ lookup_global_symbol_from_objfile (const struct objfile *objfile,
     if (sym)
       {
        block_found = block;
-       if (symtab != NULL)
-         *symtab = s;
        return fixup_symbol_section (sym, (struct objfile *)objfile);
       }
   }
@@ -1504,16 +1454,13 @@ lookup_global_symbol_from_objfile (const struct objfile *objfile,
        bv = BLOCKVECTOR (s);
        block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
        sym = lookup_block_symbol (block, name, linkage_name, domain);
-       if (symtab != NULL)
-         *symtab = s;
        return fixup_symbol_section (sym, (struct objfile *)objfile);
       }
   }
 
   if (objfile->separate_debug_objfile)
     return lookup_global_symbol_from_objfile (objfile->separate_debug_objfile,
-                                             name, linkage_name, domain,
-                                             symtab);
+                                             name, linkage_name, domain);
 
   return NULL;
 }
@@ -1526,8 +1473,7 @@ lookup_global_symbol_from_objfile (const struct objfile *objfile,
 static struct symbol *
 lookup_symbol_aux_symtabs (int block_index,
                           const char *name, const char *linkage_name,
-                          const domain_enum domain,
-                          struct symtab **symtab)
+                          const domain_enum domain)
 {
   struct symbol *sym;
   struct objfile *objfile;
@@ -1543,8 +1489,6 @@ lookup_symbol_aux_symtabs (int block_index,
     if (sym)
       {
        block_found = block;
-       if (symtab != NULL)
-         *symtab = s;
        return fixup_symbol_section (sym, objfile);
       }
   }
@@ -1560,8 +1504,7 @@ lookup_symbol_aux_symtabs (int block_index,
 static struct symbol *
 lookup_symbol_aux_psymtabs (int block_index, const char *name,
                            const char *linkage_name,
-                           const domain_enum domain,
-                           struct symtab **symtab)
+                           const domain_enum domain)
 {
   struct symbol *sym;
   struct objfile *objfile;
@@ -1603,8 +1546,6 @@ lookup_symbol_aux_psymtabs (int block_index, const char *name,
                     block_index == GLOBAL_BLOCK ? "global" : "static",
                     name, ps->filename, name, name);
          }
-       if (symtab != NULL)
-         *symtab = s;
        return fixup_symbol_section (sym, objfile);
       }
   }
@@ -1620,8 +1561,7 @@ struct symbol *
 basic_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)
 {
   struct symbol *sym;
 
@@ -1653,11 +1593,11 @@ basic_lookup_symbol_nonlocal (const char *name,
      than that one, so I don't think we should worry about that for
      now.  */
 
-  sym = lookup_symbol_static (name, linkage_name, block, domain, symtab);
+  sym = lookup_symbol_static (name, linkage_name, block, domain);
   if (sym != NULL)
     return sym;
 
-  return lookup_symbol_global (name, linkage_name, block, domain, symtab);
+  return lookup_symbol_global (name, linkage_name, block, domain);
 }
 
 /* Lookup a symbol in the static block associated to BLOCK, if there
@@ -1667,14 +1607,12 @@ struct symbol *
 lookup_symbol_static (const char *name,
                      const char *linkage_name,
                      const struct block *block,
-                     const domain_enum domain,
-                     struct symtab **symtab)
+                     const domain_enum domain)
 {
   const struct block *static_block = block_static_block (block);
 
   if (static_block != NULL)
-    return lookup_symbol_aux_block (name, linkage_name, static_block,
-                                   domain, symtab);
+    return lookup_symbol_aux_block (name, linkage_name, static_block, domain);
   else
     return NULL;
 }
@@ -1686,8 +1624,7 @@ struct symbol *
 lookup_symbol_global (const char *name,
                      const char *linkage_name,
                      const struct block *block,
-                     const domain_enum domain,
-                     struct symtab **symtab)
+                     const domain_enum domain)
 {
   struct symbol *sym = NULL;
   struct objfile *objfile = NULL;
@@ -1695,17 +1632,15 @@ lookup_symbol_global (const char *name,
   /* Call library-specific lookup procedure.  */
   objfile = lookup_objfile_from_block (block);
   if (objfile != NULL)
-    sym = solib_global_lookup (objfile, name, linkage_name, domain, symtab);
+    sym = solib_global_lookup (objfile, name, linkage_name, domain);
   if (sym != NULL)
     return sym;
 
-  sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, linkage_name,
-                                  domain, symtab);
+  sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, linkage_name, domain);
   if (sym != NULL)
     return sym;
 
-  return lookup_symbol_aux_psymtabs (GLOBAL_BLOCK, name, linkage_name,
-                                    domain, symtab);
+  return lookup_symbol_aux_psymtabs (GLOBAL_BLOCK, name, linkage_name, domain);
 }
 
 int
@@ -2020,13 +1955,7 @@ lookup_block_symbol (const struct block *block, const char *name,
                  ? strcmp (SYMBOL_LINKAGE_NAME (sym), linkage_name) == 0 : 1))
            {
              sym_found = sym;
-             if (SYMBOL_CLASS (sym) != LOC_ARG &&
-                 SYMBOL_CLASS (sym) != LOC_LOCAL_ARG &&
-                 SYMBOL_CLASS (sym) != LOC_REF_ARG &&
-                 SYMBOL_CLASS (sym) != LOC_REGPARM &&
-                 SYMBOL_CLASS (sym) != LOC_REGPARM_ADDR &&
-                 SYMBOL_CLASS (sym) != LOC_BASEREG_ARG &&
-                 SYMBOL_CLASS (sym) != LOC_COMPUTED_ARG)
+             if (!SYMBOL_IS_ARGUMENT (sym))
                {
                  break;
                }
@@ -2688,6 +2617,21 @@ find_function_start_sal (struct symbol *sym, int funfirstline)
       /* Recalculate the line number (might not be N+1).  */
       sal = find_pc_sect_line (pc, SYMBOL_BFD_SECTION (sym), 0);
     }
+
+  /* On targets with executable formats that don't have a concept of
+     constructors (ELF with .init has, PE doesn't), gcc emits a call
+     to `__main' in `main' between the prologue and before user
+     code.  */
+  if (funfirstline
+      && gdbarch_skip_main_prologue_p (current_gdbarch)
+      && SYMBOL_LINKAGE_NAME (sym)
+      && strcmp (SYMBOL_LINKAGE_NAME (sym), "main") == 0)
+    {
+      pc = gdbarch_skip_main_prologue (current_gdbarch, pc);
+      /* Recalculate the line number (might not be N+1).  */
+      sal = find_pc_sect_line (pc, SYMBOL_BFD_SECTION (sym), 0);
+    }
+
   sal.pc = pc;
 
   return sal;
@@ -3227,8 +3171,7 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
                    if (kind == FUNCTIONS_DOMAIN
                        || lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol),
                                          (struct block *) NULL,
-                                         VAR_DOMAIN,
-                                         0, (struct symtab **) NULL)
+                                         VAR_DOMAIN, 0)
                        == NULL)
                      found_misc = 1;
                  }
@@ -3314,8 +3257,8 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
                  {
                    /* Variables/Absolutes:  Look up by name */
                    if (lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol),
-                                      (struct block *) NULL, VAR_DOMAIN,
-                                      0, (struct symtab **) NULL) == NULL)
+                                      (struct block *) NULL, VAR_DOMAIN, 0)
+                        == NULL)
                      {
                        /* match */
                        psr = (struct symbol_search *) xmalloc (sizeof (struct symbol_search));
This page took 0.031144 seconds and 4 git commands to generate.