summaryrefslogtreecommitdiffstats
path: root/tester/covoar/ReportsBase.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tester/covoar/ReportsBase.cc')
-rw-r--r--tester/covoar/ReportsBase.cc181
1 files changed, 98 insertions, 83 deletions
diff --git a/tester/covoar/ReportsBase.cc b/tester/covoar/ReportsBase.cc
index 40ed209..fea776c 100644
--- a/tester/covoar/ReportsBase.cc
+++ b/tester/covoar/ReportsBase.cc
@@ -20,8 +20,9 @@
namespace Coverage {
-ReportsBase::ReportsBase( time_t timestamp ):
+ReportsBase::ReportsBase( time_t timestamp, std::string symbolSetName ):
reportExtension_m(""),
+ symbolSetName_m(symbolSetName),
timestamp_m( timestamp )
{
}
@@ -31,27 +32,38 @@ ReportsBase::~ReportsBase()
}
FILE* ReportsBase::OpenFile(
- const char* const fileName
+ const char* const fileName,
+ const char* const symbolSetName
)
{
int sc;
FILE *aFile;
std::string file;
+ std::string symbolSetOutputDirectory;
+ rld::path::path_join(
+ outputDirectory,
+ symbolSetName,
+ symbolSetOutputDirectory
+ );
+
// Create the output directory if it does not already exist
#ifdef _WIN32
- sc = _mkdir( outputDirectory );
+ sc = _mkdir( symbolSetOutputDirectory );
#else
- sc = mkdir( outputDirectory,0755 );
+ sc = mkdir( symbolSetOutputDirectory.c_str(),0755 );
#endif
if ( (sc == -1) && (errno != EEXIST) ) {
- fprintf(stderr, "Unable to create output directory %s\n", outputDirectory);
+ fprintf(
+ stderr,
+ "Unable to create output directory %s\n",
+ symbolSetOutputDirectory.c_str()
+ );
return NULL;
}
- file = outputDirectory;
- file += "/";
- file += fileName;
+ file = symbolSetOutputDirectory;
+ rld::path::path_join(file, fileName, file);
// Open the file.
aFile = fopen( file.c_str(), "w" );
@@ -71,7 +83,7 @@ FILE* ReportsBase::OpenAnnotatedFile(
const char* const fileName
)
{
- return OpenFile(fileName);
+ return OpenFile(fileName, symbolSetName_m.c_str());
}
FILE* ReportsBase::OpenBranchFile(
@@ -79,21 +91,21 @@ FILE* ReportsBase::OpenBranchFile(
bool hasBranches
)
{
- return OpenFile(fileName);
+ return OpenFile(fileName, symbolSetName_m.c_str());
}
FILE* ReportsBase::OpenCoverageFile(
const char* const fileName
)
{
- return OpenFile(fileName);
+ return OpenFile(fileName, symbolSetName_m.c_str());
}
FILE* ReportsBase::OpenNoRangeFile(
const char* const fileName
)
{
- return OpenFile(fileName);
+ return OpenFile(fileName, symbolSetName_m.c_str());
}
@@ -101,14 +113,14 @@ FILE* ReportsBase::OpenSizeFile(
const char* const fileName
)
{
- return OpenFile(fileName);
+ return OpenFile(fileName, symbolSetName_m.c_str());
}
FILE* ReportsBase::OpenSymbolSummaryFile(
const char* const fileName
)
{
- return OpenFile(fileName);
+ return OpenFile(fileName, symbolSetName_m.c_str());
}
void ReportsBase::CloseFile(
@@ -186,41 +198,42 @@ void ReportsBase::WriteAnnotatedReport(
const char* const fileName
) {
FILE* aFile = NULL;
- Coverage::DesiredSymbols::symbolSet_t::iterator ditr;
Coverage::CoverageRanges* theBranches;
Coverage::CoverageRanges* theRanges;
Coverage::CoverageMapBase* theCoverageMap = NULL;
uint32_t bAddress = 0;
AnnotatedLineState_t state;
- std::list<Coverage::ObjdumpProcessor::objdumpLine_t>* theInstructions;
- std::list<Coverage::ObjdumpProcessor::objdumpLine_t>::iterator itr;
+ const std::list<Coverage::ObjdumpProcessor::objdumpLine_t>* theInstructions;
+ std::list<
+ Coverage::ObjdumpProcessor::objdumpLine_t>::const_iterator itr;
aFile = OpenAnnotatedFile(fileName);
if (!aFile)
return;
// Process uncovered branches for each symbol.
- for (ditr = SymbolsToAnalyze->set.begin();
- ditr != SymbolsToAnalyze->set.end();
- ditr++) {
+ const std::vector<std::string>& symbols = SymbolsToAnalyze->getSymbolsForSet(symbolSetName_m);
+
+ for (const auto& symbol : symbols) {
+ const SymbolInformation& info = SymbolsToAnalyze->allSymbols().at(symbol);
// If uncoveredRanges and uncoveredBranches don't exist, then the
// symbol was never referenced by any executable. Just skip it.
- if ((ditr->second.uncoveredRanges == NULL) &&
- (ditr->second.uncoveredBranches == NULL))
+ if ((info.uncoveredRanges == NULL) &&
+ (info.uncoveredBranches == NULL))
continue;
// If uncoveredRanges and uncoveredBranches are empty, then everything
// must have been covered for this symbol. Just skip it.
- if ((ditr->second.uncoveredRanges->set.empty()) &&
- (ditr->second.uncoveredBranches->set.empty()))
+ if ((info.uncoveredRanges->set.empty()) &&
+ (info.uncoveredBranches->set.empty()))
continue;
- theCoverageMap = ditr->second.unifiedCoverageMap;
- bAddress = ditr->second.baseAddress;
- theInstructions = &(ditr->second.instructions);
- theRanges = ditr->second.uncoveredRanges;
- theBranches = ditr->second.uncoveredBranches;
+ theCoverageMap = info.unifiedCoverageMap;
+ bAddress = info.baseAddress;
+ theInstructions = &(info.instructions);
+ theRanges = info.uncoveredRanges;
+ theBranches = info.uncoveredBranches;
// Add annotations to each line where necessary
AnnotatedStart( aFile );
@@ -274,14 +287,13 @@ void ReportsBase::WriteAnnotatedReport(
void ReportsBase::WriteBranchReport(
const char* const fileName
) {
- Coverage::DesiredSymbols::symbolSet_t::iterator ditr;
FILE* report = NULL;
Coverage::CoverageRanges::ranges_t::iterator ritr;
Coverage::CoverageRanges* theBranches;
unsigned int count;
bool hasBranches = true;
- if ((SymbolsToAnalyze->getNumberBranchesFound() == 0) ||
+ if ((SymbolsToAnalyze->getNumberBranchesFound(symbolSetName_m) == 0) ||
(BranchInfoAvailable == false) )
hasBranches = false;
@@ -291,15 +303,16 @@ void ReportsBase::WriteBranchReport(
return;
// If no branches were found then branch coverage is not supported
- if ((SymbolsToAnalyze->getNumberBranchesFound() != 0) &&
+ if ((SymbolsToAnalyze->getNumberBranchesFound(symbolSetName_m) != 0) &&
(BranchInfoAvailable == true) ) {
- // Process uncovered branches for each symbol.
+ // Process uncovered branches for each symbol in the set.
+ const std::vector<std::string>& symbols = SymbolsToAnalyze->getSymbolsForSet(symbolSetName_m);
+
count = 0;
- for (ditr = SymbolsToAnalyze->set.begin();
- ditr != SymbolsToAnalyze->set.end();
- ditr++) {
+ for (const auto& symbol : symbols) {
+ const SymbolInformation& info = SymbolsToAnalyze->allSymbols().at(symbol);
- theBranches = ditr->second.uncoveredBranches;
+ theBranches = info.uncoveredBranches;
if (theBranches && !theBranches->set.empty()) {
@@ -307,7 +320,7 @@ void ReportsBase::WriteBranchReport(
ritr != theBranches->set.end() ;
ritr++ ) {
count++;
- PutBranchEntry( report, count, ditr, ritr );
+ PutBranchEntry( report, count, symbol, info, ritr );
}
}
}
@@ -323,7 +336,6 @@ void ReportsBase::WriteCoverageReport(
const char* const fileName
)
{
- Coverage::DesiredSymbols::symbolSet_t::iterator ditr;
FILE* report;
Coverage::CoverageRanges::ranges_t::iterator ritr;
Coverage::CoverageRanges* theRanges;
@@ -346,26 +358,27 @@ void ReportsBase::WriteCoverageReport(
}
// Process uncovered ranges for each symbol.
+ const std::vector<std::string>& symbols = SymbolsToAnalyze->getSymbolsForSet(symbolSetName_m);
+
count = 0;
- for (ditr = SymbolsToAnalyze->set.begin();
- ditr != SymbolsToAnalyze->set.end();
- ditr++) {
+ for (const auto& symbol : symbols) {
+ const SymbolInformation& info = SymbolsToAnalyze->allSymbols().at(symbol);
- theRanges = ditr->second.uncoveredRanges;
+ theRanges = info.uncoveredRanges;
// If uncoveredRanges doesn't exist, then the symbol was never
// referenced by any executable. There may be a problem with the
// desired symbols list or with the executables so put something
// in the report.
if (theRanges == NULL) {
- putCoverageNoRange( report, NoRangeFile, count, ditr->first );
+ putCoverageNoRange( report, NoRangeFile, count, symbol );
count++;
} else if (!theRanges->set.empty()) {
for (ritr = theRanges->set.begin() ;
ritr != theRanges->set.end() ;
ritr++ ) {
- PutCoverageLine( report, count, ditr, ritr );
+ PutCoverageLine( report, count, symbol, info, ritr );
count++;
}
}
@@ -383,7 +396,6 @@ void ReportsBase::WriteSizeReport(
const char* const fileName
)
{
- Coverage::DesiredSymbols::symbolSet_t::iterator ditr;
FILE* report;
Coverage::CoverageRanges::ranges_t::iterator ritr;
Coverage::CoverageRanges* theRanges;
@@ -396,19 +408,20 @@ void ReportsBase::WriteSizeReport(
}
// Process uncovered ranges for each symbol.
+ const std::vector<std::string>& symbols = SymbolsToAnalyze->getSymbolsForSet(symbolSetName_m);
+
count = 0;
- for (ditr = SymbolsToAnalyze->set.begin();
- ditr != SymbolsToAnalyze->set.end();
- ditr++) {
+ for (const auto& symbol : symbols) {
+ const SymbolInformation& info = SymbolsToAnalyze->allSymbols().at(symbol);
- theRanges = ditr->second.uncoveredRanges;
+ theRanges = info.uncoveredRanges;
if (theRanges && !theRanges->set.empty()) {
for (ritr = theRanges->set.begin() ;
ritr != theRanges->set.end() ;
ritr++ ) {
- PutSizeLine( report, count, ditr, ritr );
+ PutSizeLine( report, count, symbol, ritr );
count++;
}
}
@@ -421,7 +434,6 @@ void ReportsBase::WriteSymbolSummaryReport(
const char* const fileName
)
{
- Coverage::DesiredSymbols::symbolSet_t::iterator ditr;
FILE* report;
unsigned int count;
@@ -432,12 +444,13 @@ void ReportsBase::WriteSymbolSummaryReport(
}
// Process each symbol.
+ const std::vector<std::string>& symbols = SymbolsToAnalyze->getSymbolsForSet(symbolSetName_m);
+
count = 0;
- for (ditr = SymbolsToAnalyze->set.begin();
- ditr != SymbolsToAnalyze->set.end();
- ditr++) {
+ for (const auto& symbol : symbols) {
+ const SymbolInformation& info = SymbolsToAnalyze->allSymbols().at(symbol);
- PutSymbolSummaryLine( report, count, ditr );
+ PutSymbolSummaryLine( report, count, symbol, info );
count++;
}
@@ -445,13 +458,13 @@ void ReportsBase::WriteSymbolSummaryReport(
}
void ReportsBase::WriteSummaryReport(
- const char* const fileName
+ const char* const fileName,
+ const char* const symbolSetName
)
{
// Calculate coverage statistics and output results.
uint32_t a;
uint32_t endAddress;
- Coverage::DesiredSymbols::symbolSet_t::iterator itr;
uint32_t notExecuted = 0;
double percentage;
double percentageBranches;
@@ -460,22 +473,23 @@ void ReportsBase::WriteSummaryReport(
FILE* report;
// Open the report file.
- report = OpenFile( fileName );
+ report = OpenFile( fileName, symbolSetName );
if ( !report ) {
return;
}
// Look at each symbol.
- for (itr = SymbolsToAnalyze->set.begin();
- itr != SymbolsToAnalyze->set.end();
- itr++) {
+ const std::vector<std::string>& symbols = SymbolsToAnalyze->getSymbolsForSet(symbolSetName);
+
+ for (const auto& symbol : symbols) {
+ SymbolInformation info = SymbolsToAnalyze->allSymbols().at(symbol);
// If the symbol's unified coverage map exists, scan through it
// and count bytes.
- theCoverageMap = itr->second.unifiedCoverageMap;
+ theCoverageMap = info.unifiedCoverageMap;
if (theCoverageMap) {
- endAddress = itr->second.stats.sizeInBytes - 1;
+ endAddress = info.stats.sizeInBytes - 1;
for (a = 0; a <= endAddress; a++) {
totalBytes++;
@@ -490,11 +504,12 @@ void ReportsBase::WriteSummaryReport(
percentage *= 100.0;
percentageBranches = (double) (
- SymbolsToAnalyze->getNumberBranchesAlwaysTaken() +
- SymbolsToAnalyze->getNumberBranchesNeverTaken() +
- (SymbolsToAnalyze->getNumberBranchesNotExecuted() * 2)
+ SymbolsToAnalyze->getNumberBranchesAlwaysTaken(symbolSetName) +
+ SymbolsToAnalyze->getNumberBranchesNeverTaken(symbolSetName) +
+ (SymbolsToAnalyze->getNumberBranchesNotExecuted(symbolSetName) * 2)
);
- percentageBranches /= (double) SymbolsToAnalyze->getNumberBranchesFound() * 2;
+ percentageBranches /=
+ (double) SymbolsToAnalyze->getNumberBranchesFound(symbolSetName) * 2;
percentageBranches *= 100.0;
fprintf( report, "Bytes Analyzed : %d\n", totalBytes );
@@ -504,48 +519,48 @@ void ReportsBase::WriteSummaryReport(
fprintf(
report,
"Unreferenced Symbols : %d\n",
- SymbolsToAnalyze->getNumberUnreferencedSymbols()
+ SymbolsToAnalyze->getNumberUnreferencedSymbols(symbolSetName)
);
fprintf(
report,
"Uncovered ranges found : %d\n\n",
- SymbolsToAnalyze->getNumberUncoveredRanges()
+ SymbolsToAnalyze->getNumberUncoveredRanges(symbolSetName)
);
- if ((SymbolsToAnalyze->getNumberBranchesFound() == 0) ||
+ if ((SymbolsToAnalyze->getNumberBranchesFound(symbolSetName) == 0) ||
(BranchInfoAvailable == false) ) {
fprintf( report, "No branch information available\n" );
} else {
fprintf(
report,
"Total conditional branches found : %d\n",
- SymbolsToAnalyze->getNumberBranchesFound()
+ SymbolsToAnalyze->getNumberBranchesFound(symbolSetName)
);
fprintf(
report,
"Total branch paths found : %d\n",
- SymbolsToAnalyze->getNumberBranchesFound() * 2
+ SymbolsToAnalyze->getNumberBranchesFound(symbolSetName) * 2
);
fprintf(
report,
"Uncovered branch paths found : %d\n",
- SymbolsToAnalyze->getNumberBranchesAlwaysTaken() +
- SymbolsToAnalyze->getNumberBranchesNeverTaken() +
- (SymbolsToAnalyze->getNumberBranchesNotExecuted() * 2)
+ SymbolsToAnalyze->getNumberBranchesAlwaysTaken(symbolSetName) +
+ SymbolsToAnalyze->getNumberBranchesNeverTaken(symbolSetName) +
+ (SymbolsToAnalyze->getNumberBranchesNotExecuted(symbolSetName) * 2)
);
fprintf(
report,
" %d branches always taken\n",
- SymbolsToAnalyze->getNumberBranchesAlwaysTaken()
+ SymbolsToAnalyze->getNumberBranchesAlwaysTaken(symbolSetName)
);
fprintf(
report,
" %d branches never taken\n",
- SymbolsToAnalyze->getNumberBranchesNeverTaken()
+ SymbolsToAnalyze->getNumberBranchesNeverTaken(symbolSetName)
);
fprintf(
report,
" %d branch paths not executed\n",
- SymbolsToAnalyze->getNumberBranchesNotExecuted() * 2
+ SymbolsToAnalyze->getNumberBranchesNotExecuted(symbolSetName) * 2
);
fprintf(
report,
@@ -555,7 +570,7 @@ void ReportsBase::WriteSummaryReport(
}
}
-void GenerateReports()
+void GenerateReports(const std::string& symbolSetName)
{
typedef std::list<ReportsBase *> reportList_t;
@@ -568,9 +583,9 @@ void GenerateReports()
timestamp = time(NULL); /* get current cal time */
- reports = new ReportsText(timestamp);
+ reports = new ReportsText(timestamp, symbolSetName);
reportList.push_back(reports);
- reports = new ReportsHtml(timestamp);
+ reports = new ReportsHtml(timestamp, symbolSetName);
reportList.push_back(reports);
for (ritr = reportList.begin(); ritr != reportList.end(); ritr++ ) {
@@ -624,7 +639,7 @@ void GenerateReports()
delete reports;
}
- ReportsBase::WriteSummaryReport( "summary.txt" );
+ ReportsBase::WriteSummaryReport( "summary.txt", symbolSetName.c_str() );
}
}