diff gcc/gcov-io.c @ 55:77e2b8dfacca gcc-4.4.5

update it from 4.4.3 to 4.5.0
author ryoma <e075725@ie.u-ryukyu.ac.jp>
date Fri, 12 Feb 2010 23:39:51 +0900
parents a06113de4d67
children 04ced10e8804
line wrap: on
line diff
--- a/gcc/gcov-io.c	Sun Feb 07 18:28:00 2010 +0900
+++ b/gcc/gcov-io.c	Fri Feb 12 23:39:51 2010 +0900
@@ -46,11 +46,13 @@
 
 /* Open a gcov file. NAME is the name of the file to open and MODE
    indicates whether a new file should be created, or an existing file
-   opened for modification. If MODE is >= 0 an existing file will be
-   opened, if possible, and if MODE is <= 0, a new file will be
-   created. Use MODE=0 to attempt to reopen an existing file and then
-   fall back on creating a new one.  Return zero on failure, >0 on
-   opening an existing file and <0 on creating a new one.  */
+   opened. If MODE is >= 0 an existing file will be opened, if
+   possible, and if MODE is <= 0, a new file will be created. Use
+   MODE=0 to attempt to reopen an existing file and then fall back on
+   creating a new one.  If MODE < 0, the file will be opened in
+   read-only mode.  Otherwise it will be opened for modification.
+   Return zero on failure, >0 on opening an existing file and <0 on
+   creating a new one.  */
 
 GCOV_LINKAGE int
 #if IN_LIBGCOV
@@ -66,13 +68,12 @@
   struct flock s_flock;
   int fd;
 
-  s_flock.l_type = F_WRLCK;
   s_flock.l_whence = SEEK_SET;
   s_flock.l_start = 0;
   s_flock.l_len = 0; /* Until EOF.  */
   s_flock.l_pid = getpid ();
 #endif
-  
+
   gcc_assert (!gcov_var.file);
   gcov_var.start = 0;
   gcov_var.offset = gcov_var.length = 0;
@@ -83,16 +84,25 @@
 #endif
 #if GCOV_LOCKED
   if (mode > 0)
-    fd = open (name, O_RDWR);
+    {
+      /* Read-only mode - acquire a read-lock.  */
+      s_flock.l_type = F_RDLCK;
+      fd = open (name, O_RDONLY);
+    }
   else
-    fd = open (name, O_RDWR | O_CREAT, 0666);
+    {
+      /* Write mode - acquire a write-lock.  */
+      s_flock.l_type = F_WRLCK;
+      fd = open (name, O_RDWR | O_CREAT, 0666);
+    }
   if (fd < 0)
     return 0;
 
   while (fcntl (fd, F_SETLKW, &s_flock) && errno == EINTR)
     continue;
 
-  gcov_var.file = fdopen (fd, "r+b");
+  gcov_var.file = fdopen (fd, (mode > 0) ? "rb" : "r+b");
+
   if (!gcov_var.file)
     {
       close (fd);
@@ -120,7 +130,8 @@
     gcov_var.mode = mode * 2 + 1;
 #else
   if (mode >= 0)
-    gcov_var.file = fopen (name, "r+b");
+    gcov_var.file = fopen (name, (mode > 0) ? "rb" : "r+b");
+
   if (gcov_var.file)
     gcov_var.mode = 1;
   else if (mode <= 0)
@@ -134,7 +145,7 @@
 #endif
 
   setbuf (gcov_var.file, (char *)0);
-  
+
   return 1;
 }
 
@@ -189,12 +200,12 @@
 gcov_allocate (unsigned length)
 {
   size_t new_size = gcov_var.alloc;
-  
+
   if (!new_size)
     new_size = GCOV_BLOCK_SIZE;
   new_size += length;
   new_size *= 2;
-  
+
   gcov_var.alloc = new_size;
   gcov_var.buffer = XRESIZEVAR (gcov_unsigned_t, gcov_var.buffer, new_size << 2);
 }
@@ -237,7 +248,7 @@
 #endif
   result = &gcov_var.buffer[gcov_var.offset];
   gcov_var.offset += words;
-  
+
   return result;
 }
 
@@ -285,7 +296,7 @@
       length = strlen (string);
       alloc = (length + 4) >> 2;
     }
-  
+
   buffer = gcov_write_words (1 + alloc);
 
   buffer[0] = alloc;
@@ -306,7 +317,7 @@
 
   buffer[0] = tag;
   buffer[1] = 0;
-  
+
   return result;
 }
 
@@ -378,7 +389,7 @@
 {
   const gcov_unsigned_t *result;
   unsigned excess = gcov_var.length - gcov_var.offset;
-  
+
   gcc_assert (gcov_var.mode > 0);
   if (excess < words)
     {
@@ -461,7 +472,7 @@
 gcov_read_string (void)
 {
   unsigned length = gcov_read_unsigned ();
-  
+
   if (!length)
     return 0;
 
@@ -474,7 +485,7 @@
 {
   unsigned ix;
   struct gcov_ctr_summary *csum;
-  
+
   summary->checksum = gcov_read_unsigned ();
   for (csum = summary->ctrs, ix = GCOV_COUNTERS_SUMMABLE; ix--; csum++)
     {
@@ -527,7 +538,7 @@
 gcov_time (void)
 {
   struct stat status;
-  
+
   if (fstat (fileno (gcov_var.file), &status))
     return 0;
   else