Converted printf statements to c++'s method of printing, adjusted to use c++ file handling, changed char arrays to strings, fixed inconsistent formatting. --- tester/covoar/GcovData.cc | 388 +++++++++++++++++--------------- tester/covoar/GcovData.h | 32 +-- tester/covoar/GcovFunctionData.cc | 457 ++++++++++++++++++++------------------ tester/covoar/GcovFunctionData.h | 76 ++++--- 4 files changed, 509 insertions(+), 444 deletions(-)
diff --git a/tester/covoar/GcovData.cc b/tester/covoar/GcovData.cc index e8b8573..7847ce6 100644 --- a/tester/covoar/GcovData.cc +++ b/tester/covoar/GcovData.cc @@ -1,5 +1,4 @@ /* - * TODO: use strings instead of cstrings for reliability and saving memory * TODO: use global buffers * */ @@ -34,71 +33,73 @@ namespace Gcov { { } - bool GcovData::readGcnoFile( const char* const fileName ) + bool GcovData::readGcnoFile( const std::string& fileName ) { - int status; - FILE* gcovFile; - char* tempString; - char* tempString2; - char* tempString3; - - if ( strlen(fileName) >= FILE_NAME_LENGTH ){ - fprintf( - stderr, - "ERROR: File name is too long to be correctly stored: %u\n", - (unsigned int) strlen(fileName) - ); + int status; + std::ifstream gcovFile; + std::string tempString; + std::string tempString2; + std::string tempString3; + size_t index; + + if ( fileName.length() >= FILE_NAME_LENGTH ) { + std::cerr << "ERROR: File name is too long to be correctly stored: " + << fileName.length() << std::endl; return false; } - strcpy( gcnoFileName, fileName ); - strcpy( gcdaFileName, fileName ); - strcpy( textFileName, fileName ); - strcpy( cFileName, fileName ); - tempString = strstr( gcdaFileName,".gcno" ); - tempString2 = strstr( textFileName,".gcno" ); - tempString3 = strstr( cFileName,".gcno" ); - - if ( (tempString == NULL) && (tempString2 == NULL) ){ - fprintf(stderr, "ERROR: incorrect name of *.gcno file\n"); - } - else - { - strcpy( tempString, ".gcda"); // construct gcda file name - strcpy( tempString2, ".txt"); // construct report file name - strcpy( tempString3, ".c"); // construct source file name + + gcnoFileName = fileName; + gcdaFileName = fileName; + textFileName = fileName; + cFileName = fileName; + tempString = gcdaFileName; + tempString2 = textFileName; + tempString3 = cFileName; + + index = tempString.find( ".gcno" ); + if ( index == std::string::npos ) { + std::cerr << "ERROR: incorrect name of *.gcno file" << std::endl; + return false; + } else { + // construct gcda file name + tempString = tempString.replace( index, strlen( ".gcno" ), ".gcda" ); + + // construct report file name + tempString2 = tempString2.replace( index, strlen( ".gcno" ), ".txt" ); + + // construct source file name + tempString3 = tempString3.replace( index, strlen( ".gcno" ), ".c" ); } // Debug message - // fprintf( stderr, "Readning file: %s\n", gcnoFileName); + // std::cerr << "Reading file: " << gcnoFileName << std::endl; // Open the notes file. - gcovFile = fopen( gcnoFileName, "r" ); + gcovFile.open( gcnoFileName ); if ( !gcovFile ) { - fprintf( stderr, "Unable to open %s\n", gcnoFileName ); + std::cerr << "Unable to open " << gcnoFileName << std::endl; return false; } // Read and validate the gcnoPreamble (magic, version, timestamp) from the file - status = readFilePreamble( &gcnoPreamble, gcovFile, GCNO_MAGIC ); - if ( status <= 0 ){ - fprintf( stderr, "Unable to read %s\n", gcnoFileName ); - fclose( gcovFile ); + status = readFilePreamble( &gcnoPreamble, &gcovFile, GCNO_MAGIC ); + if ( status <= 0 ) { + std::cerr << "Unable to read " << gcnoFileName << std::endl; return false; } //Read all remaining frames from file - while( readFrame(gcovFile) ){} + while( readFrame( &gcovFile ) ) {} - fclose( gcovFile ); return true; } - bool GcovData::writeGcdaFile () + bool GcovData::writeGcdaFile() { gcov_preamble preamble; gcov_frame_header header; - FILE* gcdaFile; + std::ofstream gcdaFile; functions_iterator_t currentFunction; arcs_iterator_t currentArc; uint32_t buffer; @@ -109,32 +110,35 @@ namespace Gcov { uint64_t llBuffer[4096]; // TODO: Use common buffer gcov_statistics objectStats; gcov_statistics programStats; - size_t status; + size_t bytes_before; + size_t bytes_after; // Debug message - // fprintf( stderr, "Writing file: %s\n", gcdaFileName); + //std::cerr << "Writing file: " << gcdaFileName << std::endl; // Lets clear counters sumators - countersSum = 0; - countersMax = 0; + countersSum = 0; + countersMax = 0; countersFoundSum = 0; // Open the data file. - gcdaFile = fopen( gcdaFileName, "w" ); + gcdaFile.open( gcdaFileName ); if ( !gcdaFile ) { - fprintf( stderr, "Unable to create %s\n", gcdaFileName ); + std::cerr << "Unable to create " << gcdaFileName << std::endl; return false; } //Form preamble - preamble.magic = GCDA_MAGIC; - preamble.version = gcnoPreamble.version; - preamble.timestamp = gcnoPreamble.timestamp; + preamble.magic = GCDA_MAGIC; + preamble.version = gcnoPreamble.version; + preamble.timestamp = gcnoPreamble.timestamp; //Write preamble - status = fwrite (&preamble , sizeof( preamble ), 1 , gcdaFile ); - if ( status != 1 ) - fprintf( stderr, "Error while writing gcda preamble to a file %s\n", gcdaFileName ); + gcdaFile.write( (char *) &preamble , 4 * sizeof( preamble ) ); + if ( gcdaFile.fail() ) { + std::cerr << "Error while writing gcda preamble to a file " + << gcdaFileName << std::endl; + } //Write function info and counter counts for ( @@ -146,38 +150,56 @@ namespace Gcov { //Write function announcement frame header (length always equals 2) header.tag = GCOV_TAG_FUNCTION; header.length = 2; - status = fwrite (&header, sizeof(header), 1, gcdaFile ); - if ( status != 1 ) - fprintf( stderr, "Error while writing function announcement to a file %s\n", gcdaFileName ); + gcdaFile.write( (char *) &header, sizeof( header ) ); + if ( gcdaFile.fail() ) { + std::cerr << "Error while writing function announcement to a file " + << gcdaFileName << std::endl; + } //Write function id buffer = (*currentFunction).getId(); - status = fwrite (&buffer, sizeof( buffer ), 1, gcdaFile ); - if ( status != 1 ) - fprintf( stderr, "Error while writing function id to a file %s\n", gcdaFileName ); + gcdaFile.write( (char *) &buffer, sizeof( buffer ) ); + if ( gcdaFile.fail() ) { + std::cerr << "Error while writing function id to a file " + << gcdaFileName << std::endl; + } //Write function checksum buffer = (*currentFunction).getChecksum(); - status = fwrite (&buffer, sizeof( buffer ), 1, gcdaFile ); - if ( status != 1 ) - fprintf( stderr, "Error while writing function checksum to a file %s\n", gcdaFileName ); + gcdaFile.write( (char *) &buffer, sizeof( buffer ) ); + if ( gcdaFile.fail() ) { + std::cerr << "Error while writing function checksum to a file " + << gcdaFileName << std::endl; + } // Determine how many counters there are // and store their counts in buffer countersFound = 0; - (*currentFunction).getCounters( llBuffer, countersFound, countersSum, countersMax ); + (*currentFunction).getCounters( + llBuffer, + countersFound, + countersSum, + countersMax + ); countersFoundSum += countersFound; //Write info about counters header.tag = GCOV_TAG_COUNTER; header.length = countersFound * 2; - status = fwrite (&header, sizeof( header ), 1, gcdaFile ); - if ( status != 1 ) - fprintf( stderr, "Error while writing counter header to a file %s\n", gcdaFileName ); + gcdaFile.write( (char *) &header, sizeof( header ) ); + if ( gcdaFile.fail() ) { + std::cerr << "Error while writing counter header to a file " + << gcdaFileName << std::endl; + } - status = fwrite (llBuffer, sizeof( uint64_t ), countersFound , gcdaFile ); - if ( status != countersFound ) - fprintf( stderr, "Error while writing counter data to a file %s\n", gcdaFileName ); + bytes_before = gcdaFile.tellp(); + + gcdaFile.write( (char *) llBuffer, sizeof( uint64_t ) * countersFound ); + bytes_after = gcdaFile.tellp(); + if ( bytes_after - bytes_before != countersFound ) { + std::cerr << "Error while writing counter data to a file " + << gcdaFileName << std::endl; + } } // Prepare frame with object file statistics @@ -191,12 +213,17 @@ namespace Gcov { objectStats.sumMax = countersMax; // we have no clue // Write data - status = fwrite (&header, sizeof( header ), 1, gcdaFile ); - if ( status != 1 ) - fprintf( stderr, "Error while writing stats header to a file %s\n", gcdaFileName ); - status = fwrite (&objectStats, sizeof( objectStats ), 1, gcdaFile ); - if ( status != 1 ) - fprintf( stderr, "Error while writing object stats to a file %s\n", gcdaFileName ); + gcdaFile.write( (char *) &header, sizeof( header ) ); + if ( gcdaFile.fail() ) { + std::cerr << "Error while writing stats header to a file " + << gcdaFileName << std::endl; + } + + gcdaFile.write( (char *) &objectStats, sizeof( objectStats ) ); + if ( gcdaFile.fail() ) { + std::cerr << "Error while writing object stats to a file " + << gcdaFileName << std::endl; + } // Prepare frame with program statistics @@ -210,38 +237,40 @@ namespace Gcov { programStats.sumMax = countersMax; // we have no clue // Write data - status = fwrite (&header, sizeof( header ), 1, gcdaFile ); - if ( status != 1 ) - fprintf( stderr, "Error while writing stats header to a file %s\n", gcdaFileName ); - status = fwrite (&programStats, sizeof( programStats ), 1, gcdaFile ); - if ( status != 1 ) - fprintf( stderr, "Error while writing program stats to a file %s\n", gcdaFileName ); + gcdaFile.write( (char *) &header, sizeof( header ) ); + if ( gcdaFile.fail() ) { + std::cerr << "Error while writing stats header to a file " + << gcdaFileName << std::endl; + } - fclose( gcdaFile ); + gcdaFile.write( (char *) &programStats, sizeof( programStats ) ); + if ( gcdaFile.fail() ) { + std::cerr << "Error while writing program stats to a file " + << gcdaFileName << std::endl; + } return true; } bool GcovData::readFrame( - FILE* gcovFile + std::ifstream* gcovFile ) { gcov_frame_header header; char buffer[512]; - uint32_t intBuffer[4096]; + char intBuffer[16384]; uint32_t tempBlockId; blocks_iterator_t tempBlockIterator; int status; - status = readFrameHeader( &header, gcovFile); - + status = readFrameHeader( &header, gcovFile ); if ( status <= 0 ) { // Not printing error message because this // happenns at the end of each file return false; } - switch (header.tag){ + switch (header.tag) { case GCOV_TAG_FUNCTION: @@ -249,80 +278,79 @@ namespace Gcov { numberOfFunctions++; GcovFunctionData newFunction; - if ( !readFunctionFrame(header, gcovFile, &newFunction) ){ - fprintf( stderr, "Error while reading FUNCTION from gcov file...\n" ); + if ( !readFunctionFrame( header, gcovFile, &newFunction ) ) { + std::cerr << "Error while reading FUNCTION from gcov file...\n"; return false; } - functions.push_back(newFunction); + functions.push_back( newFunction ); } break; case GCOV_TAG_BLOCKS: - status = fread( &intBuffer, 4, header.length, gcovFile ); - if ( status != (int) header.length){ - fprintf( - stderr, "Error while reading BLOCKS from gcov file...\n" - "Header lenght is %u instead of %u\n", - header.length, - status - ); + gcovFile->read( intBuffer, header.length ); + if ( gcovFile->gcount() != (int) header.length ) { + std::cerr << "Error while reading BLOCKS from gcov file...\n" + << "Header length is " << header.length + << " instead of " << gcovFile->gcount() + << std::endl; return false; } - for( uint32_t i = 0; i < header.length; i++ ) - functions.back().addBlock(i, intBuffer[i], ""); + for( uint32_t i = 0; i < header.length; i++ ) { + functions.back().addBlock( i, intBuffer[i], "" ); + } break; case GCOV_TAG_ARCS: - status = fread( &intBuffer, 4, header.length, gcovFile ); - if (status != (int) header.length){ + gcovFile->read( intBuffer, header.length ); + if ( gcovFile->gcount() != (int) header.length ) { return false; } - for ( int i = 1; i < (int) header.length; i += 2 ) - functions.back().addArc(intBuffer[0], intBuffer[i], intBuffer[i+1]); + for ( int i = 1; i < (int) header.length; i += 2 ) { + functions.back().addArc( intBuffer[0], intBuffer[i], intBuffer[i+1] ); + } break; case GCOV_TAG_LINES: - status = fread( &intBuffer, 4, 2, gcovFile ); - if (status != 2 || intBuffer[1] != 0){ - fprintf( - stderr, - "Error while reading block id for LINES from gcov file..." - ); + gcovFile->read( intBuffer, 2 ); + if ( gcovFile->gcount() != 2 || intBuffer[1] != 0 ) { + std::cerr << "Error while reading block id for LINES from gcov " + << "file..."; return false; } tempBlockId = intBuffer[0]; header.length -= 2; // Find the right block - tempBlockIterator =functions.back().findBlockById(tempBlockId); + tempBlockIterator =functions.back().findBlockById( tempBlockId ); - header.length -= readString(buffer, gcovFile); + header.length -= readString( buffer, gcovFile ); functions.back().setBlockFileName( tempBlockIterator, buffer ); - status = fread( &intBuffer, 4, header.length, gcovFile ); - if (status != (int) header.length){ - fprintf( stderr, "Error while reading LINES from gcov file..." ); + gcovFile->read( intBuffer, header.length ); + if ( gcovFile->gcount() != (int) header.length ) { + std::cerr << "Error while reading LINES from gcov file..."; return false; - } - - else - for (int i = 0; i < (int) (header.length - 2); i++) + } else { + for (int i = 0; i < (int) (header.length - 2); i++) { functions.back().addBlockLine( tempBlockIterator, intBuffer[i] ); + } + } break; default: - fprintf( stderr, "\n\nERROR - encountered unknown *.gcno tag : 0x%x\n", header.tag ); + std::cerr << "\n\nERROR - encountered unknown *.gcno tag : 0x" + << std::hex << header.tag << std::dec << std::endl; break; } @@ -330,22 +358,22 @@ namespace Gcov { } int GcovData::readString( - char* buffer, //TODO: use global buffer here - FILE* gcovFile + char* buffer, //TODO: use global buffer here + std::ifstream* gcovFile ) { - int status; int length; - status = fread( &length, sizeof(int), 1, gcovFile ); - if (status != 1){ - fprintf( stderr, "ERROR: Unable to read string length from gcov file\n" ); + gcovFile->read( (char *) &length, sizeof( int ) ); + if ( gcovFile->gcount() != sizeof( int ) ) { + std::cerr << "ERROR: Unable to read string length from gcov file" + << std::endl; return -1; } - status = fread( buffer, length * 4 , 1, gcovFile ); - if (status != 1){ - fprintf( stderr, "ERROR: Unable to read string from gcov file\n" ); + gcovFile->read( buffer, length * 4 ); + if ( gcovFile->gcount() != length * 4 ) { + std::cerr << "ERROR: Unable to read string from gcov file" << std::endl; return -1; } @@ -356,16 +384,15 @@ namespace Gcov { int GcovData::readFrameHeader( gcov_frame_header* header, - FILE* gcovFile + std::ifstream* gcovFile ) { - int status; int length; - length = sizeof(gcov_frame_header); - status = fread( header, length, 1, gcovFile ); - if (status != 1){ - //fprintf( stderr, "ERROR: Unable to read frame header from gcov file\n" ); + length = sizeof( gcov_frame_header ); + gcovFile->read( (char *) header, length ); + if ( gcovFile->gcount() != length ) { + std::cerr << "ERROR: Unable to read frame header from gcov file\n"; return -1; } @@ -373,23 +400,24 @@ namespace Gcov { } int GcovData::readFilePreamble( - gcov_preamble* preamble, - FILE* gcovFile, + gcov_preamble* preamble, + std::ifstream* gcovFile, uint32_t desiredMagic ) { - int status; int length; length = sizeof( gcov_preamble ); - status = fread( preamble, sizeof( gcov_preamble), 1, gcovFile ); - if (status <= 0) { - fprintf( stderr, "Error while reading file preamble\n" ); + gcovFile->read( (char *) &preamble, 4 * sizeof( gcov_preamble ) ); + if ( gcovFile->gcount() != 4 * sizeof( gcov_preamble ) ) { + std::cerr << "Error while reading file preamble " << std::endl; return -1; } if ( preamble->magic != GCNO_MAGIC ) { - fprintf( stderr, "File is not a valid *.gcno output (magic: 0x%4x)\n", preamble->magic ); + std::cerr << "File is not a valid *.gcno output (magic: 0x" + << std::hex << std::setw( 4 ) << preamble->magic + << ")" << std::endl; return -1; } @@ -398,17 +426,17 @@ namespace Gcov { bool GcovData::readFunctionFrame( gcov_frame_header header, - FILE* gcovFile, - GcovFunctionData* function + std::ifstream* gcovFile, + GcovFunctionData* function ) { char buffer[512]; //TODO: use common buffers - uint32_t intBuffer[4096]; - int status; + char intBuffer[16384]; - status = fread( &intBuffer, 8, 1, gcovFile ); - if (status != 1){ - fprintf( stderr, "ERROR: Unable to read Function ID & checksum\n" ); + gcovFile->read( (char *) &intBuffer, 8 ); + if ( gcovFile->gcount() != 8 ) { + std::cerr << "ERROR: Unable to read Function ID & checksum " + << std::endl; return false; } header.length -= 2; @@ -419,9 +447,10 @@ namespace Gcov { function->setFunctionName( buffer ); header.length -= readString( buffer, gcovFile ); function->setFileName( buffer ); - status = fread( &intBuffer, 4, header.length, gcovFile ); - if (status <= 0){ - fprintf( stderr, "ERROR: Unable to read Function starting line number\n" ); + gcovFile->read( (char*) &intBuffer, 4 * header.length ); + if (gcovFile->gcount() != 4 * header.length ) { + std::cerr << "ERROR: Unable to read Function starting line number" + << std::endl; return false; } function->setFirstLineNumber( intBuffer[0] ); @@ -433,64 +462,56 @@ namespace Gcov { { functions_iterator_t currentFunction; uint32_t i = 1; //iterator - FILE* textFile; + std::ofstream textFile; // Debug message - // fprintf( stderr, "Writing file: %s\n", textFileName); + // std::cerr << "Writing file: " << textFileName << std::endl; // Open the data file. - textFile = fopen( textFileName, "w" ); + textFile.open( textFileName ); if ( !textFile ) { - fprintf( stderr, "Unable to create %s\n", textFileName ); + std::cerr << "Unable to create " << textFileName << std::endl; return false; } - printGcnoFileInfo( textFile ); + printGcnoFileInfo( &textFile ); for ( currentFunction = functions.begin(); currentFunction != functions.end(); currentFunction++ - ) - { - (*currentFunction).printFunctionInfo( textFile, i ); - (*currentFunction).printCoverageInfo( textFile, i ); + ) { + (*currentFunction).printFunctionInfo( &textFile, i ); + (*currentFunction).printCoverageInfo( &textFile, i ); i++; } - fclose ( textFile ); return true; } - void GcovData::printGcnoFileInfo( FILE * textFile ) + void GcovData::printGcnoFileInfo( std::ofstream* textFile ) { - fprintf( - textFile, - "\nFILE:\t\t\t%s\n" - "magic:\t\t\t%x\n" - "version:\t\t%x\n" - "timestamp:\t\t%x\n" - "functions found: \t%u\n\n", - gcnoFileName, - gcnoPreamble.magic, - gcnoPreamble.version, - gcnoPreamble.timestamp, - numberOfFunctions - ); + (*textFile) << "\nFILE:\t\t\t" << gcnoFileName << std::endl << std::hex + << "magic:\t\t\t" << gcnoPreamble.magic << std::endl + << "version:\t\t" << gcnoPreamble.version << std::endl + << "timestamp:\t\t" << gcnoPreamble.timestamp << std::endl + << std::dec + << "functions found: \t\n\n" << gcnoPreamble.timestamp + << std::endl << std::endl; } - void GcovData::writeGcovFile( ) + void GcovData::writeGcovFile() { //std::cerr << "Attempting to run gcov for: " << cFileName << std::endl; std::ostringstream command; - command << "( cd " << rld::path::dirname (cFileName) - << " && gcov " << rld::path::basename (cFileName) + command << "( cd " << rld::path::dirname(cFileName) + << " && gcov " << rld::path::basename(cFileName) << " &>> gcov.log)"; //std::cerr << "> " << command << std::endl; - system( command.str ().c_str () ); + system( command.str().c_str() ); } - bool GcovData::processCounters( ) + bool GcovData::processCounters() { functions_iterator_t currentFunction; bool status = true; @@ -499,9 +520,8 @@ namespace Gcov { currentFunction = functions.begin(); currentFunction != functions.end(); currentFunction++ - ) - { - if ( !(*currentFunction).processFunctionCounters( ) ) + ) { + if ( !(*currentFunction).processFunctionCounters() ) status = false; } diff --git a/tester/covoar/GcovData.h b/tester/covoar/GcovData.h index 0e74b02..540bd92 100644 --- a/tester/covoar/GcovData.h +++ b/tester/covoar/GcovData.h @@ -10,6 +10,8 @@ #include <stdint.h> #include <list> #include <iostream> +#include <iomanip> +#include <fstream> #include "GcovFunctionData.h" namespace Gcov { @@ -81,7 +83,7 @@ struct gcov_statistics * * @return Returns TRUE if the method succeeded and FALSE if it failed. */ - bool readGcnoFile( const char* const fileName ); + bool readGcnoFile( const std::string& fileName ); /*! * This method writes the *.gcda file. It also produces and stores @@ -89,7 +91,7 @@ struct gcov_statistics * * @return Returns TRUE if the method succeeded and FALSE if it failed. */ - bool writeGcdaFile (); + bool writeGcdaFile(); /*! * This method writes all contained information to stdout file @@ -102,21 +104,21 @@ struct gcov_statistics * This method runs gcov to generate report. This method should * be used only when gcno and gcda files are already generated. */ - void writeGcovFile( ); + void writeGcovFile(); /*! * This method calculates values of counters for all functions */ - bool processCounters( void ); + bool processCounters(); private: uint32_t numberOfFunctions; gcov_preamble gcnoPreamble; - char gcnoFileName[FILE_NAME_LENGTH]; - char gcdaFileName[FILE_NAME_LENGTH]; - char textFileName[FILE_NAME_LENGTH]; - char cFileName[FILE_NAME_LENGTH]; + std::string gcnoFileName; + std::string gcdaFileName; + std::string textFileName; + std::string cFileName; functions_t functions; @@ -128,7 +130,7 @@ struct gcov_statistics * @return true if read was succesfull, false otherwise */ bool readFrame( - FILE* gcovFile + std::ifstream* gcovFile ); /*! @@ -140,8 +142,8 @@ struct gcov_statistics * @return Returns length of words read (word = 32bit) or -1 if error ocurred */ int readString( - char* buffer, - FILE* gcovFile + char* buffer, + std::ifstream* gcovFile ); /*! @@ -155,7 +157,7 @@ struct gcov_statistics */ int readFrameHeader( gcov_frame_header* header, - FILE* gcovFile + std::ifstream* gcovFile ); /*! @@ -170,7 +172,7 @@ struct gcov_statistics */ int readFilePreamble( gcov_preamble* preamble, - FILE* gcovFile, + std::ifstream* gcovFile, const uint32_t desiredMagic ); @@ -185,7 +187,7 @@ struct gcov_statistics */ bool readFunctionFrame( gcov_frame_header header, - FILE* gcovFile, + std::ifstream* gcovFile, GcovFunctionData* function ); @@ -193,7 +195,7 @@ struct gcov_statistics * This method prints info about previously read *.gcno file * to a specified report file */ - void printGcnoFileInfo( FILE * textFile ); + void printGcnoFileInfo( std::ofstream* textFile ); }; } #endif diff --git a/tester/covoar/GcovFunctionData.cc b/tester/covoar/GcovFunctionData.cc index 90b1be0..850f68e 100644 --- a/tester/covoar/GcovFunctionData.cc +++ b/tester/covoar/GcovFunctionData.cc @@ -44,57 +44,47 @@ namespace Gcov { firstLineNumber = lineNo; } - bool GcovFunctionData::setFunctionName( const char* fcnName ) + bool GcovFunctionData::setFunctionName( const std::string& fcnName ) { - std::string symbolName; + std::string symbolName; symbolName = fcnName; - if ( strlen(fcnName) >= FUNCTION_NAME_LENGTH ) { - fprintf( - stderr, - "ERROR: Function name is too long to be correctly stored: %u\n", - (unsigned int) strlen(fcnName) - ); + if ( fcnName.length() >= FUNCTION_NAME_LENGTH ) { + std::cerr << "ERROR: Function name is too long to be correctly stored: " + << fcnName.length() << std::endl; return false; } - strcpy (functionName, fcnName); + functionName = fcnName; // Tie function to its coverage map symbolInfo = SymbolsToAnalyze->find( symbolName ); - if ( symbolInfo != NULL ) + if ( symbolInfo != NULL ) { coverageMap = symbolInfo->unifiedCoverageMap; + } #if 0 - if ( coverageMap == NULL) { - fprintf( - stderr, - "ERROR: Could not find coverage map for: %s\n", - symbolName.c_str() - ); + if ( coverageMap == NULL ) { + std::cerr << "ERROR: Could not find coverage map for: " << symbolName + << std::endl; } else { - fprintf( - stderr, - "SUCCESS: Hound coverage map for: %s\n", - symbolName.c_str() - ); - } + std::cerr << "SUCCESS: Found coverage map for: " << symbolName + << std::endl; + } #endif return true; } - bool GcovFunctionData::setFileName( const char* fileName ) { - if ( strlen(fileName) >= FILE_NAME_LENGTH ){ - fprintf( - stderr, - "ERROR: File name is too long to be correctly stored: %u\n", - (unsigned int) strlen(fileName) - ); + bool GcovFunctionData::setFileName( const std::string fileName ) { + if ( fileName.length() >= FILE_NAME_LENGTH ) { + std::cerr << "ERROR: File name is too long to be correctly stored: " + << fileName.length() << std::endl; return false; } - strcpy (sourceFileName, fileName); + + sourceFileName = fileName; return true; } @@ -114,10 +104,10 @@ namespace Gcov { } void GcovFunctionData::getCounters( - uint64_t* counterValues, - uint32_t &countersFound, - uint64_t &countersSum, - uint64_t &countersMax + uint64_t* counterValues, + uint32_t& countersFound, + uint64_t& countersSum, + uint64_t& countersMax ) { arcs_iterator_t currentArc; @@ -129,19 +119,25 @@ namespace Gcov { // Locate relevant counters and copy their values i = 0; - for( + for ( currentArc = arcs.begin(); currentArc != arcs.end(); currentArc++ ) { - if ( currentArc->flags == 0 || currentArc->flags == 2 || - currentArc->flags == 4 ) { + if ( + currentArc->flags == 0 || + currentArc->flags == 2 || + currentArc->flags == 4 + ) { countersFound++; countersSum += currentArc->counter; counterValues[i] = currentArc->counter; - if ( countersMax <= currentArc->counter) + + if ( countersMax <= currentArc->counter) { countersMax = currentArc->counter; + } + i++; } } @@ -171,120 +167,122 @@ namespace Gcov { void GcovFunctionData::addBlock( const uint32_t id, const uint32_t flags, - const char * sourceFileName + const char* sourceFileName ) { gcov_block_info block; numberOfBlocks++; - block.id = id; + block.id = id; block.flags = flags; block.numberOfLines = 0; block.counter = 0; - strcpy (block.sourceFileName, sourceFileName); - blocks.push_back(block); + strcpy( block.sourceFileName, sourceFileName ); + blocks.push_back( block ); } void GcovFunctionData::printFunctionInfo( - FILE * textFile, - uint32_t function_number + std::ofstream* textFile, + uint32_t function_number ) { blocks_iterator_t currentBlock; arcs_iterator_t currentArc; - fprintf( - textFile, - "\n\n==========================" - "FUNCTION %3d " - "==========================\n\n", - function_number - ); - fprintf( - textFile, - "Name: %s\n" - "File: %s\n" - "Line: %u\n" - "Id: %u\n" - "Checksum: 0x%x\n\n", - functionName, - sourceFileName, - firstLineNumber, - id, - checksum - ); + (*textFile) << "\n\n==========================" + << "FUNCTION " << std::setw( 3 ) << function_number + << "==========================" + << std::endl << std::endl + << "Name: " << functionName << std::endl + << "File: " << sourceFileName << std::endl + << "Line: " << firstLineNumber << std::endl + << "Id: " << id << std::endl + << "Checksum: 0x" << std::hex << checksum + << std::endl << std::endl << std::dec; // Print arcs info - for ( currentArc = arcs.begin(); currentArc != arcs.end(); currentArc++ ) { + for ( + currentArc = arcs.begin(); + currentArc != arcs.end(); + currentArc++ + ) { printArcInfo( textFile, currentArc ); } - fprintf( textFile, "\n"); + (*textFile) << std::endl; // Print blocks info - for ( currentBlock = blocks.begin(); - currentBlock != blocks.end(); - currentBlock++ + for ( + currentBlock = blocks.begin(); + currentBlock != blocks.end(); + currentBlock++ ) { printBlockInfo( textFile, currentBlock ); } } void GcovFunctionData::printCoverageInfo( - FILE *textFile, - uint32_t function_number + std::ofstream* textFile, + uint32_t function_number ) { uint32_t baseAddress = 0; uint32_t baseSize; uint32_t currentAddress; - std::list<Coverage::ObjdumpProcessor::objdumpLine_t>::iterator instruction; + std::list<Coverage::ObjdumpProcessor::objdumpLine_t>::iterator instruction; if ( coverageMap != NULL ) { - for (instruction = symbolInfo->instructions.begin(); - instruction != symbolInfo->instructions.end(); - instruction++) { + for ( + instruction = symbolInfo->instructions.begin(); + instruction != symbolInfo->instructions.end(); + instruction++ + ) { if( instruction->isInstruction ) { baseAddress = instruction->address; break; } } - baseSize = coverageMap->getSize(); - - fprintf( - textFile, - "\nInstructions (Base address: 0x%08x, Size: %4u): \n\n", - baseAddress, - baseSize - ); - for ( instruction = symbolInfo->instructions.begin(); - instruction != symbolInfo->instructions.end(); - instruction++ - ) - { + baseSize = coverageMap->getSize(); + + (*textFile) << "\nInstructions (Base address: 0x" + << std::setfill('0') << std::setw( 8 ) + << std::hex << baseAddress << std::dec << std::setfill(' ') + << ", Size: " << std::setw( 4 ) << baseSize + << "):" << std::endl << std::endl; + + for ( + instruction = symbolInfo->instructions.begin(); + instruction != symbolInfo->instructions.end(); + instruction++ + ) { if ( instruction->isInstruction ) { currentAddress = instruction->address - baseAddress; - fprintf( textFile, "0x%-70s ", instruction->line.c_str() ); - fprintf( textFile, "| 0x%08x ", currentAddress ); - fprintf( textFile, "*"); - fprintf( textFile, - "| exec: %4u ", - coverageMap->getWasExecuted( currentAddress ) - ); - fprintf( textFile, "| taken/not: %4u/%4u ", - coverageMap->getWasTaken( currentAddress ), - coverageMap->getWasNotTaken( currentAddress ) - ); - - if ( instruction->isBranch ) - fprintf( textFile, "| Branch " ); - else - fprintf( textFile, " " ); - if ( instruction->isNop ) - fprintf( textFile, "| NOP(%3u) \n", instruction->nopSize ); - else - fprintf( textFile, " \n" ); + (*textFile) << std::left << "0x" << std::setw( 70 ) + << instruction->line.c_str() << " " << std::right + << "| 0x" << std::hex << std::setfill('0') + << std::setw( 8 ) << currentAddress << " " + << std::dec << std::setfill(' ') + << "*| exec: " << std::setw( 4 ) + << coverageMap->getWasExecuted( currentAddress ) + << " | taken/not: " << std::setw( 4 ) + << coverageMap->getWasTaken( currentAddress ) + << "/" << std::setw( 4 ) + << coverageMap->getWasNotTaken( currentAddress ) + << " "; + + if ( instruction->isBranch ) { + (*textFile) << "| Branch "; + } else { + (*textFile) << " "; + } + + if ( instruction->isNop ) { + (*textFile) << "| NOP(" << std::setw( 3 ) << instruction->nopSize + << ") " << std::endl; + } else { + (*textFile) << " " << std::endl; + } } } } @@ -292,10 +290,10 @@ namespace Gcov { void GcovFunctionData::setBlockFileName( const blocks_iterator_t block, - const char *fileName + const char* fileName ) { - strcpy(block->sourceFileName, fileName); + strcpy( block->sourceFileName, fileName ); } void GcovFunctionData::addBlockLine( @@ -303,99 +301,98 @@ namespace Gcov { const uint32_t line ) { - block->lines.push_back(line); + block->lines.push_back( line ); (block->numberOfLines)++; } blocks_iterator_t GcovFunctionData::findBlockById( - const uint32_t id + const uint32_t id ) { blocks_iterator_t blockIterator; if ( !blocks.empty() ) { blockIterator = blocks.begin(); - while ( blockIterator != blocks.end() ){ - if ( blockIterator->id == id) + while ( blockIterator != blocks.end() ) { + if ( blockIterator->id == id) { break; + } + blockIterator++; } } else { - fprintf( - stderr, - "ERROR: GcovFunctionData::findBlockById() failed, no blocks present\n" - ); + std::cerr << "ERROR: GcovFunctionData::findBlockById() failed" + << ", no blocks present" << std::endl; } + return blockIterator; } void GcovFunctionData::printArcInfo( - FILE * textFile, arcs_iterator_t arc + std::ofstream* textFile, + arcs_iterator_t arc ) { - fprintf( - textFile, - " > ARC %3u -> %3u ", - arc->sourceBlock, - arc->destinationBlock - ); - - fprintf( textFile, "\tFLAGS: "); - switch ( arc->flags ){ + (*textFile) << " > ARC " << std::setw( 3 ) << arc->sourceBlock + << " -> " << std::setw( 3 ) << arc->destinationBlock << " "; + + (*textFile) << "\tFLAGS: "; + switch ( arc->flags ) { case 0: - fprintf( textFile, "( ___________ ____ _______ )"); + (*textFile) << "( ___________ ____ _______ )"; break; case 1: - fprintf( textFile, "( ___________ ____ ON_TREE )"); + (*textFile) << "( ___________ ____ ON_TREE )"; break; case 2: - fprintf( textFile, "( ___________ FAKE _______ )"); + (*textFile) << "( ___________ FAKE _______ )"; break; case 3: - fprintf( textFile, "( ___________ FAKE ON_TREE )"); + (*textFile) << "( ___________ FAKE ON_TREE )"; break; case 4: - fprintf( textFile, "( FALLTHROUGH ____ _______ )"); + (*textFile) << "( FALLTHROUGH ____ _______ )"; break; case 5: - fprintf( textFile, "( FALLTHROUGH ____ ON_TREE )"); + (*textFile) << "( FALLTHROUGH ____ ON_TREE )"; break; default: - fprintf( textFile, "( =======FLAGS_ERROR====== )"); - fprintf( stderr, - " ERROR: Unknown arc flag: 0x%x\n", - arcs.back().flags - ); + (*textFile) << "( =======FLAGS_ERROR====== )"; + std::cerr << " ERROR: Unknown arc flag: 0x" + << std::hex << arcs.back().flags << std::endl + << std::dec; break; } - fprintf( textFile, "\tTaken: %5" PRIu64 "\n", (uint64_t) arc->counter ); + + (*textFile) << "\tTaken: " << std::setw( 5 ) << arc->counter << std::endl; } void GcovFunctionData::printBlockInfo( - FILE * textFile, - blocks_iterator_t block + std::ofstream* textFile, + blocks_iterator_t block ) { std::list<uint32_t>::iterator line; - fprintf( - textFile, - " > BLOCK %3u from %s\n" - " -counter: %5" PRIu64 "\n" - " -flags: 0x%" PRIx32 "\n" - " -lines: ", - block->id, - block->sourceFileName, - (uint64_t) block->counter, - block->flags - ); - if ( !block->lines.empty( ) ) - for ( line = block->lines.begin() ; line != block->lines.end(); line++ ) - fprintf ( textFile, "%u, ", *line); - fprintf ( textFile, "\n"); + (*textFile) << " > BLOCK " << std::setw( 3 ) << block->id + << " from " << block->sourceFileName << std::endl + << " -counter: " << std::setw( 5 ) << block->counter << "\n" + << " -flags: 0x" << std::hex << block->flags << std::endl + << " -lines: "; + + if ( !block->lines.empty() ) + for ( + line = block->lines.begin() ; + line != block->lines.end(); + line++ + ) { + (*textFile) << *line << ", "; + } + + (*textFile) << std::endl; } - bool GcovFunctionData::processFunctionCounters( void ) { + bool GcovFunctionData::processFunctionCounters() { uint32_t baseAddress = 0; uint32_t currentAddress = 0; @@ -407,14 +404,17 @@ namespace Gcov { std::list<uint64_t> taken; // List of taken counts for branches std::list<uint64_t> notTaken; // List of not taken counts for branches - //fprintf( stderr, "DEBUG: Processing counters for file: %s\n", sourceFileName ); - if ( blocks.empty() || arcs.empty() || coverageMap == NULL || symbolInfo->instructions.empty()) - { - //fprintf( stderr, - // "DEBUG: sanity check returned false for function: %s from file: %s\n", - // functionName, - // sourceFileName - //); + //std::cerr << "DEBUG: Processing counters for file: " << sourceFileName + // << std::endl; + if ( + blocks.empty() || + arcs.empty() || + coverageMap == NULL || + symbolInfo->instructions.empty() + ) { + //std::cerr << "DEBUG: sanity check returned false for function: " + // << functionName << " from file: " << sourceFileName + // << std::endl; return false; } @@ -430,29 +430,30 @@ namespace Gcov { // Find taken/not taken values for branches if ( !processBranches( &taken , ¬Taken ) ) { - //fprintf( stderr, - // "ERROR: Failed to process branches for function: %s from file: %s\n", - // functionName, - // sourceFileName - //); + //std::cerr << "ERROR: Failed to process branches for function: " + // << functionName << " from file: " << sourceFileName + // << std::endl; return false; }; // Process the branching arcs while ( blockIterator != blocks.end() ) { - //fprintf( stderr, "DEBUG: Processing branches\n" ); + //std::cerr << "DEBUG: Processing branches" << std::endl; while ( arcIterator->sourceBlock != blockIterator->id ) { if ( arcIterator == arcs.end() ) { - //fprintf( stderr, "ERROR: Unexpectedly runned out of arcs to analyze\n" ); + //std::cerr << "ERROR: Unexpectedly runned out of arcs to analyze" + // << std::endl; return false; } + arcIterator++; arcIterator2++; } // If no more branches break; - if ( arcIterator2 == arcs.end() ) + if ( arcIterator2 == arcs.end() ) { break; + } // If this is a branch without FAKE arcs process it if ( @@ -461,15 +462,16 @@ namespace Gcov { !( arcIterator2->flags & FAKE_ARC_FLAG ) ) { if ( taken.empty() || notTaken.empty() ) { - fprintf( - stderr, - "ERROR: Branchess missing for function: %s from file: %s\n", - functionName, - sourceFileName - ); + std::cerr << "ERROR: Branches missing for function: " + << functionName << " from file: " << sourceFileName + << std::endl; return false; } - //fprintf( stderr, "DEBUG: Found true branching arc %3u -> %3u\n", arcIterator->sourceBlock, arcIterator->destinationBlock ); + + //std::cerr << "DEBUG: Found true branching arc " + // << std::setw( 3 ) << arcIterator->sourceBlock << " -> " + // << std::setw( 3 ) << arcIteratior->destinationBlock + // << std::endl; if ( arcIterator->flags & FALLTHROUGH_ARC_FLAG ) { arcIterator->counter = notTaken.front(); notTaken.pop_front(); @@ -484,16 +486,21 @@ namespace Gcov { blockIterator2 = blocks.begin(); //TODO: ADD FAILSAFE - while ( arcIterator->destinationBlock != blockIterator2->id) + while ( arcIterator->destinationBlock != blockIterator2->id) { blockIterator2++; + } + blockIterator2->counter += arcIterator->counter; blockIterator2 = blocks.begin(); //TODO: ADD FAILSAFE - while ( arcIterator2->destinationBlock != blockIterator2->id) + while ( arcIterator2->destinationBlock != blockIterator2->id) { blockIterator2++; - blockIterator2->counter += arcIterator2->counter; + } + + blockIterator2->counter += arcIterator2->counter; } + blockIterator++; } @@ -510,7 +517,8 @@ namespace Gcov { while ( blockIterator != blocks.end() ) { while ( arcIterator->sourceBlock != blockIterator->id ) { if ( arcIterator == arcs.end() ) { - fprintf( stderr, "ERROR: Unexpectedly runned out of arcs to analyze\n" ); + std::cerr << "ERROR: Unexpectedly runned out of arcs to analyze" + << std::endl; return false; } arcIterator++; @@ -519,37 +527,48 @@ namespace Gcov { // If this is the last arc, propagate counter and exit if ( arcIterator2 == arcs.end() ) { - //fprintf( stderr, - // "DEBUG: Found last arc %3u -> %3u\n", - // arcIterator->sourceBlock, - // arcIterator->destinationBlock + //std::cerr << "DEBUG: Found last arc " << std::setw( 3 ) + // << arcIterator->sourceBlock << " -> " << std::setw( 3 ) + // << arcIterator->destinationBlock << std::endl; //); arcIterator->counter = blockIterator->counter; blockIterator2 = blocks.begin(); - while ( arcIterator->destinationBlock != blockIterator2->id) //TODO: ADD FAILSAFE + while ( arcIterator->destinationBlock != blockIterator2->id) { //TODO: ADD FAILSAFE blockIterator2++; + } blockIterator2->counter += arcIterator->counter; + return true; } // If this is not a branch, propagate counter and continue if ( arcIterator->sourceBlock != arcIterator2->sourceBlock ) { - //fprintf( stderr, "DEBUG: Found simple arc %3u -> %3u\n", arcIterator->sourceBlock, arcIterator->destinationBlock ); + //std::cerr << "DEBUG: Found simple arc " << std::setw( 3 ) + // << arcIterator->sourceBlock << " -> " << std::setw( 3 ) + // << arcIterator->destinationBlock << std::endl; arcIterator->counter = blockIterator->counter; blockIterator2 = blocks.begin();; - while ( arcIterator->destinationBlock != blockIterator2->id) //TODO: ADD FAILSAFE + while ( arcIterator->destinationBlock != blockIterator2->id) { //TODO: ADD FAILSAFE blockIterator2++; + } + blockIterator2->counter += arcIterator->counter; } // If this is a branch with FAKE arc - else if ( (arcIterator->sourceBlock == arcIterator2->sourceBlock ) && ( arcIterator2->flags & FAKE_ARC_FLAG )) - { - //fprintf( stderr, "DEBUG: Found fake branching arc %3u -> %3u\n", arcIterator->sourceBlock, arcIterator->destinationBlock ); + else if ( + (arcIterator->sourceBlock == arcIterator2->sourceBlock ) && + (arcIterator2->flags & FAKE_ARC_FLAG ) + ) { + //std::cerr << "DEBUG: Found fake branching arc " << std::setw( 3 ) + // << arcIterator->sourceBlock << " -> " << std::setw( 3 ) + // << arcIterator->destinationBlock << std::endl; arcIterator->counter = blockIterator->counter; blockIterator2 = blocks.begin(); - while ( arcIterator->destinationBlock != blockIterator2->id) //TODO: ADD FAILSAFE + while ( arcIterator->destinationBlock != blockIterator2->id) { //TODO: ADD FAILSAFE blockIterator2++; + } + blockIterator2->counter += arcIterator->counter; } @@ -561,37 +580,53 @@ namespace Gcov { } bool GcovFunctionData::processBranches( - std::list<uint64_t> * taken , - std::list<uint64_t> * notTaken + std::list<uint64_t>* taken , + std::list<uint64_t>* notTaken ) { uint32_t baseAddress = 0; uint32_t currentAddress; std::list<Coverage::ObjdumpProcessor::objdumpLine_t>::iterator instruction; - if ( coverageMap == NULL ) + if ( coverageMap == NULL ) { return false; + } //baseAddress = coverageMap->getFirstLowAddress(); //symbolInfo->baseAddress; - for (instruction = symbolInfo->instructions.begin(); instruction != symbolInfo->instructions.end(); instruction++) + for ( + instruction = symbolInfo->instructions.begin(); + instruction != symbolInfo->instructions.end(); + instruction++ + ) { if( instruction->isInstruction ) { baseAddress = instruction->address; break; } + } - //fprintf( stderr, "DEBUG: Processing instructions in search of branches\n" ); - for (instruction = symbolInfo->instructions.begin(); instruction != symbolInfo->instructions.end(); instruction++) - { - if ( instruction->isInstruction) { + // std::cerr << "DEBUG: Processing instructions in search of branches" + // << std::endl + for ( + instruction = symbolInfo->instructions.begin(); + instruction != symbolInfo->instructions.end(); + instruction++ + ) { + if ( instruction->isInstruction ) { currentAddress = instruction-> address - baseAddress; if ( instruction->isBranch ) { - taken->push_back ( (uint64_t) coverageMap->getWasTaken( currentAddress ) ); - notTaken->push_back ( (uint64_t) coverageMap->getWasNotTaken( currentAddress ) ); - //fprintf( stderr, - // "Added branch to list taken/not: %4u/%4u\n", - // coverageMap->getWasTaken( currentAddress ), - // coverageMap->getWasNotTaken( currentAddress ) - //); + taken->push_back( + (uint64_t) coverageMap->getWasTaken( currentAddress ) + ); + + notTaken->push_back( + (uint64_t) coverageMap->getWasNotTaken( currentAddress ) + ); + + //std::cerr << "Added branch to list taken/not: " << std::setw( 4 ) + // << coverageMap->getWasTaken( currentAddress ) + // << "/" << std::setw( 4 ) + // << coverageMap->getWasNotTaken( currentAddress ) + // << std::endl; } } } diff --git a/tester/covoar/GcovFunctionData.h b/tester/covoar/GcovFunctionData.h index 812b45c..4065e17 100644 --- a/tester/covoar/GcovFunctionData.h +++ b/tester/covoar/GcovFunctionData.h @@ -9,6 +9,8 @@ #include <stdint.h> #include <list> +#include <fstream> +#include <iomanip> #include "CoverageMapBase.h" #include "DesiredSymbols.h" @@ -23,20 +25,20 @@ namespace Gcov { struct gcov_arc_info { - uint32_t sourceBlock; - uint32_t destinationBlock; - uint32_t flags; - uint64_t counter; + uint32_t sourceBlock; + uint32_t destinationBlock; + uint32_t flags; + uint64_t counter; }; struct gcov_block_info { - uint32_t id; - uint32_t flags; - uint32_t numberOfLines; - uint64_t counter; - char sourceFileName[FILE_NAME_LENGTH]; - std::list<uint32_t> lines; + uint32_t id; + uint32_t flags; + uint32_t numberOfLines; + uint64_t counter; + char sourceFileName[FILE_NAME_LENGTH]; + std::list<uint32_t> lines; }; typedef std::list<gcov_arc_info> arcs_t; @@ -98,7 +100,7 @@ typedef std::list<gcov_block_info>::iterator blocks_iterator_t; * @return Returns TRUE if the method succeeded and FALSE if it failed. */ bool setFunctionName( - const char* fcnName + const std::string& fcnName ); /*! @@ -109,7 +111,7 @@ typedef std::list<gcov_block_info>::iterator blocks_iterator_t; * @return Returns TRUE if the method succeeded and FALSE if it failed. */ bool setFileName( - const char* fileName + const std::string fileName ); /*! @@ -121,8 +123,8 @@ typedef std::list<gcov_block_info>::iterator blocks_iterator_t; * @return Returns TRUE if the method succeeded and FALSE if it failed. */ void setBlockFileName( - const blocks_iterator_t block, - const char* fileName + const blocks_iterator_t block, + const char* fileName ); /*! @@ -154,10 +156,10 @@ typedef std::list<gcov_block_info>::iterator blocks_iterator_t; * @param[out] countersMax used to return max counter value */ void getCounters( - uint64_t* counterValues, - uint32_t &countersFound, - uint64_t &countersSum, - uint64_t &countersMax + uint64_t* counterValues, + uint32_t& countersFound, + uint64_t& countersSum, + uint64_t& countersMax ); /*! @@ -167,9 +169,9 @@ typedef std::list<gcov_block_info>::iterator blocks_iterator_t; * @param[in] destination passes destination block number */ void addArc( - uint32_t source, - uint32_t destination, - uint32_t flags + uint32_t source, + uint32_t destination, + uint32_t flags ); /*! @@ -210,12 +212,18 @@ typedef std::list<gcov_block_info>::iterator blocks_iterator_t; /*! * This method prints info about function */ - void printFunctionInfo( FILE * textFile, uint32_t function_number ); + void printFunctionInfo( + std::ofstream* textFile, + uint32_t function_number + ); /*! * This method prints info about coverage of this function */ - void printCoverageInfo( FILE * textFile, uint32_t function_number ); + void printCoverageInfo( + std::ofstream* textFile, + uint32_t function_number + ); /*! * This method prints info about chosen arc in arcs list @@ -224,8 +232,8 @@ typedef std::list<gcov_block_info>::iterator blocks_iterator_t; * @param[in] arc passes iterator identifying arc */ void printArcInfo( - FILE * textFile, - arcs_iterator_t arc + std::ofstream* textFile, + arcs_iterator_t arc ); /*! @@ -234,14 +242,14 @@ typedef std::list<gcov_block_info>::iterator blocks_iterator_t; * @param[in] block passes iterator identifying block */ void printBlockInfo( - FILE * textFile, - blocks_iterator_t block + std::ofstream* textFile, + blocks_iterator_t block ); /*! * This method calculates values of arc counters */ - bool processFunctionCounters( void ); + bool processFunctionCounters(); private: @@ -252,15 +260,15 @@ typedef std::list<gcov_block_info>::iterator blocks_iterator_t; uint32_t numberOfArcs; arcs_t arcs; blocks_t blocks; - char functionName[FUNCTION_NAME_LENGTH]; - char sourceFileName[FILE_NAME_LENGTH]; + std::string functionName; + std::string sourceFileName; /*! * This member contains the unified or merged coverage map * and symbol info for the symbol. */ - Coverage::CoverageMapBase* coverageMap; - Coverage::SymbolInformation* symbolInfo; + Coverage::CoverageMapBase* coverageMap; + Coverage::SymbolInformation* symbolInfo; /*! * This method creates list of taken/not taken values @@ -270,8 +278,8 @@ typedef std::list<gcov_block_info>::iterator blocks_iterator_t; * @param[in] notTaken used to return not taken counts list */ bool processBranches( - std::list<uint64_t> * taken, - std::list<uint64_t> * notTaken + std::list<uint64_t>* taken, + std::list<uint64_t>* notTaken ); }; -- 1.8.3.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel