[PATCH] covoar: Handle periods in symbols from objdump

Alex White alex.white at oarcorp.com
Fri Mar 12 16:37:55 UTC 2021


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");
+    }
+
     return *(cmi->second);
   }
 
diff --git a/tester/covoar/ObjdumpProcessor.cc b/tester/covoar/ObjdumpProcessor.cc
index 9d10a40..a71b00d 100644
--- a/tester/covoar/ObjdumpProcessor.cc
+++ b/tester/covoar/ObjdumpProcessor.cc
@@ -420,6 +420,12 @@ namespace Coverage {
         processSymbol = false;
         theInstructions.clear();
 
+        // Look for a '.' character and strip everything after it.
+        char *periodIndex = strstr(symbol, ".");
+        if (periodIndex != NULL) {
+          *periodIndex = 0;
+        }
+
         // See if the new symbol is one that we care about.
         if (SymbolsToAnalyze->isDesired( symbol )) {
           currentSymbol = symbol;
diff --git a/tester/covoar/SymbolTable.cc b/tester/covoar/SymbolTable.cc
index 53bc8af..00062cc 100644
--- a/tester/covoar/SymbolTable.cc
+++ b/tester/covoar/SymbolTable.cc
@@ -46,12 +46,18 @@ namespace Coverage {
     symbolData.startingAddress = start;
     symbolData.length = length;
 
-    if ( info[ symbol ].empty() == false ) {
-      if ( info[ symbol ].front().length != length ) {
+    for (auto& symData : info[ symbol ]) {
+      // The starting address could differ since we strip any suffixes beginning
+      // with a '.'
+      if (symData.startingAddress != start) {
+        continue;
+      }
+
+      if (symData.length != length) {
         std::ostringstream what;
         what << "Different lengths for the symbol "
              << symbol
-             << " (" << info[ symbol ].front().length
+             << " (" << symData.length
              << " and " << length
              << ")";
         throw rld::error( what, "SymbolTable::addSymbol" );
-- 
2.27.0



More information about the devel mailing list