[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