source: rtems-tools/tester/covoar/CoverageReaderSkyeye.cc @ 100f517

4.104.115
Last change on this file since 100f517 was 100f517, checked in by Chris Johns <chrisj@…>, on 05/09/14 at 11:50:37

covoar: Merger the covoar source from rtems-testing.git.

Use waf to build covoar.

  • Property mode set to 100644
File size: 3.1 KB
Line 
1/*! @file CoverageReaderSkyeye.cc
2 *  @brief CoverageReaderSkyeye Implementation
3 *
4 *  This file contains the implementation of the functions supporting
5 *  reading the Skyeye coverage data files.
6 */
7
8#include <stdio.h>
9#include <stdlib.h>
10#include <sys/stat.h>
11
12#include "CoverageReaderSkyeye.h"
13#include "CoverageMap.h"
14#include "ExecutableInfo.h"
15#include "skyeye_header.h"
16
17namespace Coverage {
18
19  CoverageReaderSkyeye::CoverageReaderSkyeye()
20  {
21  }
22
23  CoverageReaderSkyeye::~CoverageReaderSkyeye()
24  {
25  }
26
27  void CoverageReaderSkyeye::processFile(
28    const char* const     file,
29    ExecutableInfo* const executableInformation
30  )
31  {
32    CoverageMapBase* aCoverageMap = NULL;
33    uintptr_t        baseAddress;
34    uint8_t          cover;
35    FILE*            coverageFile;
36    prof_header_t    header;
37    uintptr_t        i;
38    uintptr_t        length;
39    int              status;
40
41    //
42    // Open the coverage file and read the header.
43    //
44    coverageFile = fopen( file, "r" );
45    if (!coverageFile) {
46      fprintf(
47        stderr,
48        "ERROR: CoverageReaderSkyeye::processFile - Unable to open %s\n",
49        file
50      );
51      exit( -1 );
52    }
53
54    status = fread( &header, sizeof(header), 1, coverageFile );
55    if (status != 1) {
56      fprintf(
57        stderr,
58        "ERROR: CoverageReaderSkyeye::processFile - "
59        "Unable to read header from %s\n",
60        file
61      );
62      exit( -1 );
63    }
64
65    baseAddress = header.prof_start;
66    length      = header.prof_end - header.prof_start;
67   
68    #if 0
69    fprintf(
70      stderr,
71      "%s: 0x%08x 0x%08x 0x%08lx/%ld\n",
72      file,
73      header.prof_start,
74      header.prof_end,
75      (unsigned long) length,
76      (unsigned long) length
77    );
78    #endif
79
80    //
81    // Read and process each line of the coverage file.
82    //
83    for (i=0; i<length; i+=8) {
84      status = fread( &cover, sizeof(uint8_t), 1, coverageFile );
85      if (status != 1) {
86        fprintf(
87          stderr,
88          "CoverageReaderSkyeye::ProcessFile - breaking after 0x%08x in %s\n",
89          (unsigned int) i,
90          file
91        );
92        break;
93      }
94
95      //
96      // Obtain the coverage map containing the address and
97      // mark the address as executed.
98      //
99      // NOTE: This method ONLY works for Skyeye in 32-bit mode.
100      //
101      if (cover & 0x01) {
102        aCoverageMap = executableInformation->getCoverageMap( baseAddress + i );
103        if (aCoverageMap) {
104          aCoverageMap->setWasExecuted( baseAddress + i );
105          aCoverageMap->setWasExecuted( baseAddress + i + 1 );
106          aCoverageMap->setWasExecuted( baseAddress + i + 2 );
107          aCoverageMap->setWasExecuted( baseAddress + i + 3 );
108        }
109      }
110
111      if (cover & 0x10) {
112        aCoverageMap = executableInformation->getCoverageMap(
113          baseAddress + i + 4
114        );
115        if (aCoverageMap) {
116          aCoverageMap->setWasExecuted( baseAddress + i + 4 );
117          aCoverageMap->setWasExecuted( baseAddress + i + 5 );
118          aCoverageMap->setWasExecuted( baseAddress + i + 6 );
119          aCoverageMap->setWasExecuted( baseAddress + i + 7 );
120        }
121      }
122    }
123
124    fclose( coverageFile );
125  }
126}
Note: See TracBrowser for help on using the repository browser.