1 #ifndef __VTS_SYSFUZZER_LIBMEASUREMENT_GCOV_BASIC_IO_H__ 2 #define __VTS_SYSFUZZER_LIBMEASUREMENT_GCOV_BASIC_IO_H__ 3 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <string.h> 7 8 namespace android { 9 namespace vts { 10 11 struct block_info; 12 struct source_info; 13 14 #define GCOV_DATA_MAGIC ((unsigned)0x67636461) /* "gcda" */ 15 16 #define GCOV_TAG_FUNCTION ((unsigned int)0x01000000) 17 #define GCOV_TAG_FUNCTION_LENGTH (3) /* or 2 */ 18 #define GCOV_COUNTER_ARCS 0 19 #define GCOV_TAG_ARCS ((unsigned)0x01430000) 20 #define GCOV_TAG_ARCS_LENGTH(NUM) (1 + (NUM)*2) 21 #define GCOV_TAG_ARCS_NUM(LENGTH) (((LENGTH)-1) / 2) 22 #define GCOV_TAG_LINES ((unsigned)0x01450000) 23 #define GCOV_TAG_BLOCKS ((unsigned)0x01410000) 24 #define GCOV_TAG_BLOCKS_LENGTH(NUM) (NUM) 25 #define GCOV_TAG_BLOCKS_NUM(LENGTH) (LENGTH) 26 #define GCOV_TAG_OBJECT_SUMMARY ((unsigned)0xa1000000) 27 #define GCOV_TAG_COUNTER_NUM(LENGTH) ((LENGTH) / 2) 28 29 #define GCOV_HISTOGRAM_SIZE 252 30 #define GCOV_HISTOGRAM_BITVECTOR_SIZE (GCOV_HISTOGRAM_SIZE + 31) / 32 31 #define GCOV_COUNTERS_SUMMABLE (GCOV_COUNTER_ARCS + 1) 32 33 #define GCOV_TAG_IS_COUNTER(TAG) \ 34 (!((TAG)&0xFFFF) && GCOV_COUNTER_FOR_TAG(TAG) < GCOV_COUNTERS) 35 36 #define GCOV_TAG_MASK(TAG) (((TAG)-1) ^ (TAG)) 37 38 /* Return nonzero if SUB is an immediate subtag of TAG. */ 39 #define GCOV_TAG_IS_SUBTAG(TAG, SUB) \ 40 (GCOV_TAG_MASK(TAG) >> 8 == GCOV_TAG_MASK(SUB) && \ 41 !(((SUB) ^ (TAG)) & ~GCOV_TAG_MASK(TAG))) 42 43 /* Return nonzero if SUB is at a sublevel to TAG. */ 44 #define GCOV_TAG_IS_SUBLEVEL(TAG, SUB) (GCOV_TAG_MASK(TAG) > GCOV_TAG_MASK(SUB)) 45 46 typedef long long gcov_type; 47 48 enum { GCOV_COUNTERS }; 49 50 #define GCOV_VERSION ((unsigned)0x34303670) /* 406p */ 51 52 #define GCOV_TAG_BUILD_INFO ((unsigned)0xa7000000) 53 #define GCOV_TAG_PROGRAM_SUMMARY ((unsigned)0xa3000000) 54 55 #define XCNEWVEC(T, N) ((T *)calloc((N), sizeof(T))) 56 57 #define GCOV_TAG_COUNTER_BASE ((unsigned)0x01a10000) 58 #define GCOV_TAG_COUNTER_LENGTH(NUM) ((NUM)*2) 59 60 /* Convert a counter index to a tag. */ 61 #define GCOV_TAG_FOR_COUNTER(COUNT) \ 62 (GCOV_TAG_COUNTER_BASE + ((unsigned)(COUNT) << 17)) 63 64 /* Convert a tag to a counter. */ 65 #define GCOV_COUNTER_FOR_TAG(TAG) \ 66 ((unsigned)(((TAG)-GCOV_TAG_COUNTER_BASE) >> 17)) 67 68 /* Check whether a tag is a counter tag. */ 69 #define GCOV_TAG_IS_COUNTER(TAG) \ 70 (!((TAG)&0xFFFF) && GCOV_COUNTER_FOR_TAG(TAG) < GCOV_COUNTERS) 71 72 #define GCOV_UNSIGNED2STRING(ARRAY, VALUE) \ 73 ((ARRAY)[0] = (char)((VALUE) >> 24), (ARRAY)[1] = (char)((VALUE) >> 16), \ 74 (ARRAY)[2] = (char)((VALUE) >> 8), (ARRAY)[3] = (char)((VALUE) >> 0)) 75 76 #define GCOV_BLOCK_SIZE (1 << 10) 77 78 typedef struct arc_info { 79 /* source and destination blocks. */ 80 struct block_info *src; 81 struct block_info *dst; 82 83 /* transition counts. */ 84 gcov_type count; 85 /* used in cycle search, so that we do not clobber original counts. */ 86 gcov_type cs_count; 87 88 unsigned int count_valid : 1; 89 unsigned int on_tree : 1; 90 unsigned int fake : 1; 91 unsigned int fall_through : 1; 92 93 /* Arc to a catch handler. */ 94 unsigned int is_throw : 1; 95 96 /* Arc is for a function that abnormally returns. */ 97 unsigned int is_call_non_return : 1; 98 99 /* Arc is for catch/setjmp. */ 100 unsigned int is_nonlocal_return : 1; 101 102 /* Is an unconditional branch. */ 103 unsigned int is_unconditional : 1; 104 105 /* Loop making arc. */ 106 unsigned int cycle : 1; 107 108 /* Next branch on line. */ 109 struct arc_info *line_next; 110 111 /* Links to next arc on src and dst lists. */ 112 struct arc_info *succ_next; 113 struct arc_info *pred_next; 114 } arc_t; 115 116 struct gcov_var_t { 117 FILE* file; 118 unsigned start; /* Position of first byte of block */ 119 unsigned offset; /* Read/write position within the block. */ 120 unsigned length; /* Read limit in the block. */ 121 unsigned overread; /* Number of words overread. */ 122 int error; /* < 0 overflow, > 0 disk error. */ 123 int mode; /* < 0 writing, > 0 reading */ 124 int endian; /* Swap endianness. */ 125 /* Holds a variable length block, as the compiler can write 126 strings and needs to backtrack. */ 127 size_t alloc; 128 unsigned* buffer; 129 }; 130 131 } // namespace vts 132 } // namespace android 133 134 #endif 135