diff options
author | Chris Johns <chrisj@rtems.org> | 2014-05-09 21:50:37 +1000 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2014-06-18 16:48:08 +1200 |
commit | 100f517ab37265acdf067e36b6860020ec8b2184 (patch) | |
tree | 2316c8b888e11dcbcfbfc66a0c1e31991ea20656 /tester/covoar/CoverageMapBase.h | |
parent | 4.11: Add ntp patch. (diff) | |
download | rtems-tools-100f517ab37265acdf067e36b6860020ec8b2184.tar.bz2 |
covoar: Merger the covoar source from rtems-testing.git.
Use waf to build covoar.
Diffstat (limited to 'tester/covoar/CoverageMapBase.h')
-rw-r--r-- | tester/covoar/CoverageMapBase.h | 411 |
1 files changed, 411 insertions, 0 deletions
diff --git a/tester/covoar/CoverageMapBase.h b/tester/covoar/CoverageMapBase.h new file mode 100644 index 0000000..70b2b30 --- /dev/null +++ b/tester/covoar/CoverageMapBase.h @@ -0,0 +1,411 @@ +/*! @file CoverageMapBase.h + * @brief CoverageMapBase Specification + * + * This file contains the specification of the CoverageMapBase class. + */ + +#ifndef __COVERAGE_MAP_BASE_H__ +#define __COVERAGE_MAP_BASE_H__ + +#include <stdint.h> +#include <string> +#include <list> + +namespace Coverage { + + /*! @class CoverageMapBase + * + * This is the base class for Coverage Map implementations. + */ + class CoverageMapBase { + + public: + + /*! + * This structure identifies the low and high addresses + * of one range. Note:: There may be more than one address + * range per symbol. + */ + typedef struct { + /*! + * This is the low address of the address map range. + */ + uint32_t lowAddress; + + /*! + * This is the high address of the address map range. + */ + uint32_t highAddress; + + } AddressRange_t; + + /* + * This type identifies a list of ranges. + */ + typedef std::list< AddressRange_t > AddressRange; + typedef std::list< AddressRange_t >::iterator AddressRangeIterator_t; + + /*! + * This method constructs a CoverageMapBase instance. + * + * @param[in] low specifies the lowest address of the coverage map + * @param[in] high specifies the highest address of the coverage map + */ + CoverageMapBase( + uint32_t low, + uint32_t high + ); + + /*! + * This method destructs a CoverageMapBase instance. + */ + virtual ~CoverageMapBase(); + + /*! + * This method adds a address range to the RangeList. + * + * @param[in] Low specifies the lowAddress + * @param[in] High specifies the highAddress + * + */ + void Add( uint32_t low, uint32_t high ); + + /*! + * This method returns true and sets the offset if + * the address falls with the bounds of an address range + * in the RangeList. + * + * @param[in] address specifies the address to find + * @param[out] offset contains the offset from the low + * address of the address range. + * + * @return Returns TRUE if the address range can be found + * and FALSE if it was not. + */ + bool determineOffset( uint32_t address, uint32_t *offset ) const; + + /*! + * This method prints the contents of the coverage map to stdout. + */ + void dump( void ) const; + + /*! + * This method will return the low address of the first range in + * the RangeList. + * + * @return Returns the low address of the first range in + * the RangeList. + */ + int32_t getFirstLowAddress() const; + + /*! + * This method returns true and sets the address range if + * the address falls with the bounds of an address range + * in the RangeList. + * + * @param[in] address specifies the address to find + * @param[out] range contains the high and low addresse for + * the range + * + * @return Returns TRUE if the address range can be found + * and FALSE if it was not. + */ + bool getRange( uint32_t address, AddressRange_t *range ) const; + + /*! + * This method returns the size of the address range. + * + * @return Returns Size of the address range. + */ + uint32_t getSize() const; + + + /*! + * This method returns the address of the beginning of the + * instruction that contains the specified address. + * + * @param[in] address specifies the address to search from + * @param[out] beginning contains the address of the beginning of + * the instruction. + * + * @return Returns TRUE if the beginning of the instruction was + * found and FALSE if it was not. + */ + bool getBeginningOfInstruction( + uint32_t address, + uint32_t* beginning + ) const; + + /*! + * This method returns the high address of the coverage map. + * + * @return Returns the high address of the coverage map. + uint32_t getHighAddress( void ) const; + */ + + /*! + * This method returns the low address of the coverage map. + * + * @return Returns the low address of the coverage map. + uint32_t getLowAddress( void ) const; + */ + + /*! + * This method sets the boolean which indicates if this + * is the starting address for an instruction. + * + * @param[in] address specifies the address of the start of an instruction + */ + void setIsStartOfInstruction( + uint32_t address + ); + + /*! + * This method returns a boolean which indicates if this + * is the starting address of an instruction. + * + * @param[in] address specifies the address to check + * + * @return Returns TRUE if the specified address is the start + * of an instruction and FALSE otherwise. + */ + bool isStartOfInstruction( uint32_t address ) const; + + /*! + * This method increments the counter which indicates how many times + * the instruction at the specified address was executed. + * + * @param[in] address specifies the address which was executed + */ + virtual void setWasExecuted( uint32_t address ); + + /*! + * This method returns a boolean which indicates if the instruction + * at the specified address was executed. + * + * @param[in] address specifies the address to check + * + * @return Returns TRUE if the instruction at the specified + * address was executed and FALSE otherwise. + */ + bool wasExecuted( uint32_t address ) const; + + /*! + * This method increases the counter which indicates how many times + * the instruction at the specified address was executed. It is used + * for merging coverage maps. + * + * @param[in] address specifies the address which was executed + * @param[in] address specifies the execution count that should be + * added + */ + virtual void sumWasExecuted( uint32_t address, uint32_t addition ); + + /*! + * This method returns an unsigned integer which indicates how often + * the instruction at the specified address was executed. + * + * @param[in] address specifies the address to check + * + * @return Returns number of executins + */ + uint32_t getWasExecuted( uint32_t address ) const; + + /*! + * This method sets the boolean which indicates if the specified + * address is the starting address of a branch instruction. + * + * @param[in] address specifies the address of the branch instruction + */ + void setIsBranch( uint32_t address ); + + /*! + * This method returns a boolean which indicates if the specified + * address is the starting address of a NOP instruction. + * + * @param[in] address specifies the address to check + * + * @return Returns TRUE if a NOP instruction is at the + * specified address and FALSE otherwise. + */ + bool isNop( uint32_t address ) const; + + /*! + * This method sets the boolean which indicates if the specified + * address is the starting address of a NOP instruction. + * + * @param[in] address specifies the address of the NOP instruction + */ + void setIsNop( uint32_t address ); + + /*! + * This method returns a boolean which indicates if the specified + * address is the starting address of a branch instruction. + * + * @param[in] address specifies the address to check + * + * @return Returns TRUE if a branch instruction is at the + * specified address and FALSE otherwise. + */ + bool isBranch( uint32_t address ) const; + + /*! + * This method increments the counter which indicates how many times + * the branch at the specified address was taken. + * + * @param[in] address specifies the address of the branch instruction + */ + void setWasTaken( uint32_t address ); + + /*! + * This method increases the counter which indicates how many times + * the branch at the specified address was taken. It is used + * for merging coverage maps. + * + * @param[in] address specifies the address which was executed + * @param[in] address specifies the execution count that should be + * added + */ + virtual void sumWasTaken( uint32_t address, uint32_t addition ); + + /*! + * This method returns an unsigned integer which indicates how often + * the branch at the specified address was taken. + * + * @param[in] address specifies the address to check + * + * @return Returns number of executins + */ + uint32_t getWasTaken( uint32_t address ) const; + + /*! + * This method increments the counter which indicates how many times + * the branch at the specified address was not taken. + * + * @param[in] address specifies the address of the branch instruction + */ + void setWasNotTaken( uint32_t address ); + + /*! + * This method increases the counter which indicates how many times + * the branch at the specified address was not taken. It is used + * for merging coverage maps. + * + * @param[in] address specifies the address which was executed + * @param[in] address specifies the execution count that should be + * added + */ + virtual void sumWasNotTaken( uint32_t address, uint32_t addition ); + + /*! + * This method returns an unsigned integer which indicates how often + * the branch at the specified address was not taken. + * + * @param[in] address specifies the address to check + * + * @return Returns number of executins + */ + uint32_t getWasNotTaken( uint32_t address ) const; + + + /*! + * This method returns a boolean which indicates if the branch + * instruction at the specified address is ALWAYS taken. + * + * @param[in] address specifies the address to check + * + * @return Returns TRUE if the branch instruction at the + * specified address is ALWAYS taken and FALSE otherwise. + */ + bool wasAlwaysTaken( uint32_t address ) const; + + /*! + * This method returns a boolean which indicates if the branch + * instruction at the specified address is NEVER taken. + * + * @param[in] address specifies the address to check + * + * @return Returns TRUE if the branch instruction at the + * specified address is NEVER taken and FALSE otherwise. + */ + bool wasNeverTaken( uint32_t address ) const; + + /*! + * This method returns a boolean which indicates if the branch + * instruction at the specified address was NOT taken. + * + * @param[in] address specifies the address to check + * + * @return Returns TRUE if the branch instruction at the + * specified address was NOT taken and FALSE otherwise. + */ + bool wasNotTaken( uint32_t address ) const; + + /*! + * This method returns a boolean which indicates if the branch + * instruction at the specified address was taken. + * + * @param[in] address specifies the address to check + * + * @return Returns TRUE if the branch instruction at the + * specified address was taken and FALSE otherwise. + */ + bool wasTaken( uint32_t address ) const; + + protected: + + /*! + * This structure defines the information that is gathered and + * tracked per address. + */ + typedef struct { + /*! + * This member indicates that the address is the start of + * an instruction. + */ + bool isStartOfInstruction; + /*! + * This member indicates how many times the address was executed. + */ + uint32_t wasExecuted; + /*! + * This member indicates that the address is a branch instruction. + */ + bool isBranch; + /*! + * This member indicates that the address is a NOP instruction. + */ + bool isNop; + /*! + * When isBranch is TRUE, this member indicates that the branch + * instruction at the address was taken. + */ + uint32_t wasTaken; + /*! + * When isBranch is TRUE, this member indicates that the branch + * instruction at the address was NOT taken. + */ + uint32_t wasNotTaken; + } perAddressInfo_t; + + /*! + * + * This is a list of address ranges for this symbolic address. + */ + AddressRange RangeList; + + /*! + * + * This variable contains the size of the code block. + */ + uint32_t Size; + + /*! + * This is a dynamically allocated array of data that is + * kept for each address. + */ + perAddressInfo_t* Info; + }; + +} +#endif |