(Mostly from Gavin Koch)
authorAndrew Cagney <cagney@redhat.com>
Mon, 15 Dec 1997 12:38:05 +0000 (12:38 +0000)
committerAndrew Cagney <cagney@redhat.com>
Mon, 15 Dec 1997 12:38:05 +0000 (12:38 +0000)
In dwarf2read.c, if the ABI is 32 bit and 64 bit addresses are encountered
discard the most significant 32 bits.
Use CORE_ADDR for address variables instead of long.
Add more explicit tx49 configur target.
Check/use sigaction/SA_RESTART in remote-sim.c

gdb/ChangeLog
gdb/config.in
gdb/config/mips/.Sanitize
gdb/configure
gdb/configure.in
gdb/configure.tgt
gdb/dwarf2read.c
gdb/remote-sim.c

index 130d8957abf560eedbc8aef7ec235295050a448f..cc26113957f0a21821a0f78bfe060dff2ed1848a 100644 (file)
@@ -1,3 +1,34 @@
+Mon Dec 15 15:13:57 1997  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * configure.in (configdirs): Check for sigaction.
+       * configure: Re-generate.
+
+start-sanitize-tx49
+       From Gavin Koch <gavin@cygnus.com>:
+       * config/mips/tx49el.mt : New file.
+       * config/mips/tm-tx49.h : New file.
+       * config/mips/tm-tx49el.h : New file.
+       * configure.tgt: Changed to use the new files for 
+       mips64*tx49*-*-elf* and mips64*tx49*el-*-elf*
+
+end-sanitize-tx49
+Mon Dec 15 11:38:52 1997  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * dwarf2read.c: From change proposed by Gavin Koch.
+       (address_significant_size): New static variable.
+       (dwarf2_build_psymtabs_hard): Check consistency between
+       `address_size' and `address_significant_size'.
+       (read_address): MASK out all but the significant bits, as
+       determined by `address_significant_size', of any addresses.
+       (elf-bfd.h): Include.
+       (dwarf2_build_psymtabs_hard): Set `address_significant_size'
+       according to the arch_size of the elf object file.
+
+Thu Dec 11 13:40:46 1997  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * dwarf2read.c (dwarf_decode_lines): Change type of address to
+       CORE_ADDR.
+
 Thu Dec 11 22:39:02 1997  Mark Alexander  <marka@cygnus.com>
 
        From change made to branch by Bob Manson <manson@cygnus.com>:
index 8a1d0db6e7e90b0892d395067892b7f18ecbfcae..097f29e3c1b3f229c404a894c6dcc51c019d6e43 100644 (file)
@@ -59,6 +59,9 @@
 /* Define if the "%Lg" format works to print long doubles. */
 #undef PRINTF_HAS_LONG_DOUBLE
 
+/* Define if the "%Lg" format works to scan long doubles. */
+#undef SCANF_HAS_LONG_DOUBLE
+
 /* Define if using Solaris thread debugging.  */
 #undef HAVE_THREAD_DB_LIB
 
@@ -84,6 +87,9 @@
 /* Define if you have the setpgid function.  */
 #undef HAVE_SETPGID
 
+/* Define if you have the sigaction function.  */
+#undef HAVE_SIGACTION
+
 /* Define if you have the <endian.h> header file.  */
 #undef HAVE_ENDIAN_H
 
index 0e3dc69173d9ad5d3240da2aa0a7d2e45d393cf3..f8c0c91b4f541f10aaf103c6d38336b70cd1fa74 100644 (file)
@@ -29,6 +29,20 @@ else
        fi
 fi
 
+tx49_files="tm-tx49.h tm-tx49l.h tx49.mt tx49l.mt"
+
+if ( echo $* | grep keep\-tx49 > /dev/null ) ; then
+       keep_these_too="${tx49_files} ${keep_these_too}"
+       if [ -n "${verbose}" ] ; then
+               echo Keeping ${tx49_files}
+       fi
+else
+       lose_these_too="${tx49_files} ${lose_these_too}"
+       if [ -n "${verbose}" ] ; then
+               echo Deleting ${tx49_files}
+       fi
+fi
+
 if ( echo $* | grep keep\-r5900 > /dev/null ) ; then
        keep_these_too="tm-r5900.h r5900.mt ${keep_these_too}"
 else
index 08e8bbb7bcd699bd4fe8b11560582c3dc8d2c278..8de826fe28cf772cebd60beac92a006dfbcb6bf8 100755 (executable)
@@ -1555,7 +1555,7 @@ EOF
 fi
 
 
-for ac_func in setpgid sbrk select poll
+for ac_func in setpgid sbrk select poll sigaction
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
 echo "configure:1562: checking for $ac_func" >&5
index 8512fc9326392e7ff52acf06877799a74fecb7f5..f3438499df30d26bf8dfac65df207098f8a663db 100644 (file)
@@ -67,7 +67,7 @@ AC_HEADER_STAT
 
 AC_C_CONST
 
-AC_CHECK_FUNCS(setpgid sbrk select poll)
+AC_CHECK_FUNCS(setpgid sbrk select poll sigaction)
 
 # If we are configured native on Linux, work around problems with sys/procfs.h
 if test "${target}" = "${host}"; then
index 1c1d51f733129d2dfc8942f86a9d6f9b07e9ffcb..baa60632d0040b9acb07f40c454f2221da6f96ef 100644 (file)
@@ -171,10 +171,6 @@ mips64*vr5400*el-*-elf*)   gdb_target=vr5000el ;;
 mips64*vr5400*-*-elf*) gdb_target=vr5000
                configdirs="${configdirs} gdbserver" ;;
 # end-sanitize-vr5400
-# start-sanitize-tx49
-mips64*tx49*el-*-elf*) gdb_target=vr4300el ;;
-mips64*tx49*-*-elf*)   gdb_target=vr4300 ;;
-# end-sanitize-tx49
 # start-sanitize-r5900
 mips64*r5900*-*-elf*)  gdb_target=r5900 ;;
 # end-sanitize-r5900
@@ -186,6 +182,10 @@ mips-tx19*-* | mips*tx19*-*-*)
 # end-sanitize-tx19  
 mips*tx39*el*-elf*)    gdb_target=tx39el ;;
 mips*tx39*-elf*)       gdb_target=tx39 ;;
+# start-sanitize-tx49
+mips64*tx49*el-*-elf*) gdb_target=tx49el ;;
+mips64*tx49*-*-elf*)   gdb_target=tx49 ;;
+# end-sanitize-tx49
 mips64*el-*-elf*)      gdb_target=embedl64 ;;
 mips64*-*-elf*)                gdb_target=embed64 ;;
 mips*el-*-ecoff*)      gdb_target=embedl ;;
index feded4e9eef08761d6ead038ac1af36b1be61bc1..418aaad639689017ab7f706c3e930427ead263a5 100644 (file)
@@ -26,6 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 #include "bfd.h"
+#include "elf-bfd.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "symfile.h"
@@ -522,6 +523,15 @@ static struct complaint dwarf2_unsupported_const_value_attr =
    whatever scope is currently getting read. */
 static int address_size;
 
+/* Some elf32 object file formats while linked for a 32 bit address
+   space contain debug information that has assumed 64 bit
+   addresses. Eg 64 bit MIPS target produced by GCC/GAS/LD where the
+   symbol table contains 32bit address values while its .debug_info
+   section contains 64 bit address values.
+   ADDRESS_SIGNIFICANT_SIZE specifies the number significant bits in
+   the ADDRESS_SIZE bytes read from the file */
+static int address_significant_size;
+
 /* Externals references.  */
 extern int info_verbose;       /* From main.c; nonzero => verbose */
 
@@ -907,6 +917,9 @@ dwarf2_build_psymtabs_hard (objfile, section_offsets, mainline)
   int comp_unit_has_pc_info;
   CORE_ADDR lowpc, highpc;
 
+  /* Number of bytes of any addresses that are signficant */
+  address_significant_size = get_elf_backend_data (abfd)->s->arch_size / 8;
+
   info_ptr = dwarf_info_buffer;
   abbrev_ptr = dwarf_abbrev_buffer;
 
@@ -934,7 +947,7 @@ dwarf2_build_psymtabs_hard (objfile, section_offsets, mainline)
        }
       if (cu_header.abbrev_offset >= dwarf_abbrev_size)
        {
-         error ("Dwarf Error: bad offset (0x%lx) in compilation unit header (at 0x%lx + 6).",
+         error ("Dwarf Error: bad offset (0x%lx) in compilation unit header (offset 0x%lx + 6).",
                 (long) cu_header.abbrev_offset,
                 (long) (beg_of_comp_unit - dwarf_info_buffer));
          return;
@@ -942,11 +955,17 @@ dwarf2_build_psymtabs_hard (objfile, section_offsets, mainline)
       if (beg_of_comp_unit + cu_header.length + 4
          > dwarf_info_buffer + dwarf_info_size)
        {
-         error ("Dwarf Error: bad length (0x%lx) in compilation unit header (0x%lx + 0).",
+         error ("Dwarf Error: bad length (0x%lx) in compilation unit header (offset 0x%lx + 0).",
                 (long) cu_header.length,
                 (long) (beg_of_comp_unit - dwarf_info_buffer));
          return;
        }
+      if (address_size < address_significant_size)
+       {
+         error ("Dwarf Error: bad address size (%ld) in compilation unit header (offset 0x%lx + 11).",
+                (long) cu_header.addr_size,
+                (long) (beg_of_comp_unit - dwarf_info_buffer));
+       }
 
       /* Read the abbrevs for this compilation unit into a table */
       dwarf2_read_abbrevs (abfd, cu_header.abbrev_offset);
@@ -3509,11 +3528,27 @@ read_address (abfd, buf)
 {
   CORE_ADDR retval = 0;
 
-  if (address_size == 4)
+  switch (address_size)
     {
+    case 4:
       retval = bfd_get_32 (abfd, (bfd_byte *) buf);
-    } else {                   /* *THE* alternative is 8, right? */
+      break;
+    case 8:
       retval = bfd_get_64 (abfd, (bfd_byte *) buf);
+      break;
+    default:
+      /* *THE* alternative is 8, right? */
+      abort ();
+    }
+  /* If the address being read is larger than the address that is
+     applicable for the object file format then mask it down to the
+     correct size.  Take care to avoid unnecessary shift or shift
+     overflow */
+  if (address_size > address_significant_size
+      && address_significant_size < sizeof (CORE_ADDR))
+    {
+      CORE_ADDR mask = ((CORE_ADDR) 0) - 1;
+      retval &= ~(mask << (address_significant_size * 8));
     }
   return retval;
 }
@@ -3844,7 +3879,7 @@ dwarf_decode_lines (offset, comp_dir, abfd)
   while (line_ptr < line_end)
     {
       /* state machine registers  */
-      unsigned int address = 0;
+      CORE_ADDR address = 0;
       unsigned int file = 1;
       unsigned int line = 1;
       unsigned int column = 0;
index 22952ca3cefa30bc2a0b8229266a6aa01a6a5c17..713e539801e2c69a6ec623837d6c0c11cbb29db3 100644 (file)
@@ -690,6 +690,18 @@ gdbsim_wait (pid, status)
   if (sr_get_debug ())
     printf_filtered ("gdbsim_wait\n");
 
+#if defined (HAVE_SIGACTION) && defined (SA_RESTART)
+  {
+    struct sigaction sa, osa;
+    sa.sa_handler = gdbsim_cntrl_c;
+    sigemptyset (&sa.sa_mask);
+    sa.sa_flags = 0;
+    sigaction (SIGINT, &sa, &osa);
+    prev_sigint = osa.sa_handler;
+  }
+#else
+  prev_sigint = signal (SIGINT, cntrl_c);
+#endif
   prev_sigint = signal (SIGINT, gdbsim_cntrl_c);
   sim_resume (gdbsim_desc, resume_step,
              target_signal_to_host (resume_siggnal));