diff options
Diffstat (limited to 'src/lib/gcov-io.c')
-rw-r--r-- | src/lib/gcov-io.c | 516 |
1 files changed, 250 insertions, 266 deletions
diff --git a/src/lib/gcov-io.c b/src/lib/gcov-io.c index 7f3b7281f4..e14252412e 100644 --- a/src/lib/gcov-io.c +++ b/src/lib/gcov-io.c @@ -36,13 +36,12 @@ static void gcov_allocate(unsigned int); static inline gcov_unsigned_t from_file(gcov_unsigned_t value) { #if !IN_LIBGCOV - if (gcov_var.endian) - { - value = (value >> 16) | (value << 16); - value = ((value & 0xff00ff) << 8) | ((value >> 8) & 0xff00ff); - } + if (gcov_var.endian) { + value = (value >> 16) | (value << 16); + value = ((value & 0xff00ff) << 8) | ((value >> 8) & 0xff00ff); + } #endif - return value; + return value; } /* Open a gcov file. NAME is the name of the file to open and MODE @@ -63,91 +62,83 @@ gcov_open(const char *name, int mode) #endif { #if IN_LIBGCOV - const int mode = 0; + const int mode = 0; #endif #if GCOV_LOCKED - struct flock s_flock; - int fd; + struct flock s_flock; + int fd; - s_flock.l_whence = SEEK_SET; - s_flock.l_start = 0; - s_flock.l_len = 0; /* Until EOF. */ - s_flock.l_pid = getpid(); + 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; - gcov_var.overread = -1u; - gcov_var.error = 0; + gcc_assert(!gcov_var.file); + gcov_var.start = 0; + gcov_var.offset = gcov_var.length = 0; + gcov_var.overread = -1u; + gcov_var.error = 0; #if !IN_LIBGCOV - gcov_var.endian = 0; + gcov_var.endian = 0; #endif #if GCOV_LOCKED - if (mode > 0) - { - /* Read-only mode - acquire a read-lock. */ - s_flock.l_type = F_RDLCK; - fd = open(name, O_RDONLY); - } - else - { - /* 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, (mode > 0) ? "rb" : "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 (mode > 0) { + /* Read-only mode - acquire a read-lock. */ + s_flock.l_type = F_RDLCK; + fd = open(name, O_RDONLY); + } else { + /* Write mode - acquire a write-lock. */ + s_flock.l_type = F_WRLCK; + fd = open(name, O_RDWR | O_CREAT, 0666); } - if (st.st_size != 0) - gcov_var.mode = 1; - else - gcov_var.mode = mode * 2 + 1; - } - else - gcov_var.mode = mode * 2 + 1; + if (fd < 0) + return 0; + + while (fcntl(fd, F_SETLKW, &s_flock) && errno == EINTR) + continue; + + gcov_var.file = fdopen(fd, (mode > 0) ? "rb" : "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, (mode > 0) ? "rb" : "r+b"); - - if (gcov_var.file) - gcov_var.mode = 1; - else if (mode <= 0) - { - gcov_var.file = fopen(name, "w+b"); - if (gcov_var.file) - gcov_var.mode = mode * 2 + 1; - } - if (!gcov_var.file) - return 0; + if (mode >= 0) + gcov_var.file = fopen(name, (mode > 0) ? "rb" : "r+b"); + + if (gcov_var.file) + gcov_var.mode = 1; + else if (mode <= 0) { + gcov_var.file = fopen(name, "w+b"); + if (gcov_var.file) + gcov_var.mode = mode * 2 + 1; + } + if (!gcov_var.file) + return 0; #endif - setbuf(gcov_var.file, (char *)0); + setbuf(gcov_var.file, (char *)0); - return 1; + return 1; } /* Close the current gcov file. Flushes data to disk. Returns nonzero @@ -156,23 +147,22 @@ gcov_open(const char *name, int mode) GCOV_LINKAGE int gcov_close(void) { - if (gcov_var.file) - { + if (gcov_var.file) { #if !IN_GCOV - if (gcov_var.offset && gcov_var.mode < 0) - gcov_write_block(gcov_var.offset); + if (gcov_var.offset && gcov_var.mode < 0) + gcov_write_block(gcov_var.offset); #endif - fclose(gcov_var.file); - gcov_var.file = 0; - gcov_var.length = 0; - } + fclose(gcov_var.file); + gcov_var.file = 0; + gcov_var.length = 0; + } #if !IN_LIBGCOV - free(gcov_var.buffer); - gcov_var.alloc = 0; - gcov_var.buffer = 0; + free(gcov_var.buffer); + gcov_var.alloc = 0; + gcov_var.buffer = 0; #endif - gcov_var.mode = 0; - return gcov_var.error; + gcov_var.mode = 0; + return gcov_var.error; } #if !IN_LIBGCOV @@ -183,16 +173,15 @@ gcov_close(void) GCOV_LINKAGE int gcov_magic(gcov_unsigned_t magic, gcov_unsigned_t expected) { - if (magic == expected) - return 1; - magic = (magic >> 16) | (magic << 16); - magic = ((magic & 0xff00ff) << 8) | ((magic >> 8) & 0xff00ff); - if (magic == expected) - { - gcov_var.endian = 1; - return -1; - } - return 0; + if (magic == expected) + return 1; + magic = (magic >> 16) | (magic << 16); + magic = ((magic & 0xff00ff) << 8) | ((magic >> 8) & 0xff00ff); + if (magic == expected) { + gcov_var.endian = 1; + return -1; + } + return 0; } #endif @@ -200,15 +189,16 @@ gcov_magic(gcov_unsigned_t magic, gcov_unsigned_t expected) static void gcov_allocate(unsigned int length) { - size_t new_size = gcov_var.alloc; + size_t new_size = gcov_var.alloc; - if (!new_size) - new_size = GCOV_BLOCK_SIZE; - new_size += length; - new_size *= 2; + 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); + gcov_var.alloc = new_size; + gcov_var.buffer = XRESIZEVAR(gcov_unsigned_t, gcov_var.buffer, + new_size << 2); } #endif @@ -218,10 +208,10 @@ gcov_allocate(unsigned int length) static void gcov_write_block(unsigned int size) { - if (fwrite(gcov_var.buffer, size << 2, 1, gcov_var.file) != 1) - gcov_var.error = 1; - gcov_var.start += size; - gcov_var.offset -= size; + if (fwrite(gcov_var.buffer, size << 2, 1, gcov_var.file) != 1) + gcov_var.error = 1; + gcov_var.start += size; + gcov_var.offset -= size; } /* Allocate space to write BYTES bytes to the gcov file. Return a @@ -230,27 +220,26 @@ gcov_write_block(unsigned int size) static gcov_unsigned_t * gcov_write_words(unsigned int words) { - gcov_unsigned_t *result; + gcov_unsigned_t *result; - gcc_assert(gcov_var.mode < 0); + 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) - { - gcc_assert(gcov_var.offset == 1); - memcpy(gcov_var.buffer, gcov_var.buffer + GCOV_BLOCK_SIZE, 4); + if (gcov_var.offset >= GCOV_BLOCK_SIZE) { + gcov_write_block(GCOV_BLOCK_SIZE); + if (gcov_var.offset) { + gcc_assert(gcov_var.offset == 1); + memcpy(gcov_var.buffer, gcov_var.buffer + + GCOV_BLOCK_SIZE, 4); + } } - } #else - if (gcov_var.offset + words > gcov_var.alloc) - gcov_allocate(gcov_var.offset + words); + if (gcov_var.offset + words > gcov_var.alloc) + gcov_allocate(gcov_var.offset + words); #endif - result = &gcov_var.buffer[gcov_var.offset]; - gcov_var.offset += words; + result = &gcov_var.buffer[gcov_var.offset]; + gcov_var.offset += words; - return result; + return result; } /* Write unsigned VALUE to coverage file. Sets error flag @@ -259,9 +248,9 @@ gcov_write_words(unsigned int words) GCOV_LINKAGE void gcov_write_unsigned(gcov_unsigned_t value) { - gcov_unsigned_t *buffer = gcov_write_words(1); + gcov_unsigned_t *buffer = gcov_write_words(1); - buffer[0] = value; + buffer[0] = value; } /* Write counter VALUE to coverage file. Sets error flag @@ -271,13 +260,13 @@ gcov_write_unsigned(gcov_unsigned_t value) GCOV_LINKAGE void gcov_write_counter(gcov_type value) { - gcov_unsigned_t *buffer = gcov_write_words(2); + gcov_unsigned_t *buffer = gcov_write_words(2); - buffer[0] = (gcov_unsigned_t) value; - if (sizeof(value) > sizeof(gcov_unsigned_t)) - buffer[1] = (gcov_unsigned_t) (value >> 32); - else - buffer[1] = 0; + buffer[0] = (gcov_unsigned_t) value; + if (sizeof(value) > sizeof(gcov_unsigned_t)) + buffer[1] = (gcov_unsigned_t) (value >> 32); + else + buffer[1] = 0; } #endif /* IN_LIBGCOV */ @@ -288,21 +277,20 @@ gcov_write_counter(gcov_type value) GCOV_LINKAGE void gcov_write_string(const char *string) { - unsigned int length = 0; - unsigned int alloc = 0; - gcov_unsigned_t *buffer; + unsigned int length = 0; + unsigned int alloc = 0; + gcov_unsigned_t *buffer; - if (string) - { - length = strlen(string); - alloc = (length + 4) >> 2; - } + if (string) { + length = strlen(string); + alloc = (length + 4) >> 2; + } - buffer = gcov_write_words(1 + alloc); + buffer = gcov_write_words(1 + alloc); - buffer[0] = alloc; - buffer[alloc] = 0; - memcpy(&buffer[1], string, length); + buffer[0] = alloc; + buffer[alloc] = 0; + memcpy(&buffer[1], string, length); } #endif @@ -313,13 +301,13 @@ gcov_write_string(const char *string) GCOV_LINKAGE gcov_position_t gcov_write_tag(gcov_unsigned_t tag) { - gcov_position_t result = gcov_var.start + gcov_var.offset; - gcov_unsigned_t *buffer = gcov_write_words(2); + gcov_position_t result = gcov_var.start + gcov_var.offset; + gcov_unsigned_t *buffer = gcov_write_words(2); - buffer[0] = tag; - buffer[1] = 0; + buffer[0] = tag; + buffer[1] = 0; - return result; + return result; } /* Write a record length using POSITION, which was returned by @@ -330,19 +318,19 @@ gcov_write_tag(gcov_unsigned_t tag) GCOV_LINKAGE void gcov_write_length(gcov_position_t position) { - unsigned int offset; - gcov_unsigned_t length; - gcov_unsigned_t *buffer; - - 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]; - buffer[1] = length; - if (gcov_var.offset >= GCOV_BLOCK_SIZE) - gcov_write_block(gcov_var.offset); + unsigned int offset; + gcov_unsigned_t length; + gcov_unsigned_t *buffer; + + 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]; + buffer[1] = length; + if (gcov_var.offset >= GCOV_BLOCK_SIZE) + gcov_write_block(gcov_var.offset); } #else /* IN_LIBGCOV */ @@ -352,10 +340,10 @@ gcov_write_length(gcov_position_t position) GCOV_LINKAGE void gcov_write_tag_length(gcov_unsigned_t tag, gcov_unsigned_t length) { - gcov_unsigned_t *buffer = gcov_write_words(2); + gcov_unsigned_t *buffer = gcov_write_words(2); - buffer[0] = tag; - buffer[1] = length; + buffer[0] = tag; + buffer[1] = length; } /* Write a summary structure to the gcov file. Return nonzero on @@ -364,19 +352,18 @@ gcov_write_tag_length(gcov_unsigned_t tag, gcov_unsigned_t length) GCOV_LINKAGE void gcov_write_summary(gcov_unsigned_t tag, const struct gcov_summary *summary) { - unsigned int ix; - const struct gcov_ctr_summary *csum; - - gcov_write_tag_length(tag, GCOV_TAG_SUMMARY_LENGTH); - gcov_write_unsigned(summary->checksum); - for (csum = summary->ctrs, ix = GCOV_COUNTERS_SUMMABLE; ix--; csum++) - { - gcov_write_unsigned(csum->num); - gcov_write_unsigned(csum->runs); - gcov_write_counter(csum->sum_all); - gcov_write_counter(csum->run_max); - gcov_write_counter(csum->sum_max); - } + unsigned int ix; + const struct gcov_ctr_summary *csum; + + gcov_write_tag_length(tag, GCOV_TAG_SUMMARY_LENGTH); + gcov_write_unsigned(summary->checksum); + for (csum = summary->ctrs, ix = GCOV_COUNTERS_SUMMABLE; ix--; csum++) { + gcov_write_unsigned(csum->num); + gcov_write_unsigned(csum->runs); + gcov_write_counter(csum->sum_all); + gcov_write_counter(csum->run_max); + gcov_write_counter(csum->sum_max); + } } #endif /* IN_LIBGCOV */ @@ -388,45 +375,44 @@ gcov_write_summary(gcov_unsigned_t tag, const struct gcov_summary *summary) static const gcov_unsigned_t * gcov_read_words(unsigned int words) { - const gcov_unsigned_t *result; - unsigned int excess = gcov_var.length - gcov_var.offset; + const gcov_unsigned_t *result; + unsigned int excess = gcov_var.length - gcov_var.offset; - gcc_assert(gcov_var.mode > 0); - if (excess < words) - { - gcov_var.start += gcov_var.offset; + gcc_assert(gcov_var.mode > 0); + if (excess < words) { + gcov_var.start += gcov_var.offset; #if IN_LIBGCOV - if (excess) - { - gcc_assert(excess == 1); - memcpy(gcov_var.buffer, gcov_var.buffer + gcov_var.offset, 4); - } + if (excess) { + 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 * 4); + memmove(gcov_var.buffer, gcov_var.buffer + + gcov_var.offset, excess * 4); #endif - gcov_var.offset = 0; - gcov_var.length = excess; + gcov_var.offset = 0; + gcov_var.length = excess; #if IN_LIBGCOV - gcc_assert(!gcov_var.length || gcov_var.length == 1); - excess = GCOV_BLOCK_SIZE; + gcc_assert(!gcov_var.length || gcov_var.length == 1); + excess = GCOV_BLOCK_SIZE; #else - if (gcov_var.length + words > gcov_var.alloc) - gcov_allocate(gcov_var.length + words); - excess = gcov_var.alloc - gcov_var.length; + if (gcov_var.length + words > gcov_var.alloc) + gcov_allocate(gcov_var.length + words); + excess = gcov_var.alloc - gcov_var.length; #endif - excess = fread(gcov_var.buffer + gcov_var.length, - 1, excess << 2, gcov_var.file) >> 2; - gcov_var.length += excess; - if (gcov_var.length < words) - { - gcov_var.overread += words - gcov_var.length; - gcov_var.length = 0; - return 0; + excess = fread(gcov_var.buffer + gcov_var.length, + 1, excess << 2, gcov_var.file) >> 2; + gcov_var.length += excess; + if (gcov_var.length < words) { + gcov_var.overread += words - gcov_var.length; + gcov_var.length = 0; + return 0; + } } - } - result = &gcov_var.buffer[gcov_var.offset]; - gcov_var.offset += words; - return result; + result = &gcov_var.buffer[gcov_var.offset]; + gcov_var.offset += words; + return result; } /* Read unsigned value from a coverage file. Sets error flag on file @@ -435,13 +421,13 @@ gcov_read_words(unsigned int words) GCOV_LINKAGE gcov_unsigned_t gcov_read_unsigned(void) { - gcov_unsigned_t value; - const gcov_unsigned_t *buffer = gcov_read_words(1); + gcov_unsigned_t value; + const gcov_unsigned_t *buffer = gcov_read_words(1); - if (!buffer) - return 0; - value = from_file(buffer[0]); - return value; + if (!buffer) + return 0; + value = from_file(buffer[0]); + return value; } /* Read counter value from a coverage file. Sets error flag on file @@ -450,18 +436,18 @@ gcov_read_unsigned(void) GCOV_LINKAGE gcov_type gcov_read_counter(void) { - gcov_type value; - const gcov_unsigned_t *buffer = gcov_read_words(2); - - if (!buffer) - return 0; - value = from_file(buffer[0]); - if (sizeof(value) > sizeof(gcov_unsigned_t)) - value |= ((gcov_type) from_file(buffer[1])) << 32; - else if (buffer[1]) - gcov_var.error = -1; - - return value; + gcov_type value; + const gcov_unsigned_t *buffer = gcov_read_words(2); + + if (!buffer) + return 0; + value = from_file(buffer[0]); + if (sizeof(value) > sizeof(gcov_unsigned_t)) + value |= ((gcov_type) from_file(buffer[1])) << 32; + else if (buffer[1]) + gcov_var.error = -1; + + return value; } /* Read string from coverage file. Returns a pointer to a static @@ -472,30 +458,29 @@ gcov_read_counter(void) GCOV_LINKAGE const char * gcov_read_string(void) { - unsigned int length = gcov_read_unsigned(); + unsigned int length = gcov_read_unsigned(); - if (!length) - return 0; + if (!length) + return 0; - return (const char *) gcov_read_words(length); + return (const char *) gcov_read_words(length); } #endif GCOV_LINKAGE void gcov_read_summary(struct gcov_summary *summary) { - unsigned int ix; - struct gcov_ctr_summary *csum; - - summary->checksum = gcov_read_unsigned(); - for (csum = summary->ctrs, ix = GCOV_COUNTERS_SUMMABLE; ix--; csum++) - { - csum->num = gcov_read_unsigned(); - csum->runs = gcov_read_unsigned(); - csum->sum_all = gcov_read_counter(); - csum->run_max = gcov_read_counter(); - csum->sum_max = gcov_read_counter(); - } + unsigned int ix; + struct gcov_ctr_summary *csum; + + summary->checksum = gcov_read_unsigned(); + for (csum = summary->ctrs, ix = GCOV_COUNTERS_SUMMABLE; ix--; csum++) { + csum->num = gcov_read_unsigned(); + csum->runs = gcov_read_unsigned(); + csum->sum_all = gcov_read_counter(); + csum->run_max = gcov_read_counter(); + csum->sum_max = gcov_read_counter(); + } } #if !IN_LIBGCOV @@ -505,16 +490,15 @@ gcov_read_summary(struct gcov_summary *summary) GCOV_LINKAGE void gcov_sync(gcov_position_t base, gcov_unsigned_t length) { - gcc_assert(gcov_var.mode > 0); - base += length; - if (base - gcov_var.start <= gcov_var.length) - gcov_var.offset = base - gcov_var.start; - else - { - gcov_var.offset = gcov_var.length = 0; - fseek(gcov_var.file, base << 2, SEEK_SET); - gcov_var.start = ftell(gcov_var.file) >> 2; - } + gcc_assert(gcov_var.mode > 0); + base += length; + if (base - gcov_var.start <= gcov_var.length) + gcov_var.offset = base - gcov_var.start; + else { + gcov_var.offset = gcov_var.length = 0; + fseek(gcov_var.file, base << 2, SEEK_SET); + gcov_var.start = ftell(gcov_var.file) >> 2; + } } #endif @@ -524,11 +508,11 @@ gcov_sync(gcov_position_t base, gcov_unsigned_t length) GCOV_LINKAGE void gcov_seek(gcov_position_t base) { - gcc_assert(gcov_var.mode < 0); - if (gcov_var.offset) - gcov_write_block(gcov_var.offset); - fseek(gcov_var.file, base << 2, SEEK_SET); - gcov_var.start = ftell(gcov_var.file) >> 2; + gcc_assert(gcov_var.mode < 0); + if (gcov_var.offset) + gcov_write_block(gcov_var.offset); + fseek(gcov_var.file, base << 2, SEEK_SET); + gcov_var.start = ftell(gcov_var.file) >> 2; } #endif @@ -538,11 +522,11 @@ gcov_seek(gcov_position_t base) GCOV_LINKAGE time_t gcov_time(void) { - struct stat status; + struct stat status; - if (fstat(fileno(gcov_var.file), &status)) - return 0; - else - return status.st_mtime; + if (fstat(fileno(gcov_var.file), &status)) + return 0; + else + return status.st_mtime; } #endif /* IN_GCOV */ |