Home | History | Annotate | Download | only in libcodecoverage
      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