This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

kill rest of -ax dumping code


Hi,
it looks like I was not curefull enought killing all the interwinded
code to support -a and friends.

Mon Dec 17 18:18:20 CET 2001  Jan Hubicka  <jh@suse.cz>
	* libgcc2.c (__bb_exit_func): Kill -ax dumping code.

Index: libgcc2.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/libgcc2.c,v
retrieving revision 1.127.2.2
diff -c -3 -p -r1.127.2.2 libgcc2.c
*** libgcc2.c	2001/12/14 23:08:19	1.127.2.2
--- libgcc2.c	2001/12/17 16:59:01
*************** static int num_digits (long long value, 
*** 1332,1606 ****
  void
  __bb_exit_func (void)
  {
!   FILE *da_file, *file;
    long time_value;
    int i;
  
    if (bb_head == 0)
      return;
  
    i = strlen (bb_head->filename) - 3;
  
-   if (!strcmp (bb_head->filename+i, ".da"))
-     {
-       /* Must be -fprofile-arcs not -a.
- 	 Dump data in a form that gcov expects.  */
  
!       struct bb *ptr;
  
!       for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next)
  	{
! 	  int firstchar;
! 
! 	  /* Make sure the output file exists -
! 	     but don't clobber exiting data.  */
! 	  if ((da_file = fopen (ptr->filename, "a")) != 0)
! 	    fclose (da_file);
! 
! 	  /* Need to re-open in order to be able to write from the start.  */
! 	  da_file = fopen (ptr->filename, "r+b");
! 	  /* Some old systems might not allow the 'b' mode modifier.
! 	     Therefore, try to open without it.  This can lead to a race
! 	     condition so that when you delete and re-create the file, the
! 	     file might be opened in text mode, but then, you shouldn't
! 	     delete the file in the first place.  */
! 	  if (da_file == 0)
! 	    da_file = fopen (ptr->filename, "r+");
! 	  if (da_file == 0)
! 	    {
! 	      fprintf (stderr, "arc profiling: Can't open output file %s.\n",
! 		       ptr->filename);
! 	      continue;
! 	    }
  
! 	  /* After a fork, another process might try to read and/or write
! 	     the same file simultanously.  So if we can, lock the file to
! 	     avoid race conditions.  */
  #if defined (TARGET_HAS_F_SETLKW)
! 	  {
! 	    struct flock s_flock;
  
! 	    s_flock.l_type = F_WRLCK;
! 	    s_flock.l_whence = SEEK_SET;
! 	    s_flock.l_start = 0;
! 	    s_flock.l_len = 1;
! 	    s_flock.l_pid = getpid ();
! 
! 	    while (fcntl (fileno (da_file), F_SETLKW, &s_flock)
! 		   && errno == EINTR);
! 	  }
  #endif
  
! 	  /* If the file is not empty, and the number of counts in it is the
! 	     same, then merge them in.  */
! 	  firstchar = fgetc (da_file);
! 	  if (firstchar == EOF)
  	    {
! 	      if (ferror (da_file))
! 		{
! 		  fprintf (stderr, "arc profiling: Can't read output file ");
! 		  perror (ptr->filename);
! 		}
  	    }
! 	  else
! 	    {
! 	      long n_counts = 0;
! 
! 	      if (ungetc (firstchar, da_file) == EOF)
! 		rewind (da_file);
! 	      if (__read_long (&n_counts, da_file, 8) != 0)
! 		{
! 		  fprintf (stderr, "arc profiling: Can't read output file %s.\n",
! 			   ptr->filename);
! 		  continue;
! 		}
! 
! 	      if (n_counts == ptr->ncounts)
! 		{
! 		  int i;
! 
! 		  for (i = 0; i < n_counts; i++)
! 		    {
! 		      gcov_type v = 0;
! 
! 		      if (__read_gcov_type (&v, da_file, 8) != 0)
! 			{
! 			  fprintf (stderr, "arc profiling: Can't read output file %s.\n",
! 				   ptr->filename);
! 			  break;
! 			}
! 		      ptr->counts[i] += v;
! 		    }
! 		}
! 
! 	    }
! 
! 	  rewind (da_file);
! 
! 	  /* ??? Should first write a header to the file.  Preferably, a 4 byte
! 	     magic number, 4 bytes containing the time the program was
! 	     compiled, 4 bytes containing the last modification time of the
! 	     source file, and 4 bytes indicating the compiler options used.
! 
! 	     That way we can easily verify that the proper source/executable/
! 	     data file combination is being used from gcov.  */
  
! 	  if (__write_gcov_type (ptr->ncounts, da_file, 8) != 0)
  	    {
! 
! 	      fprintf (stderr, "arc profiling: Error writing output file %s.\n",
  		       ptr->filename);
  	    }
! 	  else
  	    {
! 	      int j;
! 	      gcov_type *count_ptr = ptr->counts;
! 	      int ret = 0;
! 	      for (j = ptr->ncounts; j > 0; j--)
  		{
! 		  if (__write_gcov_type (*count_ptr, da_file, 8) != 0)
  		    {
! 		      ret=1;
  		      break;
  		    }
! 		  count_ptr++;
  		}
- 	      if (ret)
- 		fprintf (stderr, "arc profiling: Error writing output file %s.\n",
- 			 ptr->filename);
  	    }
  
- 	  if (fclose (da_file) == EOF)
- 	    fprintf (stderr, "arc profiling: Error closing output file %s.\n",
- 		     ptr->filename);
  	}
  
!       return;
!     }
! 
!   /* Must be basic block profiling.  Emit a human readable output file.  */
  
!   file = fopen ("bb.out", "a");
  
!   if (!file)
!     perror ("bb.out");
! 
!   else
!     {
!       struct bb *ptr;
  
!       /* This is somewhat type incorrect, but it avoids worrying about
! 	 exactly where time.h is included from.  It should be ok unless
! 	 a void * differs from other pointer formats, or if sizeof (long)
! 	 is < sizeof (time_t).  It would be nice if we could assume the
! 	 use of rationale standards here.  */
! 
!       time ((void *) &time_value);
!       fprintf (file, "Basic block profiling finished on %s\n",
! 	       ctime ((void *) &time_value));
! 
!       /* We check the length field explicitly in order to allow compatibility
! 	 with older GCC's which did not provide it.  */
! 
!       for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next)
  	{
- 	  int i;
- 	  int func_p	= (ptr->nwords >= (long) sizeof (struct bb)
- 			   && ptr->nwords <= 1000
- 			   && ptr->functions);
- 	  int line_p	= (func_p && ptr->line_nums);
- 	  int file_p	= (func_p && ptr->filenames);
- 	  int addr_p	= (ptr->addresses != 0);
- 	  long ncounts	= ptr->ncounts;
- 	  gcov_type cnt_max  = 0;
- 	  long line_max = 0;
- 	  long addr_max = 0;
- 	  int file_len	= 0;
- 	  int func_len	= 0;
- 	  int blk_len	= num_digits (ncounts, 10);
- 	  int cnt_len;
- 	  int line_len;
- 	  int addr_len;
  
! 	  fprintf (file, "File %s, %ld basic blocks \n\n",
! 		   ptr->filename, ncounts);
! 
! 	  /* Get max values for each field.  */
! 	  for (i = 0; i < ncounts; i++)
  	    {
! 	      const char *p;
! 	      int len;
! 
! 	      if (cnt_max < ptr->counts[i])
! 		cnt_max = ptr->counts[i];
! 
! 	      if (addr_p && (unsigned long) addr_max < ptr->addresses[i])
! 		addr_max = ptr->addresses[i];
! 
! 	      if (line_p && line_max < ptr->line_nums[i])
! 		line_max = ptr->line_nums[i];
! 
! 	      if (func_p)
! 		{
! 		  p = (ptr->functions[i]) ? (ptr->functions[i]) : "<none>";
! 		  len = strlen (p);
! 		  if (func_len < len)
! 		    func_len = len;
! 		}
! 
! 	      if (file_p)
  		{
! 		  p = (ptr->filenames[i]) ? (ptr->filenames[i]) : "<none>";
! 		  len = strlen (p);
! 		  if (file_len < len)
! 		    file_len = len;
  		}
  	    }
! 
! 	  addr_len = num_digits (addr_max, 16);
! 	  cnt_len  = num_digits (cnt_max, 10);
! 	  line_len = num_digits (line_max, 10);
! 
! 	  /* Now print out the basic block information.  */
! 	  for (i = 0; i < ncounts; i++)
! 	    {
! #if LONG_TYPE_SIZE == GCOV_TYPE_SIZE
! 	      fprintf (file,
! 		       "    Block #%*d: executed %*ld time(s)",
! 		       blk_len, i+1,
! 		       cnt_len, ptr->counts[i]);
! #else
! 	      fprintf (file,
! 		       "    Block #%*d: executed %*lld time(s)",
! 		       blk_len, i+1,
! 		       cnt_len, ptr->counts[i]);
! #endif
! 
! 	      if (addr_p)
! 		fprintf (file, " address= 0x%.*lx", addr_len,
! 			 ptr->addresses[i]);
! 
! 	      if (func_p)
! 		fprintf (file, " function= %-*s", func_len,
! 			 (ptr->functions[i]) ? ptr->functions[i] : "<none>");
! 
! 	      if (line_p)
! 		fprintf (file, " line= %*ld", line_len, ptr->line_nums[i]);
! 
! 	      if (file_p)
! 		fprintf (file, " file= %s",
! 			 (ptr->filenames[i]) ? ptr->filenames[i] : "<none>");
! 
! 	      fprintf (file, "\n");
! 	    }
! 
! 	  fprintf (file, "\n");
! 	  fflush (file);
  	}
  
!       fprintf (file, "\n\n");
!       fclose (file);
      }
  }
  
  void
--- 1332,1477 ----
  void
  __bb_exit_func (void)
  {
!   FILE *da_file;
    long time_value;
    int i;
+   struct bb *ptr;
  
    if (bb_head == 0)
      return;
  
    i = strlen (bb_head->filename) - 3;
  
  
!   for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next)
!     {
!       int firstchar;
  
!       /* Make sure the output file exists -
!          but don't clobber exiting data.  */
!       if ((da_file = fopen (ptr->filename, "a")) != 0)
! 	fclose (da_file);
! 
!       /* Need to re-open in order to be able to write from the start.  */
!       da_file = fopen (ptr->filename, "r+b");
!       /* Some old systems might not allow the 'b' mode modifier.
!          Therefore, try to open without it.  This can lead to a race
!          condition so that when you delete and re-create the file, the
!          file might be opened in text mode, but then, you shouldn't
!          delete the file in the first place.  */
!       if (da_file == 0)
! 	da_file = fopen (ptr->filename, "r+");
!       if (da_file == 0)
  	{
! 	  fprintf (stderr, "arc profiling: Can't open output file %s.\n",
! 		   ptr->filename);
! 	  continue;
! 	}
  
!       /* After a fork, another process might try to read and/or write
!          the same file simultanously.  So if we can, lock the file to
!          avoid race conditions.  */
  #if defined (TARGET_HAS_F_SETLKW)
!       {
! 	struct flock s_flock;
  
! 	s_flock.l_type = F_WRLCK;
! 	s_flock.l_whence = SEEK_SET;
! 	s_flock.l_start = 0;
! 	s_flock.l_len = 1;
! 	s_flock.l_pid = getpid ();
! 
! 	while (fcntl (fileno (da_file), F_SETLKW, &s_flock)
! 	       && errno == EINTR);
!       }
  #endif
  
!       /* If the file is not empty, and the number of counts in it is the
!          same, then merge them in.  */
!       firstchar = fgetc (da_file);
!       if (firstchar == EOF)
! 	{
! 	  if (ferror (da_file))
  	    {
! 	      fprintf (stderr, "arc profiling: Can't read output file ");
! 	      perror (ptr->filename);
  	    }
! 	}
!       else
! 	{
! 	  long n_counts = 0;
  
! 	  if (ungetc (firstchar, da_file) == EOF)
! 	    rewind (da_file);
! 	  if (__read_long (&n_counts, da_file, 8) != 0)
  	    {
! 	      fprintf (stderr, "arc profiling: Can't read output file %s.\n",
  		       ptr->filename);
+ 	      continue;
  	    }
! 
! 	  if (n_counts == ptr->ncounts)
  	    {
! 	      int i;
! 
! 	      for (i = 0; i < n_counts; i++)
  		{
! 		  gcov_type v = 0;
! 
! 		  if (__read_gcov_type (&v, da_file, 8) != 0)
  		    {
! 		      fprintf (stderr,
! 			       "arc profiling: Can't read output file %s.\n",
! 			       ptr->filename);
  		      break;
  		    }
! 		  ptr->counts[i] += v;
  		}
  	    }
  
  	}
  
!       rewind (da_file);
  
!       /* ??? Should first write a header to the file.  Preferably, a 4 byte
!          magic number, 4 bytes containing the time the program was
!          compiled, 4 bytes containing the last modification time of the
!          source file, and 4 bytes indicating the compiler options used.
  
!          That way we can easily verify that the proper source/executable/
!          data file combination is being used from gcov.  */
  
!       if (__write_gcov_type (ptr->ncounts, da_file, 8) != 0)
  	{
  
! 	  fprintf (stderr, "arc profiling: Error writing output file %s.\n",
! 		   ptr->filename);
! 	}
!       else
! 	{
! 	  int j;
! 	  gcov_type *count_ptr = ptr->counts;
! 	  int ret = 0;
! 	  for (j = ptr->ncounts; j > 0; j--)
  	    {
! 	      if (__write_gcov_type (*count_ptr, da_file, 8) != 0)
  		{
! 		  ret = 1;
! 		  break;
  		}
+ 	      count_ptr++;
  	    }
! 	  if (ret)
! 	    fprintf (stderr, "arc profiling: Error writing output file %s.\n",
! 		     ptr->filename);
  	}
  
!       if (fclose (da_file) == EOF)
! 	fprintf (stderr, "arc profiling: Error closing output file %s.\n",
! 		 ptr->filename);
      }
+ 
+   return;
  }
  
  void


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