[PATCH] tester/covoar: Remove the C part of main and convert to C++
Joel Sherrill
joel at rtems.org
Sat Apr 28 11:38:29 UTC 2018
Looks ok on a phone.
On Sat, Apr 28, 2018, 4:15 AM Chris Johns <chrisj at rtems.org> wrote:
> This is a clean up.
> ---
> tester/covoar/covoar.cc | 243
> +++++++++++++++++++-----------------------------
> 1 file changed, 98 insertions(+), 145 deletions(-)
>
> diff --git a/tester/covoar/covoar.cc b/tester/covoar/covoar.cc
> index 81c90d2..5c87402 100644
> --- a/tester/covoar/covoar.cc
> +++ b/tester/covoar/covoar.cc
> @@ -116,30 +116,26 @@ static void createBuildPath(Executables&
> executablesToAnalyze,
> */
> void usage(const std::string& progname)
> {
> - fprintf(
> - stderr,
> - "Usage: %s [-v] -T TARGET -f FORMAT [-E EXPLANATIONS] -1 EXECUTABLE
> coverage1 ... coverageN\n"
> - "--OR--\n"
> - "Usage: %s [-v] -T TARGET -f FORMAT [-E EXPLANATIONS] -e
> EXE_EXTENSION -c COVERAGEFILE_EXTENSION EXECUTABLE1 ... EXECUTABLE2\n"
> - "\n"
> - " -v - verbose at initialization\n"
> - " -T TARGET - target name\n"
> - " -f FORMAT - coverage file format "
> - "(RTEMS, QEMU, TSIM or Skyeye)\n"
> - " -E EXPLANATIONS - name of file with explanations\n"
> - " -s SYMBOL_SET_FILE - path to the INI format symbol sets\n"
> - " -1 EXECUTABLE - name of executable to get symbols
> from\n"
> - " -e EXE_EXTENSION - extension of the executables to
> analyze\n"
> - " -c COVERAGEFILE_EXTENSION - extension of the coverage files to
> analyze\n"
> - " -g GCNOS_LIST - name of file with list of *.gcno
> files\n"
> - " -p PROJECT_NAME - name of the project\n"
> - " -C ConfigurationFileName - name of configuration file\n"
> - " -O Output_Directory - name of output directory (default=.\n"
> - " -d debug - disable cleaning of tempfiles."
> - "\n",
> - progname.c_str(),
> - progname.c_str()
> - );
> + std::cerr <<"Usage: " << progname
> + <<" [-v] -T TARGET -f FORMAT [-E EXPLANATIONS] -1 EXECUTABLE
> coverage1 ... coverageN" << std::endl
> + << "--OR--" << std::endl
> + << "Usage: " << progname
> + << " [-v] -T TARGET -f FORMAT [-E EXPLANATIONS] -e
> EXE_EXTENSION -c COVERAGEFILE_EXTENSION EXECUTABLE1 ... EXECUTABLE2" <<
> std::endl
> + << std::endl
> + << " -v - verbose at initialization"
> << std::endl
> + << " -T TARGET - target name" << std::endl
> + << " -f FORMAT - coverage file format
> (RTEMS, QEMU, TSIM or Skyeye)" << std::endl
> + << " -E EXPLANATIONS - name of file with
> explanations" << std::endl
> + << " -s SYMBOL_SET_FILE - path to the INI format
> symbol sets" << std::endl
> + << " -1 EXECUTABLE - name of executable to get
> symbols from" << std::endl
> + << " -e EXE_EXTENSION - extension of the
> executables to analyze" << std::endl
> + << " -c COVERAGEFILE_EXTENSION - extension of the coverage
> files to analyze" << std::endl
> + << " -g GCNOS_LIST - name of file with list of
> *.gcno files" << std::endl
> + << " -p PROJECT_NAME - name of the project" <<
> std::endl
> + << " -C ConfigurationFileName - name of configuration file"
> << std::endl
> + << " -O Output_Directory - name of output directory
> (default=." << std::endl
> + << " -d debug - disable cleaning of
> tempfile" << std::endl
> + << std::endl;
> }
>
> #define PrintableString(_s) \
> @@ -282,21 +278,15 @@ int main(
>
> // Ensure that the executable is readable.
> if (!FileIsReadable( singleExecutable )) {
> - fprintf(
> - stderr,
> - "WARNING: Unable to read executable %s\n",
> - singleExecutable
> - );
> + std::cerr << "warning: Unable to read executable: " <<
> singleExecutable
> + << std::endl;
> } else {
>
> for (int i = optind; i < argc; i++) {
> // Ensure that the coverage file is readable.
> if (!FileIsReadable( argv[i] )) {
> - fprintf(
> - stderr,
> - "WARNING: Unable to read coverage file %s\n",
> - argv[i]
> - );
> + std::cerr << "warning: Unable to read coverage file: " <<
> argv[i]
> + << std::endl;
> } else {
> coverageFileNames.push_back( argv[i] );
> }
> @@ -321,14 +311,9 @@ int main(
> // If not invoked with a single executable, process the remaining
> // arguments as executables and derive the coverage file names.
> for (int i = optind; i < argc; i++) {
> -
> // Ensure that the executable is readable.
> if (!FileIsReadable( argv[i] )) {
> - fprintf(
> - stderr,
> - "WARNING: Unable to read executable %s\n",
> - argv[i]
> - );
> + std::cerr << "warning: Unable to read executable: " << argv[i] <<
> std::endl;
> } else {
> coverageFileName = argv[i];
> coverageFileName.replace(
> @@ -338,11 +323,8 @@ int main(
> );
>
> if (!FileIsReadable( coverageFileName.c_str() )) {
> - fprintf(
> - stderr,
> - "WARNING: Unable to read coverage file %s\n",
> - coverageFileName.c_str()
> - );
> + std::cerr << "warning: Unable to read coverage file: " <<
> coverageFileName
> + << std::endl;
> } else {
> executableInfo = new Coverage::ExecutableInfo( argv[i] );
> executablesToAnalyze.push_back( executableInfo );
> @@ -354,9 +336,7 @@ int main(
>
> // Ensure that there is at least one executable to process.
> if (executablesToAnalyze.empty()) {
> - fprintf(
> - stderr, "ERROR: No information to analyze\n"
> - );
> + std::cerr << "error: No information to analyze" << std::endl;
> exit(EXIT_FAILURE);
> }
>
> @@ -389,33 +369,20 @@ int main(
>
> if (Verbose) {
> if (singleExecutable) {
> - fprintf(
> - stderr,
> - "Processing a single executable and multiple coverage files\n"
> - );
> + std::cerr << "Processing a single executable and multiple coverage
> files"
> + << std::endl;
> } else {
> - fprintf(
> - stderr,
> - "Processing multiple executable/coverage file pairs\n"
> - );
> + std::cerr << "Processing multiple executable/coverage file pairs"
> << std::endl;
> }
> - fprintf( stderr, "Coverage Format : %s\n", format );
> - fprintf( stderr, "Target : %s\n", buildTarget.c_str() );
> - fprintf( stderr, "\n" );
> + std::cerr << "Coverage Format : " << format << std::endl
> + << "Target : " << buildTarget.c_str() << std::endl
> + << std::endl;
>
> // Process each executable/coverage file pair.
> Executables::iterator eitr = executablesToAnalyze.begin();
> - for (CoverageNames::iterator citr = coverageFileNames.begin();
> - citr != coverageFileNames.end();
> - citr++) {
> -
> - fprintf(
> - stderr,
> - "Coverage file %s for executable %s\n",
> - (*citr).c_str(),
> - ((*eitr)->getFileName()).c_str()
> - );
> -
> + for (const auto& cname : coverageFileNames) {
> + std::cerr << "Coverage file " << cname
> + << " for executable: " << (*eitr)->getFileName() <<
> std::endl;
> if (!singleExecutable)
> eitr++;
> }
> @@ -439,7 +406,7 @@ int main(
> }
>
> if ( Verbose )
> - std::cout << "Analyzing " << SymbolsToAnalyze->set.size()
> + std::cerr << "Analyzing " << SymbolsToAnalyze->set.size()
> << " symbols" << std::endl;
>
> // Create explanations.
> @@ -450,7 +417,7 @@ int main(
> // Create coverage map reader.
> coverageReader = Coverage::CreateCoverageReader(coverageFormat);
> if (!coverageReader) {
> - fprintf( stderr, "ERROR: Unable to create coverage file reader\n" );
> + std::cerr << "error: Unable to create coverage file reader" <<
> std::endl;
> exit(EXIT_FAILURE);
> }
>
> @@ -458,27 +425,18 @@ int main(
> objdumpProcessor = new Coverage::ObjdumpProcessor();
>
> // Prepare each executable for analysis.
> - for (Executables::iterator eitr = executablesToAnalyze.begin();
> - eitr != executablesToAnalyze.end();
> - eitr++) {
> -
> - if (Verbose) {
> - fprintf(
> - stderr,
> - "Extracting information from %s\n",
> - ((*eitr)->getFileName()).c_str()
> - );
> - }
> + for (auto& exe : executablesToAnalyze) {
> + if (Verbose)
> + std::cerr << "Extracting information from: " << exe->getFileName()
> + << std::endl;
>
> // If a dynamic library was specified, determine the load address.
> if (dynamicLibrary) {
> - (*eitr)->setLoadAddress(
> - objdumpProcessor->determineLoadAddress( *eitr )
> - );
> + exe->setLoadAddress( objdumpProcessor->determineLoadAddress( exe )
> );
> }
>
> // Load the objdump for the symbols in this executable.
> - objdumpProcessor->load( *eitr, objdumpFile, err );
> + objdumpProcessor->load( exe, objdumpFile, err );
> }
>
> //
> @@ -488,23 +446,20 @@ int main(
> // Process each executable/coverage file pair.
> Executables::iterator eitr = executablesToAnalyze.begin();
> for (const auto& cname : coverageFileNames) {
> - if (Verbose) {
> - fprintf(
> - stderr,
> - "Processing coverage file %s for executable %s\n",
> - cname.c_str(),
> - ((*eitr)->getFileName()).c_str()
> - );
> - }
> + Coverage::ExecutableInfo* exe = *eitr;
> + if (Verbose)
> + std::cerr << "Processing coverage file " << cname
> + << " for executable " << exe->getFileName()
> + << std::endl;
>
> // Process its coverage file.
> - coverageReader->processFile( cname.c_str(), *eitr );
> + coverageReader->processFile( cname.c_str(), exe );
>
> // Merge each symbols coverage map into a unified coverage map.
> - (*eitr)->mergeCoverage();
> + exe->mergeCoverage();
>
> // DEBUG Print ExecutableInfo content
> - //(*eitr)->dumpExecutableInfo();
> + //exe->dumpExecutableInfo();
>
> if (!singleExecutable) {
> eitr++;
> @@ -512,72 +467,69 @@ int main(
> }
>
> // Do necessary preprocessing of uncovered ranges and branches
> - if (Verbose) {
> - fprintf( stderr, "Preprocess uncovered ranges and branches\n" );
> - }
> + if (Verbose)
> + std::cerr << "Preprocess uncovered ranges and branches" << std::endl;
> +
> SymbolsToAnalyze->preprocess();
>
> //
> // Generate Gcov reports
> //
> - if (Verbose) {
> - fprintf( stderr, "Generating Gcov reports...\n");
> - }
> - gcnosFile = fopen ( gcnosFileName , "r" );
> -
> - if ( !gcnosFile ) {
> - fprintf( stderr, "Unable to open %s\n", gcnosFileName );
> - }
> - else {
> - while ( fscanf( gcnosFile, "%s", inputBuffer ) != EOF) {
> - gcovFile = new Gcov::GcovData();
> - strcpy( gcnoFileName, inputBuffer );
> -
> - if ( Verbose ) {
> - fprintf( stderr, "Processing file: %s\n", gcnoFileName );
> - }
> + if (gcnosFileName) {
> + if (Verbose)
> + std::cerr << "Generating Gcov reports..." << std::endl;
> +
> + gcnosFile = fopen ( gcnosFileName , "r" );
> +
> + if ( !gcnosFile )
> + std::cerr << "Unable to open " << gcnosFileName << std::endl;
> + else {
> + while ( fscanf( gcnosFile, "%s", inputBuffer ) != EOF) {
> + gcovFile = new Gcov::GcovData();
> + strcpy( gcnoFileName, inputBuffer );
> +
> + if ( Verbose )
> + std::cerr << "Processing file: " << gcnoFileName << std::endl;
> +
> + if ( gcovFile->readGcnoFile( gcnoFileName ) ) {
> + // Those need to be in this order
> + gcovFile->processCounters();
> + gcovFile->writeReportFile();
> + gcovFile->writeGcdaFile();
> + gcovFile->writeGcovFile();
> + }
>
> - if ( gcovFile->readGcnoFile( gcnoFileName ) ) {
> - // Those need to be in this order
> - gcovFile->processCounters();
> - gcovFile->writeReportFile();
> - gcovFile->writeGcdaFile();
> - gcovFile->writeGcovFile();
> + delete gcovFile;
> }
> -
> - delete gcovFile;
> + fclose( gcnosFile );
> }
> - fclose( gcnosFile );
> }
>
> // Determine the uncovered ranges and branches.
> - if (Verbose) {
> - fprintf( stderr, "Computing uncovered ranges and branches\n" );
> - }
> + if (Verbose)
> + std::cerr << "Computing uncovered ranges and branches" << std::endl;
> +
> SymbolsToAnalyze->computeUncovered();
>
> // Calculate remainder of statistics.
> - if (Verbose) {
> - fprintf( stderr, "Calculate statistics\n" );
> - }
> + if (Verbose)
> + std::cerr << "Calculate statistics" << std::endl;
> +
> SymbolsToAnalyze->calculateStatistics();
>
> // Look up the source lines for any uncovered ranges and branches.
> - if (Verbose) {
> - fprintf(
> - stderr, "Looking up source lines for uncovered ranges and
> branches\n"
> - );
> - }
> + if (Verbose)
> + std::cerr << "Looking up source lines for uncovered ranges and
> branches"
> + << std::endl;
> +
> SymbolsToAnalyze->findSourceForUncovered();
>
> //
> // Report the coverage data.
> //
> - if (Verbose) {
> - fprintf(
> - stderr, "Generate Reports\n"
> - );
> - }
> + if (Verbose)
> + std::cerr << "Generate Reports" << std::endl;
> +
> Coverage::GenerateReports();
>
> // Write explanations that were not found.
> @@ -588,9 +540,9 @@ int main(
> notFound += "/";
> notFound += "ExplanationsNotFound.txt";
>
> - if (Verbose) {
> - fprintf( stderr, "Writing Not Found Report (%s)\n",
> notFound.c_str() );
> - }
> + if (Verbose)
> + std::cerr << "Writing Not Found Report (" << notFound<< ')' <<
> std::endl;
> +
> AllExplanations->writeNotFound( notFound.c_str() );
> }
>
> @@ -603,5 +555,6 @@ int main(
> syms.override( "symbols_list" );
> syms.keep();
> }
> +
> return 0;
> }
> --
> 2.15.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20180428/59095c68/attachment-0002.html>
More information about the devel
mailing list