You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.0 KiB
135 lines
4.0 KiB
#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
|