diff options
author | Bill Wendling <isanbard@gmail.com> | 2013-04-22 03:36:22 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2013-04-22 03:36:22 +0000 |
commit | 4aa08fae9b02ba9a0701fe27f58e2645d236798b (patch) | |
tree | 3f8b5e6fc829a2767e57dfeffd7714ef24ada270 /lib | |
parent | 64544c1093e2a911af0df20c60bd16ff90b4018c (diff) | |
download | compiler-rt-4aa08fae9b02ba9a0701fe27f58e2645d236798b.tar.gz |
Improve performance of file I/O.
The fread / fwrite calls were happening for each timer. However, that could be
pretty expensive for a large number of timers. Instead, read and write the
timers in one call.
This gives ~10% speedup in compilation time.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@179990 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/profile/GCDAProfiling.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/lib/profile/GCDAProfiling.c b/lib/profile/GCDAProfiling.c index 86f68f58a..653f641f7 100644 --- a/lib/profile/GCDAProfiling.c +++ b/lib/profile/GCDAProfiling.c @@ -77,11 +77,11 @@ static void write_int32(uint32_t i) { fwrite(&i, 4, 1, output_file); } -static void write_int64(uint64_t i) { - uint32_t lo = i >> 0; - uint32_t hi = i >> 32; - write_int32(lo); - write_int32(hi); +static uint64_t write_from_buffer(uint64_t *buffer, size_t size) { + if (fwrite(buffer, 8, size, output_file) != size) + return (uint64_t)-1; + + return 0; } static uint32_t length_of_string(const char *s) { @@ -104,13 +104,11 @@ static uint32_t read_int32() { return tmp; } -static uint64_t read_int64() { - uint64_t tmp; - - if (fread(&tmp, 1, 8, output_file) != 8) +static uint64_t read_into_buffer(uint64_t *buffer, size_t size) { + if (fread(buffer, 8, size, output_file) != size) return (uint64_t)-1; - return tmp; + return 0; } static char *mangle_filename(const char *orig_filename) { @@ -269,23 +267,24 @@ void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) { if (val != (uint32_t)-1) { /* There are counters present in the file. Merge them. */ - uint32_t j; - if (val != 0x01a10000) { - fprintf(stderr, "profiling: invalid magic number (0x%08x)\n", val); + fprintf(stderr, "profiling:invalid magic number (0x%08x)\n", val); return; } val = read_int32(); if (val == (uint32_t)-1 || val / 2 != num_counters) { - fprintf(stderr, "profiling: invalid number of counters (%d)\n", val); + fprintf(stderr, "profiling:invalid number of counters (%d)\n", val); return; } old_ctrs = malloc(sizeof(uint64_t) * num_counters); - for (j = 0; j < num_counters; ++j) - old_ctrs[j] = read_int64(); + if (read_into_buffer(old_ctrs, num_counters) == (uint64_t)-1) { + fprintf(stderr, "profiling:invalid number of counters (%d)\n", + num_counters); + return; + } } /* Reset for writing. */ @@ -295,7 +294,12 @@ void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) { fwrite("\0\0\xa1\1", 4, 1, output_file); write_int32(num_counters * 2); for (i = 0; i < num_counters; ++i) - write_int64(counters[i] + (old_ctrs ? old_ctrs[i] : 0)); + counters[i] += (old_ctrs ? old_ctrs[i] : 0); + + if (write_from_buffer(counters, num_counters) == (uint64_t)-1) { + fprintf(stderr, "profiling:cannot write to output file\n"); + return; + } free(old_ctrs); |