diff options
author | Yuchen Wu <yuchenericwu@hotmail.com> | 2013-11-12 18:45:50 +0000 |
---|---|---|
committer | Yuchen Wu <yuchenericwu@hotmail.com> | 2013-11-12 18:45:50 +0000 |
commit | 7bb5d49a6402c5a1d20911e6992ebb7e9e4468c4 (patch) | |
tree | 3fecd734baa548ea9bb34d154c9462f997e93aaf /lib/profile/GCDAProfiling.c | |
parent | 55c7947a742aa72530eef52d902e60e5571ac3cf (diff) |
Added summary info to GCDAProfiling.
This function will be called by GCOVProfiling to write and update object
and program summaries to be read in by llvm-cov.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@194499 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/profile/GCDAProfiling.c')
-rw-r--r-- | lib/profile/GCDAProfiling.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/lib/profile/GCDAProfiling.c b/lib/profile/GCDAProfiling.c index dcd766284..7edf6829b 100644 --- a/lib/profile/GCDAProfiling.c +++ b/lib/profile/GCDAProfiling.c @@ -366,7 +366,7 @@ 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. */ if (val != 0x01a10000) { - fprintf(stderr, "profiling:invalid magic number (0x%08x)\n", val); + fprintf(stderr, "profiling:invalid arc tag (0x%08x)\n", val); return; } @@ -400,6 +400,55 @@ void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) { #endif } +void llvm_gcda_summary_info() { + const int obj_summary_len = 9; // length for gcov compatibility + uint32_t i; + uint32_t runs = 1; + uint32_t val = 0; + uint64_t save_cur_pos = cur_pos; + + if (!output_file) return; + + val = read_32bit_value(); + + if (val != (uint32_t)-1) { + /* There are counters present in the file. Merge them. */ + if (val != 0xa1000000) { + fprintf(stderr, "profiling:invalid object tag (0x%08x)\n", val); + return; + } + + val = read_32bit_value(); // length + if (val != obj_summary_len) { + fprintf(stderr, "profiling:invalid object length (%d)\n", val); // length + return; + } + + read_32bit_value(); // checksum, unused + read_32bit_value(); // num, unused + runs += read_32bit_value(); // add previous run count to new counter + } + + cur_pos = save_cur_pos; + + /* Object summary tag */ + write_bytes("\0\0\0\xa1", 4); + write_32bit_value(obj_summary_len); + write_32bit_value(0); // checksum, unused + write_32bit_value(0); // num, unused + write_32bit_value(runs); + for (i = 3; i < obj_summary_len; ++i) + write_32bit_value(0); + + /* Program summary tag */ + write_bytes("\0\0\0\xa3", 4); // tag indicates 1 program + write_32bit_value(0); // 0 length + +#ifdef DEBUG_GCDAPROFILING + fprintf(stderr, "llvmgcda: %u runs\n", runs); +#endif +} + void llvm_gcda_end_file() { /* Write out EOF record. */ if (output_file) { |