aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog15
-rw-r--r--gdb/buildsym.c119
-rw-r--r--gdb/dbxread.c5
-rw-r--r--gdb/elfread.c7
-rw-r--r--gdb/partial-stab.h3
5 files changed, 98 insertions, 51 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 5e880f9..882e0c9 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,18 @@
+Fri Jul 3 00:00:49 1992 John Gilmore (gnu at cygnus.com)
+
+ * dbxread.c (process_one_symbol): Ignore N_MAIN, N_ENDM for Solaris.
+ * partial-stab.h: Ignore N_ENDM.
+ * elfread.c (elf_symtab_read): Ignore symbols that don't have a
+ CODE or DATA section attachment. This eliminates a lot of random
+ values from shared libraries, which screw up the ordinary symbols
+ in the address ranges they happen to overlap.
+ * buildsym.c (define_symbol): Eliminate special tests
+ for function types; move into "function" cases in switch statement.
+ (define_symbol: 'f', 'F', 'P'): Process all parameter types
+ in case they define new type numbers. But ignore them (FIXME).
+ ('k', 'B'): Ignore const and volatile if we see them (FIXME).
+ (read_sun_builtin_type): Add commentary.
+
Tue Jun 30 02:25:10 1992 John Gilmore (gnu at cygnus.com)
* tm-mips.h (GDB_TARGET_IS_MIPS): Define for mips-xdep.c.
diff --git a/gdb/buildsym.c b/gdb/buildsym.c
index e9ca175..55c99c8 100644
--- a/gdb/buildsym.c
+++ b/gdb/buildsym.c
@@ -1253,7 +1253,9 @@ define_symbol (valu, string, desc, type, objfile)
else
{
- struct type *type_read;
+ /* The symbol class letter is followed by a type (typically the
+ type of the symbol, or its return-type, or etc). Read it. */
+
synonym = *p == 't';
if (synonym)
@@ -1273,43 +1275,7 @@ define_symbol (valu, string, desc, type, objfile)
we can examine it to decide between "int" and "long". FIXME. */
long_kludge_name = SYMBOL_NAME (sym);
- type_read = read_type (&p, objfile);
-
- if ((deftype == 'F' || deftype == 'f') && *p == ';') {
- /* Sun acc puts declared types of aguments here. We don't care
- about their actual types (FIXME -- we should remember the whole
- function prototype), but the list
- may define some new types that we have to remember, so we must
- scan them now. */
- while (*p == ';') {
- p++;
- read_type (&p, objfile);
- }
- }
-
- if ((deftype == 'F' || deftype == 'f')
- && TYPE_CODE (type_read) != TYPE_CODE_FUNC)
- {
-#if 0
-/* This code doesn't work -- it needs to realloc and can't. */
-/* Attempt to set up to record a function prototype... */
- struct type *new = (struct type *)
- obstack_alloc (&objfile -> type_obstack,
- sizeof (struct type));
-
- /* Generate a template for the type of this function. The
- types of the arguments will be added as we read the symbol
- table. */
- *new = *lookup_function_type (type_read);
- SYMBOL_TYPE(sym) = new;
- TYPE_OBJFILE (new) = objfile;
- in_function_type = new;
-#else
- SYMBOL_TYPE (sym) = lookup_function_type (type_read);
-#endif
- }
- else
- SYMBOL_TYPE (sym) = type_read;
+ SYMBOL_TYPE (sym) = read_type (&p, objfile);
}
switch (deftype)
@@ -1323,16 +1289,55 @@ define_symbol (valu, string, desc, type, objfile)
break;
case 'f':
+ /* A static function definition. */
SYMBOL_CLASS (sym) = LOC_BLOCK;
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
add_symbol_to_list (sym, &file_symbols);
+ /* fall into process_function_types. */
+
+ process_function_types:
+ /* Function result types are described as the result type in stabs.
+ We need to convert this to the function-returning-type-X type
+ in GDB. E.g. "int" is converted to "function returning int". */
+ if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_FUNC)
+ {
+#if 0
+ /* This code doesn't work -- it needs to realloc and can't. */
+ /* Attempt to set up to record a function prototype... */
+ struct type *new = (struct type *)
+ obstack_alloc (&objfile -> type_obstack,
+ sizeof (struct type));
+
+ /* Generate a template for the type of this function. The
+ types of the arguments will be added as we read the symbol
+ table. */
+ *new = *lookup_function_type (SYMBOL_TYPE(sym));
+ SYMBOL_TYPE(sym) = new;
+ TYPE_OBJFILE (new) = objfile;
+ in_function_type = new;
+#else
+ SYMBOL_TYPE (sym) = lookup_function_type (SYMBOL_TYPE (sym));
+#endif
+ }
+ /* fall into process_prototype_types */
+
+ process_prototype_types:
+ /* Sun acc puts declared types of arguments here. We don't care
+ about their actual types (FIXME -- we should remember the whole
+ function prototype), but the list may define some new types
+ that we have to remember, so we must scan it now. */
+ while (*p == ';') {
+ p++;
+ read_type (&p, objfile);
+ }
break;
case 'F':
+ /* A global function definition. */
SYMBOL_CLASS (sym) = LOC_BLOCK;
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
add_symbol_to_list (sym, &global_symbols);
- break;
+ goto process_function_types;
case 'G':
/* For a class G (global) symbol, it appears that the
@@ -1435,14 +1440,13 @@ define_symbol (valu, string, desc, type, objfile)
#endif /* no BELIEVE_PCC_PROMOTION_TYPE. */
case 'P':
- /* Parameter which is in a register. */
-
- /* acc seems to use P to delare the types of functions that
- are called by this file. gdb is not prepared to deal
- with this extra information. */
- if (processing_acc_compilation)
- break;
+ /* acc seems to use P to delare the prototypes of functions that
+ are referenced by this file. gdb is not prepared to deal
+ with this extra information. FIXME, it ought to. */
+ if (type == N_FUN)
+ goto process_prototype_types;
+ /* Parameter which is in a register. */
SYMBOL_CLASS (sym) = LOC_REGPARM;
SYMBOL_VALUE (sym) = STAB_REG_TO_REGNUM (valu);
if (SYMBOL_VALUE (sym) >= NUM_REGS)
@@ -1953,6 +1957,16 @@ read_type (pp, objfile)
type = make_function_type (type1, dbx_lookup_type (typenums));
break;
+ case 'k': /* Const qualifier on some type (Sun) */
+ type = read_type (pp, objfile);
+ /* FIXME! For now, we ignore const and volatile qualifiers. */
+ break;
+
+ case 'B': /* Volatile qual on some type (Sun) */
+ type = read_type (pp, objfile);
+ /* FIXME! For now, we ignore const and volatile qualifiers. */
+ break;
+
/* FIXME -- we should be doing smash_to_XXX types here. */
case '@': /* Member (class & variable) type */
{
@@ -2969,7 +2983,18 @@ read_enum_type (pp, type, objfile)
return type;
}
-/* this is for the initial typedefs in every file (for int, long, etc) */
+/* Sun's ACC uses a somewhat saner method for specifying the builtin
+ typedefs in every file (for int, long, etc):
+
+ type = b <signed> <width>; <offset>; <nbits>
+ signed = u or s. Possible c in addition to u or s (for char?).
+ offset = offset from high order bit to start bit of type.
+ width is # bytes in object of this type, nbits is # bits in type.
+
+ The width/offset stuff appears to be for small objects stored in
+ larger ones (e.g. `shorts' in `int' registers). We ignore it for now,
+ FIXME. */
+
static struct type *
read_sun_builtin_type (pp, typenums, objfile)
char **pp;
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 1b60cd1..d8998db 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -1629,7 +1629,7 @@ process_one_symbol (type, desc, valu, name, offset, objfile)
#if 0
/* It seems that the Sun ANSI C compiler (acc) replaces N_FUN with N_GSYM and
N_STSYM with a type code of f or F. Can't enable this until we get some
- stuff straightened out with psymtabs. */
+ stuff straightened out with psymtabs. FIXME. */
case N_GSYM:
case N_STSYM:
@@ -1916,13 +1916,14 @@ process_one_symbol (type, desc, valu, name, offset, objfile)
/* N_UNDF: Solaris 2: file separator mark */
/* N_UNDF: -- we will never encounter it, since we only process one
file's symbols at once. */
+ case N_ENDM: /* Solaris 2: End of module */
+ case N_MAIN: /* Name of main routine. */
break;
/* The following symbol types we don't know how to process. Handle
them in a "default" way, but complain to people who care. */
default:
case N_EHDECL: /* Exception handler name */
- case N_MAIN: /* Name of main routine (not used in C) */
case N_PC: /* Global symbol in Pascal */
case N_M2C: /* Modula-2 compilation unit */
/* N_MOD2: overlaps with N_EHDECL */
diff --git a/gdb/elfread.c b/gdb/elfread.c
index 56e3a89..4104d1a 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -274,7 +274,12 @@ elf_symtab_read (abfd, addr, objfile)
}
else
{
- ms_type = mst_unknown;
+ /* FIXME: Solaris2 shared libraries include lots of
+ odd "absolute" and "undefined" symbols, that play
+ hob with actions like finding what function the PC
+ is in. Ignore them if they aren't text or data. */
+ /* ms_type = mst_unknown; */
+ continue; /* Skip this symbol. */
}
/* Pass symbol size field in via BFD. FIXME!!! */
record_minimal_symbol_and_info ((char *) sym -> name,
diff --git a/gdb/partial-stab.h b/gdb/partial-stab.h
index 2dc32e0..cd07a97 100644
--- a/gdb/partial-stab.h
+++ b/gdb/partial-stab.h
@@ -630,8 +630,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
case N_NSYMS: /* Ultrix 4.0: symbol count */
case N_DEFD: /* GNU Modula-2 */
- case N_OBJ: /* two useless types from Solaris */
+ case N_OBJ: /* useless types from Solaris */
case N_OPT:
+ case N_ENDM:
/* These symbols aren't interesting; don't worry about them */
continue;