[PATCH] covoar: Add symbol set reader and ELF data parser to covoar.

Vijay Kumar Banerjee vijaykumar9597 at gmail.com
Sat Apr 28 16:29:13 UTC 2018


I'm getting the following error after applying the patch:

-----
./waf build install
Waf: Entering directory
`/home/lunatic/development/rtems/test/rtems-tools/build'
Traceback (most recent call last):
  File
"/home/lunatic/development/rtems/test/rtems-tools/.waf-1.9.9-75529a659e4f06cb4254801e52405e0a/waflib/Scripting.py",
line 120, in waf_entry_point
    run_commands()
  File
"/home/lunatic/development/rtems/test/rtems-tools/.waf-1.9.9-75529a659e4f06cb4254801e52405e0a/waflib/Scripting.py",
line 181, in run_commands
    ctx=run_command(cmd_name)
  File
"/home/lunatic/development/rtems/test/rtems-tools/.waf-1.9.9-75529a659e4f06cb4254801e52405e0a/waflib/Scripting.py",
line 172, in run_command
    ctx.execute()
  File
"/home/lunatic/development/rtems/test/rtems-tools/.waf-1.9.9-75529a659e4f06cb4254801e52405e0a/waflib/Scripting.py",
line 362, in execute
    return execute_method(self)
  File
"/home/lunatic/development/rtems/test/rtems-tools/.waf-1.9.9-75529a659e4f06cb4254801e52405e0a/waflib/Build.py",
line 99, in execute
    self.execute_build()
  File
"/home/lunatic/development/rtems/test/rtems-tools/.waf-1.9.9-75529a659e4f06cb4254801e52405e0a/waflib/Build.py",
line 102, in execute_build
    self.recurse([self.run_dir])
  File
"/home/lunatic/development/rtems/test/rtems-tools/.waf-1.9.9-75529a659e4f06cb4254801e52405e0a/waflib/Context.py",
line 129, in recurse
    user_function(self)
  File "/home/lunatic/development/rtems/test/rtems-tools/wscript", line
134, in build
    recurse(ctx)
  File "/home/lunatic/development/rtems/test/rtems-tools/wscript", line 81,
in recurse
    ctx.recurse(sd)
  File
"/home/lunatic/development/rtems/test/rtems-tools/.waf-1.9.9-75529a659e4f06cb4254801e52405e0a/waflib/Context.py",
line 129, in recurse
    user_function(self)
  File "/home/lunatic/development/rtems/test/rtems-tools/tester/wscript",
line 48, in build
    recurse(bld)
  File "/home/lunatic/development/rtems/test/rtems-tools/tester/wscript",
line 35, in recurse
    ctx.recurse(sd)
  File
"/home/lunatic/development/rtems/test/rtems-tools/.waf-1.9.9-75529a659e4f06cb4254801e52405e0a/waflib/Context.py",
line 129, in recurse
    user_function(self)
  File
"/home/lunatic/development/rtems/test/rtems-tools/tester/covoar/wscript",
line 115, in build
    use = ['ccovoar'] + modules,
NameError: global name 'modules' is not defined


-- vijay

On 28 April 2018 at 21:54, Cillian O'Donnell <cpodonnell8 at gmail.com> wrote:

>
>
> On 28 April 2018 at 08:08, Chris Johns <chrisj at rtems.org> wrote:
>
>> From: Cillian O'Donnell <cpodonnell8 at gmail.com>
>>
>> Add ability to organize symbol sets of libraries in INI file
>> and then read them with covoar and load the symbols directly from the
>> libraries.
>>
>> rtems-tools/../testing: Add configuration files for coverage analysis.
>>
>> A number of covoar options are not required and are defaulted.
>>
>> Co-author: Krzysztof Miesowicz <krzysztof.miesowicz at gmail.com>
>> Co-author: Vijay Kumar Banerjee <vijaykumar9597 at gmail.com>
>> Cp-author: Chris Johns <chrisj at rtems.org>
>> ---
>>  tester/covoar/DesiredSymbols.cc                    | 144 +++++-----
>>  tester/covoar/DesiredSymbols.h                     |  14 +-
>>  tester/covoar/ExecutableInfo.cc                    |   4 +-
>>  tester/covoar/ExecutableInfo.h                     |   6 +-
>>  tester/covoar/ObjdumpProcessor.cc                  |   6 +-
>>  tester/covoar/app_common.h                         |   9 +-
>>  tester/covoar/covoar.cc                            | 300
>> +++++++++++++--------
>>  tester/covoar/wscript                              |   2 +
>>  tester/rtems/testing/bsps/leon3-qemu-cov.ini       |  39 +++
>>  tester/rtems/testing/bsps/leon3-qemu.ini           |  38 +++
>>  tester/rtems/testing/coverage/Categories.txt       |  19 ++
>>  tester/rtems/testing/coverage/Explanations.txt     |  35 +++
>>  .../coverage/SPARC-Annul-Slot-Explanation.txt      |  56 ++++
>>  tester/rtems/testing/coverage/score-symbols.ini    |  35 +++
>>  tester/rtems/testing/coverage/style.css            | 197 ++++++++++++++
>>  tester/rtems/testing/qemu.cfg                      |  11 +-
>>  tester/rtems/testing/testing.mc                    |   8 +
>>  17 files changed, 737 insertions(+), 186 deletions(-)
>>  create mode 100644 tester/rtems/testing/bsps/leon3-qemu-cov.ini
>>  create mode 100644 tester/rtems/testing/bsps/leon3-qemu.ini
>>  create mode 100644 tester/rtems/testing/coverage/Categories.txt
>>  create mode 100644 tester/rtems/testing/coverage/Explanations.txt
>>  create mode 100644 tester/rtems/testing/coverage/
>> SPARC-Annul-Slot-Explanation.txt
>>  create mode 100644 tester/rtems/testing/coverage/score-symbols.ini
>>  create mode 100644 tester/rtems/testing/coverage/style.css
>>
>> diff --git a/tester/covoar/DesiredSymbols.cc
>> b/tester/covoar/DesiredSymbols.cc
>> index 00d1984..9957b28 100644
>> --- a/tester/covoar/DesiredSymbols.cc
>> +++ b/tester/covoar/DesiredSymbols.cc
>> @@ -16,6 +16,13 @@
>>  #include <string.h>
>>  #include <unistd.h>
>>
>> +#include <iostream>
>> +
>> +#include "rld.h"
>> +#include <rld-config.h>
>> +#include "rld-symbols.h"
>> +#include "rld-files.h"
>> +
>>  #include "DesiredSymbols.h"
>>  #include "app_common.h"
>>  #include "CoverageMap.h"
>> @@ -31,75 +38,90 @@ namespace Coverage {
>>    {
>>    }
>>
>> -  void DesiredSymbols::load(
>> -    const char* const symbolsFile
>> +  bool DesiredSymbols::load(
>> +    const std::string& symbolsSet,
>> +    const std::string& buildTarget,
>> +    const std::string& buildBSP,
>> +    bool               verbose
>>    )
>>    {
>> -    int                     cStatus;
>> -    bool                    done = false;
>> -    FILE*                   sFile;
>> -    SymbolInformation*      symInfo;
>> -    int                     line = 1;
>> -    std::string             symbol;
>> -
>> -    // Ensure that symbols file name is given.
>> -    if ( !symbolsFile ) {
>> -      fprintf(
>> -        stderr,
>> -        "ERROR: DesiredSymbols::load - no symbols file specified\n"
>> -      );
>> -      exit(-1);
>> -    }
>> -
>> -    // Open symbols file.
>> -    sFile = fopen( symbolsFile, "r" );
>> -    if ( !sFile ) {
>> -      fprintf(
>> -        stderr,
>> -        "ERROR: DesiredSymbols::load - unable to open symbols file %s\n",
>> -        symbolsFile
>> -      );
>> -      exit(-1);
>> -    }
>> -
>> -    // Process symbols file.
>> -    while ( !done ) {
>> -
>> -      symInfo = new SymbolInformation;
>> -
>> -      // Skip blank lines between symbols
>> -      do {
>> -        inputBuffer[0] = '\0';
>> -        inputBuffer2[0] = '\0';
>> -        cStatus = fscanf( sFile, "%s %s", inputBuffer, inputBuffer2 );
>> -        if ( cStatus == EOF ) {
>> -          done = true;
>> +    rld::files::cache cache;
>> +    bool              r = true;
>> +
>> +    //
>> +    // Load the INI file looking for a top level:
>> +    //
>> +    //  [symbols-sets]
>> +    //  sets = A, B, C
>> +    //
>> +    // For each set read the libraries from the configuration file and
>> load.
>> +    //
>> +    //  [A]
>> +    //  libraries = @BUILD-PREFIX@/c/@BSP@/A/libA.a
>> +    //
>> +    //  [B]
>> +    //  libraries = @BUILD-PREFIX@/c/@BSP@/B/libB.a
>> +    //
>> +    try {
>> +      cache.open();
>> +
>> +      rld::config::config config;
>> +
>> +      if (verbose)
>> +        std::cerr << "Loading symbol sets: " << symbolsSet << std::endl;
>> +
>> +      config.load (symbolsSet);
>> +
>> +      const rld::config::section& sym_section =
>> config.get_section("symbol-sets");
>> +
>> +      rld::strings sets;
>> +      rld::config::parse_items (sym_section, "sets", sets, true);
>> +
>> +      for (const std::string set : sets) {
>> +        if (verbose)
>> +          std::cerr << " Symbol set: " << set << std::endl;
>> +        const rld::config::section& set_section =
>> config.get_section(set);
>> +        rld::strings libs;
>> +        rld::config::parse_items (set_section, "libraries", libs, true);
>> +        for (std::string lib : libs) {
>> +          lib = rld::find_replace(lib, "@BUILD-TARGET@", buildTarget);
>> +          lib = rld::find_replace(lib, "@BSP@", buildBSP);
>> +          if (verbose)
>> +            std::cerr << " Loading library: " << lib << std::endl;
>> +          cache.add(lib);
>>          }
>> -        else {
>> -          //inputBuffer[ strlen(inputBuffer) - 1] = '\0';
>> -          line++;
>> -        }
>> -      } while ( !done && (inputBuffer[0] == '\0') );
>> +      }
>>
>> -      // Have we already seen this one?
>> -      if ( !done ) {
>> -        if (set.find( inputBuffer ) != set.end()) {
>> -          fprintf(
>> -            stderr,
>> -            "File: %s, Line %d: Duplicate symbol: %s\n",
>> -            symbolsFile,
>> -            line,
>> -            inputBuffer
>> -          );
>> +      rld::symbols::table symbols;
>>
>> -          delete symInfo;
>> -        }
>> +      cache.load_symbols (symbols, true);
>>
>> -        // Add this to the set of symbols.
>> -        else
>> -          set[ inputBuffer ] = *symInfo;
>> +      for (auto& kv : symbols.globals()) {
>> +        const rld::symbols::symbol& sym = *(kv.second);
>> +        set[sym.name()] = *(new SymbolInformation);
>> +      }
>> +      for (auto& kv : symbols.weaks()) {
>> +        const rld::symbols::symbol& sym = *(kv.second);
>> +        set[sym.name()] = *(new SymbolInformation);
>> +      }
>> +      for (auto& kv : symbols.locals()) {
>> +        const rld::symbols::symbol& sym = *(kv.second);
>> +        set[sym.name()] = *(new SymbolInformation);
>>        }
>> +
>> +    } catch (rld::error re) {
>> +      std::cerr << "error: "
>> +                << re.where << ": " << re.what
>> +                << std::endl;
>> +      r = false;
>> +    } catch (...) {
>> +      cache.close();
>> +      throw;
>>      }
>> +
>> +    cache.close();
>> +
>> +    return r;
>>    }
>>
>>    void DesiredSymbols::preprocess( void )
>> diff --git a/tester/covoar/DesiredSymbols.h
>> b/tester/covoar/DesiredSymbols.h
>> index 9524c64..21c5602 100644
>> --- a/tester/covoar/DesiredSymbols.h
>> +++ b/tester/covoar/DesiredSymbols.h
>> @@ -293,9 +293,17 @@ namespace Coverage {
>>      /*!
>>       *  This method creates the set of symbols to analyze from the
>> symbols
>>       *  listed in the specified file.
>> -     */
>> -    void load(
>> -      const char* const symbolsFile
>> +     *
>> +     *  @param[in] symbolsSet An INI format file of the symbols to be
>> loaded.
>> +     *  @param[in] buildTarget The build target
>> +     *  @param[in] buildBSP The BSP
>> +     *  @return Returns false if the load fails.
>> +     */
>> +    bool load(
>> +      const std::string& symbolsSet,
>> +      const std::string& buildTarget,
>> +      const std::string& buildBSP,
>> +      bool               verbose
>>      );
>>
>>      /*!
>> diff --git a/tester/covoar/ExecutableInfo.cc
>> b/tester/covoar/ExecutableInfo.cc
>> index d71c435..c41d931 100644
>> --- a/tester/covoar/ExecutableInfo.cc
>> +++ b/tester/covoar/ExecutableInfo.cc
>> @@ -67,12 +67,12 @@ namespace Coverage {
>>      return aCoverageMap;
>>    }
>>
>> -  std::string ExecutableInfo::getFileName ( void ) const
>> +  const std::string& ExecutableInfo::getFileName ( void ) const
>>    {
>>      return executableName;
>>    }
>>
>> -  std::string ExecutableInfo::getLibraryName( void ) const
>> +  const std::string& ExecutableInfo::getLibraryName( void ) const
>>    {
>>      return libraryName;
>>    }
>> diff --git a/tester/covoar/ExecutableInfo.h
>> b/tester/covoar/ExecutableInfo.h
>> index 7242715..20ea9bf 100644
>> --- a/tester/covoar/ExecutableInfo.h
>> +++ b/tester/covoar/ExecutableInfo.h
>> @@ -67,14 +67,14 @@ namespace Coverage {
>>       *
>>       *  @return Returns the executable's file name
>>       */
>> -    std::string getFileName( void ) const;
>> +    const std::string& getFileName( void ) const;
>>
>>      /*!
>>       *  This method returns the library name associated with the
>> executable.
>>       *
>>       *  @return Returns the executable's library name
>>       */
>> -    std::string getLibraryName( void ) const;
>> +    const std::string& getLibraryName( void ) const;
>>
>>      /*!
>>       *  This method returns the load address of the dynamic library
>> @@ -111,7 +111,7 @@ namespace Coverage {
>>       *  This method indicates whether a dynamic library has been
>>       *  associated with the executable.
>>       *
>> -     *  @return Returns TRUE if
>> +     *  @return Returns TRUE if
>>       */
>>      bool hasDynamicLibrary( void );
>>
>> diff --git a/tester/covoar/ObjdumpProcessor.cc
>> b/tester/covoar/ObjdumpProcessor.cc
>> index b916984..d41906c 100644
>> --- a/tester/covoar/ObjdumpProcessor.cc
>> +++ b/tester/covoar/ObjdumpProcessor.cc
>> @@ -247,15 +247,15 @@ namespace Coverage {
>>      try
>>      {
>>        status = rld::process::execute( TargetInfo->getObjdump(),
>> -               args, objdumpFile.name(), err.name() );
>> +                                      args, objdumpFile.name(), err.name()
>> );
>>        if ( (status.type != rld::process::status::normal)
>>             || (status.code != 0) ) {
>>          throw rld::error( "Objdump error", "generating objdump" );
>>        }
>>      } catch( rld::error& err )
>>        {
>> -        std::cout << "Error while running" << TargetInfo->getObjdump()
>> -                  << "for" << fileName << std::endl;
>> +        std::cout << "Error while running " << TargetInfo->getObjdump()
>> +                  << " on " << fileName << std::endl;
>>          std::cout << err.what << " in " << err.where << std::endl;
>>          return;
>>        }
>> diff --git a/tester/covoar/app_common.h b/tester/covoar/app_common.h
>> index d28bfd0..ac32bbd 100644
>> --- a/tester/covoar/app_common.h
>> +++ b/tester/covoar/app_common.h
>> @@ -1,6 +1,11 @@
>>  #ifndef __APP_COMMON_h
>>  #define __APP_COMMON_h
>>
>> +/*
>> + * This file needs to be removed and these globals removed from the
>> + * global scope. For example SymbolsToAnalyze is never destructed.
>> + */
>> +
>>  #include <list>
>>
>>  #include "DesiredSymbols.h"
>> @@ -22,8 +27,8 @@ extern char
>>  inputBuffer[MAX_LINE_LENGTH];
>>  extern char                         inputBuffer2[MAX_LINE_LENGTH];
>>
>>
>> -bool FileIsNewer( const char *f1, const char *f2 );
>> -bool FileIsReadable( const char *f1 );
>> +bool FileIsNewer( const char *f1, const char *f2 );
>> +bool FileIsReadable( const char *f1 );
>>  bool ReadUntilFound( FILE *file, const char *line );
>>
>>  #endif
>> diff --git a/tester/covoar/covoar.cc b/tester/covoar/covoar.cc
>> index c36b00a..81c90d2 100644
>> --- a/tester/covoar/covoar.cc
>> +++ b/tester/covoar/covoar.cc
>> @@ -29,34 +29,92 @@
>>    #define kill(p,s) raise(s)
>>  #endif
>>
>> +typedef std::list<std::string> CoverageNames;
>> +typedef std::list<Coverage::ExecutableInfo*> Executables;
>> +
>>  /*
>> - *  Variables to control general behavior
>> + * Create a build path from the executable paths. Also extract the build
>> prefix
>> + * and BSP names.
>>   */
>> -const char*                          coverageFileExtension = NULL;
>> -std::list<std::string>               coverageFileNames;
>> -int                                  coverageExtensionLength = 0;
>> -Coverage::CoverageFormats_t          coverageFormat;
>> -Coverage::CoverageReaderBase*        coverageReader = NULL;
>> -char*                                executable = NULL;
>> -const char*                          executableExtension = NULL;
>> -int                                  executableExtensionLength = 0;
>> -std::list<Coverage::ExecutableInfo*> executablesToAnalyze;
>> -const char*                          explanations = NULL;
>> -char*                                progname;
>> -const char*                          symbolsFile = NULL;
>> -const char*                          gcnosFileName = NULL;
>> -char                                 gcnoFileName[FILE_NAME_LENGTH];
>> -char                                 gcdaFileName[FILE_NAME_LENGTH];
>> -char                                 gcovBashCommand[256];
>> -const char*                          target = NULL;
>> -const char*                          format = NULL;
>> -FILE*                                gcnosFile = NULL;
>> -Gcov::GcovData*          gcovFile;
>> +static void createBuildPath(Executables& executablesToAnalyze,
>> +                            std::string& buildPath,
>> +                            std::string& buildPrefix,
>> +                            std::string& buildBSP)
>> +{
>> +  for (const auto& exe : executablesToAnalyze) {
>> +    rld::strings eparts;
>> +    rld::split(eparts, rld::path::path_abs(exe->getFileName()),
>> RLD_PATH_SEPARATOR);
>> +    std::string fail; // empty means all is OK else an error string
>> +    for (rld::path::paths::reverse_iterator pri = eparts.rbegin();
>> +         pri != eparts.rend();
>> +         ++pri) {
>> +      if (*pri == "testsuites") {
>> +        ++pri;
>> +        if (pri == eparts.rend()) {
>> +          fail = "invalid executable path, no BSP";
>> +          break;
>> +        }
>> +        if (buildBSP.empty()) {
>> +          buildBSP = *pri;
>> +        } else {
>> +          if (buildBSP != *pri) {
>> +            fail = "executable BSP does not match: " + buildBSP;
>> +            break;
>> +          }
>> +        }
>> +        ++pri;
>> +        if (pri == eparts.rend() || *pri != "c") {
>> +          fail = "invalid executable path, no 'c'";
>> +          break;
>> +        }
>> +        ++pri;
>> +        if (pri == eparts.rend()) {
>> +          fail = "invalid executable path, no arch prefix";
>> +          break;
>> +        }
>> +        if (buildPrefix.empty()) {
>> +          buildPrefix = *pri;
>> +        } else {
>> +          if (buildBSP != *pri) {
>> +            fail = "executable build prefix does not match: " +
>> buildPrefix;
>> +            break;
>> +          }
>> +        }
>> +        ++pri;
>> +        if (pri == eparts.rend()) {
>> +          fail = "invalid executable path, no build top";
>> +          break;
>> +        }
>> +        //
>> +        // The remaining parts of the path is the build path. Iterator
>> over them
>> +        // and collect into a new paths variable to join to make a path.
>> +        //
>> +        rld::path::paths bparts;
>> +        for (; pri != eparts.rend(); ++pri)
>> +          bparts.insert(bparts.begin(), *pri);
>> +        std::string thisBuildPath;
>> +        rld::path::path_join(thisBuildPath, bparts, thisBuildPath);
>> +        if (buildPath.empty()) {
>> +          buildPath = thisBuildPath;
>> +        } else {
>> +          if (buildBSP != *pri) {
>> +            fail = "executable build path does not match: " + buildPath;
>> +          }
>> +        }
>> +        break;
>> +      }
>> +    }
>> +    if (!fail.empty()) {
>> +      std::cerr << "ERROR: " << fail << std::endl;
>> +      exit(EXIT_FAILURE);
>> +    }
>> +  }
>> +}
>>
>>  /*
>>   *  Print program usage message
>>   */
>> -void usage()
>> +void usage(const std::string& progname)
>>  {
>>    fprintf(
>>      stderr,
>> @@ -69,17 +127,18 @@ void usage()
>>      "  -f FORMAT                 - coverage file format "
>>             "(RTEMS, QEMU, TSIM or Skyeye)\n"
>>      "  -E EXPLANATIONS           - name of file with explanations\n"
>> -    "  -s SYMBOLS_FILE           - name of file with symbols of
>> interest\n"
>> +    "  -s SYMBOL_SET_FILE        - path to the INI format symbol sets\n"
>>      "  -1 EXECUTABLE             - name of executable to get symbols
>> from\n"
>>      "  -e EXE_EXTENSION          - extension of the executables to
>> analyze\n"
>>      "  -c COVERAGEFILE_EXTENSION - extension of the coverage files to
>> analyze\n"
>>      "  -g GCNOS_LIST             - name of file with list of *.gcno
>> files\n"
>>      "  -p PROJECT_NAME           - name of the project\n"
>>      "  -C ConfigurationFileName  - name of configuration file\n"
>> -    "  -O Output_Directory       - name of output directory (default=."
>> +    "  -O Output_Directory       - name of output directory (default=.\n"
>> +    "  -d debug                  - disable cleaning of tempfiles."
>>      "\n",
>> -    progname,
>> -    progname
>> +    progname.c_str(),
>> +    progname.c_str()
>>    );
>>  }
>>
>> @@ -125,42 +184,58 @@ int main(
>>    char** argv
>>  )
>>  {
>> -  std::list<std::string>::iterator               citr;
>> -  std::string                                    coverageFileName;
>> -  std::list<Coverage::ExecutableInfo*>::iterator eitr;
>> -  Coverage::ExecutableInfo*                      executableInfo = NULL;
>> -  int                                            i;
>> -  int                                            opt;
>> -  const char*                                    singleExecutable = NULL;
>> -  rld::process::tempfile                         objdumpFile( ".dmp" );
>> -  rld::process::tempfile                         err( ".err" );
>> -  bool                                           debug = false;
>> -  std::string                                    option;
>> +  CoverageNames                 coverageFileNames;
>> +  std::string                   coverageFileName;
>> +  Executables                   executablesToAnalyze;
>> +  Coverage::ExecutableInfo*     executableInfo = NULL;
>> +  std::string                   executableExtension = "exe";
>> +  std::string                   coverageExtension = "cov";
>> +  Coverage::CoverageFormats_t   coverageFormat;
>> +  Coverage::CoverageReaderBase* coverageReader = NULL;
>> +  char*                         executable = NULL;
>> +  const char*                   explanations = NULL;
>> +  const char*                   gcnosFileName = NULL;
>> +  char                          gcnoFileName[FILE_NAME_LENGTH];
>> +  char                          gcdaFileName[FILE_NAME_LENGTH];
>> +  char                          gcovBashCommand[256];
>> +  std::string                   target;
>> +  const char*                   format = "html";
>> +  FILE*                         gcnosFile = NULL;
>> +  Gcov::GcovData*               gcovFile;
>> +  const char*                   singleExecutable = NULL;
>> +  rld::process::tempfile        objdumpFile( ".dmp" );
>> +  rld::process::tempfile        err( ".err" );
>> +  rld::process::tempfile        syms( ".syms" );
>> +  bool                          debug = false;
>> +  std::string                   symbolSet;
>> +  std::string                   progname;
>> +  std::string                   option;
>> +  int                           opt;
>>
>>    setup_signals();
>>
>>    //
>>    // Process command line options.
>>    //
>> -  progname = argv[0];
>> +  progname = rld::path::basename(argv[0]);
>>
>> -  while ((opt = getopt(argc, argv, "1:L:e:c:g:E:f:s:T:O:p:v:d")) != -1) {
>> +  while ((opt = getopt(argc, argv, "1:L:e:c:g:E:f:s:S:T:O:p:vd")) != -1)
>> {
>>      switch (opt) {
>> -      case '1': singleExecutable      = optarg; break;
>> -      case 'L': dynamicLibrary        = optarg; break;
>> -      case 'e': executableExtension   = optarg; break;
>> -      case 'c': coverageFileExtension = optarg; break;
>> -      case 'g': gcnosFileName         = optarg; break;
>> -      case 'E': explanations          = optarg; break;
>> -      case 'f': format                = optarg; break;
>> -      case 's': symbolsFile           = optarg; break;
>> -      case 'T': target                = optarg; break;
>> -      case 'O': outputDirectory       = optarg; break;
>> -      case 'v': Verbose               = true;   break;
>> -      case 'p': projectName           = optarg; break;
>> -      case 'd': debug                 = true;   break;
>> +      case '1': singleExecutable    = optarg; break;
>> +      case 'L': dynamicLibrary      = optarg; break;
>> +      case 'e': executableExtension = optarg; break;
>> +      case 'c': coverageExtension   = optarg; break;
>> +      case 'g': gcnosFileName       = optarg; break;
>> +      case 'E': explanations        = optarg; break;
>> +      case 'f': format              = optarg; break;
>> +      case 'S': symbolSet           = optarg; break;
>> +      case 'T': target              = optarg; break;
>> +      case 'O': outputDirectory     = optarg; break;
>> +      case 'v': Verbose             = true;   break;
>> +      case 'p': projectName         = optarg; break;
>> +      case 'd': debug               = true;   break;
>>        default: /* '?' */
>> -        usage();
>> +        usage(progname);
>>          exit(EXIT_FAILURE);
>>      }
>>    }
>> @@ -171,18 +246,10 @@ int main(
>>       */
>>
>>      /*
>> -     * Target name must be set.
>> +     * Validate that we have a symbols of interest file.
>>       */
>> -    if ( !target ) {
>> -      option = "target -T";
>> -      throw option;
>> -    }
>> -
>> -    /*
>> -     * Validate simulator format.
>> -     */
>> -    if ( !format ) {
>> -      option = "format -f";
>> +    if ( symbolSet.empty() ) {
>> +      option = "symbol set file -S";
>>        throw option;
>>      }
>>
>> @@ -194,22 +261,6 @@ int main(
>>        throw option;
>>      }
>>
>> -    /*
>> -     * Has coverage file extension been specified.
>> -     */
>> -    if ( !coverageFileExtension ) {
>> -      option = "coverage extension -c";
>> -      throw option;
>> -    }
>> -
>> -    /*
>> -     * Has executable extension been specified.
>> -     */
>> -    if ( !executableExtension ) {
>> -      option = "executable extension -e";
>> -      throw option;
>> -    }
>> -
>>      /*
>>       * Check for project name.
>>       */
>> @@ -220,8 +271,8 @@ int main(
>>    }
>>    catch( std::string option )
>>    {
>> -    std::cout << "error missing option: " + option << std::endl;
>> -    usage();
>> +    std::cerr << "error missing option: " + option << std::endl;
>> +    usage(progname);
>>      exit(EXIT_FAILURE);
>>    }
>>
>> @@ -238,7 +289,7 @@ int main(
>>        );
>>      } else {
>>
>> -      for (i=optind; i < argc; i++) {
>> +      for (int i = optind; i < argc; i++) {
>>          // Ensure that the coverage file is readable.
>>          if (!FileIsReadable( argv[i] )) {
>>            fprintf(
>> @@ -266,11 +317,10 @@ int main(
>>        }
>>      }
>>    }
>> -
>> -  // If not invoked with a single executable, process the remaining
>> -  // arguments as executables and derive the coverage file names.
>>    else {
>> -    for (i = optind; i < argc; i++) {
>> +    // If not invoked with a single executable, process the remaining
>> +    // arguments as executables and derive the coverage file names.
>> +    for (int i = optind; i < argc; i++) {
>>
>>        // Ensure that the executable is readable.
>>        if (!FileIsReadable( argv[i] )) {
>> @@ -282,9 +332,9 @@ int main(
>>        } else {
>>          coverageFileName = argv[i];
>>          coverageFileName.replace(
>> -          coverageFileName.length() - executableExtensionLength,
>> -          executableExtensionLength,
>> -          coverageFileExtension
>> +          coverageFileName.length() - executableExtension.size(),
>> +          executableExtension.size(),
>> +          coverageExtension
>>          );
>>
>>          if (!FileIsReadable( coverageFileName.c_str() )) {
>> @@ -310,6 +360,33 @@ int main(
>>      exit(EXIT_FAILURE);
>>    }
>>
>> +  // The executablesToAnalyze and coverageFileNames containers need
>> +  // to be the name size of some of the code below breaks. Lets
>> +  // check and make sure.
>> +  if (executablesToAnalyze.size() != coverageFileNames.size()) {
>> +    std::cerr << "ERROR: executables and coverage name size mismatch" <<
>> std::endl;
>> +    exit(EXIT_FAILURE);
>> +  }
>> +
>> +  //
>> +  // Find the top of the BSP's build tree and if we have found the top
>> +  // check the executable is under the same path and BSP.
>> +  //
>> +  std::string buildPath;
>> +  std::string buildTarget;
>> +  std::string buildBSP;
>> +  createBuildPath(executablesToAnalyze,
>> +                  buildPath,
>> +                  buildTarget,
>> +                  buildBSP);
>> +
>> +  //
>> +  // Use a command line target if provided.
>> +  //
>> +  if (!target.empty()) {
>> +    buildTarget = target;
>> +  }
>> +
>>    if (Verbose) {
>>      if (singleExecutable) {
>>        fprintf(
>> @@ -323,12 +400,12 @@ int main(
>>        );
>>      }
>>      fprintf( stderr, "Coverage Format : %s\n", format );
>> -    fprintf( stderr, "Target          : %s\n", PrintableString(target) );
>> +    fprintf( stderr, "Target          : %s\n", buildTarget.c_str() );
>>      fprintf( stderr, "\n" );
>> -#if 1
>> +
>>      // Process each executable/coverage file pair.
>> -    eitr = executablesToAnalyze.begin();
>> -    for (citr = coverageFileNames.begin();
>> +    Executables::iterator eitr = executablesToAnalyze.begin();
>> +    for (CoverageNames::iterator citr = coverageFileNames.begin();
>>           citr != coverageFileNames.end();
>>           citr++) {
>>
>> @@ -342,7 +419,6 @@ int main(
>>        if (!singleExecutable)
>>          eitr++;
>>      }
>> -#endif
>>    }
>>
>>    //
>> @@ -350,19 +426,22 @@ int main(
>>    //
>>
>>    // Create data based on target.
>> -  TargetInfo = Target::TargetFactory( target );
>> +  TargetInfo = Target::TargetFactory( buildTarget );
>>
>>    // Create the set of desired symbols.
>>    SymbolsToAnalyze = new Coverage::DesiredSymbols();
>> -  SymbolsToAnalyze->load( symbolsFile );
>> -  if (Verbose) {
>> -    fprintf(
>> -      stderr,
>> -      "Analyzing %u symbols\n",
>> -      (unsigned int) SymbolsToAnalyze->set.size()
>> -    );
>> +
>> +  //
>> +  // Read symbol configuration file and load needed symbols.
>> +  //
>> +  if (!SymbolsToAnalyze->load( symbolSet, buildTarget, buildBSP, Verbose
>> )) {
>> +      exit(EXIT_FAILURE);
>>    }
>>
>> +  if ( Verbose )
>> +    std::cout << "Analyzing " << SymbolsToAnalyze->set.size()
>> +              << " symbols" << std::endl;
>> +
>>    // Create explanations.
>>    AllExplanations = new Coverage::Explanations();
>>    if ( explanations )
>> @@ -379,7 +458,7 @@ int main(
>>    objdumpProcessor = new Coverage::ObjdumpProcessor();
>>
>>    // Prepare each executable for analysis.
>> -  for (eitr = executablesToAnalyze.begin();
>> +  for (Executables::iterator eitr = executablesToAnalyze.begin();
>>         eitr != executablesToAnalyze.end();
>>         eitr++) {
>>
>> @@ -407,22 +486,19 @@ int main(
>>    //
>>
>>    // Process each executable/coverage file pair.
>> -  eitr = executablesToAnalyze.begin();
>> -  for (citr = coverageFileNames.begin();
>> -       citr != coverageFileNames.end();
>> -       citr++) {
>> -
>> +  Executables::iterator eitr = executablesToAnalyze.begin();
>> +  for (const auto& cname : coverageFileNames) {
>>      if (Verbose) {
>>        fprintf(
>>          stderr,
>>          "Processing coverage file %s for executable %s\n",
>> -        (*citr).c_str(),
>> +        cname.c_str(),
>>          ((*eitr)->getFileName()).c_str()
>>        );
>>      }
>>
>>      // Process its coverage file.
>> -    coverageReader->processFile( (*citr).c_str(), *eitr );
>> +    coverageReader->processFile( cname.c_str(), *eitr );
>>
>>      // Merge each symbols coverage map into a unified coverage map.
>>      (*eitr)->mergeCoverage();
>> @@ -524,6 +600,8 @@ int main(
>>      objdumpFile.keep();
>>      err.override( "objdump_exec_log" );
>>      err.keep();
>> +    syms.override( "symbols_list" );
>> +    syms.keep();
>>    }
>>    return 0;
>>  }
>> diff --git a/tester/covoar/wscript b/tester/covoar/wscript
>> index 9db4815..c0270d8 100644
>> --- a/tester/covoar/wscript
>> +++ b/tester/covoar/wscript
>> @@ -118,10 +118,12 @@ def build(bld):
>>                            'TraceWriterQEMU.cc'],
>>                  use = ['ccovoar'] + modules,
>>                  cflags = ['-O2', '-g'],
>> +                cxxflags = ['-std=c++11', '-O2', '-g'],
>>                  includes = ['.'] + rtl_includes)
>>
>>      bld.program(target = 'covoar',
>>                  source = ['covoar.cc'],
>>                  use = ['ccovoar'] + modules,
>>                  cflags = ['-O2', '-g'],
>> +                cxxflags = ['-std=c++11', '-O2', '-g'],
>>                  includes = ['.'] + rtl_includes)
>> diff --git a/tester/rtems/testing/bsps/leon3-qemu-cov.ini
>> b/tester/rtems/testing/bsps/leon3-qemu-cov.ini
>> new file mode 100644
>> index 0000000..6b5e7e6
>> --- /dev/null
>> +++ b/tester/rtems/testing/bsps/leon3-qemu-cov.ini
>> @@ -0,0 +1,39 @@
>> +#
>> +# RTEMS Tools Project (http://www.rtems.org/)
>> +# Copyright 2010-2018 Chris Johns (chrisj at rtems.org)
>> +# All rights reserved.
>> +#
>> +# This file is part of the RTEMS Tools package in 'rtems-tools'.
>> +#
>> +# Redistribution and use in source and binary forms, with or without
>> +# modification, are permitted provided that the following conditions are
>> met:
>> +#
>> +# 1. Redistributions of source code must retain the above copyright
>> notice,
>> +# this list of conditions and the following disclaimer.
>> +#
>> +# 2. Redistributions in binary form must reproduce the above copyright
>> notice,
>> +# this list of conditions and the following disclaimer in the
>> documentation
>> +# and/or other materials provided with the distribution.
>> +#
>> +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
>> "AS IS"
>> +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
>> THE
>> +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
>> PURPOSE
>> +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
>> BE
>> +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
>> +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
>> +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
>> BUSINESS
>> +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
>> +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
>> +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
>> THE
>> +# POSSIBILITY OF SUCH DAMAGE.
>> +#
>> +
>> +#
>> +# The Leon 3 QEMU BSP
>> +#
>> +[leon3-qemu]
>> +bsp               = leon3-qemu
>> +arch              = sparc
>> +tester            = %{_rtscripts}/qemu.cfg
>> +bsp_qemu_opts     = %{qemu_opts_base} -M leon3_generic
>> +bsp_qemu_cov_opts = -exec-trace %{test_executable}.cov
>> diff --git a/tester/rtems/testing/bsps/leon3-qemu.ini
>> b/tester/rtems/testing/bsps/leon3-qemu.ini
>> new file mode 100644
>> index 0000000..9e8854c
>> --- /dev/null
>> +++ b/tester/rtems/testing/bsps/leon3-qemu.ini
>> @@ -0,0 +1,38 @@
>> +#
>> +# RTEMS Tools Project (http://www.rtems.org/)
>> +# Copyright 2010-2014 Chris Johns (chrisj at rtems.org)
>> +# All rights reserved.
>> +#
>> +# This file is part of the RTEMS Tools package in 'rtems-tools'.
>> +#
>> +# Redistribution and use in source and binary forms, with or without
>> +# modification, are permitted provided that the following conditions are
>> met:
>> +#
>> +# 1. Redistributions of source code must retain the above copyright
>> notice,
>> +# this list of conditions and the following disclaimer.
>> +#
>> +# 2. Redistributions in binary form must reproduce the above copyright
>> notice,
>> +# this list of conditions and the following disclaimer in the
>> documentation
>> +# and/or other materials provided with the distribution.
>> +#
>> +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
>> "AS IS"
>> +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
>> THE
>> +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
>> PURPOSE
>> +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
>> BE
>> +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
>> +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
>> +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
>> BUSINESS
>> +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
>> +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
>> +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
>> THE
>> +# POSSIBILITY OF SUCH DAMAGE.
>> +#
>> +
>> +#
>> +# The Leon 3 QEMU BSP
>> +#
>> +[leon3-qemu]
>> +bsp           = leon3-qemu
>> +arch          = sparc
>> +tester        = %{_rtscripts}/qemu.cfg
>> +bsp_qemu_opts = %{qemu_opts_base} -M leon3_generic
>> diff --git a/tester/rtems/testing/coverage/Categories.txt
>> b/tester/rtems/testing/coverage/Categories.txt
>> new file mode 100644
>> index 0000000..e19a456
>> --- /dev/null
>> +++ b/tester/rtems/testing/coverage/Categories.txt
>> @@ -0,0 +1,19 @@
>> +This is the list of Explanation Categories used when analyzing RTEMS
>> +Coverage report.  By using standard categories, the table filter on
>> +the web site works better.
>> +
>> +Simple Test Case
>> +
>> +Hard Test Tase
>> +
>> +Uncalled Routine
>> +
>> +Interrupt Critical Section
>> +
>> +Simple Error Case
>> +
>> +Hard Error Case
>> +
>> +Allocation Error
>> +
>> +Bharath Suri
>> diff --git a/tester/rtems/testing/coverage/Explanations.txt
>> b/tester/rtems/testing/coverage/Explanations.txt
>> new file mode 100644
>> index 0000000..a5917f6
>> --- /dev/null
>> +++ b/tester/rtems/testing/coverage/Explanations.txt
>> @@ -0,0 +1,35 @@
>> +schedulerpriorityyield.c:47
>> +Simple Test Case
>> +Branch Never Taken
>> +New test where there is more than one thread at a priority with the
>> +executing thread being non-preemptive.  Create a higher priority thread
>> +and then yield.
>> +
>> +   init task at priority 2, non-preemptive
>> +   create task at priority 2
>> +   create task at priority 1
>> +   yield
>> ++++
>> +
>> +schedulerpriorityyield.c:51
>> +Simple Test Case
>> +Branch Always Taken
>> +New test where only one thread at a priority (non-preemptive), create a
>> +thread at higher priority, then yield.
>> +
>> +   init task at priority 2, non-preemptive
>> +   create task at priority 1
>> +   yield
>> ++++
>> +
>> +schedulerpriorityyield.c:52
>> +Simple Test Case
>> +Not Executed
>> +Same test case as schedulerpriorityyield.c:51
>> ++++
>> +
>> +coremsg.c:86
>> +Simple Test Case
>> +We need to request enough messages of a certain size that the math
>> +overflows to less than a single message.
>> ++++
>> diff --git a/tester/rtems/testing/coverage/SPARC-Annul-Slot-Explanation.txt
>> b/tester/rtems/testing/coverage/SPARC-Annul-Slot-Explanation.txt
>> new file mode 100644
>> index 0000000..ef740d3
>> --- /dev/null
>> +++ b/tester/rtems/testing/coverage/SPARC-Annul-Slot-Explanation.txt
>> @@ -0,0 +1,56 @@
>> +The SPARC assembly is often hard to understand because a single
>> +instruction will show up as not executed.  The instructions before
>> +and after it will be marked as executed.  The instruction before
>> +the one not executed should be a "bxx,a" instruction which means
>> +that the instruction following the branch instruction is executed
>> +ONLY if the branch is taken.  Otherwise it is "annulled" or skipped.
>> +
>> +So when you see these cases, it means the branch was NOT taken.
>> +
>> +===================================================================
>> +Subject: <offlist> annul slot explanation
>> +From: Jiri Gaisler <jiri at gaisler.com>
>> +Date: Wed, 3 Jun 2009 14:57:48 -0500
>> +To: Joel Sherrill <Joel.Sherrill at OARcorp.com>
>> +
>> +
>> +Joel Sherrill wrote:
>> +> > Hi,
>> +> >
>> +> > I am trying to look at more coverage cases and
>> +> > wanted to make sure I am reading things correctly.
>> +> >
>> +> > The code in question is:
>> +> >
>> +> >
>> +> >      if ( the_thread->current_priority > interested_priority )
>> +> > 200fd00:    d8 00 e0 14     ld  [ %g3 + 0x14 ], %o4
>> +> > 200fd04:    80 a3 00 04     cmp  %o4, %g4
>> +> > 200fd08:    38 80 00 1c     bgu,a   200fd78 <killinfo+0x224>
>> +> > 200fd0c:    98 10 00 04     mov  %g4,
>> +> > %o4                                            <== NOT EXECUTED
>> +> >
>> +> >      /*
>> +> >       *  If this thread is not interested, then go on to the next
>> thread.
>> +> >       */
>> +> >
>> +> >      api = the_thread->API_Extensions[ THREAD_API_POSIX ];
>> +> > 200fd10:    d4 00 e1 6c     ld  [ %g3 + 0x16c ], %o2
>> +> >
>> +> > Am I correct in interpreting this as meaning 0x200fd0c
>> +> > is not executed because the bgu,a is never taken. And it
>> +> > is not executed as part of falling through.
>> +
>> +Yes, this is correct. The branch delay slot is only executed
>> +when the branch is taken.
>> +
>> +Jiri.
>> +
>> +> >
>> +> > So in this case we need a test where the "if" condition
>> +> > is true if I am reading things correctly.
>> +> >
>> +> > Thanks.  There are a number of these 4 byte cases which
>> +> > are probably easy to hit if I read the code correctly.
>> +> >
>> +> >
>> diff --git a/tester/rtems/testing/coverage/score-symbols.ini
>> b/tester/rtems/testing/coverage/score-symbols.ini
>> new file mode 100644
>> index 0000000..b3c8b18
>> --- /dev/null
>> +++ b/tester/rtems/testing/coverage/score-symbols.ini
>> @@ -0,0 +1,35 @@
>> +#
>> +# RTEMS Tools Project (http://www.rtems.org/)
>> +# Copyright 2018 Chris Johns (chrisj at rtems.org)
>> +# All rights reserved.
>> +#
>> +# This file is part of the RTEMS Tools package in 'rtems-tools'.
>> +#
>> +# Redistribution and use in source and binary forms, with or without
>> +# modification, are permitted provided that the following conditions are
>> met:
>> +#
>> +# 1. Redistributions of source code must retain the above copyright
>> notice,
>> +# this list of conditions and the following disclaimer.
>> +#
>> +# 2. Redistributions in binary form must reproduce the above copyright
>> notice,
>> +# this list of conditions and the following disclaimer in the
>> documentation
>> +# and/or other materials provided with the distribution.
>> +#
>> +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
>> "AS IS"
>> +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
>> THE
>> +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
>> PURPOSE
>> +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
>> BE
>> +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
>> +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
>> +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
>> BUSINESS
>> +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
>> +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
>> +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
>> THE
>> +# POSSIBILITY OF SUCH DAMAGE.
>> +#
>> +
>> +[symbol-sets]
>> +sets = score
>> +
>> +[score]
>> +libraries=@BUILD-TARGET@/c/@BSP@/cpukit/score/libscore.a
>> diff --git a/tester/rtems/testing/coverage/style.css
>> b/tester/rtems/testing/coverage/style.css
>> new file mode 100644
>> index 0000000..c715518
>> --- /dev/null
>> +++ b/tester/rtems/testing/coverage/style.css
>> @@ -0,0 +1,197 @@
>> +body {
>> +    background: rgb(253,253,253);
>> +    color: rgb(0,0,0);
>> +    font-family: helvetica, sans-serif;
>> +    font-size: 1em;
>> +    line-height: 1.4;
>> +    margin: 5px, 5px, 5px, 5px;
>> +    padding: 0;
>> +}
>> +
>> +a:link {
>> +    color: rgb(180, 50, 50);
>> +    font-family: helvetica, sans-serif;
>> +    font-size: 1.0em;
>> +}
>> +
>> +a:visited {
>> +    color: purple;
>> +    font-family: helvetica, sans-serif;
>> +    font-size: 1.0em;
>> +}
>> +
>> +a:hover {
>> +    color: rgb(0, 0, 0);
>> +    font-family: helvetica, sans-serif;
>> +    font-size: 1.0em;
>> +}
>> +
>> +a:active {
>> +    color: red;
>> +    font-family: helvetica, sans-serif;
>> +    font-size: 1.0em;
>> +}
>> +
>> +.heading {
>> +    background: rgb(250,250,250);
>> +    background-image: url("http://www.rtems.org/logos/rtems_logo.jpg");
>> +    background-repeat: no-repeat;
>> +    color: rgb(55,55,55);
>> +    font-size: 1.5em;
>> +    height: 140px;
>> +    padding-top: 20px;
>> +    padding-left: 300px;
>> +}
>> +
>> +.heading-title {
>> +    text-align:  center;
>> +    color: rgb(0,0,0);
>> +    font-size: 0.9em;
>> +    font-weight: bold;
>> +    padding-top: 5px;
>> +    padding-left: 0px;
>> +    text-align:  center;
>> +    width: 100%;
>> +}
>> +
>> +.datetime {
>> +    color: rgb(55,55,55);
>> +    font-size: 0.8em;
>> +    padding-top: 5px;
>> +    padding-left: 0px;
>> +    text-align:  center;
>> +    width: 100%;
>> +}
>> +
>> +.info {
>> +    color: rgb(55,55,55);
>> +    font-size: 0.6em;
>> +    padding-top: 5px;
>> +    padding-left: 00px;
>> +    text-align:  center;
>> +    width: 100%;
>> +}
>> +
>> +.stats-table {
>> +    background: rgb(225,225,225);
>> +    font-size: 0.9em;
>> +    border: 1px solid rgb(200, 200, 200);
>> +    padding: 0;
>> +    margin-top: 3px;
>> +    margin-left: 10px;
>> +    width: 70%;
>> +}
>> +
>> +.stats-table-target {
>> +    background: rgb(243,243,243);
>> +    font-size: 1.2em;
>> +    padding-left: 10px;
>> +    text-align: left;
>> +}
>> +
>> +.stats-target-results {
>> +    background: rgb(243,243,243);
>> +    font-size: 0.9em;
>> +    text-align: right;
>> +    padding-right: 10px;
>> +}
>> +
>> +.stats-target-good {
>> +    background: rgb(30,230,30);
>> +    font-size: 0.9em;
>> +    text-align: right;
>> +    padding-right: 10px;
>> +}
>> +
>> +.stats-target-good {
>> +    background: rgb(50,180,50);
>> +    color: rgb(230,230,230);
>> +    font-size: 0.9em;
>> +    text-align: center;
>> +    padding-right: 10px;
>> +}
>> +
>> +.stats-target-bad {
>> +    background: rgb(180,50,50);
>> +    color: rgb(230,230,230);
>> +    font-size: 0.9em;
>> +    text-align: center;
>> +    padding-right: 10px;
>> +}
>> +
>> +.stats-table-top {
>> +    background: rgb(243,243,243);
>> +    color: rgb(0,0,0);
>> +    font-size: 0.9em;
>> +    padding-left: 2px;
>> +}
>> +
>> +.stats-table-row {
>> +    background: rgb(253,253,253);
>> +    font-size: 0.9em;
>> +    padding: 1px;
>> +    text-align: right;
>> +}
>> +
>> +.error-table {
>> +    font-size: 0.9em;
>> +    border: 1px solid rgb(200, 200, 200);
>> +    padding: 0;
>> +    margin-left: 10px;
>> +    width: 96%;
>> +}
>> +
>> +.error-table-top {
>> +    background: rgb(225,225,225);
>> +    color: rgb(0,0,0);
>> +    font-size: 0.9em;
>> +    padding-left: 2px;
>> +}
>> +
>> +.error-table-on {
>> +    background: rgb(225,225,225);
>> +    font-size: 0.9em;
>> +    padding-left: 2px;
>> +}
>> +
>> +.error-table-off {
>> +    background: rgb(253,253,253);
>> +    font-size: 0.9em;
>> +    padding-left: 2px;
>> +}
>> +
>> +.error-table-dups {
>> +    text-align: right;
>> +    padding-right: 2px;
>> +}
>> +
>> +.error-table-error {
>> +    background: rgb(255,150,150);
>> +    font-size: 0.9em;
>> +    padding-left: 2px;
>> +}
>> +
>> +.error-table-warning {
>> +    font-size: 0.9em;
>> +    padding-left: 2px;
>> +}
>> +
>> +.navbar {
>> +    margin-left: auto;
>> +    margin-right: auto;
>> +    margin-top: 10px;
>> +    width: 40%;
>> +}
>> +th.table-sortable {
>> +  background-image:url("unsorted.gif");
>> +  cursor: pointer;
>> +  background-position: center left;
>> +  background-repeat: no-repeat;
>> +  padding-left: 15px;
>> +}
>> +th.table-sorted-asc {
>> +  background-image:url("descending.gif");
>> +}
>> +th.table-sorted-desc {
>> +  background-image:url("ascending.gif");
>> +}
>> \ No newline at end of file
>> diff --git a/tester/rtems/testing/qemu.cfg b/tester/rtems/testing/qemu.cf
>> g
>> index db5b6b2..858cac8 100644
>> --- a/tester/rtems/testing/qemu.cfg
>> +++ b/tester/rtems/testing/qemu.cfg
>> @@ -54,14 +54,23 @@
>>  #%define qemu_opts_base   -no-reboot -monitor none -serial stdio
>> -nographic
>>  %define qemu_opts_base   -no-reboot -serial null -serial mon:stdio
>> -nographic
>>  %define qemu_opts_no_net -net none
>> +
>> +#
>> +# Converage, some builds of qemu support coverage.
>>
>
> Typo Converage. That's the only mistake I can see from reading through.
> Still have to apply the patches and test.
> I'll let you know how that goes.
>
>
>> +#
>> +%ifn %{defined bsp_qemu_ocv_opts}
>> + %define bsp_qemu_cov_opts %{nil}
>> +%endif
>> +
>>  #
>>  # Qemu executable
>>  #
>>  %ifn %{defined bsp_qemu_opts}
>>   %define bsp_qemu_opts %{nil}
>>  %endif
>> +
>>  %define qemu_cmd  qemu-system-%{bsp_arch}
>> -%define qemu_opts %{bsp_qemu_opts}
>> +%define qemu_opts %{bsp_qemu_opts} %{bsp_qemu_cov_opts}
>>
>>  #
>>  # Executable
>> diff --git a/tester/rtems/testing/testing.mc b/tester/rtems/testing/
>> testing.mc
>> index 77f8419..662b352 100644
>> --- a/tester/rtems/testing/testing.mc
>> +++ b/tester/rtems/testing/testing.mc
>> @@ -55,3 +55,11 @@ timeout:              none,    none,     '180'
>>
>>  # Tests detected as invalid that are valid
>>  invalid_tests:        none,    none,     '''minimum.exe'''
>> +
>> +# Coverage defaults
>> +cov_format:           none,    none,     'QEMU'
>> +cov_explanations:     none,    none,     '%{_rtscripts}/coverage/Expla
>> nations.txt'
>> +cov_extension:        none,    none,     'cov'
>> +cov_gcnos_file:       none,    none,     '%{_rtscripts}/coverage/
>> rtems.gcnos'
>> +cov_exe_ext:          none,    none,     'exe'
>> +cov_report_format:    none,    none,     'html'
>> --
>> 2.15.1
>>
>>
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20180428/f565d446/attachment-0002.html>


More information about the devel mailing list