#ifndef __VTS_SYSFUZZER_LIBMEASUREMENT_GCOV_BASIC_IO_H__
#define __VTS_SYSFUZZER_LIBMEASUREMENT_GCOV_BASIC_IO_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
namespace android {
namespace vts {
struct block_info;
struct source_info;
#define GCOV_DATA_MAGIC ((unsigned)0x67636461) /* "gcda" */
#define GCOV_TAG_FUNCTION ((unsigned int)0x01000000)
#define GCOV_TAG_FUNCTION_LENGTH (3) /* or 2 */
#define GCOV_COUNTER_ARCS 0
#define GCOV_TAG_ARCS ((unsigned)0x01430000)
#define GCOV_TAG_ARCS_LENGTH(NUM) (1 + (NUM)*2)
#define GCOV_TAG_ARCS_NUM(LENGTH) (((LENGTH)-1) / 2)
#define GCOV_TAG_LINES ((unsigned)0x01450000)
#define GCOV_TAG_BLOCKS ((unsigned)0x01410000)
#define GCOV_TAG_BLOCKS_LENGTH(NUM) (NUM)
#define GCOV_TAG_BLOCKS_NUM(LENGTH) (LENGTH)
#define GCOV_TAG_OBJECT_SUMMARY ((unsigned)0xa1000000)
#define GCOV_TAG_COUNTER_NUM(LENGTH) ((LENGTH) / 2)
#define GCOV_HISTOGRAM_SIZE 252
#define GCOV_HISTOGRAM_BITVECTOR_SIZE (GCOV_HISTOGRAM_SIZE + 31) / 32
#define GCOV_COUNTERS_SUMMABLE (GCOV_COUNTER_ARCS + 1)
#define GCOV_TAG_IS_COUNTER(TAG) \
(!((TAG)&0xFFFF) && GCOV_COUNTER_FOR_TAG(TAG) < GCOV_COUNTERS)
#define GCOV_TAG_MASK(TAG) (((TAG)-1) ^ (TAG))
/* Return nonzero if SUB is an immediate subtag of TAG. */
#define GCOV_TAG_IS_SUBTAG(TAG, SUB) \
(GCOV_TAG_MASK(TAG) >> 8 == GCOV_TAG_MASK(SUB) && \
!(((SUB) ^ (TAG)) & ~GCOV_TAG_MASK(TAG)))
/* Return nonzero if SUB is at a sublevel to TAG. */
#define GCOV_TAG_IS_SUBLEVEL(TAG, SUB) (GCOV_TAG_MASK(TAG) > GCOV_TAG_MASK(SUB))
typedef long long gcov_type;
enum { GCOV_COUNTERS };
#define GCOV_VERSION ((unsigned)0x34303670) /* 406p */
#define GCOV_TAG_BUILD_INFO ((unsigned)0xa7000000)
#define GCOV_TAG_PROGRAM_SUMMARY ((unsigned)0xa3000000)
#define XCNEWVEC(T, N) ((T *)calloc((N), sizeof(T)))
#define GCOV_TAG_COUNTER_BASE ((unsigned)0x01a10000)
#define GCOV_TAG_COUNTER_LENGTH(NUM) ((NUM)*2)
/* Convert a counter index to a tag. */
#define GCOV_TAG_FOR_COUNTER(COUNT) \
(GCOV_TAG_COUNTER_BASE + ((unsigned)(COUNT) << 17))
/* Convert a tag to a counter. */
#define GCOV_COUNTER_FOR_TAG(TAG) \
((unsigned)(((TAG)-GCOV_TAG_COUNTER_BASE) >> 17))
/* Check whether a tag is a counter tag. */
#define GCOV_TAG_IS_COUNTER(TAG) \
(!((TAG)&0xFFFF) && GCOV_COUNTER_FOR_TAG(TAG) < GCOV_COUNTERS)
#define GCOV_UNSIGNED2STRING(ARRAY, VALUE) \
((ARRAY)[0] = (char)((VALUE) >> 24), (ARRAY)[1] = (char)((VALUE) >> 16), \
(ARRAY)[2] = (char)((VALUE) >> 8), (ARRAY)[3] = (char)((VALUE) >> 0))
#define GCOV_BLOCK_SIZE (1 << 10)
typedef struct arc_info {
/* source and destination blocks. */
struct block_info *src;
struct block_info *dst;
/* transition counts. */
gcov_type count;
/* used in cycle search, so that we do not clobber original counts. */
gcov_type cs_count;
unsigned int count_valid : 1;
unsigned int on_tree : 1;
unsigned int fake : 1;
unsigned int fall_through : 1;
/* Arc to a catch handler. */
unsigned int is_throw : 1;
/* Arc is for a function that abnormally returns. */
unsigned int is_call_non_return : 1;
/* Arc is for catch/setjmp. */
unsigned int is_nonlocal_return : 1;
/* Is an unconditional branch. */
unsigned int is_unconditional : 1;
/* Loop making arc. */
unsigned int cycle : 1;
/* Next branch on line. */
struct arc_info *line_next;
/* Links to next arc on src and dst lists. */
struct arc_info *succ_next;
struct arc_info *pred_next;
} arc_t;
struct gcov_var_t {
FILE* file;
unsigned start; /* Position of first byte of block */
unsigned offset; /* Read/write position within the block. */
unsigned length; /* Read limit in the block. */
unsigned overread; /* Number of words overread. */
int error; /* < 0 overflow, > 0 disk error. */
int mode; /* < 0 writing, > 0 reading */
int endian; /* Swap endianness. */
/* Holds a variable length block, as the compiler can write
strings and needs to backtrack. */
size_t alloc;
unsigned* buffer;
};
} // namespace vts
} // namespace android
#endif