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/CoverageReaderRTEMS.cc | |
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/CoverageReaderRTEMS.cc')
-rw-r--r-- | tester/covoar/CoverageReaderRTEMS.cc | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/tester/covoar/CoverageReaderRTEMS.cc b/tester/covoar/CoverageReaderRTEMS.cc new file mode 100644 index 0000000..8439c41 --- /dev/null +++ b/tester/covoar/CoverageReaderRTEMS.cc @@ -0,0 +1,108 @@ +/*! @file CoverageReaderRTEMS.cc + * @brief CoverageReaderRTEMS Implementation + * + * This file contains the implementation of the functions supporting + * reading the RTEMS coverage data files. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <sys/stat.h> + +#include "CoverageReaderRTEMS.h" +#include "CoverageMap.h" +#include "ExecutableInfo.h" +#include "rtemscov_header.h" + +namespace Coverage { + + CoverageReaderRTEMS::CoverageReaderRTEMS() + { + } + + CoverageReaderRTEMS::~CoverageReaderRTEMS() + { + } + + void CoverageReaderRTEMS::processFile( + const char* const file, + ExecutableInfo* const executableInformation + ) + { + CoverageMapBase* aCoverageMap = NULL; + uintptr_t baseAddress; + uint8_t cover; + FILE* coverageFile; + rtems_coverage_map_header_t header; + uintptr_t i; + uintptr_t length; + int status; + + // + // Open the coverage file and read the header. + // + coverageFile = fopen( file, "r" ); + if (!coverageFile) { + fprintf( + stderr, + "ERROR: CoverageReaderRTEMS::processFile - Unable to open %s\n", + file + ); + exit( -1 ); + } + + status = fread( &header, sizeof(header), 1, coverageFile ); + if (status != 1) { + fprintf( + stderr, + "ERROR: CoverageReaderRTEMS::processFile - " + "Unable to read header from %s\n", + file + ); + exit( -1 ); + } + + baseAddress = header.start; + length = header.end - header.start; + + #if 0 + fprintf( + stderr, + "%s: 0x%08x 0x%08x 0x%08lx/%ld\n", + file, + header.start, + header.end, + (unsigned long) length, + (unsigned long) length + ); + #endif + + // + // Read and process each line of the coverage file. + // + for (i=0; i<length; i++) { + status = fread( &cover, sizeof(uint8_t), 1, coverageFile ); + if (status != 1) { + fprintf( + stderr, + "CoverageReaderRTEMS::ProcessFile - breaking after 0x%08x in %s\n", + (unsigned int) i, + file + ); + break; + } + + // + // Obtain the coverage map containing the address and + // mark the address as executed. + // + if (cover) { + aCoverageMap = executableInformation->getCoverageMap( baseAddress + i ); + if (aCoverageMap) + aCoverageMap->setWasExecuted( baseAddress + i ); + } + } + + fclose( coverageFile ); + } +} |