This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

ping: [patch] Fix zero registers core files w/gcc-4.7


ping

It is a dependency for GDB 7.4 release:
	http://sourceware.org/gdb/wiki/GDB_7.4_Release

Probably obvious but still...


On Fri, 23 Dec 2011 22:15:32 +0100, Jan Kratochvil wrote:
Hello H.J.,

there is a regression by:
	commit 2c9c556617a7de8657c25b512d272c26b070ae22
	Author: H.J. Lu <hjl.tools@gmail.com>
	Date:   Thu Jun 16 22:08:10 2011 +0000
	    Suport x32 gcore.

when built with -O2 by
	gcc (GCC) 4.7.0 20111223 (experimental)
	(not by 4.6.x)

as the code violates ISO C99 6.2.4 item 5 by using local variable outside of
its block, GCC optimizes out the second memcpy, keeping there only that
memset.

./gdb -nx ./gdb -ex start -ex 'gcore 1' -ex 'set confirm no' -ex q;gdb -nx ./gdb ./1 -ex q
will print:
Core was generated by `.../gdb/gdb'.
#0  0x0000000000000000 in ?? ()

No regressions on x86_64-fedora16-linux-gnu.

Probably obvious, OK to check it in?


Thanks,
Jan


bfd/
2011-12-23  Jan Kratochvil  <jan.kratochvil@redhat.com>

	Fix zero registers core files when built by gcc-4.7.
	* elf64-x86-64.c (elf_x86_64_write_core_note): Remove variables p and
	size.  Call elfcore_write_note for the local variables.  Remove the
	final elfcore_write_note call.  Add NOTREACHED comments.

--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -420,8 +420,6 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
 			    int note_type, ...)
 {
   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
-  const void *p;
-  int size;
   va_list ap;
   const char *fname, *psargs;
   long pid;
@@ -445,8 +443,8 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
 	  memset (&data, 0, sizeof (data));
 	  strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
 	  strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
-	  p = (const void *) &data;
-	  size = sizeof (data);
+	  return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
+				     &data, sizeof (data));
 	}
       else
 	{
@@ -454,10 +452,10 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
 	  memset (&data, 0, sizeof (data));
 	  strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
 	  strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
-	  p = (const void *) &data;
-	  size = sizeof (data);
+	  return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
+				     &data, sizeof (data));
 	}
-      break;
+      /* NOTREACHED */
 
     case NT_PRSTATUS:
       va_start (ap, note_type);
@@ -475,8 +473,8 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
 	      prstat.pr_pid = pid;
 	      prstat.pr_cursig = cursig;
 	      memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
-	      p = (const void *) &prstat;
-	      size = sizeof (prstat);
+	      return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
+					 &prstat, sizeof (prstat));
 	    }
 	  else
 	    {
@@ -485,8 +483,8 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
 	      prstat.pr_pid = pid;
 	      prstat.pr_cursig = cursig;
 	      memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
-	      p = (const void *) &prstat;
-	      size = sizeof (prstat);
+	      return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
+					 &prstat, sizeof (prstat));
 	    }
 	}
       else
@@ -496,14 +494,11 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
 	  prstat.pr_pid = pid;
 	  prstat.pr_cursig = cursig;
 	  memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
-	  p = (const void *) &prstat;
-	  size = sizeof (prstat);
+	  return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
+				     &prstat, sizeof (prstat));
 	}
-      break;
     }
-
-  return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type, p,
-			     size);
+  /* NOTREACHED */
 }
 #endif
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]