* mdebugread.c (parse_type): Do not complain for types with
authorPeter Schauer <Peter.Schauer@mytum.de>
Thu, 10 Mar 1994 09:28:18 +0000 (09:28 +0000)
committerPeter Schauer <Peter.Schauer@mytum.de>
Thu, 10 Mar 1994 09:28:18 +0000 (09:28 +0000)
an `indexNil' aux index, these are simply undefined types.
Remove indexNil check from caller of parse_type.
* mdebugread.c (parse_partial_symbols):  Do not enter
stGlobal, scCommon symbols into the minimal symbol table, their
value is the size of the common, not its address.
Handle scInit, scFini, scPData and scXData sections.
Use minimal symbol type mst_file_* for stLabel symbols, instead of
mst_*.
Enter stProc symbols into the global_psymbols list once, not into
the static_psymbols_list.
Get rid of dummy psymtab if it is empty, to allow proper detection
of stripped executables.
* mdebugread.c (cross_ref):  Allow cross references to Fortran
common blocks.

gdb/ChangeLog
gdb/mdebugread.c

index 0a6d856e83bee2972e9aae1d601809b0e01d5293..878d273b8fd73247609d878b9411d8ba7124ecb4 100644 (file)
@@ -1,3 +1,21 @@
+Wed Mar  9 21:43:24 1994  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
+
+       * mdebugread.c (parse_type):  Do not complain for types with
+       an `indexNil' aux index, these are simply undefined types.
+       Remove indexNil check from caller of parse_type.
+       * mdebugread.c (parse_partial_symbols):  Do not enter
+       stGlobal, scCommon symbols into the minimal symbol table, their
+       value is the size of the common, not its address.
+       Handle scInit, scFini, scPData and scXData sections.
+       Use minimal symbol type mst_file_* for stLabel symbols, instead of
+       mst_*.
+       Enter stProc symbols into the global_psymbols list once, not into
+       the static_psymbols_list.
+       Get rid of dummy psymtab if it is empty, to allow proper detection
+       of stripped executables.
+       * mdebugread.c (cross_ref):  Allow cross references to Fortran
+       common blocks.
+
 Wed Mar  9 15:23:19 1994  Jim Kingdon  (kingdon@lioth.cygnus.com)
 
        * stabsread.c (common_block_end, fix_common_block): Stash the
index 2b18da5772ee0f72bc1dc2df12e3a649c6cb276e..e620b0bd71d282eaad027f57483d301edda3654f 100644 (file)
@@ -722,8 +722,7 @@ parse_symbol (sh, ax, ext_sh, bigend)
       add_symbol (s, b);
 
       /* Type could be missing in a number of cases */
-      if (sh->sc == scUndefined || sh->sc == scNil ||
-         sh->index == 0xfffff)
+      if (sh->sc == scUndefined || sh->sc == scNil)
        SYMBOL_TYPE (s) = builtin_type_int;     /* undefined? */
       else
        SYMBOL_TYPE (s) = parse_type (cur_fd, ax, sh->index, 0, bigend, name);
@@ -1342,6 +1341,10 @@ parse_type (fd, ax, aux_index, bs, bigend, sym_name)
   struct type *tp = 0;
   enum type_code type_code = TYPE_CODE_UNDEF;
 
+  /* Handle undefined types, they have indexNil. */
+  if (aux_index == indexNil)
+    return builtin_type_int;
+
   /* Handle corrupt aux indices.  */
   if (aux_index >= (debug_info->fdr + fd)->caux)
     {
@@ -2144,9 +2147,17 @@ parse_partial_symbols (objfile, section_offsets)
          ms_type = mst_file_text;
          break;
        case stGlobal:
-          if (ext_in->asym.sc == scData
+          if (ext_in->asym.sc == scCommon)
+           {
+             /* The value of a common symbol is its size, not its address.
+                Ignore it.  */
+             continue;
+           }
+          else if (ext_in->asym.sc == scData
              || ext_in->asym.sc == scSData
-             || ext_in->asym.sc == scRData)
+             || ext_in->asym.sc == scRData
+             || ext_in->asym.sc == scPData
+             || ext_in->asym.sc == scXData)
            ms_type = mst_data;
          else
            ms_type = mst_bss;
@@ -2154,14 +2165,18 @@ parse_partial_symbols (objfile, section_offsets)
        case stLabel:
           if (ext_in->asym.sc == scAbs)
            ms_type = mst_abs;
-          else if (ext_in->asym.sc == scText)
-           ms_type = mst_text;
+          else if (ext_in->asym.sc == scText
+                  || ext_in->asym.sc == scInit
+                  || ext_in->asym.sc == scFini)
+           ms_type = mst_file_text;
           else if (ext_in->asym.sc == scData
                   || ext_in->asym.sc == scSData
-                  || ext_in->asym.sc == scRData)
-           ms_type = mst_data;
+                  || ext_in->asym.sc == scRData
+                  || ext_in->asym.sc == scPData
+                  || ext_in->asym.sc == scXData)
+           ms_type = mst_file_data;
          else
-           ms_type = mst_bss;
+           ms_type = mst_file_bss;
          break;
        case stLocal:
          /* The alpha has the section start addresses in stLocal symbols
@@ -2342,19 +2357,30 @@ parse_partial_symbols (objfile, section_offsets)
                  long procaddr;
                  int new_sdx;
 
-               case stStaticProc:      /* Function */
-                 /* I believe this is used only for file-local functions.
-                    The comment in symconst.h ("load time only static procs")
-                    isn't particularly clear on this point.  */
+               case stStaticProc:
                  prim_record_minimal_symbol (name, sh.value, mst_file_text,
                                              objfile);
+
                  /* FALLTHROUGH */
 
-               case stProc:    /* Asm labels apparently */
+               case stProc:
+                 /* Usually there is a local and a global stProc symbol
+                    for a function. This means that the function name
+                    has already been entered into the mimimal symbol table
+                    while processing the global symbols in pass 2 above.
+                    One notable exception is the PROGRAM name from
+                    f77 compiled executables, it is only put out as
+                    local stProc symbol, and a global MAIN__ stProc symbol
+                    points to it.  It doesn't matter though, as gdb is
+                    still able to find the PROGRAM name via the partial
+                    symbol table, and the MAIN__ symbol via the minimal
+                    symbol table.  */
                  ADD_PSYMBOL_TO_LIST (name, strlen (name),
                                       VAR_NAMESPACE, LOC_BLOCK,
-                                      objfile->static_psymbols, sh.value,
-                                      psymtab_language, objfile);
+                                      (sh.st == stProc)
+                                        ? objfile->global_psymbols
+                                        : objfile->static_psymbols,
+                                      sh.value, psymtab_language, objfile);
                  /* Skip over procedure to next one. */
                  if (sh.index >= hdr->iauxMax)
                    {
@@ -2391,7 +2417,11 @@ parse_partial_symbols (objfile, section_offsets)
                  continue;
 
                case stStatic:  /* Variable */
-                 if (sh.sc == scData || sh.sc == scSData || sh.sc == scRData)
+                 if (sh.sc == scData
+                     || sh.sc == scSData
+                     || sh.sc == scRData
+                     || sh.sc == scPData
+                     || sh.sc == scXData)
                    prim_record_minimal_symbol (name, sh.value, mst_file_data,
                                                objfile);
                  else
@@ -2496,6 +2526,12 @@ parse_partial_symbols (objfile, section_offsets)
                  continue;
                case stProc:
                case stStaticProc:
+                 /* If the index of the global symbol is not indexNil,
+                    it points to the local stProc symbol with the same
+                    name, which has already been entered into the
+                    partial symbol table above.  */
+                 if (psh->index != indexNil)
+                   continue;
                  class = LOC_BLOCK;
                  break;
                case stLabel:
@@ -2577,6 +2613,14 @@ parse_partial_symbols (objfile, section_offsets)
          pst->dependencies[pst->number_of_dependencies++] = fdr_to_pst[rh].pst;
        }
     }
+
+  /* Remove the dummy psymtab created for -O3 images above, if it is
+     still empty, to enable the detection of stripped executables.  */
+  if (objfile->psymtabs->next == NULL
+      && objfile->psymtabs->number_of_dependencies == 0
+      && objfile->psymtabs->n_global_syms == 0
+      && objfile->psymtabs->n_static_syms == 0)
+    objfile->psymtabs = NULL;
   do_cleanups (old_chain);
 }
 
@@ -3090,10 +3134,11 @@ cross_ref (fd, ax, tpp, type_code, pname, bigend, sym_name)
   (*debug_swap->swap_sym_in) (cur_bfd, esh, &sh);
 
   /* Make sure that this type of cross reference can be handled.  */
-  if (sh.sc != scInfo
-      || (sh.st != stBlock && sh.st != stTypedef
-         && sh.st != stStruct && sh.st != stUnion
-         && sh.st != stEnum))
+  if ((sh.sc != scInfo
+       || (sh.st != stBlock && sh.st != stTypedef
+          && sh.st != stStruct && sh.st != stUnion
+          && sh.st != stEnum))
+      && (sh.sc != scCommon || sh.st != stBlock))
     {
       /* File indirect entry is corrupt.  */
       *pname = "<illegal>";