X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;ds=sidebyside;f=gcc%2Fgcov-io.c;h=ab8e08db4d882b5c7607e4abc50c32040dc1148a;hb=138fbfd03489528c7f71b4c9e755fb1da3e0e277;hp=820b1f61701e64c8d3036c81b3e3e22450191c48;hpb=9e0943d49176f12d4ed1c181e4f51e59f33f8d18;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/gcov-io.c b/gcc/gcov-io.c index 820b1f61701..ab8e08db4d8 100644 --- a/gcc/gcov-io.c +++ b/gcc/gcov-io.c @@ -1,6 +1,6 @@ /* File format for coverage information - Copyright (C) 1996, 1997, 1998, 2000, 2002, - 2003 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 2000, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. Contributed by Bob Manson . Completely remangled by Nathan Sidwell . @@ -18,8 +18,8 @@ for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301, USA. */ /* Routines declared in gcov-io.h. This file should be #included by another source file, after having #included gcov-io.h. */ @@ -65,6 +65,7 @@ gcov_open (const char *name, int mode) #endif #if GCOV_LOCKED struct flock s_flock; + int fd; s_flock.l_type = F_WRLCK; s_flock.l_whence = SEEK_SET; @@ -73,8 +74,7 @@ gcov_open (const char *name, int mode) s_flock.l_pid = getpid (); #endif - if (gcov_var.file) - abort (); + gcc_assert (!gcov_var.file); gcov_var.start = 0; gcov_var.offset = gcov_var.length = 0; gcov_var.overread = -1u; @@ -82,6 +82,44 @@ gcov_open (const char *name, int mode) #if !IN_LIBGCOV gcov_var.endian = 0; #endif +#if GCOV_LOCKED + if (mode > 0) + fd = open (name, O_RDWR); + else + 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"); + if (!gcov_var.file) + { + close (fd); + return 0; + } + + if (mode > 0) + gcov_var.mode = 1; + else if (mode == 0) + { + struct stat st; + + if (fstat (fd, &st) < 0) + { + fclose (gcov_var.file); + gcov_var.file = 0; + return 0; + } + if (st.st_size != 0) + gcov_var.mode = 1; + else + gcov_var.mode = mode * 2 + 1; + } + else + gcov_var.mode = mode * 2 + 1; +#else if (mode >= 0) gcov_var.file = fopen (name, "r+b"); if (gcov_var.file) @@ -94,15 +132,10 @@ gcov_open (const char *name, int mode) } if (!gcov_var.file) return 0; - - setbuf (gcov_var.file, (char *)0); - -#if GCOV_LOCKED - while (fcntl (fileno (gcov_var.file), F_SETLKW, &s_flock) - && errno == EINTR) - continue; #endif + setbuf (gcov_var.file, (char *)0); + return 1; } @@ -188,14 +221,14 @@ gcov_write_words (unsigned words) { gcov_unsigned_t *result; - GCOV_CHECK_WRITING (); + gcc_assert (gcov_var.mode < 0); #if IN_LIBGCOV if (gcov_var.offset >= GCOV_BLOCK_SIZE) { gcov_write_block (GCOV_BLOCK_SIZE); if (gcov_var.offset) { - GCOV_CHECK (gcov_var.offset == 1); + gcc_assert (gcov_var.offset == 1); memcpy (gcov_var.buffer, gcov_var.buffer + GCOV_BLOCK_SIZE, 4); } } @@ -234,9 +267,6 @@ gcov_write_counter (gcov_type value) buffer[1] = (gcov_unsigned_t) (value >> 32); else buffer[1] = 0; - - if (value < 0) - gcov_var.error = -1; } #endif /* IN_LIBGCOV */ @@ -293,9 +323,9 @@ gcov_write_length (gcov_position_t position) gcov_unsigned_t length; gcov_unsigned_t *buffer; - GCOV_CHECK_WRITING (); - GCOV_CHECK (position + 2 <= gcov_var.start + gcov_var.offset); - GCOV_CHECK (position >= gcov_var.start); + gcc_assert (gcov_var.mode < 0); + gcc_assert (position + 2 <= gcov_var.start + gcov_var.offset); + gcc_assert (position >= gcov_var.start); offset = position - gcov_var.start; length = gcov_var.offset - offset - 2; buffer = (gcov_unsigned_t *) &gcov_var.buffer[offset]; @@ -350,23 +380,23 @@ gcov_read_words (unsigned words) const gcov_unsigned_t *result; unsigned excess = gcov_var.length - gcov_var.offset; - GCOV_CHECK_READING (); + gcc_assert (gcov_var.mode > 0); if (excess < words) { gcov_var.start += gcov_var.offset; #if IN_LIBGCOV if (excess) { - GCOV_CHECK (excess == 1); + gcc_assert (excess == 1); memcpy (gcov_var.buffer, gcov_var.buffer + gcov_var.offset, 4); } #else - memmove (gcov_var.buffer, gcov_var.buffer + gcov_var.offset, excess); + memmove (gcov_var.buffer, gcov_var.buffer + gcov_var.offset, excess * 4); #endif gcov_var.offset = 0; gcov_var.length = excess; #if IN_LIBGCOV - GCOV_CHECK (!gcov_var.length || gcov_var.length == 1); + gcc_assert (!gcov_var.length || gcov_var.length == 1); excess = GCOV_BLOCK_SIZE; #else if (gcov_var.length + words > gcov_var.alloc) @@ -419,9 +449,7 @@ gcov_read_counter (void) value |= ((gcov_type) from_file (buffer[1])) << 32; else if (buffer[1]) gcov_var.error = -1; - - if (value < 0) - gcov_var.error = -1; + return value; } @@ -466,7 +494,7 @@ gcov_read_summary (struct gcov_summary *summary) GCOV_LINKAGE void gcov_sync (gcov_position_t base, gcov_unsigned_t length) { - GCOV_CHECK_READING (); + gcc_assert (gcov_var.mode > 0); base += length; if (base - gcov_var.start <= gcov_var.length) gcov_var.offset = base - gcov_var.start; @@ -480,16 +508,15 @@ gcov_sync (gcov_position_t base, gcov_unsigned_t length) #endif #if IN_LIBGCOV -/* Move to the a set position in a gcov file. BASE is zero to move to - the end, and nonzero to move to that position. */ +/* Move to the a set position in a gcov file. */ GCOV_LINKAGE void gcov_seek (gcov_position_t base) { - GCOV_CHECK_WRITING (); + gcc_assert (gcov_var.mode < 0); if (gcov_var.offset) gcov_write_block (gcov_var.offset); - fseek (gcov_var.file, base << 2, base ? SEEK_SET : SEEK_END); + fseek (gcov_var.file, base << 2, SEEK_SET); gcov_var.start = ftell (gcov_var.file) >> 2; } #endif