* buildsym.h: Add processing_acc_compilation flag.
authorJohn Gilmore <gnu@cygnus>
Sat, 13 Jun 1992 02:18:44 +0000 (02:18 +0000)
committerJohn Gilmore <gnu@cygnus>
Sat, 13 Jun 1992 02:18:44 +0000 (02:18 +0000)
* buildsym.c (read_sun_builtin_type, read_sun_floating_type):  New.
(define_symbol):  Skip arg types in function entries.  Resolve
overloaded 'P' which acc uses for prototypes of functions called
by this file.
(read_type: 'b', 'r'):  Handle Solaris2 builtin types.

* minsyms.c (prim_record_minimal_symbol_and_info):  Hack to
save size of ELF symbols.  FIXME.
* tm-sun4os5.h:  Rename to tm-sun4sol2.h.  Update defines for Sol2.
* xm-sun4os5.h:  Rename to xm-sun4sol2.h.  Hack more defines.

* config/sun4os5.m[ht]:  Rename to config/sun4sol2.m[ht]; new xm, tm.

gdb/ChangeLog
gdb/buildsym.c
gdb/buildsym.h
gdb/config/sun4sol2.mh
gdb/config/sun4sol2.mt
gdb/minsyms.c
gdb/tm-sun4sol2.h [new file with mode: 0644]
gdb/xm-sun4sol2.h [new file with mode: 0644]

index 9a533cd..e9effec 100644 (file)
@@ -1,7 +1,19 @@
 Fri Jun 12 18:54:40 1992  John Gilmore  (gnu at cygnus.com)
 
+       * buildsym.h:  Add processing_acc_compilation flag.
+       * buildsym.c (read_sun_builtin_type, read_sun_floating_type):  New.
+       (define_symbol):  Skip arg types in function entries.  Resolve
+       overloaded 'P' which acc uses for prototypes of functions called
+       by this file.
+       (read_type: 'b', 'r'):  Handle Solaris2 builtin types.
+
+       * minsyms.c (prim_record_minimal_symbol_and_info):  Hack to
+       save size of ELF symbols.  FIXME.
+       * tm-sun4os5.h:  Rename to tm-sun4sol2.h.  Update defines for Sol2.
+       * xm-sun4os5.h:  Rename to xm-sun4sol2.h.  Hack more defines.
+
        * configure.in:  Solaris config is sparc-sun-solaris2.
-       * config/sun4os5.m[ht]:  Rename to config/sun4sol2.m[ht].
+       * config/sun4os5.m[ht]:  Rename to config/sun4sol2.m[ht]; new xm, tm.
 
 Fri Jun 12 12:49:43 1992  Fred Fish  (fnf@cygnus.com)
 
index 3a82e9a..4c9e7b1 100644 (file)
@@ -1,5 +1,6 @@
 /* Build symbol tables in GDB's internal format.
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992
+             Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -67,6 +68,12 @@ static struct type *
 read_range_type PARAMS ((char **, int [2], struct objfile *));
 
 static struct type *
+read_sun_builtin_type PARAMS ((char **, int [2], struct objfile *));
+
+static struct type *
+read_sun_floating_type PARAMS ((char **, int [2], struct objfile *));
+
+static struct type *
 read_enum_type PARAMS ((char **, struct type *, struct objfile *));
 
 static struct type *
@@ -1269,11 +1276,24 @@ define_symbol (valu, string, desc, type, objfile)
 
       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);
+       }
+      }
+
       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));
@@ -1417,6 +1437,13 @@ define_symbol (valu, string, desc, type, objfile)
 
     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;
+
       SYMBOL_CLASS (sym) = LOC_REGPARM;
       SYMBOL_VALUE (sym) = STAB_REG_TO_REGNUM (valu);
       if (SYMBOL_VALUE (sym) >= NUM_REGS)
@@ -1979,6 +2006,18 @@ read_type (pp, objfile)
        *dbx_lookup_type (typenums) = type;
       break;
 
+    case 'b':                          /* Sun ACC builtin int type */
+      type = read_sun_builtin_type (pp, typenums, objfile);
+      if (typenums[0] != -1)
+       *dbx_lookup_type (typenums) = type;
+      break;
+
+    case 'R':                          /* Sun ACC builtin float type */
+      type = read_sun_floating_type (pp, typenums, objfile);
+      if (typenums[0] != -1)
+       *dbx_lookup_type (typenums) = type;
+      break;
+    
     case 'e':                          /* Enumeration type */
       type = dbx_alloc_type (typenums, objfile);
       type = read_enum_type (pp, type, objfile);
@@ -2929,6 +2968,110 @@ read_enum_type (pp, type, objfile)
   return type;
 }
 
+/* this is for the initial typedefs in every file (for int, long, etc) */
+static struct type *
+read_sun_builtin_type (pp, typenums, objfile)
+     char **pp;
+     int typenums[2];
+     struct objfile *objfile;
+{
+  int nbits;
+  int signed_type;
+
+  switch (**pp) {
+  case 's':
+    signed_type = 1;
+    break;
+  case 'u':
+    signed_type = 0;
+    break;
+  default:
+    return error_type (pp);
+  }
+  (*pp)++;
+
+  /* The first number appears to be the number of bytes occupied
+     by this type, except that unsigned short is 4 instead of 2.
+     Since this information is redundant with the third number,
+     we will ignore it.  */
+  read_number (pp, ';');
+
+  /* The second number is always 0, so ignore it too. */
+  read_number (pp, ';');
+
+  /* The third number is the number of bits for this type. */
+  nbits = read_number (pp, 0);
+
+  /* FIXME.  Here we should just be able to make a type of the right
+     number of bits and signedness.  FIXME.  */
+
+  if (nbits == TARGET_LONG_LONG_BIT)
+    return (lookup_fundamental_type (objfile,
+                signed_type? FT_LONG_LONG: FT_UNSIGNED_LONG_LONG));
+  
+  if (nbits == TARGET_INT_BIT) {
+    /* FIXME -- the only way to distinguish `int' from `long'
+       is to look at its name!  */
+    if (signed_type) {
+      if (long_kludge_name && long_kludge_name[0] == 'l' /* long */)
+       return lookup_fundamental_type (objfile, FT_LONG);
+      else
+       return lookup_fundamental_type (objfile, FT_INTEGER);
+    } else {
+      if (long_kludge_name
+         && ((long_kludge_name[0] == 'u' /* unsigned */ &&
+              long_kludge_name[9] == 'l' /* long */)
+             || (long_kludge_name[0] == 'l' /* long unsigned */)))
+       return lookup_fundamental_type (objfile, FT_UNSIGNED_LONG);
+      else
+       return lookup_fundamental_type (objfile, FT_UNSIGNED_INTEGER);
+    }
+  }
+    
+  if (nbits == TARGET_SHORT_BIT)
+    return (lookup_fundamental_type (objfile,
+                signed_type? FT_SHORT: FT_UNSIGNED_SHORT));
+  
+  if (nbits == TARGET_CHAR_BIT)
+    return (lookup_fundamental_type (objfile,
+                signed_type? FT_CHAR: FT_UNSIGNED_CHAR));
+  
+  if (nbits == 0)
+    return lookup_fundamental_type (objfile, FT_VOID);
+  
+  return error_type (pp);
+}
+
+static struct type *
+read_sun_floating_type (pp, typenums, objfile)
+     char **pp;
+     int typenums[2];
+     struct objfile *objfile;
+{
+  int nbytes;
+
+  /* The first number has more details about the type, for example
+     FN_COMPLEX.  See the sun stab.h.  */
+  read_number (pp, ';');
+
+  /* The second number is the number of bytes occupied by this type */
+  nbytes = read_number (pp, ';');
+
+  if (**pp != 0)
+    return error_type (pp);
+
+  if (nbytes == TARGET_FLOAT_BIT / TARGET_CHAR_BIT)
+    return lookup_fundamental_type (objfile, FT_FLOAT);
+
+  if (nbytes == TARGET_DOUBLE_BIT / TARGET_CHAR_BIT)
+    return lookup_fundamental_type (objfile, FT_DBL_PREC_FLOAT);
+
+  if (nbytes == TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT)
+    return lookup_fundamental_type (objfile, FT_EXT_PREC_FLOAT);
+
+  return error_type (pp);
+}
+
 /* Read a number from the string pointed to by *PP.
    The value of *PP is advanced over the number.
    If END is nonzero, the character that ends the
index 8183cfc..8c660f3 100644 (file)
@@ -74,6 +74,9 @@ EXTERN struct subfile *current_subfile;
 
 EXTERN unsigned char processing_gcc_compilation;
 
+/* When set, we are processing a .o file compiled by sun acc */
+EXTERN unsigned char processing_acc_compilation;
+
 /* Count symbols as they are processed, for error messages.  */
 
 EXTERN unsigned int symnum;
index 85de6ba..d90e695 100644 (file)
@@ -1,6 +1,6 @@
 # Host: Sun 4 or Sparcstation, running Solaris 2
 XDEPFILES= procfs.o
-XM_FILE= xm-sun4os5.h
+XM_FILE= xm-sun4sol2.h
 SYSV_DEFINE=-DSYSV
 REGEX=regex.o
 REGEX1=regex.o
index 2a499e0..9c42fd5 100644 (file)
@@ -1,3 +1,3 @@
 # Target: Sun 4 or Sparcstation, running Solaris 2
 TDEPFILES= exec.o sparc-tdep.o sparc-pinsn.o solib.o
-TM_FILE= tm-sun4os5.h
+TM_FILE= tm-sun4sol2.h
index 6810d9a..1641592 100644 (file)
@@ -263,6 +263,32 @@ prim_record_minimal_symbol (name, address, ms_type)
   msym_count++;
 }
 
+void
+prim_record_minimal_symbol_and_info (name, address, ms_type, info)
+     const char *name;
+     CORE_ADDR address;
+     enum minimal_symbol_type ms_type;
+     char *info;
+{
+  register struct msym_bunch *new;
+
+  if (msym_bunch_index == BUNCH_SIZE)
+    {
+      new = (struct msym_bunch *) xmalloc (sizeof (struct msym_bunch));
+      msym_bunch_index = 0;
+      new -> next = msym_bunch;
+      msym_bunch = new;
+    }
+  msym_bunch -> contents[msym_bunch_index].name = (char *) name;
+  msym_bunch -> contents[msym_bunch_index].address = address;
+  msym_bunch -> contents[msym_bunch_index].info = NULL;
+  msym_bunch -> contents[msym_bunch_index].type = ms_type;
+    /* FIXME:  This info, if it remains, needs its own field.  */
+  msym_bunch -> contents[msym_bunch_index].info = info;  /* FIXME! */
+  msym_bunch_index++;
+  msym_count++;
+}
+
 /* Compare two minimal symbols by address and return a signed result based
    on unsigned comparisons, so that we sort into unsigned numeric order.  */
 
diff --git a/gdb/tm-sun4sol2.h b/gdb/tm-sun4sol2.h
new file mode 100644 (file)
index 0000000..78c7389
--- /dev/null
@@ -0,0 +1,68 @@
+/* Macro definitions for GDB for a Sun 4 running Solaris 2
+   Copyright (C) 1989, 1992 Free Software Foundation, Inc.
+
+This file is part of GDB.
+
+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 2 of the License, or
+(at your option) any later version.
+
+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 this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#include "tm-sparc.h"
+
+#include "tm-sysv4.h"
+
+#undef STACK_END_ADDRESS
+#define STACK_END_ADDRESS 0xf8000000
+
+/* The values of N_SLINE, N_LBRAC, N_RBRAC symbols in .stab sections are
+   relative to the current function, rather than being absolute or
+   relative to the current N_SO.  */
+
+#define        BLOCK_ADDRESS_FUNCTION_RELATIVE
+
+/* Variables in the debug stabs occur after the N_LBRAC, not before it.  */
+
+#define VARIABLES_INSIDE_BLOCK(desc, gcc_p) (!gcc_p)
+
+/* May be needed, may be not?  From Pace Willisson's port.  FIXME.  */
+#define PROLOGUE_FIRSTLINE_OVERLAP
+
+
+#if 0          /* Setjmp/longjmp are not as well doc'd in SunOS 5.x yet */
+
+/* Offsets into jmp_buf.  Not defined by Sun, but at least documented in a
+   comment in <machine/setjmp.h>! */
+
+#define JB_ELEMENT_SIZE 4      /* Size of each element in jmp_buf */
+
+#define JB_ONSSTACK 0
+#define JB_SIGMASK 1
+#define JB_SP 2
+#define JB_PC 3
+#define JB_NPC 4
+#define JB_PSR 5
+#define JB_G1 6
+#define JB_O0 7
+#define JB_WBCNT 8
+
+/* Figure out where the longjmp will land.  We expect that we have just entered
+   longjmp and haven't yet setup the stack frame, so the args are still in the
+   output regs.  %o0 (O0_REGNUM) points at the jmp_buf structure from which we
+   extract the pc (JB_PC) that we will land at.  The pc is copied into ADDR.
+   This routine returns true on success */
+
+extern int
+get_longjmp_target PARAMS ((CORE_ADDR *));
+
+#define GET_LONGJMP_TARGET(ADDR) get_longjmp_target(ADDR)
+#endif  /* 0 */
diff --git a/gdb/xm-sun4sol2.h b/gdb/xm-sun4sol2.h
new file mode 100644 (file)
index 0000000..25013a9
--- /dev/null
@@ -0,0 +1,64 @@
+/* Macro definitions for running gdb on a Sun 4 running Solaris 2.
+   Copyright 1989, 1992 Free Software Foundation, Inc.
+
+This file is part of GDB.
+
+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 2 of the License, or
+(at your option) any later version.
+
+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 this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* Most of what we know is generic to SPARC hosts.  */
+
+#include "xm-sparc.h"
+
+/* Pick up more stuff from the generic SVR4 host include file. */
+
+#include "xm-sysv4.h"
+
+/* SVR4's can't seem to agree on what to call the type that contains the
+   general registers.  Kludge around it with a #define.  */
+
+#define        gregset_t       prgreg_t
+#define        fpregset_t      prfpregset_t
+
+/* The native Sun compiler complains about using volatile
+   to indicate functions that never return.  So shut it up by simply
+   defining away "NORETURN", which is normally defined to "volatile". */
+
+#ifndef __GNUC__
+# define NORETURN /**/
+#endif
+
+/* Large alloca's fail because the attempt to increase the stack limit in
+   main() fails because shared libraries are allocated just below the initial
+   stack limit.  The SunOS kernel will not allow the stack to grow into
+   the area occupied by the shared libraries.  Sun knows about this bug
+   but has no obvious fix for it.  */
+#define BROKEN_LARGE_ALLOCA
+
+/* If you expect to use the mmalloc package to obtain mapped symbol files,
+   for now you have to specify some parameters that determine how gdb places
+   the mappings in it's address space.  See the comments in map_to_address()
+   for details.  This is expected to only be a short term solution.  Yes it
+   is a kludge.
+   FIXME:  Make this more automatic. */
+
+#define MMAP_BASE_ADDRESS      0xE0000000      /* First mapping here */
+#define MMAP_INCREMENT         0x01000000      /* Increment to next mapping */
+
+/* These are not currently used in SVR4 (but should be, FIXME!).  */
+#undef DO_DEFERRED_STORES
+#undef CLEAR_DEFERRED_STORES
+
+/* May be needed, may be not?  From Pace Willisson's port.  FIXME.  */
+#define NEED_POSIX_SETPGID