[PATCH v6 1/2] covoar: Fix NOP execution marking

Alexander White alexanderjwhite at gmail.com
Fri Mar 26 02:38:04 UTC 2021


On Thu, Mar 25, 2021 at 9:25 PM Chris Johns <chrisj at rtems.org> wrote:
>
> On 26/3/21 10:28 am, Alex White wrote:
> > On Thu, Mar 25, 2021 at 6:10 PM Chris Johns <chrisj at rtems.org> wrote:
> >>
> >> On 26/3/21 8:49 am, Alex White wrote:
> >>> Some NOP instructions were not being marked as executed because they
> >>> are located at the end of uncovered ranges. This has been fixed.
> >>> ---
> >>>  tester/covoar/CoverageMapBase.cc  |  10 +++
> >>>  tester/covoar/CoverageMapBase.h   |   4 ++
> >>>  tester/covoar/DesiredSymbols.cc   |  38 +++++++++--
> >>>  tester/covoar/DesiredSymbols.h    |  11 +++-
> >>>  tester/covoar/ExecutableInfo.cc   |   2 +-
> >>>  tester/covoar/ExecutableInfo.h    |   4 ++
> >>>  tester/covoar/ObjdumpProcessor.cc | 105 ++++++++++++++++++++++--------
> >>>  7 files changed, 138 insertions(+), 36 deletions(-)
> >>>
> >>> diff --git a/tester/covoar/CoverageMapBase.cc b/tester/covoar/CoverageMapBase.cc
> >>> index ad0080d..6ca5cf7 100644
> >>> --- a/tester/covoar/CoverageMapBase.cc
> >>> +++ b/tester/covoar/CoverageMapBase.cc
> >>> @@ -142,6 +142,11 @@ namespace Coverage {
> >>>      return size;
> >>>    }
> >>>
> >>> +  uint32_t CoverageMapBase::getSizeOfRange( size_t index ) const
> >>> +  {
> >>> +    return Ranges.at(index).size();
> >>> +  }
> >>> +
> >>>    bool CoverageMapBase::getBeginningOfInstruction(
> >>>      uint32_t  address,
> >>>      uint32_t* beginning
> >>> @@ -178,6 +183,11 @@ namespace Coverage {
> >>>      return Ranges.front().lowAddress;
> >>>    }
> >>>
> >>> +  uint32_t CoverageMapBase::getLowAddressOfRange( size_t index ) const
> >>> +  {
> >>> +    return Ranges.at(index).lowAddress;
> >>> +  }
> >>> +
> >>>    bool CoverageMapBase::getRange( uint32_t address, AddressRange& range ) const
> >>>    {
> >>>      for ( auto r : Ranges ) {
> >>> diff --git a/tester/covoar/CoverageMapBase.h b/tester/covoar/CoverageMapBase.h
> >>> index 6ad76d3..a58c696 100644
> >>> --- a/tester/covoar/CoverageMapBase.h
> >>> +++ b/tester/covoar/CoverageMapBase.h
> >>> @@ -156,6 +156,8 @@ namespace Coverage {
> >>>       */
> >>>      int32_t getFirstLowAddress() const;
> >>>
> >>> +    uint32_t getLowAddressOfRange( size_t index ) const;
> >>> +
> >>>      /*!
> >>>       *  This method returns true and sets the address range if
> >>>       *  the address falls with the bounds of an address range
> >>> @@ -177,6 +179,8 @@ namespace Coverage {
> >>>       */
> >>>      uint32_t getSize() const;
> >>>
> >>> +    uint32_t getSizeOfRange( size_t index ) const;
> >>> +
> >>>      /*!
> >>>       *  This method returns the address of the beginning of the
> >>>       *  instruction that contains the specified address.
> >>> diff --git a/tester/covoar/DesiredSymbols.cc b/tester/covoar/DesiredSymbols.cc
> >>> index b9a5bb7..c97b25c 100644
> >>> --- a/tester/covoar/DesiredSymbols.cc
> >>> +++ b/tester/covoar/DesiredSymbols.cc
> >>> @@ -142,7 +142,7 @@ namespace Coverage {
> >>>        CoverageMapBase* theCoverageMap = s.second.unifiedCoverageMap;
> >>>        if (theCoverageMap)
> >>>        {
> >>> -        // Increment the total sizeInBytes byt the bytes in the symbol
> >>> +        // Increment the total sizeInBytes by the bytes in the symbol
> >>>          stats.sizeInBytes += s.second.stats.sizeInBytes;
> >>>
> >>>          // Now scan through the coverage map of this symbol.
> >>> @@ -202,6 +202,26 @@ namespace Coverage {
> >>>          uint32_t count;
> >>>
> >>>          // Mark NOPs as executed
> >>> +        a = s.second.stats.sizeInBytes - 1;
> >>> +        count = 0;
> >>> +        while (a > 0) {
> >>> +          if (theCoverageMap->isStartOfInstruction( a )) {
> >>> +            break;
> >>> +          }
> >>> +
> >>> +          count++;
> >>> +
> >>> +          if (theCoverageMap->isNop( a )) {
> >>> +            for (la = a; la < (a + count); la++) {
> >>> +              theCoverageMap->setWasExecuted( la );
> >>> +            }
> >>> +
> >>> +            count = 0;
> >>> +          }
> >>> +
> >>> +          a--;
> >>> +        }
> >>> +
> >>>          endAddress = s.second.stats.sizeInBytes - 1;
> >>>          a = 0;
> >>>          while (a < endAddress) {
> >>> @@ -223,12 +243,13 @@ namespace Coverage {
> >>>                ha++;
> >>>                if ( ha >= endAddress )
> >>>                  break;
> >>> -            } while ( !theCoverageMap->isStartOfInstruction( ha ) );
> >>> +            } while ( !theCoverageMap->isStartOfInstruction( ha ) ||
> >>> +                      theCoverageMap->isNop( ha ) );
> >>>            a = ha;
> >>>          }
> >>>
> >>>          // Now scan through the coverage map of this symbol.
> >>> -        endAddress = s.second.stats.sizeInBytes - 1;
> >>> +        endAddress = s.second.stats.sizeInBytesWithoutNops - 1;
> >>>          a = 0;
> >>>          while (a <= endAddress) {
> >>>            // If an address was NOT executed, find consecutive unexecuted
> >>> @@ -316,7 +337,8 @@ namespace Coverage {
> >>>    void DesiredSymbols::createCoverageMap(
> >>>      const std::string& exefileName,
> >>>      const std::string& symbolName,
> >>> -    uint32_t           size
> >>> +    uint32_t           size,
> >>> +    uint32_t           sizeWithoutNops
> >>>    )
> >>>    {
> >>>      CoverageMapBase* aCoverageMap;
> >>> @@ -354,9 +376,10 @@ namespace Coverage {
> >>>                    << '/' << size << ')'
> >>>                    << std::endl;
> >>>
> >>> -        if ( itr->second.stats.sizeInBytes < size )
> >>> +        if ( itr->second.stats.sizeInBytes < size ) {
> >>>            itr->second.stats.sizeInBytes = size;
> >>> -        else
> >>> +          itr->second.stats.sizeInBytesWithoutNops = sizeWithoutNops;
> >>> +        } else
> >>>            size = itr->second.stats.sizeInBytes;
> >>>        }
> >>>      }
> >>> @@ -376,6 +399,7 @@ namespace Coverage {
> >>>          );
> >>>        itr->second.unifiedCoverageMap = aCoverageMap;
> >>>        itr->second.stats.sizeInBytes = size;
> >>> +      itr->second.stats.sizeInBytesWithoutNops = sizeWithoutNops;
> >>>      }
> >>>    }
> >>>
> >>> @@ -479,7 +503,7 @@ namespace Coverage {
> >>>      // are the same size.
> >>>      // Changed from ERROR msg to INFO, because size mismatch is not
> >>>      // treated as error anymore. 2015-07-20
> >>> -    uint32_t dMapSize = sinfo.stats.sizeInBytes;
> >>> +    uint32_t dMapSize = sinfo.stats.sizeInBytesWithoutNops;
> >>>      uint32_t sBaseAddress = sourceCoverageMap->getFirstLowAddress();
> >>>      uint32_t sMapSize = sourceCoverageMap->getSize();
> >>>      if (dMapSize != 0 && dMapSize != sMapSize) {
> >>> diff --git a/tester/covoar/DesiredSymbols.h b/tester/covoar/DesiredSymbols.h
> >>> index 5c45af8..367ca95 100644
> >>> --- a/tester/covoar/DesiredSymbols.h
> >>> +++ b/tester/covoar/DesiredSymbols.h
> >>> @@ -57,7 +57,12 @@ namespace Coverage {
> >>>      uint32_t sizeInBytes;
> >>>
> >>>      /*!
> >>> -     *  This member contains the size in Bytes.
> >>> +     *  This member contains the size in Bytes not accounting for NOPs.
> >>> +     */
> >>> +    uint32_t sizeInBytesWithoutNops;
> >>> +
> >>> +    /*!
> >>> +     *  This member contains the size in instructions.
> >>>       */
> >>>      uint32_t sizeInInstructions;
> >>>
> >>> @@ -100,6 +105,7 @@ namespace Coverage {
> >>>         branchesNeverTaken(0),
> >>>         branchesNotExecuted(0),
> >>>         sizeInBytes(0),
> >>> +       sizeInBytesWithoutNops(0),
> >>>         sizeInInstructions(0),
> >>>         uncoveredBytes(0),
> >>>         uncoveredInstructions(0),
> >>> @@ -227,7 +233,8 @@ namespace Coverage {
> >>>      void createCoverageMap(
> >>>        const std::string& exefileName,
> >>>        const std::string& symbolName,
> >>> -      uint32_t           size
> >>> +      uint32_t           size,
> >>> +      uint32_t           sizeWithoutNops
> >>>      );
> >>>
> >>>      /*!
> >>> diff --git a/tester/covoar/ExecutableInfo.cc b/tester/covoar/ExecutableInfo.cc
> >>> index c593e1d..ddd2987 100644
> >>> --- a/tester/covoar/ExecutableInfo.cc
> >>> +++ b/tester/covoar/ExecutableInfo.cc
> >>> @@ -127,7 +127,7 @@ namespace Coverage {
> >>>    {
> >>>      CoverageMaps::iterator cmi = coverageMaps.find( symbolName );
> >>>      if ( cmi == coverageMaps.end() )
> >>> -      throw rld::error (symbolName, "ExecutableInfo::findCoverageMap");
> >>> +      throw CoverageMapNotFoundError(symbolName);
> >>>      return *(cmi->second);
> >>>    }
> >>>
> >>> diff --git a/tester/covoar/ExecutableInfo.h b/tester/covoar/ExecutableInfo.h
> >>> index dcb4dcb..ab74b7f 100644
> >>> --- a/tester/covoar/ExecutableInfo.h
> >>> +++ b/tester/covoar/ExecutableInfo.h
> >>> @@ -29,6 +29,10 @@ namespace Coverage {
> >>>
> >>>    public:
> >>>
> >>> +    class CoverageMapNotFoundError : public std::runtime_error {
> >>> +      using std::runtime_error::runtime_error;
> >>
> >> Ok sorry for raising C++ things (again) ....
> >>
> >> Why is `using` being used here?
> >>
> >> I do not use `using` anywhere execpt come special `chrono` related codes. I do
> >> not know `std::runtime_error::runtime_error` enough to know where it is being
> >> used in the code below. If those places had the full namespace I would.
> >
> > This usage of `using` was introduced in C++11. It makes the constructors in std::runtime_error::runtime_error visible to overload resolution when initializing CoverageMapNotFoundError.
> >
> > It's just a shortcut so that the constructors don't have to be redefined. It refers to the constructor `std::runtime_error::runtime_error`.
>
> Thanks for the explaination. Can I suggest a comment to this effect. ie Use the
> defined constructors?

I believe that would be helpful, yes. I'll add that.

Alex

>
> Chris
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list