* symtab.h (enum minimal_symbol_type): Add mst_file_*.
authorJim Kingdon <jkingdon@engr.sgi.com>
Tue, 20 Jul 1993 02:50:15 +0000 (02:50 +0000)
committerJim Kingdon <jkingdon@engr.sgi.com>
Tue, 20 Jul 1993 02:50:15 +0000 (02:50 +0000)
* partial-stab.h [DBXREAD_ONLY]: Record statics in miminal symbols.
* dbxread.c (record_minimal_symbol): Deal with statics.
* minsyms.c (lookup_minimal_symbol): Prefer externals to statics.

gdb/ChangeLog
gdb/minsyms.c
gdb/partial-stab.h

index ee7e542530b389f66ce5df70fe25c9ccda8a182d..a654c976a6d8743f14cd76b9c5c408d324513821 100644 (file)
@@ -1,5 +1,10 @@
 Mon Jul 19 11:48:57 1993  Jim Kingdon  (kingdon@deneb.cygnus.com)
 
+       * symtab.h (enum minimal_symbol_type): Add mst_file_*.
+       * partial-stab.h [DBXREAD_ONLY]: Record statics in miminal symbols.
+       * dbxread.c (record_minimal_symbol): Deal with statics.
+       * minsyms.c (lookup_minimal_symbol): Prefer externals to statics.
+
        * config/i386/xm-i386sco.h: Define HAVE_TERMIOS.
 
        * printcmd.c, config/pa/xm-pa.h, config/alpha/xm-alpha.h: Make it so
index 4b48e2e9c8f075bad475aad3790db303ebde0cc3..d8488f221cfc1fc126be48a6cd48f1b508b2c873 100644 (file)
@@ -95,6 +95,7 @@ lookup_minimal_symbol (name, objf)
   struct objfile *objfile;
   struct minimal_symbol *msymbol;
   struct minimal_symbol *found_symbol = NULL;
+  struct minimal_symbol *found_file_symbol = NULL;
 #ifdef IBM6000_TARGET
   struct minimal_symbol *trampoline_symbol = NULL;
 #endif
@@ -112,40 +113,68 @@ lookup_minimal_symbol (name, objf)
            {
              if (SYMBOL_MATCHES_NAME (msymbol, name))
                {
+                 switch (MSYMBOL_TYPE (msymbol))
+                   {
+                   case mst_file_text:
+                   case mst_file_data:
+                   case mst_file_bss:
+                     /* It is file-local.  If we find more than one, just
+                        return the latest one (the user can't expect
+                        useful behavior in that case).  */
+                     found_file_symbol = msymbol;
+                     break;
+
+                   case mst_unknown:
 #ifdef IBM6000_TARGET
-                 /* I *think* all platforms using shared libraries (and
-                    trampoline code) will suffer this problem. Consider a
-                    case where there are 5 shared libraries, each referencing
-                    `foo' with a trampoline entry. When someone wants to put
-                    a breakpoint on `foo' and the only info we have is minimal
-                    symbol vector, we want to use the real `foo', rather than
-                    one of those trampoline entries. MGO */
-                 /* If a trampoline symbol is found, we prefer to keep looking
-                    for the *real* symbol. If the actual symbol not found,
-                    then we'll use the trampoline entry. Sorry for the machine
-                    dependent code here, but I hope this will benefit other
-                    platforms as well. For trampoline entries, we used
-                    mst_unknown earlier. Perhaps we should define a
-                    `mst_trampoline' type?? */
-
-                 if (MSYMBOL_TYPE (msymbol) != mst_unknown)
-                   found_symbol = msymbol;
-                 else if (MSYMBOL_TYPE (msymbol) == mst_unknown &&
-                          !trampoline_symbol)
-                   trampoline_symbol = msymbol;
-                    
+                     /* I *think* all platforms using shared
+                        libraries (and trampoline code) will suffer
+                        this problem. Consider a case where there are
+                        5 shared libraries, each referencing `foo'
+                        with a trampoline entry. When someone wants
+                        to put a breakpoint on `foo' and the only
+                        info we have is minimal symbol vector, we
+                        want to use the real `foo', rather than one
+                        of those trampoline entries. MGO */
+
+                     /* If a trampoline symbol is found, we prefer to
+                        keep looking for the *real* symbol. If the
+                        actual symbol not found, then we'll use the
+                        trampoline entry. Sorry for the machine
+                        dependent code here, but I hope this will
+                        benefit other platforms as well. For
+                        trampoline entries, we used mst_unknown
+                        earlier. Perhaps we should define a
+                        `mst_trampoline' type?? */
+
+                     if (trampoline_symbol == NULL)
+                       trampoline_symbol = msymbol;
+                     break;
 #else
-                 found_symbol = msymbol;
+                     /* FALLTHROUGH */
 #endif
+                   default:
+                     found_symbol = msymbol;
+                     break;
+                   }
                }
            }
        }
     }
+  /* External symbols are best.  */
+  if (found_symbol)
+    return found_symbol;
+
+  /* File-local symbols are next best.  */
+  if (found_file_symbol)
+    return found_file_symbol;
+
+  /* Symbols for IBM shared library trampolines are next best.  */
 #ifdef IBM6000_TARGET
-  return found_symbol ? found_symbol : trampoline_symbol;
+  if (trampoline_symbol)
+    return trampoline_symbol;
 #endif
 
-  return (found_symbol);
+  return NULL;
 }
 
 
index 1eea3ccee8c2b5c83f85440fe5e4af327aee9360..35d0193742c3e00467fbed6b44b634be6a866fb8 100644 (file)
@@ -43,6 +43,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
          CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
          goto record_it;
 
+       case N_BSS:
        case N_BSS | N_EXT:
        case N_NBBSS | N_EXT:
         case N_SETV | N_EXT:           /* FIXME, is this in BSS? */
@@ -108,30 +109,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
                past_first_source_file = 1;
              last_o_file_start = CUR_SYMBOL_VALUE;
            }
+         else
+           goto record_it;
 #endif /* DBXREAD_ONLY */
          continue;
 
        case N_DATA:
-#ifdef DBXREAD_ONLY
          CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
-         SET_NAMESTRING ();
-         /* Check for __DYNAMIC, which is used by Sun shared libraries. 
-            Record it even if it's local, not global, so we can find it.
-            FIXME:  this might want to check for _DYNAMIC and the current
-                    symbol_leading_char.  */
-         if (namestring[8] == 'C' && STREQ ("__DYNAMIC", namestring))
-           goto record_it;
-
-         /* Same with virtual function tables, both global and static.  */
-         {
-           char *tempstring = namestring;
-           if (tempstring[0] == bfd_get_symbol_leading_char (objfile->obfd))
-             tempstring++;
-           if (VTBL_PREFIX_P ((tempstring)))
-             goto record_it;
-         }
-#endif /* DBXREAD_ONLY */
-         continue;
+         goto record_it;
 
        case N_UNDF | N_EXT:
 #ifdef DBXREAD_ONLY
@@ -175,7 +160,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
            /* Lots of symbol types we can just ignore.  */
 
        case N_ABS:
-       case N_BSS:
        case N_NBDATA:
        case N_NBBSS:
          continue;