source: rtems-tools/tester/covoar/coverage_converter.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: 4.9 KB
Line 
1#include <ctype.h>
2#include <errno.h>
3#include <fcntl.h>
4#include <limits.h>
5#include <netdb.h>
6#include <signal.h>
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10#include <sys/types.h>
11#include <sys/stat.h>
12#include <unistd.h>
13
14#include "app_common.h"
15#include "CoverageFactory.h"
16#include "CoverageMap.h"
17
18/*
19 *  Variables to control global behavior
20 */
21Coverage::CoverageReaderBase* coverageReader = NULL;
22Coverage::CoverageWriterBase* coverageWriter = NULL;
23uint32_t                      highAddress = 0xffffffff;
24Coverage::CoverageFormats_t   inputFormat;
25uint32_t                      lowAddress  = 0xffffffff;
26char*                         progname;
27
28/*
29 *  Global variables for the program
30 */
31Coverage::CoverageMapBase    *CoverageMap    = NULL;
32
33/*
34 *  Convert string to int with status out
35 */
36
37bool stringToUint32(
38  const char* s,
39  int         base,
40  uint32_t*   n
41)
42{
43  long long result;
44
45  if (!n)
46    return false;
47
48  errno = 0;
49  *n    = 0;
50
51  result = strtoll( s, NULL, base );
52
53  if ((result == 0) && errno)
54    return false;
55
56  if ((result == LLONG_MAX) && (errno == ERANGE))
57    return false;
58
59  if ((result == LLONG_MIN) && (errno == ERANGE))
60    return false;
61
62  *n = (uint32_t)result;
63  return true;
64}
65
66/*
67 *  Print program usage message
68 */
69void usage()
70{
71  fprintf(
72    stderr,
73    "Usage: %s [-v] -l ADDRESS -h ADDRESS coverage_in coverage_out\n"
74    "\n"
75    "  -l low address   - low address of range to merge\n"
76    "  -l high address  - high address of range to merge\n"
77    "  -f format        - coverage files are in <format> (Qemu)\n"
78    "  -v               - verbose at initialization\n"
79    "\n",
80    progname
81  );
82}
83
84#define PrintableString(_s) \
85       ((!(_s)) ? "NOT SET" : (_s))
86
87int main(
88  int    argc,
89  char** argv
90)
91{
92  char*       format = NULL;
93  const char* coverageFile;
94  const char* coverageIn;
95  int         opt;
96
97  //
98  // Process command line options.
99  //
100  progname = argv[0];
101
102  while ((opt = getopt(argc, argv, "f:h:l:v")) != -1) {
103    switch (opt) {
104      case 'v': Verbose = 1;       break;
105      case 'f':
106        inputFormat = Coverage::CoverageFormatToEnum(optarg);
107        format = optarg;
108        break;
109      case 'l':
110        if (!stringToUint32( optarg, 16, &lowAddress )) {
111          fprintf( stderr, "ERROR: Low address is not a hexadecimal number\n" );
112          usage();
113          exit(-1);
114        }
115        break;
116      case 'h':
117        if (!stringToUint32( optarg, 16, &highAddress )) {
118          fprintf( stderr, "ERROR: High address is not a hexadecimal number\n" );
119          usage();
120          exit(-1);
121        }
122        break;
123      default: /* '?' */
124        usage();
125        exit( -1 );
126    }
127  }
128
129  if ((argc - optind) != 2) {
130    fprintf( stderr, "ERROR: Must provide input and output files\n" );
131    exit(1);
132  }
133
134  coverageIn   = argv[optind];
135  coverageFile = argv[optind + 1];
136
137  if (Verbose) {
138    fprintf( stderr, "Verbose       : %d\n", Verbose );
139    fprintf( stderr, "Input Format  : %s\n", format );
140    fprintf( stderr, "Input File    : %s\n", coverageIn );
141    fprintf( stderr, "Output Format : %s\n", "RTEMS" );
142    fprintf( stderr, "Output File   : %s\n", coverageFile );
143    fprintf( stderr, "low address   : 0x%08x\n", lowAddress );
144    fprintf( stderr, "high address  : 0x%08x\n", highAddress );
145    fprintf( stderr, "\n" );
146  }
147
148  //
149  // Validate inputs.
150  //
151
152  // Validate format.
153  if (!format) {
154    fprintf( stderr, "ERROR: input format must be given.\n\n" );
155    usage();
156    exit(-1);
157  }
158
159  // Validate address range
160  if (lowAddress == 0xffffffff) {
161    fprintf( stderr, "ERROR: Low address not specified.\n\n" );
162    usage();
163    exit(-1);
164  }
165
166  if (highAddress == 0xffffffff) {
167    fprintf( stderr, "ERROR: High address not specified.\n\n" );
168    usage();
169    exit(-1);
170  }
171
172  if (lowAddress >= highAddress) {
173    fprintf( stderr, "ERROR: Low address >= high address.\n\n" );
174    usage();
175    exit(-1);
176  }
177
178  //
179  // Create data to support conversion.
180  //
181
182  // Create coverage map.
183  CoverageMap = new Coverage::CoverageMap( lowAddress, highAddress );
184  if (!CoverageMap) {
185    fprintf( stderr, "ERROR: Unable to create coverage map.\n\n" );
186    exit(-1);
187  }
188
189  // Create coverage writer.
190  coverageWriter =
191    Coverage::CreateCoverageWriter(Coverage::COVERAGE_FORMAT_RTEMS);
192  if (!coverageWriter) {
193    fprintf( stderr, "ERROR: Unable to create coverage file writer.\n\n" );
194    exit(-1);
195  }
196
197  // Create coverage reader.
198  coverageReader = CreateCoverageReader( inputFormat );
199  if (!coverageReader) {
200    fprintf( stderr, "ERROR: Unable to create input file reader.\n\n" );
201    exit(-1);
202  }
203
204  // Now get to some real work.
205  if (Verbose)
206    fprintf( stderr, "Processing %s\n", coverageIn );
207  coverageReader->processFile( coverageIn, CoverageMap );
208
209  if (Verbose)
210    fprintf(
211      stderr, "Writing coverage file (%s)\n", coverageFile );
212  coverageWriter->writeFile(
213    coverageFile,
214    CoverageMap,
215    lowAddress,
216    highAddress
217  );
218
219  return 0;
220}
Note: See TracBrowser for help on using the repository browser.