[PATCH] covoar: Handle periods in symbols from objdump

Chris Johns chrisj at rtems.org
Mon Mar 15 01:00:39 UTC 2021



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