diff options
Diffstat (limited to 'tester/covoar/GcovData.cc')
-rw-r--r-- | tester/covoar/GcovData.cc | 719 |
1 files changed, 360 insertions, 359 deletions
diff --git a/tester/covoar/GcovData.cc b/tester/covoar/GcovData.cc index 2c033e5..5175fb3 100644 --- a/tester/covoar/GcovData.cc +++ b/tester/covoar/GcovData.cc @@ -27,7 +27,7 @@ namespace Gcov { GcovData::GcovData() { - numberOfFunctions = 0; + numberOfFunctions = 0; } GcovData::~GcovData() @@ -36,11 +36,11 @@ namespace Gcov { bool GcovData::readGcnoFile( const char* const fileName ) { - int status; - FILE* gcovFile; - char* tempString; - char* tempString2; - char* tempString3; + int status; + FILE* gcovFile; + char* tempString; + char* tempString2; + char* tempString3; if ( strlen(fileName) >= FILE_NAME_LENGTH ){ fprintf( @@ -63,9 +63,9 @@ namespace Gcov { } else { - strcpy( tempString, ".gcda"); // construct gcda file name - strcpy( tempString2, ".txt"); // construct report file name - strcpy( tempString3, ".c"); // construct source file name + strcpy( tempString, ".gcda"); // construct gcda file name + strcpy( tempString2, ".txt"); // construct report file name + strcpy( tempString3, ".c"); // construct source file name } // Debug message @@ -74,16 +74,16 @@ namespace Gcov { // Open the notes file. gcovFile = fopen( gcnoFileName, "r" ); if ( !gcovFile ) { - fprintf( stderr, "Unable to open %s\n", gcnoFileName ); - return false; + fprintf( stderr, "Unable to open %s\n", gcnoFileName ); + 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 ); - return false; + fprintf( stderr, "Unable to read %s\n", gcnoFileName ); + fclose( gcovFile ); + return false; } //Read all remaining frames from file @@ -96,383 +96,383 @@ namespace Gcov { bool GcovData::writeGcdaFile () { - gcov_preamble preamble; - gcov_frame_header header; - FILE* gcdaFile; - functions_iterator_t currentFunction; - arcs_iterator_t currentArc; - uint32_t buffer; - uint32_t countersFound; - uint32_t countersFoundSum; - uint64_t countersSum; - uint64_t countersMax; - uint64_t llBuffer[4096]; // TODO: Use common buffer - gcov_statistics objectStats; - gcov_statistics programStats; - size_t status; - - // Debug message - // fprintf( stderr, "Writing file: %s\n", gcdaFileName); - - // Lets clear counters sumators - countersSum = 0; - countersMax = 0; - countersFoundSum = 0; - - // Open the data file. - gcdaFile = fopen( gcdaFileName, "w" ); - if ( !gcdaFile ) { - fprintf( stderr, "Unable to create %s\n", gcdaFileName ); - return false; - } - - //Form preamble - 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 ); - - //Write function info and counter counts - for ( - currentFunction = functions.begin(); - currentFunction != functions.end(); - currentFunction++ - ) - { - //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 ); - - //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 ); - - //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 ); - - // Determine how many counters there are - // and store their counts in buffer - countersFound = 0; - (*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 ); - - status = fwrite (llBuffer, sizeof( uint64_t ), countersFound , gcdaFile ); - if ( status != countersFound ) - fprintf( stderr, "Error while writing counter data to a file %s\n", gcdaFileName ); - } - - // Prepare frame with object file statistics - header.tag = GCOV_TAG_OBJECT_SUMMARY; - header.length = 9; - objectStats.checksum = 0; // TODO: have no idea hov to calculates it :) - objectStats.counters = countersFoundSum; - objectStats.runs = 1; // We are lying for now, we have no means of figuring this out - objectStats.sum = countersSum; // Sum of all counters - objectStats.max = countersMax; // max value for counter on last run, we have no clue - 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 ); - - - // Prepare frame with program statistics - header.tag = GCOV_TAG_PROGRAM_SUMMARY; - header.length = 9; - programStats.checksum = 0; // TODO: have no idea hov to calculate it :) - programStats.counters = countersFoundSum; - programStats.runs = 1; // We are lying for now, we have no clue - programStats.sum = countersSum; // Sum of all counters - programStats.max = countersMax; // max value for counter on last run, we have no clue - 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 ); - - fclose( gcdaFile ); - - return true; + gcov_preamble preamble; + gcov_frame_header header; + FILE* gcdaFile; + functions_iterator_t currentFunction; + arcs_iterator_t currentArc; + uint32_t buffer; + uint32_t countersFound; + uint32_t countersFoundSum; + uint64_t countersSum; + uint64_t countersMax; + uint64_t llBuffer[4096]; // TODO: Use common buffer + gcov_statistics objectStats; + gcov_statistics programStats; + size_t status; + + // Debug message + // fprintf( stderr, "Writing file: %s\n", gcdaFileName); + + // Lets clear counters sumators + countersSum = 0; + countersMax = 0; + countersFoundSum = 0; + + // Open the data file. + gcdaFile = fopen( gcdaFileName, "w" ); + if ( !gcdaFile ) { + fprintf( stderr, "Unable to create %s\n", gcdaFileName ); + return false; + } + + //Form preamble + 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 ); + + //Write function info and counter counts + for ( + currentFunction = functions.begin(); + currentFunction != functions.end(); + currentFunction++ + ) + { + //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 ); + + //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 ); + + //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 ); + + // Determine how many counters there are + // and store their counts in buffer + countersFound = 0; + (*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 ); + + status = fwrite (llBuffer, sizeof( uint64_t ), countersFound , gcdaFile ); + if ( status != countersFound ) + fprintf( stderr, "Error while writing counter data to a file %s\n", gcdaFileName ); + } + + // Prepare frame with object file statistics + header.tag = GCOV_TAG_OBJECT_SUMMARY; + header.length = 9; + objectStats.checksum = 0; // TODO: have no idea hov to calculates it :) + objectStats.counters = countersFoundSum; + objectStats.runs = 1; // We are lying for now, we have no means of figuring this out + objectStats.sum = countersSum; // Sum of all counters + objectStats.max = countersMax; // max value for counter on last run, we have no clue + 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 ); + + + // Prepare frame with program statistics + header.tag = GCOV_TAG_PROGRAM_SUMMARY; + header.length = 9; + programStats.checksum = 0; // TODO: have no idea hov to calculate it :) + programStats.counters = countersFoundSum; + programStats.runs = 1; // We are lying for now, we have no clue + programStats.sum = countersSum; // Sum of all counters + programStats.max = countersMax; // max value for counter on last run, we have no clue + 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 ); + + fclose( gcdaFile ); + + return true; } bool GcovData::readFrame( - FILE* gcovFile - ) + FILE* gcovFile + ) { - gcov_frame_header header; - char buffer[512]; - uint32_t intBuffer[4096]; - uint32_t tempBlockId; - blocks_iterator_t tempBlockIterator; - int status; - GcovFunctionData* newFunction; - - 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){ - - case GCOV_TAG_FUNCTION: - - numberOfFunctions++; - newFunction = new GcovFunctionData; - if ( !readFunctionFrame(header, gcovFile, newFunction) ){ - fprintf( stderr, "Error while reading FUNCTION from gcov file...\n" ); - return false; - } - 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 - ); - return false; - } - - 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){ - return false; - } - - 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..." - ); - return false; - } - tempBlockId = intBuffer[0]; - header.length -= 2; - - // Find the right block - tempBlockIterator =functions.back()->findBlockById(tempBlockId); - - 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..." ); - return false; - } - - 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 ); - break; - } - - return true; + gcov_frame_header header; + char buffer[512]; + uint32_t intBuffer[4096]; + uint32_t tempBlockId; + blocks_iterator_t tempBlockIterator; + int status; + GcovFunctionData* newFunction; + + 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){ + + case GCOV_TAG_FUNCTION: + + numberOfFunctions++; + newFunction = new GcovFunctionData; + if ( !readFunctionFrame(header, gcovFile, newFunction) ){ + fprintf( stderr, "Error while reading FUNCTION from gcov file...\n" ); + return false; + } + 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 + ); + return false; + } + + 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){ + return false; + } + + 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..." + ); + return false; + } + tempBlockId = intBuffer[0]; + header.length -= 2; + + // Find the right block + tempBlockIterator =functions.back()->findBlockById(tempBlockId); + + 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..." ); + return false; + } + + 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 ); + break; + } + + return true; } int GcovData::readString( - char* buffer, //TODO: use global buffer here - FILE* gcovFile + char* buffer, //TODO: use global buffer here + FILE* gcovFile ) { - int status; - int length; + 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" ); - return -1; - } + status = fread( &length, sizeof(int), 1, gcovFile ); + if (status != 1){ + fprintf( stderr, "ERROR: Unable to read string length from gcov file\n" ); + return -1; + } - status = fread( buffer, length * 4 , 1, gcovFile ); - if (status != 1){ - fprintf( stderr, "ERROR: Unable to read string from gcov file\n" ); - return -1; - } + status = fread( buffer, length * 4 , 1, gcovFile ); + if (status != 1){ + fprintf( stderr, "ERROR: Unable to read string from gcov file\n" ); + return -1; + } - buffer[length * 4] = '\0'; + buffer[length * 4] = '\0'; - return length +1; + return length +1; } int GcovData::readFrameHeader( - gcov_frame_header* header, - FILE* gcovFile - ) + gcov_frame_header* header, + FILE* 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" ); - return -1; - } + 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" ); + return -1; + } - return length / 4; + return length / 4; } int GcovData::readFilePreamble( - gcov_preamble* preamble, - FILE* gcovFile, - uint32_t desiredMagic + gcov_preamble* preamble, + FILE* 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" ); - return -1; - } - - if ( preamble->magic != GCNO_MAGIC ) { - fprintf( stderr, "File is not a valid *.gcno output (magic: 0x%4x)\n", preamble->magic ); - return -1; - } - - return length / 4; + 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" ); + return -1; + } + + if ( preamble->magic != GCNO_MAGIC ) { + fprintf( stderr, "File is not a valid *.gcno output (magic: 0x%4x)\n", preamble->magic ); + return -1; + } + + return length / 4; } bool GcovData::readFunctionFrame( - gcov_frame_header header, - FILE* gcovFile, - GcovFunctionData* function + gcov_frame_header header, + FILE* gcovFile, + GcovFunctionData* function ) { - char buffer[512]; //TODO: use common buffers - uint32_t intBuffer[4096]; - int status; - - status = fread( &intBuffer, 8, 1, gcovFile ); - if (status != 1){ - fprintf( stderr, "ERROR: Unable to read Function ID & checksum\n" ); - return false; - } - header.length -= 2; - function->setId( intBuffer[0] ); - function->setChecksum( intBuffer[1] ); - - header.length -= readString( buffer, gcovFile ); - 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" ); - return false; - } - function->setFirstLineNumber( intBuffer[0] ); - - return true; + char buffer[512]; //TODO: use common buffers + uint32_t intBuffer[4096]; + int status; + + status = fread( &intBuffer, 8, 1, gcovFile ); + if (status != 1){ + fprintf( stderr, "ERROR: Unable to read Function ID & checksum\n" ); + return false; + } + header.length -= 2; + function->setId( intBuffer[0] ); + function->setChecksum( intBuffer[1] ); + + header.length -= readString( buffer, gcovFile ); + 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" ); + return false; + } + function->setFirstLineNumber( intBuffer[0] ); + + return true; } bool GcovData::writeReportFile() { - functions_iterator_t currentFunction; - uint32_t i = 1; //iterator - FILE* textFile; - - // Debug message - // fprintf( stderr, "Writing file: %s\n", textFileName); - - // Open the data file. - textFile = fopen( textFileName, "w" ); - if ( !textFile ) { - fprintf( stderr, "Unable to create %s\n", textFileName ); - return false; - } - - printGcnoFileInfo( textFile ); - - for ( - currentFunction = functions.begin(); - currentFunction != functions.end(); - currentFunction++ - ) - { - (*currentFunction)->printFunctionInfo( textFile, i ); - (*currentFunction)->printCoverageInfo( textFile, i ); - i++; - } - - fclose ( textFile ); - return true; + functions_iterator_t currentFunction; + uint32_t i = 1; //iterator + FILE* textFile; + + // Debug message + // fprintf( stderr, "Writing file: %s\n", textFileName); + + // Open the data file. + textFile = fopen( textFileName, "w" ); + if ( !textFile ) { + fprintf( stderr, "Unable to create %s\n", textFileName ); + return false; + } + + printGcnoFileInfo( textFile ); + + for ( + currentFunction = functions.begin(); + currentFunction != functions.end(); + currentFunction++ + ) + { + (*currentFunction)->printFunctionInfo( textFile, i ); + (*currentFunction)->printCoverageInfo( textFile, i ); + i++; + } + + fclose ( textFile ); + return true; } void GcovData::printGcnoFileInfo( FILE * 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 - ); + 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 + ); } void GcovData::writeGcovFile( ) @@ -480,16 +480,17 @@ namespace Gcov { //std::cerr << "Attempting to run gcov for: " << cFileName << std::endl; std::ostringstream command; command << "( cd " << rld::path::dirname (cFileName) - << " && gcov " << rld::path::basename (cFileName) - << " &>> gcov.log)"; + << " && gcov " << rld::path::basename (cFileName) + << " &>> gcov.log)"; //std::cerr << "> " << command << std::endl; system( command.str ().c_str () ); } bool GcovData::processCounters( ) { - functions_iterator_t currentFunction; - bool status = true; + functions_iterator_t currentFunction; + bool status = true; + for ( currentFunction = functions.begin(); currentFunction != functions.end(); |