[PATCH 4/9] covoar: Add information to improve diagnostics.

Cillian O'Donnell cpodonnell8 at gmail.com
Fri Aug 25 21:53:27 UTC 2017


From: Hermann Felbinger <hermann19829 at gmail.com>

---
 tester/covoar/CoverageMap.cc      |  7 ++++---
 tester/covoar/CoverageMap.h       |  5 +++--
 tester/covoar/CoverageMapBase.cc  |  6 ++++--
 tester/covoar/CoverageMapBase.h   | 11 +++++++++--
 tester/covoar/DesiredSymbols.cc   | 25 ++++++++++++++++++-------
 tester/covoar/DesiredSymbols.h    | 25 ++++++++++++++-----------
 tester/covoar/ExecutableInfo.cc   |  3 ++-
 tester/covoar/ExecutableInfo.h    |  2 ++
 tester/covoar/ObjdumpProcessor.cc | 21 +++++++++++----------
 9 files changed, 67 insertions(+), 38 deletions(-)

diff --git a/tester/covoar/CoverageMap.cc b/tester/covoar/CoverageMap.cc
index 816be11..b470fea 100644
--- a/tester/covoar/CoverageMap.cc
+++ b/tester/covoar/CoverageMap.cc
@@ -10,9 +10,10 @@
 namespace Coverage {
 
   CoverageMap::CoverageMap(
-    uint32_t low,
-    uint32_t high
-  ) : CoverageMapBase(low, high)
+    const std::string& exefileName,
+    uint32_t           low,
+    uint32_t           high
+  ) : CoverageMapBase(exefileName, low, high)
   {
   }
 
diff --git a/tester/covoar/CoverageMap.h b/tester/covoar/CoverageMap.h
index 0f2f6d4..c211949 100644
--- a/tester/covoar/CoverageMap.h
+++ b/tester/covoar/CoverageMap.h
@@ -27,8 +27,9 @@ namespace Coverage {
      *  @param[in] high specifies the highest address of the coverage map.
      */
     CoverageMap(
-      uint32_t low,
-      uint32_t high
+      const std::string& exefileName,
+      uint32_t           low,
+      uint32_t           high
     );
 
     /* Inherit documentation from base class. */
diff --git a/tester/covoar/CoverageMapBase.cc b/tester/covoar/CoverageMapBase.cc
index 407ef5f..ed30603 100644
--- a/tester/covoar/CoverageMapBase.cc
+++ b/tester/covoar/CoverageMapBase.cc
@@ -16,13 +16,15 @@
 namespace Coverage {
 
   CoverageMapBase::CoverageMapBase(
-    uint32_t low,
-    uint32_t high
+    const std::string& exefileName,
+    uint32_t           low,
+    uint32_t           high
   )
   {
     uint32_t       a;
     AddressRange_t range;
 
+    range.fileName    = exefileName;
     range.lowAddress  = low;
     range.highAddress = high;
     RangeList.push_back( range );
diff --git a/tester/covoar/CoverageMapBase.h b/tester/covoar/CoverageMapBase.h
index 70b2b30..e1310c9 100644
--- a/tester/covoar/CoverageMapBase.h
+++ b/tester/covoar/CoverageMapBase.h
@@ -28,6 +28,11 @@ namespace Coverage {
      */
     typedef struct {
       /*!
+       *  This is the file from which this originated.
+       */
+      std::string fileName;
+
+      /*!
        *  This is the low address of the address map range.
        */
       uint32_t lowAddress;
@@ -48,12 +53,14 @@ namespace Coverage {
     /*! 
      *  This method constructs a CoverageMapBase instance.
      *
+     *  @param[in] exefileName specifies the executable this originated in
      *  @param[in] low specifies the lowest address of the coverage map
      *  @param[in] high specifies the highest address of the coverage map
      */
     CoverageMapBase(
-      uint32_t low,
-      uint32_t high
+      const std::string& exefileName,
+      uint32_t           low,
+      uint32_t           high
     );
 
     /*! 
diff --git a/tester/covoar/DesiredSymbols.cc b/tester/covoar/DesiredSymbols.cc
index b5032b4..60bc7f7 100644
--- a/tester/covoar/DesiredSymbols.cc
+++ b/tester/covoar/DesiredSymbols.cc
@@ -335,6 +335,7 @@ namespace Coverage {
 
 
   void DesiredSymbols::createCoverageMap(
+    const std::string& exefileName,
     const std::string& symbolName,
     uint32_t           size
   )
@@ -363,19 +364,27 @@ namespace Coverage {
       // ensure that the specified size matches the existing size.
       if (itr->second.stats.sizeInBytes != size) {
 
+        // Changed ERROR to INFO because size mismatch is not treated as
+        // error anymore.
+        // Set smallest size as size and continue.
+        // Update value for longer byte size.
+        // 2015-07-22
         fprintf(
           stderr,
-          "ERROR: DesiredSymbols::createCoverageMap - Attempt to create "
-          "unified coverage maps for %s with different sizes (%d != %d)\n",
+          "INFO: DesiredSymbols::createCoverageMap - Attempt to create "
+          "unified coverage maps for %s with different sizes (%s/%d != %s/%d)\n",
+
           symbolName.c_str(),
+          exefileName.c_str(),
           itr->second.stats.sizeInBytes,
+          itr->second.sourceFile->getFileName().c_str(),
           size
         );
+
         if ( itr->second.stats.sizeInBytes < size )
           itr->second.stats.sizeInBytes = size;
         else
           size = itr->second.stats.sizeInBytes;
-        // exit( -1 );
       }
     }
 
@@ -384,13 +393,14 @@ namespace Coverage {
 
       highAddress = size - 1;
 
-      aCoverageMap = new CoverageMap( 0, highAddress );
+      aCoverageMap = new CoverageMap( exefileName, 0, highAddress );
       if (!aCoverageMap) {
 
         fprintf(
           stderr,
           "ERROR: DesiredSymbols::createCoverageMap - Unable to allocate "
-          "coverage map for %s\n",
+          "coverage map for %s:%s\n",
+          exefileName.c_str(),
           symbolName.c_str()
         );
         exit( -1 );
@@ -653,6 +663,8 @@ namespace Coverage {
 
     // Ensure that the source and destination coverage maps
     // are the same size.
+    // Changed from ERROR msg to INFO, because size mismatch is not
+    // treated as error anymore. 2015-07-20
     dMapSize = itr->second.stats.sizeInBytes;
     sBaseAddress = sourceCoverageMap->getFirstLowAddress();
     sMapSize = sourceCoverageMap->getSize();
@@ -660,12 +672,11 @@ namespace Coverage {
 
       fprintf(
         stderr,
-        "ERROR: DesiredSymbols::mergeCoverageMap - Unable to merge "
+        "INFO: DesiredSymbols::mergeCoverageMap - Unable to merge "
         "coverage map for %s because the sizes are different\n",
         symbolName.c_str()
       );
       return;
-      // exit( -1 );
     }
 
     // Merge the data for each address.
diff --git a/tester/covoar/DesiredSymbols.h b/tester/covoar/DesiredSymbols.h
index 448f263..9524c64 100644
--- a/tester/covoar/DesiredSymbols.h
+++ b/tester/covoar/DesiredSymbols.h
@@ -20,8 +20,8 @@
 namespace Coverage {
 
 
-  /*! 
-   * 
+  /*!
+   *
    *  This class defines the statistics that are tracked.
    */
   class Statistics {
@@ -34,7 +34,7 @@ namespace Coverage {
     int branchesAlwaysTaken;
 
     /*!
-     *  This member variable contains the total number of branches where 
+     *  This member variable contains the total number of branches where
      *  one or more paths were executed.
      */
     int branchesExecuted;
@@ -55,7 +55,7 @@ namespace Coverage {
      *  This member contains the size in Bytes.
      */
     uint32_t sizeInBytes;
-    
+
     /*!
      *  This member contains the size in Bytes.
      */
@@ -93,7 +93,7 @@ namespace Coverage {
 
     /*!
      *  This method constructs a Statistics instance.
-     */   
+     */
      Statistics():
        branchesAlwaysTaken(0),
        branchesExecuted(0),
@@ -137,7 +137,7 @@ namespace Coverage {
 
     /*!
      *  This member contains the statistics kept on each symbol.
-     */    
+     */
     Statistics stats;
 
     /*!
@@ -186,24 +186,24 @@ namespace Coverage {
     typedef std::map<std::string, SymbolInformation> symbolSet_t;
 
     /*!
-     *  This variable contains a map of symbol sets for each 
+     *  This variable contains a map of symbol sets for each
      *  symbol in the system keyed on the symbol name.
      */
     symbolSet_t set;
 
-    /*! 
+    /*!
      *  This method constructs a DesiredSymbols instance.
      */
     DesiredSymbols();
 
-    /*! 
+    /*!
      *  This method destructs a DesiredSymbols instance.
      */
     ~DesiredSymbols();
 
     /*!
      *  This method loops through the coverage map and
-     *  calculates the statistics that have not already 
+     *  calculates the statistics that have not already
      *  been filled in.
      */
     void calculateStatistics( void );
@@ -218,11 +218,14 @@ namespace Coverage {
      *  This method creates a coverage map for the specified symbol
      *  using the specified size.
      *
+     *  @param[in] exefileName specifies the executable from which the
+     *             coverage map is being created
      *  @param[in] symbolName specifies the symbol for which to create
      *             a coverage map
      *  @param[in] size specifies the size of the coverage map to create
      */
     void createCoverageMap(
+      const std::string& exefileName,
       const std::string& symbolName,
       uint32_t           size
     );
@@ -316,7 +319,7 @@ namespace Coverage {
 
     /*!
      *  This member contains the statistics kept on each symbol.
-     */    
+     */
     Statistics stats;
 
   private:
diff --git a/tester/covoar/ExecutableInfo.cc b/tester/covoar/ExecutableInfo.cc
index 0a7eac3..d71c435 100644
--- a/tester/covoar/ExecutableInfo.cc
+++ b/tester/covoar/ExecutableInfo.cc
@@ -89,6 +89,7 @@ namespace Coverage {
   }
 
   CoverageMapBase* ExecutableInfo::createCoverageMap (
+    const std::string& fileName,
     const std::string& symbolName,
     uint32_t           lowAddress,
     uint32_t           highAddress
@@ -99,7 +100,7 @@ namespace Coverage {
 
     itr = coverageMaps.find( symbolName );
     if ( itr == coverageMaps.end() ) {
-      theMap = new CoverageMap( lowAddress, highAddress );
+      theMap = new CoverageMap( fileName, lowAddress, highAddress );
       coverageMaps[ symbolName ] = theMap;
     } else {
       theMap = itr->second;
diff --git a/tester/covoar/ExecutableInfo.h b/tester/covoar/ExecutableInfo.h
index ca4184a..7242715 100644
--- a/tester/covoar/ExecutableInfo.h
+++ b/tester/covoar/ExecutableInfo.h
@@ -93,6 +93,7 @@ namespace Coverage {
     /*!
      *  This method creates a coverage map for the specified symbol.
      *
+     *  @param[in] exefileName specifies the source of the information
      *  @param[in] symbolName specifies the name of the symbol
      *  @param[in] lowAddress specifies the low address of the coverage map
      *  @param[in] highAddress specifies the high address of the coverage map
@@ -100,6 +101,7 @@ namespace Coverage {
      *  @return Returns a pointer to the coverage map
      */
     CoverageMapBase* createCoverageMap (
+      const std::string& exefileName,
       const std::string& symbolName,
       uint32_t           lowAddress,
       uint32_t           highAddress
diff --git a/tester/covoar/ObjdumpProcessor.cc b/tester/covoar/ObjdumpProcessor.cc
index 486c720..262c0a5 100644
--- a/tester/covoar/ObjdumpProcessor.cc
+++ b/tester/covoar/ObjdumpProcessor.cc
@@ -3,7 +3,7 @@
  *
  *  This file contains the implementation of the functions supporting
  *  the reading of an objdump output file and adding nops to a
- *  coverage map. 
+ *  coverage map.
  */
 
 #include <assert.h>
@@ -97,7 +97,7 @@ namespace Coverage {
 
     // Create a coverage map for the symbol.
     aCoverageMap = executableInfo->createCoverageMap(
-      symbolName, lowAddress, endAddress
+      executableInfo->getFileName().c_str(), symbolName, lowAddress, endAddress
     );
 
     if (aCoverageMap) {
@@ -112,7 +112,8 @@ namespace Coverage {
 
       // Create a unified coverage map for the symbol.
       SymbolsToAnalyze->createCoverageMap(
-        symbolName, endAddress - lowAddress + 1
+        executableInfo->getFileName().c_str(), symbolName,
+        endAddress - lowAddress + 1
       );
     }
   }
@@ -170,7 +171,7 @@ namespace Coverage {
       std::string tmp = inLibName;
       if ( tmp.find( Library ) != tmp.npos ) {
         // fprintf( stderr, "%s - 0x%08x\n", inLibName, offset );
-        address = offset; 
+        address = offset;
         break;
       }
     }
@@ -182,9 +183,9 @@ namespace Coverage {
   }
 
   bool ObjdumpProcessor::IsBranch(
-    const char *instruction 
+    const char *instruction
   )
-  { 
+  {
     if ( !TargetInfo ) {
       fprintf(
         stderr,
@@ -230,7 +231,7 @@ namespace Coverage {
     return TargetInfo->isNopLine( line, size );
   }
 
-  FILE* ObjdumpProcessor::getFile( std::string fileName ) 
+  FILE* ObjdumpProcessor::getFile( std::string fileName )
   {
     char               dumpFile[128];
     FILE*              objdumpFile;
@@ -238,7 +239,7 @@ namespace Coverage {
     int                status;
 
     sprintf( dumpFile, "%s.dmp", fileName.c_str() );
-      
+
     // Generate the objdump.
     if (FileIsNewer( fileName.c_str(), dumpFile )) {
       sprintf(
@@ -259,7 +260,7 @@ namespace Coverage {
         );
         exit( -1 );
       }
-    } 
+    }
 
     // Open the objdump file.
     objdumpFile = fopen( dumpFile, "r" );
@@ -283,7 +284,7 @@ namespace Coverage {
     if (itr == objdumpList.end()) {
       return 0;
     }
-    
+
     itr++;
     if (itr == objdumpList.end()) {
       return 0;
-- 
2.7.4




More information about the devel mailing list