<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>change log for gcc-testing (2010-05-06)</title>
</head>
<body text='#000000' bgcolor='#ffffff'>
<a name='cs1'></a>
<table border='0' cellspacing='0' cellpadding='5' width='100%' bgcolor='#eeeeee'>
<tr><td colspan='3' bgcolor='#dddddd'>
<font color='#bb2222'><strong>jennifer</strong></font>
</td></tr>
<tr><td colspan='3' bgcolor='#dddddd'><pre>2010-05-06 Jennifer.Averett <Jennifer.Averett>
* Makefile, covoar.cc: Split Reports into a Report Base and Report Text
file to make room for a design allowing multiple types of reported
files.
* ReportsBase.cc, ReportsBase.h, ReportsText.cc, ReportsText.h: New
files.
* Reports.cc, Reports.h: Removed.
</pre></td></tr>
<tr><td width='1%'><a href="http://www.rtems.com/cgi-bin/viewcvs.cgi//gcc-testing/rtems-coverage/ChangeLog.diff?r1=text&tr1=1.200&r2=text&tr2=1.201&diff_format=h">M</a></td><td width='1%'>1.201</td><td width='100%'>rtems-coverage/ChangeLog</td></tr>
<tr><td width='1%'><a href="http://www.rtems.com/cgi-bin/viewcvs.cgi//gcc-testing/rtems-coverage/Makefile.diff?r1=text&tr1=1.17&r2=text&tr2=1.18&diff_format=h">M</a></td><td width='1%'>1.18</td><td width='100%'>rtems-coverage/Makefile</td></tr>
<tr><td width='1%'><a href="http://www.rtems.com/cgi-bin/viewcvs.cgi//gcc-testing/rtems-coverage/Reports.h?rev=1.2&content-type=text/vnd.viewcvs-markup">R</a></td><td width='1%'><font color="#880000">1.2</font></td><td width='100%'><font color="#880000">rtems-coverage/Reports.h</font></td></tr>
<tr><td width='1%'><a href="http://www.rtems.com/cgi-bin/viewcvs.cgi//gcc-testing/rtems-coverage/Reports.cc?rev=1.3&content-type=text/vnd.viewcvs-markup">R</a></td><td width='1%'><font color="#880000">1.3</font></td><td width='100%'><font color="#880000">rtems-coverage/Reports.cc</font></td></tr>
<tr><td width='1%'><a href="http://www.rtems.com/cgi-bin/viewcvs.cgi//gcc-testing/rtems-coverage/ReportsBase.h?rev=1.1&content-type=text/vnd.viewcvs-markup">A</a></td><td width='1%'><font color="#000088">1.1</font></td><td width='100%'><font color="#000088">rtems-coverage/ReportsBase.h</font></td></tr>
<tr><td width='1%'><a href="http://www.rtems.com/cgi-bin/viewcvs.cgi//gcc-testing/rtems-coverage/ReportsBase.cc?rev=1.1&content-type=text/vnd.viewcvs-markup">A</a></td><td width='1%'><font color="#000088">1.1</font></td><td width='100%'><font color="#000088">rtems-coverage/ReportsBase.cc</font></td></tr>
<tr><td width='1%'><a href="http://www.rtems.com/cgi-bin/viewcvs.cgi//gcc-testing/rtems-coverage/ReportsText.h?rev=1.1&content-type=text/vnd.viewcvs-markup">A</a></td><td width='1%'><font color="#000088">1.1</font></td><td width='100%'><font color="#000088">rtems-coverage/ReportsText.h</font></td></tr>
<tr><td width='1%'><a href="http://www.rtems.com/cgi-bin/viewcvs.cgi//gcc-testing/rtems-coverage/ReportsText.cc?rev=1.1&content-type=text/vnd.viewcvs-markup">A</a></td><td width='1%'><font color="#000088">1.1</font></td><td width='100%'><font color="#000088">rtems-coverage/ReportsText.cc</font></td></tr>
<tr><td width='1%'><a href="http://www.rtems.com/cgi-bin/viewcvs.cgi//gcc-testing/rtems-coverage/covoar.cc.diff?r1=text&tr1=1.12&r2=text&tr2=1.13&diff_format=h">M</a></td><td width='1%'>1.13</td><td width='100%'>rtems-coverage/covoar.cc</td></tr>
</table>
<pre>
<font color='#006600'>diff -u gcc-testing/rtems-coverage/ChangeLog:1.200 gcc-testing/rtems-coverage/ChangeLog:1.201
--- gcc-testing/rtems-coverage/ChangeLog:1.200 Thu May 6 10:10:45 2010
+++ gcc-testing/rtems-coverage/ChangeLog Thu May 6 12:54:12 2010
</font><font color='#997700'>@@ -1,3 +1,12 @@
</font><font color='#000088'>+2010-05-06 Jennifer.Averett <Jennifer.Averett>
+
+ * Makefile, covoar.cc: Split Reports into a Report Base and Report Text
+ file to make room for a design allowing multiple types of reported
+ files.
+ * ReportsBase.cc, ReportsBase.h, ReportsText.cc, ReportsText.h: New
+ files.
+ * Reports.cc, Reports.h: Removed.
+
</font> 2010-05-06 Joel Sherrill <joel.sherrill@oarcorp.com>
* covoar.cc: Fix typo that gives core dump.
<font color='#006600'>diff -u gcc-testing/rtems-coverage/Makefile:1.17 gcc-testing/rtems-coverage/Makefile:1.18
--- gcc-testing/rtems-coverage/Makefile:1.17 Wed May 5 18:09:36 2010
+++ gcc-testing/rtems-coverage/Makefile Thu May 6 12:54:12 2010
</font><font color='#997700'>@@ -25,7 +25,8 @@
</font> ExecutableInfo.o \
Explanations.o \
ObjdumpProcessor.o \
<font color='#880000'>- Reports.o \
</font><font color='#000088'>+ ReportsBase.o \
+ ReportsText.o \
</font> SymbolTable.o \
Target_arm.o \
TargetBase.o \
<font color='#997700'>@@ -118,8 +119,9 @@
</font> Explanations.o: Explanations.cc Explanations.h
ObjdumpProcessor.o: ObjdumpProcessor.cc ObjdumpProcessor.h ExecutableInfo.h \
TargetBase.h TargetFactory.h
<font color='#880000'>-Reports.o: Reports.cc Reports.h CoverageRanges.h DesiredSymbols.h \
</font><font color='#000088'>+ReportsBase.o: ReportsBase.cc ReportsBase.h CoverageRanges.h DesiredSymbols.h \
</font> Explanations.h ObjdumpProcessor.h
<font color='#000088'>+ReportsText.o: ReportsBase.h ReportsText.cc
</font> SymbolTable.o: SymbolTable.cc SymbolTable.h
Target_arm.o: Target_arm.cc Target_arm.h TargetBase.h
TargetBase.o: TargetBase.cc TargetBase.h
<font color='#006600'>diff -u /dev/null gcc-testing/rtems-coverage/ReportsBase.h:1.1
--- /dev/null Thu May 6 13:10:04 2010
+++ gcc-testing/rtems-coverage/ReportsBase.h Thu May 6 12:54:13 2010
</font><font color='#997700'>@@ -0,0 +1,164 @@
</font><font color='#000088'>+/*
+ * $Id$
+ */
+
+/*! @file Reports.h
+ * @brief Reports Specification
+ *
+ * This file contains the specification of the Reports methods. This
+ * collection of methods is used to generate the various reports of
+ * the analysis results.
+ */
+
+#ifndef __REPORTSBASE_H__
+#define __REPORTSBASE_H__
+
+#include <stdint.h>
+#include <string>
+#include "DesiredSymbols.h"
+
+namespace Coverage {
+
+
+class ReportsBase {
+
+ public:
+ ReportsBase();
+ ~ReportsBase();
+
+ /*!
+ * This method produces an annotated assembly listing report containing
+ * the disassembly of each symbol that was not completely covered.
+ *
+ * @param[in] fileName identifies the annotated report file name
+ */
+ void WriteAnnotatedReport(
+ const char* const fileName
+ );
+
+ /*!
+ * This method produces a report that contains information about each
+ * uncovered branch statement.
+ *
+ * @param[in] fileName identifies the branch report file name
+ */
+ void WriteBranchReport(
+ const char* const fileName
+ );
+
+ /*!
+ * This method produces a report that contains information about each
+ * uncovered range of bytes.
+ *
+ * @param[in] fileName identifies the coverage report file name
+ */
+ void WriteCoverageReport(
+ const char* const fileName
+ );
+
+ /*!
+ * This method produces a summary report that lists each uncovered
+ * range of bytes.
+ *
+ * @param[in] fileName identifies the size report file name
+ */
+ void WriteSizeReport(
+ const char* const fileName
+ );
+
+
+ std::string ReportExtension() { return reportExtension_m; }
+
+ protected:
+
+ typedef enum {
+ A_SOURCE,
+ A_EXECUTED,
+ A_NEVER_EXECUTED,
+ A_BRANCH_TAKEN,
+ A_BRANCH_NOT_TAKEN
+ }AnnotatedLineState_t;
+
+ std::string reportExtension_m;
+
+
+ FILE* OpenFile(
+ const char* const fileName
+ );
+
+ virtual FILE* OpenAnnotatedFile(
+ const char* const fileName
+ );
+
+ virtual FILE* OpenBranchFile(
+ const char* const fileName
+ );
+
+ virtual FILE* OpenCoverageFile(
+ const char* const fileName
+ );
+
+ virtual FILE* OpenSizeFile(
+ const char* const fileName
+ );
+
+ void CloseFile(
+ FILE* aFile
+ );
+
+ virtual void CloseAnnotatedFile(
+ FILE* aFile
+ );
+
+ virtual void CloseBranchFile(
+ FILE* aFile
+ );
+
+ virtual void CloseCoverageFile(
+ FILE* aFile
+ );
+
+ virtual void CloseSizeFile(
+ FILE* aFile
+ );
+
+ virtual void PutAnnotatedLine(<span style="background-color: #FF0000"> </span>
+ FILE* aFile,<span style="background-color: #FF0000"> </span>
+ AnnotatedLineState_t state,<span style="background-color: #FF0000"> </span>
+ std::string line<span style="background-color: #FF0000"> </span>
+ )=0;
+
+ virtual bool PutNoBranchInfo(
+ FILE* report
+ ) = 0;
+
+ virtual bool PutBranchEntry(
+ FILE* report,
+ Coverage::DesiredSymbols::symbolSet_t::iterator symbolPtr,
+ Coverage::CoverageRanges::ranges_t::iterator rangePtr
+ )=0;
+
+ virtual void putCoverageNoRange(
+ FILE* report,
+ std::string symbol
+ )=0;
+
+ virtual bool PutCoverageLine(
+ FILE* report,
+ Coverage::DesiredSymbols::symbolSet_t::iterator ditr,
+ Coverage::CoverageRanges::ranges_t::iterator ritr
+ )=0;
+
+ virtual bool PutSizeLine(
+ FILE* report,
+ Coverage::DesiredSymbols::symbolSet_t::iterator symbol,
+ Coverage::CoverageRanges::ranges_t::iterator range
+ )=0;
+
+};
+
+void GenerateReports();
+
+}
+
+#endif
</font>
<font color='#006600'>diff -u /dev/null gcc-testing/rtems-coverage/ReportsBase.cc:1.1
--- /dev/null Thu May 6 13:10:04 2010
+++ gcc-testing/rtems-coverage/ReportsBase.cc Thu May 6 12:54:13 2010
</font><font color='#997700'>@@ -0,0 +1,352 @@
</font><font color='#000088'>+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "ReportsBase.h"
+#include "app_common.h"
+#include "CoverageRanges.h"
+#include "DesiredSymbols.h"
+#include "Explanations.h"
+#include "ObjdumpProcessor.h"
+
+
+#include "ReportsText.h"
+
+namespace Coverage {
+
+ReportsBase::ReportsBase():
+ reportExtension_m("")
+{
+}
+
+ReportsBase::~ReportsBase()
+{
+}
+
+
+FILE* ReportsBase::OpenFile(
+ const char* const fileName
+)
+{
+ FILE* aFile;
+
+ // Open the file.
+ aFile = fopen( fileName, "w" );
+ if ( !aFile ) {
+ fprintf(
+ stderr, "Unable to open %s\n", fileName
+ );
+ }
+ return aFile;
+}
+
+FILE* ReportsBase::OpenAnnotatedFile(
+ const char* const fileName
+)
+{
+ return OpenFile(fileName);
+}
+
+FILE* ReportsBase::OpenBranchFile(
+ const char* const fileName
+)
+{
+ return OpenFile(fileName);
+}
+
+FILE* ReportsBase::OpenCoverageFile(
+ const char* const fileName
+)
+{
+ return OpenFile(fileName);
+}
+
+FILE* ReportsBase::OpenSizeFile(
+ const char* const fileName
+)
+{
+ return OpenFile(fileName);
+}
+
+
+void ReportsBase::CloseFile(
+ FILE* aFile
+)
+{
+ fclose( aFile );
+}
+
+void ReportsBase::CloseAnnotatedFile(
+ FILE* aFile
+)
+{
+ CloseFile( aFile );
+}
+
+void ReportsBase::CloseBranchFile(
+ FILE* aFile
+)
+{
+ CloseFile( aFile );
+}
+
+void ReportsBase::CloseCoverageFile(
+ FILE* aFile
+)
+{
+ CloseFile( aFile );
+}
+
+void ReportsBase::CloseSizeFile(
+ FILE* aFile
+)
+{
+ CloseFile( aFile );
+}
+
+
+/*
+ * Write annotated report
+ */
+void ReportsBase::WriteAnnotatedReport(
+ const char* const fileName
+) {
+ FILE* aFile = NULL;
+ Coverage::DesiredSymbols::symbolSet_t::iterator ditr;
+ std::list<Coverage::ObjdumpProcessor::objdumpLine_t>* theInstructions;
+ std::list<Coverage::ObjdumpProcessor::objdumpLine_t>::iterator itr;
+ Coverage::CoverageMapBase* theCoverageMap = NULL;
+ uint32_t bAddress = 0;
+ AnnotatedLineState_t state;
+
+ aFile = OpenAnnotatedFile(fileName);
+ if (!aFile)
+ return;
+
+ // Process uncovered branches for each symbol.
+ for (ditr = SymbolsToAnalyze->set.begin();
+ ditr != SymbolsToAnalyze->set.end();
+ ditr++) {
+
+ // 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))
+ 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()))
+ continue;
+
+ theCoverageMap = ditr->second.unifiedCoverageMap;
+ bAddress = ditr->second.baseAddress;
+ theInstructions = &(ditr->second.instructions);
+
+ // Add annotations to each line where necessary
+ for (itr = theInstructions->begin();
+ itr != theInstructions->end();
+ itr++ ) {
+
+ std::string annotation = "";
+ std::string line;<span style="background-color: #FF0000"> </span>
+
+ state = A_SOURCE;
+
+ if ( itr->isInstruction ) {
+ if (!theCoverageMap->wasExecuted( itr->address - bAddress )){
+ annotation = "\t<== NOT EXECUTED";
+ state = A_NEVER_EXECUTED;
+ } else if (theCoverageMap->isBranch( itr->address - bAddress )) {
+ if (theCoverageMap->wasAlwaysTaken( itr->address - bAddress )){
+ annotation = "\t<== ALWAYS TAKEN";
+ state = A_BRANCH_TAKEN;
+ } else if (theCoverageMap->wasNeverTaken( itr->address - bAddress )){
+ annotation = "\t<== NEVER TAKEN";
+ state = A_BRANCH_NOT_TAKEN;
+ }
+ } else {
+ state = A_EXECUTED;
+ }
+ }
+
+<span style="background-color: #FF0000"> </span>
+ line = itr->line + annotation;
+ PutAnnotatedLine( aFile, state, line);<span style="background-color: #FF0000"> </span>
+ }
+ }
+
+ CloseAnnotatedFile( aFile );
+}
+
+/*
+ * Write branch report
+ */
+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;
+
+ // Open the branch report file
+ report = OpenBranchFile( fileName );
+ if (!report)
+ return;
+
+ // If no branches were found, then branch coverage is not supported
+ if (SymbolsToAnalyze->getNumberBranchesFound() == 0)
+ PutNoBranchInfo(report);
+
+ // If branches were found, ...
+ else {
+
+ // Process uncovered branches for each symbol.
+ for (ditr = SymbolsToAnalyze->set.begin();
+ ditr != SymbolsToAnalyze->set.end();
+ ditr++) {
+
+ theBranches = ditr->second.uncoveredBranches;
+
+ if (theBranches && !theBranches->set.empty()) {
+
+ for (ritr = theBranches->set.begin() ;
+ ritr != theBranches->set.end() ;
+ ritr++ ) {
+ PutBranchEntry( report, ditr, ritr );
+ }
+ }
+ }
+ }
+
+ CloseBranchFile( report );
+}
+
+/*
+ * Write coverage report
+ */
+void ReportsBase::WriteCoverageReport(
+ const char* const fileName
+) {
+ Coverage::DesiredSymbols::symbolSet_t::iterator ditr;
+ FILE* report;
+ Coverage::CoverageRanges::ranges_t::iterator ritr;
+ Coverage::CoverageRanges* theRanges;
+
+ // Open the coverage report file.
+ report = fopen( fileName, "w" );
+ if ( !report ) {
+ fprintf( stderr, "Unable to open %s\n\n", fileName );
+ return;
+ }
+
+ // Process uncovered ranges for each symbol.
+ for (ditr = SymbolsToAnalyze->set.begin();
+ ditr != SymbolsToAnalyze->set.end();
+ ditr++) {
+
+ theRanges = ditr->second.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, ditr->first );
+ }
+
+ else if (!theRanges->set.empty()) {
+
+ for (ritr = theRanges->set.begin() ;
+ ritr != theRanges->set.end() ;
+ ritr++ ) {
+
+ PutCoverageLine( report, ditr, ritr );
+ }
+ }
+ }
+
+ fclose( report );
+}
+
+/*
+ * Write size report
+ */
+void ReportsBase::WriteSizeReport(
+ const char* const fileName
+)<span style="background-color: #FF0000"> </span>
+{
+ Coverage::DesiredSymbols::symbolSet_t::iterator ditr;
+ FILE* report;
+ Coverage::CoverageRanges::ranges_t::iterator ritr;
+ Coverage::CoverageRanges* theRanges;
+
+ // Open the report file.
+ report = OpenSizeFile( fileName );
+ if ( !report ) {
+ return;
+ }
+
+ // Process uncovered ranges for each symbol.
+ for (ditr = SymbolsToAnalyze->set.begin();
+ ditr != SymbolsToAnalyze->set.end();
+ ditr++) {
+
+ theRanges = ditr->second.uncoveredRanges;
+
+ if (theRanges && !theRanges->set.empty()) {
+
+ for (ritr = theRanges->set.begin() ;
+ ritr != theRanges->set.end() ;
+ ritr++ ) {
+ PutSizeLine( report, ditr, ritr );
+ }
+ }
+ }
+
+ CloseSizeFile( report );
+}
+
+void GenerateReports()
+{
+ typedef std::list<ReportsBase *> reportList_t;
+
+ reportList_t reportList;
+ reportList_t::iterator ritr;
+ std::string reportName;
+ ReportsBase* reports;
+
+ reports = new ReportsText();
+ reportList.push_back(reports);
+
+
+ for (ritr = reportList.begin(); ritr != reportList.end(); ritr++ ) {
+ reports = *ritr;
+
+ reportName = "annotated" + reports->ReportExtension();
+ reports->WriteAnnotatedReport( reportName.c_str() );
+
+ reportName = "branch" + reports->ReportExtension();
+ reports->WriteBranchReport(reportName.c_str() );
+
+ reportName = "coverage" + reports->ReportExtension();
+ reports->WriteCoverageReport(reportName.c_str() );
+
+ reportName = "sizes" + reports->ReportExtension();
+ reports->WriteSizeReport(reportName.c_str() );
+
+ }
+
+ for (ritr = reportList.begin(); ritr != reportList.end(); ritr++ ) {
+ reports = *ritr;
+ delete reports;
+ }
+<span style="background-color: #FF0000"> </span>
+}
+
+}
</font>
<font color='#006600'>diff -u /dev/null gcc-testing/rtems-coverage/ReportsText.h:1.1
--- /dev/null Thu May 6 13:10:04 2010
+++ gcc-testing/rtems-coverage/ReportsText.h Thu May 6 12:54:13 2010
</font><font color='#997700'>@@ -0,0 +1,98 @@
</font><font color='#000088'>+/*
+ * $Id$
+ */
+
+/*! @file Reports.h
+ * @brief Reports Specification
+ *
+ * This file contains the specification of the Reports methods. This
+ * collection of methods is used to generate the various reports of
+ * the analysis results.
+ */
+
+#ifndef __REPORTSTEXT_H__
+#define __REPORTSTEXT_H__
+
+#include <stdint.h>
+#include "ReportsBase.h"
+
+namespace Coverage {
+
+class ReportsText: public ReportsBase {
+
+ public:
+ ReportsText();
+ ~ReportsText();
+
+ /*!
+ * This method produces a report that contains information about each
+ * uncovered branch statement.
+ *
+ * @param[in] fileName identifies the branch report file name
+ */
+ void WriteBranchReport(
+ const char* const fileName
+ );
+
+ /*!
+ * This method produces a report that contains information about each
+ * uncovered range of bytes.
+ *
+ * @param[in] fileName identifies the coverage report file name
+ */
+ void WriteCoverageReport(
+ const char* const fileName
+ );
+
+ /*!
+ * This method produces a summary report that lists each uncovered
+ * range of bytes.
+ *
+ * @param[in] fileName identifies the size report file name
+ */
+ void WriteSizeReport(
+ const char* const fileName
+ );
+
+ protected:
+
+ virtual void PutAnnotatedLine(<span style="background-color: #FF0000"> </span>
+ FILE* aFile,<span style="background-color: #FF0000"> </span>
+ AnnotatedLineState_t state,<span style="background-color: #FF0000"> </span>
+ std::string line<span style="background-color: #FF0000"> </span>
+ );
+
+ virtual bool PutNoBranchInfo(
+ FILE* report
+ );
+
+ virtual bool PutBranchEntry(
+ FILE* report,
+ Coverage::DesiredSymbols::symbolSet_t::iterator symbolPtr,
+ Coverage::CoverageRanges::ranges_t::iterator rangePtr
+ );
+
+ virtual void putCoverageNoRange(
+ FILE* report,
+ std::string symbol
+ );
+
+ virtual bool PutCoverageLine(
+ FILE* report,
+ Coverage::DesiredSymbols::symbolSet_t::iterator ditr,
+ Coverage::CoverageRanges::ranges_t::iterator ritr
+ );
+
+ virtual bool PutSizeLine(
+ FILE* report,
+ Coverage::DesiredSymbols::symbolSet_t::iterator symbol,
+ Coverage::CoverageRanges::ranges_t::iterator range
+ );
+
+
+
+};
+
+}
+
+#endif
</font>
<font color='#006600'>diff -u /dev/null gcc-testing/rtems-coverage/ReportsText.cc:1.1
--- /dev/null Thu May 6 13:10:04 2010
+++ gcc-testing/rtems-coverage/ReportsText.cc Thu May 6 12:54:13 2010
</font><font color='#997700'>@@ -0,0 +1,198 @@
</font><font color='#000088'>+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "ReportsText.h"
+#include "app_common.h"
+#include "CoverageRanges.h"
+#include "DesiredSymbols.h"
+#include "Explanations.h"
+#include "ObjdumpProcessor.h"
+
+
+namespace Coverage {
+
+ReportsText::ReportsText():
+ ReportsBase()
+{
+ reportExtension_m = ".txt";
+}
+
+void ReportsText::PutAnnotatedLine(<span style="background-color: #FF0000"> </span>
+ FILE* aFile,<span style="background-color: #FF0000"> </span>
+ AnnotatedLineState_t state,<span style="background-color: #FF0000"> </span>
+ std::string line<span style="background-color: #FF0000"> </span>
+)
+{
+ fprintf( aFile, "%s\n", line.c_str());
+}
+
+bool ReportsText::PutNoBranchInfo(
+ FILE* report
+)
+{
+ fprintf( report, "No branch information found\n" );
+ return true;
+}
+
+
+bool ReportsText::PutBranchEntry(
+ FILE* report,
+ Coverage::DesiredSymbols::symbolSet_t::iterator symbolPtr,
+ Coverage::CoverageRanges::ranges_t::iterator rangePtr
+)
+{
+ const Coverage::Explanation* explanation;
+
+ // Add an entry to the report
+ fprintf(
+ report,
+ "============================================\n"
+ "Symbol : %s (0x%x)\n"
+ "Line : %s (0x%x)\n"
+ "Size in Bytes : %d\n",
+ symbolPtr->first.c_str(),
+ symbolPtr->second.baseAddress,
+ rangePtr->lowSourceLine.c_str(),
+ rangePtr->lowAddress,
+ rangePtr->highAddress - rangePtr->lowAddress + 1
+ );
+
+ if (rangePtr->reason ==
+ Coverage::CoverageRanges::UNCOVERED_REASON_BRANCH_ALWAYS_TAKEN)
+ fprintf(
+ report, "Reason : %s\n\n", "ALWAYS TAKEN"
+ );
+ else if (rangePtr->reason ==
+ Coverage::CoverageRanges::UNCOVERED_REASON_BRANCH_NEVER_TAKEN)
+ fprintf( report, "Reason : %s\n\n", "NEVER TAKEN" );
+
+ // See if an explanation is available
+ explanation = AllExplanations->lookupExplanation( rangePtr->lowSourceLine );
+
+ if ( !explanation ) {
+ fprintf(
+ report,
+ "Classification: NONE\n"
+ "\n"
+ "Explanation:\n"
+ "No Explanation\n"
+ );
+ } else {
+ fprintf(
+ report,
+ "Classification: %s\n"
+ "\n"
+ "Explanation:\n",
+ explanation->classification.c_str()
+ );
+
+ for ( unsigned int i=0 ;
+ i < explanation->explanation.size();
+ i++) {
+ fprintf(
+ report,
+ "%s\n",
+ explanation->explanation[i].c_str()
+ );
+ }
+ }
+
+ fprintf(
+ report, "============================================\n"
+ );
+
+ return true;
+}
+
+void ReportsText::putCoverageNoRange(
+ FILE* report,
+ std::string symbol
+)
+{
+ fprintf(
+ report,
+ "============================================\n"
+ "Symbol : %s\n\n"
+ " *** NEVER REFERENCED ***\n\n"
+ "This symbol was never referenced by an analyzed executable.\n"
+ "Therefore there is no size or disassembly for this symbol.\n"
+ "This could be due to symbol misspelling or lack of a test for\n"
+ "this symbol.\n"
+ "============================================\n",
+ symbol.c_str()
+ );
+}
+
+bool ReportsText::PutCoverageLine(
+ FILE* report,
+ Coverage::DesiredSymbols::symbolSet_t::iterator ditr,
+ Coverage::CoverageRanges::ranges_t::iterator ritr
+)
+{
+ const Coverage::Explanation* explanation;
+
+ fprintf(
+ report,
+ "============================================\n"
+ "Symbol : %s (0x%x)\n"
+ "Starting Line : %s (0x%x)\n"
+ "Ending Line : %s (0x%x)\n"
+ "Size in Bytes : %d\n\n",
+ ditr->first.c_str(),
+ ditr->second.baseAddress,
+ ritr->lowSourceLine.c_str(),
+ ritr->lowAddress,
+ ritr->highSourceLine.c_str(),
+ ritr->highAddress,
+ ritr->highAddress - ritr->lowAddress + 1
+ );
+
+ explanation = AllExplanations->lookupExplanation( ritr->lowSourceLine );
+
+ if ( !explanation ) {
+ fprintf(
+ report,
+ "Classification: NONE\n"
+ "\n"
+ "Explanation:\n"
+ "No Explanation\n"
+ );
+ } else {
+ fprintf(
+ report,
+ "Classification: %s\n"
+ "\n"
+ "Explanation:\n",
+ explanation->classification.c_str()
+ );
+
+ for ( unsigned int i=0; i < explanation->explanation.size(); i++) {
+ fprintf( report,"%s\n", explanation->explanation[i].c_str() );
+ }
+ }
+
+ fprintf(report, "============================================\n");
+ return true;
+}
+
+bool ReportsText::PutSizeLine(
+ FILE* report,
+ Coverage::DesiredSymbols::symbolSet_t::iterator symbol,
+ Coverage::CoverageRanges::ranges_t::iterator range
+)
+{
+ fprintf(
+ report,
+ "%d\t%s\t%s\n",
+ range->highAddress - range->lowAddress + 1,
+ symbol->first.c_str(),
+ range->lowSourceLine.c_str()
+ );
+ return true;
+}
+
+}
</font>
<font color='#006600'>diff -u gcc-testing/rtems-coverage/covoar.cc:1.12 gcc-testing/rtems-coverage/covoar.cc:1.13
--- gcc-testing/rtems-coverage/covoar.cc:1.12 Thu May 6 10:10:45 2010
+++ gcc-testing/rtems-coverage/covoar.cc Thu May 6 12:54:13 2010
</font><font color='#997700'>@@ -23,18 +23,16 @@
</font> #include "ExecutableInfo.h"
#include "Explanations.h"
#include "ObjdumpProcessor.h"
<font color='#880000'>-#include "Reports.h"
</font><font color='#000088'>+#include "ReportsBase.h"
</font>
/*
* Variables to control general behavior
*/
<font color='#880000'>-const char* branchReportFile = "branch.txt";
</font> char* coverageFileExtension = NULL;
std::list<std::string> coverageFileNames;
int coverageExtensionLength = 0;
Coverage::CoverageFormats_t coverageFormat;
Coverage::CoverageReaderBase* coverageReader = NULL;
<font color='#880000'>-const char* coverageReportFile = "uncovered.txt";
</font> char* executable = NULL;
char* executableExtension = NULL;
int executableExtensionLength = 0;
<font color='#997700'>@@ -42,7 +40,6 @@
</font> const char* explanations = NULL;
char* progname;
bool singleExecutable = false;
<font color='#880000'>-const char* sizeReportFile = "sizes.txt";
</font> const char* symbolsFile = NULL;
const char* target = NULL;
const char* format = NULL;
<font color='#997700'>@@ -365,26 +362,7 @@
</font> //
// Report the coverage data.
//
<font color='#880000'>-
- // Generate report of ranges not executed.
- if (Verbose)
- fprintf( stderr, "Writing coverage report (%s)\n", coverageReportFile );
- Coverage::WriteCoverageReport( coverageReportFile );
-
- // Generate report of branches taken/not taken.
- if (Verbose)
- fprintf( stderr, "Writing branch report (%s)\n", branchReportFile );
- Coverage::WriteBranchReport( branchReportFile );
-
- // Generate report of range sizes.
- if (Verbose)
- fprintf( stderr, "Writing size report (%s)\n", sizeReportFile );
- Coverage::WriteSizeReport( sizeReportFile );
-
- // Generate annotated assembly file
- if (Verbose)
- fprintf( stderr, "Writing annotated report (%s)\n", "annotated.txt" );
- Coverage::WriteAnnotatedReport( "annotated.txt" );
</font><font color='#000088'>+ Coverage::GenerateReports();
</font>
// Write explanations that were not found.
if ( explanations ) {
</pre>
<p> </p>
<p>--<br />
<small>Generated by <a href="http://www.codewiz.org/projects/index.html#loginfo">Deluxe Loginfo</a> 2.122 by Bernardo Innocenti <bernie@develer.com></small></p>
</body>
</html>