[PATCH] covoar: Handle periods in symbols from objdump

Alex White alex.white at oarcorp.com
Mon Mar 15 21:26:00 UTC 2021


The exceptions are being used as legitimate error cases. The "what" messages that I use here are not helpful. I think that's why it looks like they're being used as labels. 

As part of a revision of my "covoar: Fix NOP execution marking" patch that I'll be sending out soon, this has been greatly simplified and a specific exception class has been defined.

I'll get v2 of this patch out, and that should clear the exception handling up.

Alex

-----Original Message-----
From: Chris Johns <chrisj at rtems.org> 
Sent: Sunday, March 14, 2021 8:01 PM
To: Alex White <alex.white at oarcorp.com>; devel at rtems.org
Subject: Re: [PATCH] covoar: Handle periods in symbols from objdump



On 13/3/21 3:37 am, Alex White wrote:
> Occasionally the compiler will generate symbols that look similar to 
> symbols defined in RTEMS code except that they contain some suffix.
> This looks to be related to compiler optimizations. Such symbols were 
> being treated as unique. For our purposes, they should be mapped to 
> the equivalent symbols in the DWARF info. This has been fixed.
> ---
>  tester/covoar/ExecutableInfo.cc   | 35 ++++++++++++++++++++++++++++++-
>  tester/covoar/ObjdumpProcessor.cc |  6 ++++++
>  tester/covoar/SymbolTable.cc      | 12 ++++++++---
>  3 files changed, 49 insertions(+), 4 deletions(-)
> 
> diff --git a/tester/covoar/ExecutableInfo.cc 
> b/tester/covoar/ExecutableInfo.cc index c4257f0..1396519 100644
> --- a/tester/covoar/ExecutableInfo.cc
> +++ b/tester/covoar/ExecutableInfo.cc
> @@ -119,6 +119,22 @@ namespace Coverage {
>      itsSymbol = theSymbolTable.getSymbol( address );
>      if (itsSymbol != "") {
>        it = coverageMaps.find( itsSymbol );
> +      if (it == coverageMaps.end()) {
> +        size_t periodIndex = itsSymbol.find(".");
> +
> +        if (periodIndex == std::string::npos) {
> +          // Symbol name has no '.', can't do another lookup.
> +          throw rld::error (itsSymbol, "ExecutableInfo::getCoverageMap");
> +        }
> +
> +        it = coverageMaps.find(
> +          itsSymbol.substr(0, periodIndex)
> +        );
> +
> +        if (it == coverageMaps.end()) {
> +          throw rld::error (itsSymbol, "ExecutableInfo::getCoverageMap");
> +        }
> +      }
>        aCoverageMap = (*it).second;
>      }
>  
> @@ -150,8 +166,25 @@ namespace Coverage {
>    )
>    {
>      CoverageMaps::iterator cmi = coverageMaps.find( symbolName );
> -    if ( cmi == coverageMaps.end() )
> +    if ( cmi != coverageMaps.end() ) {
> +      return *(cmi->second);
> +    }
> +
> +    size_t periodIndex = symbolName.find(".");
> +
> +    if (periodIndex == std::string::npos) {
> +      // Symbol name has no '.', can't do another lookup.
>        throw rld::error (symbolName, 
> "ExecutableInfo::findCoverageMap");
> +    }
> +
> +    cmi = coverageMaps.find(
> +      symbolName.substr(0, periodIndex)
> +    );
> +
> +    if ( cmi == coverageMaps.end() ) {
> +      throw rld::error (symbolName, 
> + "ExecutableInfo::findCoverageMap");

The exception takes a what message and this looks like a label?

Is the exception being treated as signal to be caught in another place? I hope this is _not_ the case. Herb Sutter's write up is good place to start ...

https://www.drdobbs.com/when-and-how-to-use-exceptions/184401836

Chris


More information about the devel mailing list