* i386.h: Correct opcode values for fsubp, fsubrp, fdivp, and
[deliverable/binutils-gdb.git] / gdb / symtab.c
index 92bff76850a0571f641163a994584dba203326a9..654098e6529083d1894dc8d0ba6a897470c2a3d8 100644 (file)
@@ -1,5 +1,5 @@
 /* Symbol table lookup for the GNU debugger, GDB.
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995
+   Copyright 1986, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 1997
              Free Software Foundation, Inc.
 
 This file is part of GDB.
@@ -77,7 +77,7 @@ list_symbols PARAMS ((char *, int, int, int));
 static void
 output_source_filename PARAMS ((char *, int *));
 
-static char *
+char *
 operator_chars PARAMS ((char *, char **));
 
 static int find_line_common PARAMS ((struct linetable *, int, int *));
@@ -459,6 +459,33 @@ find_pc_psymbol (psymtab, pc)
   return best;
 }
 
+/* Debug symbols usually don't have section information.  We need to dig that
+   out of the minimal symbols and stash that in the debug symbol.  */
+
+static
+struct symbol * fixup_symbol_section PARAMS ((struct symbol *sym,
+                                             struct objfile *objfile));
+static struct symbol *
+fixup_symbol_section (sym, objfile)
+     struct symbol *sym;
+     struct objfile *objfile;
+{
+  struct minimal_symbol *msym;
+
+  if (!sym)
+    return NULL;
+
+  if (SYMBOL_BFD_SECTION (sym))
+    return sym;
+
+  msym = lookup_minimal_symbol (SYMBOL_NAME (sym), NULL, objfile);
+
+  if (msym)
+    SYMBOL_BFD_SECTION (sym) = SYMBOL_BFD_SECTION (msym);
+
+  return sym;
+}
+
 \f
 /* Find the definition for a specified symbol name NAME
    in namespace NAMESPACE, visible from lexical block BLOCK.
@@ -493,7 +520,7 @@ lookup_symbol (name, block, namespace, is_a_field_of_this, symtab)
   register struct symtab *s = NULL;
   register struct partial_symtab *ps;
   struct blockvector *bv;
-  register struct objfile *objfile;
+  register struct objfile *objfile = NULL;
   register struct block *b;
   register struct minimal_symbol *msymbol;
 
@@ -521,7 +548,7 @@ found:
              *symtab = s;
            }
 
-         return (sym);
+         return fixup_symbol_section (sym, objfile);
        }
       block = BLOCK_SUPERBLOCK (block);
     }
@@ -550,7 +577,7 @@ found:
                  block_found = b;
                  if (symtab != NULL)
                    *symtab = s;
-                 return sym;
+                 return fixup_symbol_section (sym, objfile);
                }
            }
        }
@@ -569,7 +596,7 @@ found:
          *is_a_field_of_this = 1;
          if (symtab != NULL)
            *symtab = NULL;
-         return 0;
+         return NULL;
        }
     }
 
@@ -586,7 +613,7 @@ found:
          block_found = block;
          if (symtab != NULL)
            *symtab = s;
-         return sym;
+         return fixup_symbol_section (sym, objfile);
        }
     }
 
@@ -630,7 +657,7 @@ found:
 
              if (symtab != NULL)
                *symtab = s;
-             return sym;
+             return fixup_symbol_section (sym, objfile);
            }
          else if (MSYMBOL_TYPE (msymbol) != mst_text
                   && MSYMBOL_TYPE (msymbol) != mst_file_text
@@ -638,8 +665,10 @@ found:
            {
              /* This is a mangled variable, look it up by its
                 mangled name.  */
-             return lookup_symbol (SYMBOL_NAME (msymbol), block,
-                                   namespace, is_a_field_of_this, symtab);
+             return fixup_symbol_section
+               (lookup_symbol (SYMBOL_NAME (msymbol), block,
+                               namespace, is_a_field_of_this, symtab),
+                NULL);
            }
          /* There are no debug symbols for this file, or we are looking
             for an unmangled variable.
@@ -659,7 +688,7 @@ found:
            error ("Internal: global symbol `%s' found in %s psymtab but not in symtab", name, ps->filename);
          if (symtab != NULL)
            *symtab = s;
-         return sym;
+         return fixup_symbol_section (sym, objfile);
        }
     }
 
@@ -677,7 +706,7 @@ found:
          block_found = block;
          if (symtab != NULL)
            *symtab = s;
-         return sym;
+         return fixup_symbol_section (sym, objfile);
        }
     }
 
@@ -693,7 +722,7 @@ found:
            error ("Internal: static symbol `%s' found in %s psymtab but not in symtab", name, ps->filename);
          if (symtab != NULL)
            *symtab = s;
-         return sym;
+         return fixup_symbol_section (sym, objfile);
        }
     }
 
@@ -1170,15 +1199,15 @@ find_pc_line (pc, notcurrent)
      But what we want is the statement containing the instruction.
      Fudge the pc to make sure we get that.  */
 
-  if (notcurrent) pc -= 1;
+  INIT_SAL (&val);     /* initialize to zeroes */
+
+  if (notcurrent) 
+    pc -= 1;
 
   s = find_pc_symtab (pc);
   if (!s)
     {
-      val.symtab = 0;
-      val.line = 0;
       val.pc = pc;
-      val.end = 0;
       return val;
     }
 
@@ -1248,11 +1277,8 @@ find_pc_line (pc, notcurrent)
     {
       if (!alt_symtab)
        {                       /* If we didn't find any line # info, just
-                                return zeros.  */
-         val.symtab = 0;
-         val.line = 0;
+                                  return zeros.  */
          val.pc = pc;
-         val.end = 0;
        }
       else
        {
@@ -1551,7 +1577,7 @@ find_function_start_sal (sym, funfirstline)
    some legitimate operator text, return a pointer to the
    beginning of the substring of the operator text.
    Otherwise, return "".  */
-static char *
+char *
 operator_chars (p, end)
      char *p;
      char **end;
@@ -1717,19 +1743,12 @@ find_methods (t, name, sym_arr)
                if (DESTRUCTOR_PREFIX_P (phys_name))
                  continue;
 
-               /* FIXME: Why are we looking this up in the
-                  SYMBOL_BLOCK_VALUE (sym_class)?  It is intended as a hook
-                  for nested types?  If so, it should probably hook to the
-                  type, not the symbol.  mipsread.c is the only symbol
-                  reader which sets the SYMBOL_BLOCK_VALUE for types, and
-                  this is not documented in symtab.h.  -26Aug93.  */
-
                sym_arr[i1] = lookup_symbol (phys_name,
-                                            SYMBOL_BLOCK_VALUE (sym_class),
-                                            VAR_NAMESPACE,
+                                            NULL, VAR_NAMESPACE,
                                             (int *) NULL,
                                             (struct symtab **) NULL);
-               if (sym_arr[i1]) i1++;
+               if (sym_arr[i1])
+                 i1++;
                else
                  {
                    fputs_filtered("(Cannot find method ", gdb_stdout);
@@ -1902,6 +1921,8 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
   char *saved_arg = *argptr;
   extern char *gdb_completer_quote_characters;
   
+  INIT_SAL (&val);     /* initialize to zeroes */
+
   /* Defaults have defaults.  */
 
   if (default_symtab == 0)
@@ -2029,25 +2050,22 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
              sym_arr = (struct symbol **) alloca(total_number_of_methods (t)
                                                  * sizeof(struct symbol *));
 
-             /* Cfront objects don't have fieldlists.  */
-             if (destructor_name_p (copy, t) && TYPE_FN_FIELDLISTS (t) != NULL)
+             if (destructor_name_p (copy, t))
                {
-                 /* destructors are a special case.  */
-                 struct fn_field *f = TYPE_FN_FIELDLIST1 (t, 0);
-                 int len = TYPE_FN_FIELDLIST_LENGTH (t, 0) - 1;
-                 /* gcc 1.x puts destructor in last field,
-                    gcc 2.x puts destructor in first field.  */
-                 char *phys_name = TYPE_FN_FIELD_PHYSNAME (f, len);
-                 if (!DESTRUCTOR_PREFIX_P (phys_name))
+                 /* Destructors are a special case.  */
+                 int m_index, f_index;
+
+                 if (get_destructor_fn_field (t, &m_index, &f_index))
                    {
-                     phys_name = TYPE_FN_FIELD_PHYSNAME (f, 0);
-                     if (!DESTRUCTOR_PREFIX_P (phys_name))
-                       phys_name = "";
+                     struct fn_field *f = TYPE_FN_FIELDLIST1 (t, m_index);
+
+                     sym_arr[i1] =
+                       lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, f_index),
+                                      NULL, VAR_NAMESPACE, (int *) NULL,
+                                      (struct symtab **)NULL);
+                     if (sym_arr[i1])
+                       i1++;
                    }
-                 sym_arr[i1] =
-                   lookup_symbol (phys_name, SYMBOL_BLOCK_VALUE (sym_class),
-                                  VAR_NAMESPACE, 0, (struct symtab **)NULL);
-                 if (sym_arr[i1]) i1++;
                }
              else
                i1 = find_methods (t, copy, sym_arr);
@@ -2324,15 +2342,14 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
   msymbol = lookup_minimal_symbol (copy, NULL, NULL);
   if (msymbol != NULL)
     {
-      val.symtab = 0;
-      val.line = 0;
       val.pc = SYMBOL_VALUE_ADDRESS (msymbol);
       if (funfirstline)
        {
          val.pc += FUNCTION_START_OFFSET;
          SKIP_PROLOGUE (val.pc);
        }
-      values.sals = (struct symtab_and_line *)xmalloc (sizeof (struct symtab_and_line));
+      values.sals = (struct symtab_and_line *)
+       xmalloc (sizeof (struct symtab_and_line));
       values.sals[0] = val;
       values.nelts = 1;
       return values;
@@ -2398,6 +2415,8 @@ decode_line_2 (sym_arr, nelts, funfirstline, canonical)
   printf_unfiltered("[0] cancel\n[1] all\n");
   while (i < nelts)
     {
+      INIT_SAL (&return_values.sals[i]);       /* initialize to zeroes */
+      INIT_SAL (&values.sals[i]);
       if (sym_arr[i] && SYMBOL_CLASS (sym_arr[i]) == LOC_BLOCK)
        {
          values.sals[i] = find_function_start_sal (sym_arr[i], funfirstline);
@@ -2458,7 +2477,7 @@ decode_line_2 (sym_arr, nelts, funfirstline, canonical)
          return return_values;
        }
 
-      if (num > nelts + 2)
+      if (num >= nelts + 2)
        {
          printf_unfiltered ("No choice number %d.\n", num);
        }
@@ -2848,15 +2867,26 @@ list_symbols (regexp, class, bpt, from_tty)
                      }
                    else
                      {
-# if 0  /* FIXME, why is this zapped out? */
-                       char buf[1024];
+# if 0
+/* Tiemann says: "info methods was never implemented."  */
+                       char *demangled_name;
                        c_type_print_base (TYPE_FN_FIELD_TYPE(t, i),
                                           gdb_stdout, 0, 0); 
                        c_type_print_varspec_prefix (TYPE_FN_FIELD_TYPE(t, i),
                                                     gdb_stdout, 0); 
-                       sprintf (buf, " %s::", type_name_no_tag (t));
-                       cp_type_print_method_args (TYPE_FN_FIELD_ARGS (t, i),
-                                                  buf, name, gdb_stdout);
+                       if (TYPE_FN_FIELD_STUB (t, i))
+                         check_stub_method (TYPE_DOMAIN_TYPE (type), j, i);
+                       demangled_name =
+                         cplus_demangle (TYPE_FN_FIELD_PHYSNAME (t, i),
+                                         DMGL_ANSI | DMGL_PARAMS);
+                       if (demangled_name == NULL)
+                         fprintf_filtered (stream, "<badly mangled name %s>",
+                                           TYPE_FN_FIELD_PHYSNAME (t, i));
+                       else
+                         {
+                           fputs_filtered (demangled_name, stream);
+                           free (demangled_name);
+                         }
 # endif
                      }
                  }
This page took 0.027319 seconds and 4 git commands to generate.