Eliminate LOC_EXTERNAL. Improve select_source_symtab. Bug fixes.
authorJohn Gilmore <gnu@cygnus>
Fri, 19 Jul 1991 06:45:19 +0000 (06:45 +0000)
committerJohn Gilmore <gnu@cygnus>
Fri, 19 Jul 1991 06:45:19 +0000 (06:45 +0000)
gdb/core.c
gdb/dbxread.c
gdb/expread.y
gdb/values.c

index 3a6a071d2bdcbd8b9bbe6cd02492e0032af20874..842e712773d8d5c561446f62ed23b228f18e98b9 100644 (file)
@@ -78,7 +78,7 @@ core_open (filename, from_tty)
      char *filename;
      int from_tty;
 {
-  char *p;
+  const char *p;
   int siggy;
   struct cleanup *old_chain;
   char *temp;
index 4644fef58d8da08bfefb984e11b9d0c3b99b2143..619c471b60aa909e9e029bcd1e31b5d298156782 100644 (file)
@@ -3,19 +3,19 @@
 
 This file is part of GDB.
 
-GDB is free software; you can redistribute it and/or modify
+This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
-any later version.
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
 
-GDB is distributed in the hope that it will be useful,
+This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GDB; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 \f
 /* Symbol read-in occurs in two phases:
    1.  A scan (read_dbx_symtab()) of the entire executable, whose sole
@@ -28,16 +28,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        when a symbol in a file for which symbols have not yet been
        read in is referenced.  */
 
-/* There used to be some PROFILE_TYPES code in this file which counted
-   the number of occurances of various symbols.  I'd suggest instead:
-     nm -ap foo | awk 'print $5' | sort | uniq -c
-   to print how many of each n_type, or something like
-     nm -ap foo | awk '$5 == "LSYM" {print $6 $7 $8 $9 $10 $11}' | \
-     awk 'BEGIN {FS=":"}
-     {print substr($2,1,1)}' | sort | uniq -c
-   to print the number of each kind of symbol descriptor (i.e. the letter
-   after ':').  */
-
 #include <stdio.h>
 #include <string.h>
 #include "defs.h"
@@ -1325,10 +1315,6 @@ dbx_symfile_read (sf, addr, mainline)
   free (info);
   sf->sym_private = 0;         /* Zap pointer to our (now gone) info struct */
 
-  /* Call to select_source_symtab used to be here; it was using too
-     much time.  I'll make sure that list_sources can handle the lack
-     of current_source_symtab */
-
   if (!partial_symtab_list)
     printf_filtered ("\n(no debugging symbols found)...");
 }
@@ -2200,8 +2186,10 @@ read_dbx_symtab (symfile_name, addr,
              continue;
            case 'G':
              bufp->n_value += addr;            /* Relocate */
+             /* The addresses in these entries are reported to be
+                wrong.  See the code that reads 'G's for symtabs. */
              ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
-                                  VAR_NAMESPACE, LOC_EXTERNAL,
+                                  VAR_NAMESPACE, LOC_STATIC,
                                   global_psymbols, bufp->n_value);
              continue;
 
index 597b42402d2f170f1446fc9f6a227ab2353fe1c8..d05383fdd94890df204e7850d58aa1fb665c27fd 100755 (executable)
@@ -667,7 +667,6 @@ variable:   name_not_typename
                                case LOC_TYPEDEF:
                                case LOC_LABEL:
                                case LOC_BLOCK:
-                               case LOC_EXTERNAL:
                                case LOC_CONST_BYTES:
 
                                  /* In this case the expression can
index c86ecc981e7c4ed53c1fe75ddfb1aba713e49ddf..1c11d4ea4023c01114ebb272cff89b033fd85e13 100644 (file)
@@ -1352,7 +1352,8 @@ unpack_field_as_long (type, valaddr, fieldno)
   val = val >> (bitpos % 8);
 #endif
 
-  val &= (1 << bitsize) - 1;
+  if (bitsize < 8 * sizeof (val))
+    val &= (((unsigned long)1) << bitsize) - 1;
   return val;
 }
 
@@ -1369,9 +1370,10 @@ modify_field (addr, fieldval, bitpos, bitsize)
 {
   long oword;
 
-  /* Reject values too big to fit in the field in question.
-     Otherwise adjoining fields may be corrupted.  */
-  if (fieldval & ~((1<<bitsize)-1))
+  /* Reject values too big to fit in the field in question,
+     otherwise adjoining fields may be corrupted.  */
+  if ((0 != fieldval & ~((1<<bitsize)-1))
+   && bitsize < 8 * sizeof (fieldval))
     error ("Value %d does not fit in %d bits.", fieldval, bitsize);
   
   bcopy (addr, &oword, sizeof oword);
@@ -1382,7 +1384,11 @@ modify_field (addr, fieldval, bitpos, bitsize)
   bitpos = sizeof (oword) * 8 - bitpos - bitsize;
 #endif
 
-  oword &= ~(((1 << bitsize) - 1) << bitpos);
+  /* Mask out old value, while avoiding shifts >= longword size */
+  if (bitsize < 8 * sizeof (oword))
+    oword &= ~(((((unsigned long)1) << bitsize) - 1) << bitpos);
+  else
+    oword &= ~((-1) << bitpos);
   oword |= fieldval << bitpos;
 
   SWAP_TARGET_AND_HOST (&oword, sizeof oword);         /* To target format */