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 <cpodonne...@gmail.com> wrote: > > > On 28 April 2018 at 08:08, Chris Johns <chr...@rtems.org> wrote: > >> From: Cillian O'Donnell <cpodonne...@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.miesow...@gmail.com> >> Co-author: Vijay Kumar Banerjee <vijaykumar9...@gmail.com> >> Cp-author: Chris Johns <chr...@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 (chr...@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 (chr...@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 <j...@gaisler.com> >> +Date: Wed, 3 Jun 2009 14:57:48 -0500 >> +To: Joel Sherrill <joel.sherr...@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 (chr...@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@rtems.org > http://lists.rtems.org/mailman/listinfo/devel >
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel