On 29 April 2018 at 00:04, Cillian O'Donnell <cpodonne...@gmail.com> wrote:
> > > On 28 April 2018 at 17:29, Vijay Kumar Banerjee <vijaykumar9...@gmail.com> > wrote: > >> I'm getting the following error after applying the patch: >> > > Did you apply it to the current rtems-tools master? It's building fine for > me. > >> >> oh , it wasn't the current master. Yes it's building fine now . > ----- >> ./waf build install >> Waf: Entering directory `/home/lunatic/development/rte >> ms/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.cfg >>>> 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