looks ok, it's a lot to try to process though. In a future patch it would be good to provide more useful names, I don't know what 'ha' and 'la' mean, if anything. at least 'a' I understand to be an address.
Also, the typedef with appending _t at the end should be removed, _t is reserved by POSIX. And I don't know why the _m is being appended, I guess it is denoted member variables? I'm used to seeing it as a prefix rather than a suffix, if it gets used at all. A few more C++ issues to add to the backlog. On Mon, Apr 5, 2021 at 1:25 PM Alex White <alex.wh...@oarcorp.com> wrote: > > This changes the way covoar organizes the symbols. Instead of treating > all symbols as one set, covoar is now aware of multiple symbol sets and > tracks statistics for each set. It now also generates reports for each > symbol set. > > This change relieves the caller of covoar of the reponsibility of > managing the symbol sets. As a result, covoar can minimize the work > done for each symbol set, yielding a significant speedup. > > Updates #4374 > --- > tester/covoar/DesiredSymbols.cc | 465 +++++++++++++++++--------------- > tester/covoar/DesiredSymbols.h | 98 +++++-- > tester/covoar/ReportsBase.cc | 181 +++++++------ > tester/covoar/ReportsBase.h | 40 ++- > tester/covoar/ReportsHtml.cc | 62 +++-- > tester/covoar/ReportsHtml.h | 13 +- > tester/covoar/ReportsText.cc | 66 ++--- > tester/covoar/ReportsText.h | 13 +- > tester/covoar/covoar.cc | 6 +- > 9 files changed, 542 insertions(+), 402 deletions(-) > > diff --git a/tester/covoar/DesiredSymbols.cc b/tester/covoar/DesiredSymbols.cc > index ffc4f86..2866dbe 100644 > --- a/tester/covoar/DesiredSymbols.cc > +++ b/tester/covoar/DesiredSymbols.cc > @@ -37,6 +37,11 @@ namespace Coverage { > { > } > > + const DesiredSymbols::symbolSet_t& DesiredSymbols::allSymbols() const > + { > + return set; > + } > + > void DesiredSymbols::load( > const std::string& symbolsSet, > const std::string& buildTarget, > @@ -44,8 +49,6 @@ namespace Coverage { > bool verbose > ) > { > - rld::files::cache cache; > - > // > // Load the INI file looking for a top level: > // > @@ -60,61 +63,61 @@ namespace Coverage { > // [B] > // libraries = @BUILD-PREFIX@/c/@BSP@/B/libB.a > // > - try { > - cache.open(); > + rld::config::config config; > > - rld::config::config config; > + if (verbose) > + std::cerr << "Loading symbol sets: " << symbolsSet << std::endl; > > - if (verbose) > - std::cerr << "Loading symbol sets: " << symbolsSet << std::endl; > + config.load (symbolsSet); > > - config.load (symbolsSet); > + const rld::config::section& sym_section = > config.get_section("symbol-sets"); > > - const rld::config::section& sym_section = > config.get_section("symbol-sets"); > + rld::strings sets; > + rld::config::parse_items (sym_section, "sets", sets, true); > > - rld::strings sets; > - rld::config::parse_items (sym_section, "sets", sets, true); > + // Load the symbols for each set specified in the config file. > + for (const auto& setName : sets) { > + rld::files::cache cache; > + cache.open(); > > - for (const std::string set : sets) { > + if (verbose) > + std::cerr << "Loading symbols for set: " << setName << std::endl; > + const rld::config::section& set_section = config.get_section(setName); > + 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 << " 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); > - } > + std::cerr << " Loading library: " << lib << std::endl; > + cache.add(lib); > } > > rld::symbols::table symbols; > > cache.load_symbols (symbols, true); > > + // Populate the symbol maps with all global symbols. > for (auto& kv : symbols.globals()) { > const rld::symbols::symbol& sym = *(kv.second); > - if (sym.type() == sym.st_func) > + if (sym.type() == sym.st_func) { > set[sym.name()] = *(new SymbolInformation); > + setNamesToSymbols[setName].push_back(sym.name()); > + } > } > + // Populate the symbol maps with all weak symbols. > for (auto& kv : symbols.weaks()) { > const rld::symbols::symbol& sym = *(kv.second); > - if (sym.type() == sym.st_func) > + if (sym.type() == sym.st_func) { > set[sym.name()] = *(new SymbolInformation); > + setNamesToSymbols[setName].push_back(sym.name()); > + } > } > - } catch (...) { > - cache.close(); > - throw; > } > - > - cache.close(); > } > > void DesiredSymbols::preprocess( void ) > { > - > // Look at each symbol. > for (auto& s : SymbolsToAnalyze->set) { > // If the unified coverage map does not exist, the symbol was > @@ -135,48 +138,52 @@ namespace Coverage { > > void DesiredSymbols::calculateStatistics( void ) > { > - // Look at each symbol. > - for (auto& s : SymbolsToAnalyze->set) { > - // If the unified coverage map does not exist, the symbol was > - // never referenced by any executable. Just skip it. > - CoverageMapBase* theCoverageMap = s.second.unifiedCoverageMap; > - if (theCoverageMap) > - { > - // Increment the total sizeInBytes by the bytes in the symbol > - stats.sizeInBytes += s.second.stats.sizeInBytes; > - > - // Now scan through the coverage map of this symbol. > - uint32_t endAddress = s.second.stats.sizeInBytes - 1; > - > - for (uint32_t a = 0; a <= endAddress; ++a) { > - // If we are at the start of instruction increment > - // instruction type counters as needed. > - if ( theCoverageMap->isStartOfInstruction( a ) ) { > - > - stats.sizeInInstructions++; > - s.second.stats.sizeInInstructions++; > - > - if (!theCoverageMap->wasExecuted( a ) ) { > - stats.uncoveredInstructions++; > - s.second.stats.uncoveredInstructions++; > - > - if ( theCoverageMap->isBranch( a )) { > - stats.branchesNotExecuted++; > - s.second.stats.branchesNotExecuted++; > + // Look at each symbol set. > + for (const auto& kv : setNamesToSymbols) { > + // Look at each symbol. > + for (const auto& symbol : kv.second) { > + SymbolInformation& info = set.at(symbol); > + > + // If the unified coverage map does not exist, the symbol was > + // never referenced by any executable. Just skip it. > + CoverageMapBase* theCoverageMap = info.unifiedCoverageMap; > + if (theCoverageMap) { > + // Increment the total sizeInBytes by the bytes in the symbol > + stats[kv.first].sizeInBytes += info.stats.sizeInBytes; > + > + // Now scan through the coverage map of this symbol. > + uint32_t endAddress = info.stats.sizeInBytes - 1; > + > + for (uint32_t a = 0; a <= endAddress; ++a) { > + // If we are at the start of instruction increment > + // instruction type counters as needed. > + if ( theCoverageMap->isStartOfInstruction( a ) ) { > + > + stats[kv.first].sizeInInstructions++; > + info.stats.sizeInInstructions++; > + > + if (!theCoverageMap->wasExecuted( a ) ) { > + stats[kv.first].uncoveredInstructions++; > + info.stats.uncoveredInstructions++; > + > + if ( theCoverageMap->isBranch( a )) { > + stats[kv.first].branchesNotExecuted++; > + info.stats.branchesNotExecuted++; > + } > + } else if (theCoverageMap->isBranch( a )) { > + stats[kv.first].branchesExecuted++; > + info.stats.branchesExecuted++; > } > - } else if (theCoverageMap->isBranch( a )) { > - stats.branchesExecuted++; > - s.second.stats.branchesExecuted++; > } > - } > > - if (!theCoverageMap->wasExecuted( a )) { > - stats.uncoveredBytes++; > - s.second.stats.uncoveredBytes++; > + if (!theCoverageMap->wasExecuted( a )) { > + stats[kv.first].uncoveredBytes++; > + info.stats.uncoveredBytes++; > + } > } > + } else { > + stats[kv.first].unreferencedSymbols++; > } > - } else { > - stats.unreferencedSymbols++; > } > } > } > @@ -184,152 +191,155 @@ namespace Coverage { > > void DesiredSymbols::computeUncovered( void ) > { > - // Look at each symbol. > - for (auto& s : SymbolsToAnalyze->set) { > - // If the unified coverage map does not exist, the symbol was > - // never referenced by any executable. Just skip it. > - CoverageMapBase* theCoverageMap = s.second.unifiedCoverageMap; > - if (theCoverageMap) > - { > - // Create containers for the symbol's uncovered ranges and branches. > - CoverageRanges* theRanges = new CoverageRanges(); > - s.second.uncoveredRanges = theRanges; > - CoverageRanges* theBranches = new CoverageRanges(); > - s.second.uncoveredBranches = theBranches; > - > - uint32_t a; > - uint32_t la; > - uint32_t ha; > - uint32_t endAddress; > - uint32_t count; > - > - // Mark NOPs as executed > - a = s.second.stats.sizeInBytes - 1; > - count = 0; > - while (a > 0) { > - if (theCoverageMap->isStartOfInstruction( a )) { > - break; > - } > - > - count++; > - > - if (theCoverageMap->isNop( a )) { > - for (la = a; la < (a + count); la++) { > - theCoverageMap->setWasExecuted( la ); > + // Look at each symbol set. > + for (const auto& kv : setNamesToSymbols) { > + // Look at each symbol. > + for (const auto& symbol : kv.second) { > + SymbolInformation& info = set.at(symbol); > + // If the unified coverage map does not exist, the symbol was > + // never referenced by any executable. Just skip it. > + CoverageMapBase* theCoverageMap = info.unifiedCoverageMap; > + if (theCoverageMap) { > + // Create containers for the symbol's uncovered ranges and > branches. > + CoverageRanges* theRanges = new CoverageRanges(); > + info.uncoveredRanges = theRanges; > + CoverageRanges* theBranches = new CoverageRanges(); > + info.uncoveredBranches = theBranches; > + > + uint32_t a; > + uint32_t la; > + uint32_t ha; > + uint32_t endAddress; > + uint32_t count; > + > + // Mark NOPs as executed > + a = info.stats.sizeInBytes - 1; > + count = 0; > + while (a > 0) { > + if (theCoverageMap->isStartOfInstruction( a )) { > + break; > } > > - count = 0; > - } > + count++; > > - a--; > - } > + if (theCoverageMap->isNop( a )) { > + for (la = a; la < (a + count); la++) { > + theCoverageMap->setWasExecuted( la ); > + } > > - endAddress = s.second.stats.sizeInBytes - 1; > - a = 0; > - while (a < endAddress) { > - if (!theCoverageMap->wasExecuted( a )) { > - a++; > - continue; > - } > + count = 0; > + } > > - for (ha=a+1; > - ha <= endAddress && !theCoverageMap->isStartOfInstruction( ha > ); > - ha++) > - ; > - if ( ha >= endAddress ) > - break; > - > - if (theCoverageMap->isNop( ha )) > - do { > - theCoverageMap->setWasExecuted( ha ); > - ha++; > - if ( ha >= endAddress ) > - break; > - } while ( !theCoverageMap->isStartOfInstruction( ha ) || > - theCoverageMap->isNop( ha ) ); > - a = ha; > - } > + a--; > + } > > - // Now scan through the coverage map of this symbol. > - endAddress = s.second.stats.sizeInBytesWithoutNops - 1; > - a = 0; > - while (a <= endAddress) { > - // If an address was NOT executed, find consecutive unexecuted > - // addresses and add them to the uncovered ranges. > - if (!theCoverageMap->wasExecuted( a )) { > - > - la = a; > - count = 1; > - for (ha = a + 1; > - ha <= endAddress && !theCoverageMap->wasExecuted( ha ); > - ha++) > - { > - if ( theCoverageMap->isStartOfInstruction( ha ) ) > - count++; > + endAddress = info.stats.sizeInBytes - 1; > + a = 0; > + while (a < endAddress) { > + if (!theCoverageMap->wasExecuted( a )) { > + a++; > + continue; > } > - ha--; > - > - stats.uncoveredRanges++; > - s.second.stats.uncoveredRanges++; > - theRanges->add( > - s.second.baseAddress + la, > - s.second.baseAddress + ha, > - CoverageRanges::UNCOVERED_REASON_NOT_EXECUTED, > - count > - ); > - a = ha + 1; > - } > > - // If an address is a branch instruction, add any uncovered > branches > - // to the uncoverd branches. > - else if (theCoverageMap->isBranch( a )) { > - la = a; > - for (ha = a + 1; > - ha <= endAddress && !theCoverageMap->isStartOfInstruction( ha > ); > - ha++) > + for (ha=a+1; > + ha <= endAddress && !theCoverageMap->isStartOfInstruction( > ha ); > + ha++) > ; > - ha--; > - > - if (theCoverageMap->wasAlwaysTaken( la )) { > - stats.branchesAlwaysTaken++; > - s.second.stats.branchesAlwaysTaken++; > - theBranches->add( > - s.second.baseAddress + la, > - s.second.baseAddress + ha, > - CoverageRanges::UNCOVERED_REASON_BRANCH_ALWAYS_TAKEN, > - 1 > + if ( ha >= endAddress ) > + break; > + > + if (theCoverageMap->isNop( ha )) > + do { > + theCoverageMap->setWasExecuted( ha ); > + ha++; > + if ( ha >= endAddress ) > + break; > + } while ( !theCoverageMap->isStartOfInstruction( ha ) || > + theCoverageMap->isNop( ha ) ); > + a = ha; > + } > + > + // Now scan through the coverage map of this symbol. > + endAddress = info.stats.sizeInBytesWithoutNops - 1; > + a = 0; > + while (a <= endAddress) { > + // If an address was NOT executed, find consecutive unexecuted > + // addresses and add them to the uncovered ranges. > + if (!theCoverageMap->wasExecuted( a )) { > + > + la = a; > + count = 1; > + for (ha = a + 1; > + ha <= endAddress && !theCoverageMap->wasExecuted( ha ); > + ha++) > + { > + if ( theCoverageMap->isStartOfInstruction( ha ) ) > + count++; > + } > + ha--; > + > + stats[kv.first].uncoveredRanges++; > + info.stats.uncoveredRanges++; > + theRanges->add( > + info.baseAddress + la, > + info.baseAddress + ha, > + CoverageRanges::UNCOVERED_REASON_NOT_EXECUTED, > + count > ); > - if (Verbose) > - std::cerr << "Branch always taken found in" << s.first > - << std::hex > - << " (0x" << s.second.baseAddress + la > - << " - 0x" << s.second.baseAddress + ha > - << ")" > - << std::dec > - << std::endl; > + a = ha + 1; > } > - else if (theCoverageMap->wasNeverTaken( la )) { > - stats.branchesNeverTaken++; > - s.second.stats.branchesNeverTaken++; > - theBranches->add( > - s.second.baseAddress + la, > - s.second.baseAddress + ha, > - CoverageRanges::UNCOVERED_REASON_BRANCH_NEVER_TAKEN, > - 1 > + > + // If an address is a branch instruction, add any uncovered > branches > + // to the uncoverd branches. > + else if (theCoverageMap->isBranch( a )) { > + la = a; > + for (ha = a + 1; > + ha <= endAddress && !theCoverageMap->isStartOfInstruction( > ha ); > + ha++) > + ; > + ha--; > + > + if (theCoverageMap->wasAlwaysTaken( la )) { > + stats[kv.first].branchesAlwaysTaken++; > + info.stats.branchesAlwaysTaken++; > + theBranches->add( > + info.baseAddress + la, > + info.baseAddress + ha, > + CoverageRanges::UNCOVERED_REASON_BRANCH_ALWAYS_TAKEN, > + 1 > ); > - if (Verbose) > - std::cerr << "Branch never taken found in " << s.first > - << std::hex > - << " (0x" << s.second.baseAddress + la > - << " - 0x" << s.second.baseAddress + ha > - << ")" > - << std::dec > - << std::endl; > + if (Verbose) > + std::cerr << "Branch always taken found in" << symbol > + << std::hex > + << " (0x" << info.baseAddress + la > + << " - 0x" << info.baseAddress + ha > + << ")" > + << std::dec > + << std::endl; > + } > + else if (theCoverageMap->wasNeverTaken( la )) { > + stats[kv.first].branchesNeverTaken++; > + info.stats.branchesNeverTaken++; > + theBranches->add( > + info.baseAddress + la, > + info.baseAddress + ha, > + CoverageRanges::UNCOVERED_REASON_BRANCH_NEVER_TAKEN, > + 1 > + ); > + if (Verbose) > + std::cerr << "Branch never taken found in " << symbol > + << std::hex > + << " (0x" << info.baseAddress + la > + << " - 0x" << info.baseAddress + ha > + << ")" > + << std::dec > + << std::endl; > + } > + a = ha + 1; > } > - a = ha + 1; > + else > + a++; > } > - else > - a++; > } > } > } > @@ -460,30 +470,61 @@ namespace Coverage { > } > } > > - uint32_t DesiredSymbols::getNumberBranchesAlwaysTaken( void ) const { > - return stats.branchesAlwaysTaken; > + uint32_t DesiredSymbols::getNumberBranchesAlwaysTaken( > + const std::string& symbolSetName > + ) const { > + return stats.at(symbolSetName).branchesAlwaysTaken; > }; > > - uint32_t DesiredSymbols::getNumberBranchesFound( void ) const { > - return (stats.branchesNotExecuted + stats.branchesExecuted); > + uint32_t DesiredSymbols::getNumberBranchesFound( > + const std::string& symbolSetName > + ) const { > + return ( > + stats.at(symbolSetName).branchesNotExecuted + > + stats.at(symbolSetName).branchesExecuted > + ); > }; > > - uint32_t DesiredSymbols::getNumberBranchesNeverTaken( void ) const { > - return stats.branchesNeverTaken; > + uint32_t DesiredSymbols::getNumberBranchesNeverTaken( > + const std::string& symbolSetName > + ) const { > + return stats.at(symbolSetName).branchesNeverTaken; > }; > > - uint32_t DesiredSymbols::getNumberBranchesNotExecuted( void ) const { > - return stats.branchesNotExecuted; > + uint32_t DesiredSymbols::getNumberBranchesNotExecuted( > + const std::string& symbolSetName > + ) const { > + return stats.at(symbolSetName).branchesNotExecuted; > }; > > - uint32_t DesiredSymbols::getNumberUncoveredRanges( void ) const { > - return stats.uncoveredRanges; > + uint32_t DesiredSymbols::getNumberUncoveredRanges( > + const std::string& symbolSetName > + ) const { > + return stats.at(symbolSetName).uncoveredRanges; > }; > > - uint32_t DesiredSymbols::getNumberUnreferencedSymbols( void ) const { > - return stats.unreferencedSymbols; > + uint32_t DesiredSymbols::getNumberUnreferencedSymbols( > + const std::string& symbolSetName > + ) const { > + return stats.at(symbolSetName).unreferencedSymbols; > }; > > + std::vector<std::string> DesiredSymbols::getSetNames( void ) const { > + std::vector<std::string> setNames; > + for (const auto &kv : setNamesToSymbols) { > + setNames.push_back(kv.first); > + } > + > + return setNames; > + } > + > + const std::vector<std::string>& DesiredSymbols::getSymbolsForSet( > + const std::string& symbolSetName > + ) const > + { > + return setNamesToSymbols.at(symbolSetName); > + } > + > bool DesiredSymbols::isDesired ( > const std::string& symbolName > ) const > diff --git a/tester/covoar/DesiredSymbols.h b/tester/covoar/DesiredSymbols.h > index 5cf96e9..5280d50 100644 > --- a/tester/covoar/DesiredSymbols.h > +++ b/tester/covoar/DesiredSymbols.h > @@ -197,12 +197,6 @@ namespace Coverage { > */ > typedef std::map<std::string, SymbolInformation> symbolSet_t; > > - /*! > - * This variable contains a map of symbol sets for each > - * symbol in the system keyed on the symbol name. > - */ > - symbolSet_t set; > - > /*! > * This method constructs a DesiredSymbols instance. > */ > @@ -213,6 +207,11 @@ namespace Coverage { > */ > ~DesiredSymbols(); > > + /*! > + * The set of all symbols. > + */ > + const symbolSet_t& allSymbols() const; > + > /*! > * This method loops through the coverage map and > * calculates the statistics that have not already > @@ -262,51 +261,93 @@ namespace Coverage { > > /*! > * This method returns the total number of branches always taken > - * for all analyzed symbols. > + * for all analyzed symbols in a given set. > + * > + * @param[in] symbolSetName specifies the symbol set of interest > * > * @return Returns the total number of branches always taken > */ > - uint32_t getNumberBranchesAlwaysTaken( void ) const; > + uint32_t getNumberBranchesAlwaysTaken( > + const std::string& symbolSetName > + ) const; > > /*! > * This method returns the total number of branches found for > - * all analyzed symbols. > + * all analyzed symbols in a given set. > + * > + * @param[in] symbolSetName specifies the symbol set of interest > * > * @return Returns the total number of branches found > */ > - uint32_t getNumberBranchesFound( void ) const; > + uint32_t getNumberBranchesFound( > + const std::string& symbolSetName > + ) const; > > /*! > * This method returns the total number of branches never taken > - * for all analyzed symbols. > + * for all analyzed symbols in a given set. > + * > + * @param[in] symbolSetName specifies the symbol set of interest > * > * @return Returns the total number of branches never taken > */ > - uint32_t getNumberBranchesNeverTaken( void ) const; > + uint32_t getNumberBranchesNeverTaken( > + const std::string& symbolSetName > + ) const; > > /*! > * This method returns the total number of branches not executed > - * for all analyzed symbols. > + * for all analyzed symbols in a given set. > + * > + * @param[in] symbolSetName specifies the symbol set of interest > * > * @return Returns the total number of branches not executed > */ > - uint32_t getNumberBranchesNotExecuted( void ) const; > + uint32_t getNumberBranchesNotExecuted( > + const std::string& symbolSetName > + ) const; > > /*! > * This method returns the total number of uncovered ranges > - * for all analyzed symbols. > + * for all analyzed symbols in a given set. > + * > + * @param[in] symbolSetName specifies the symbol set of interest > * > * @return Returns the total number of uncovered ranges > */ > - uint32_t getNumberUncoveredRanges( void ) const; > + uint32_t getNumberUncoveredRanges( > + const std::string& symbolSetName > + ) const; > > /*! > * This method returns the total number of unreferenced symbols > - * for all analyzed symbols. > + * for all analyzed symbols in a given set. > + * > + * @param[in] symbolSetName specifies the symbol set of interest > * > * @return Returns the total number of unreferenced symbols > */ > - uint32_t getNumberUnreferencedSymbols( void ) const; > + uint32_t getNumberUnreferencedSymbols( > + const std::string& symbolSetName > + ) const; > + > + /*! > + * This method returns all symbol set names. > + * > + * @return Returns all symbol set names > + */ > + std::vector<std::string> getSetNames( void ) const; > + > + /*! > + * This method returns all symbols for a given set. > + * > + * @param[in] symbolSetName specifies the symbol set of interest > + * > + * @return Returns all symbols for the given set > + */ > + const std::vector<std::string>& getSymbolsForSet( > + const std::string& symbolSetName > + ) const; > > /*! > * This method returns an indication of whether or not the specified > @@ -353,11 +394,6 @@ namespace Coverage { > */ > void preprocess( void ); > > - /*! > - * This member contains the statistics kept on each symbol. > - */ > - Statistics stats; > - > private: > > /*! > @@ -369,6 +405,22 @@ namespace Coverage { > ExecutableInfo* const theExecutable > ); > > + /*! > + * This variable contains a map of symbol sets for each > + * symbol in the system keyed on the symbol name. > + */ > + symbolSet_t set; > + > + /*! > + * This variable contains a map of symbol set names to symbol name > lists. > + */ > + std::map<std::string, std::vector<std::string>> setNamesToSymbols; > + > + /*! > + * This member contains a map of symbol set names to statistics. > + */ > + std::map<std::string, Statistics> stats; > + > }; > } > > diff --git a/tester/covoar/ReportsBase.cc b/tester/covoar/ReportsBase.cc > index 40ed209..fea776c 100644 > --- a/tester/covoar/ReportsBase.cc > +++ b/tester/covoar/ReportsBase.cc > @@ -20,8 +20,9 @@ > > namespace Coverage { > > -ReportsBase::ReportsBase( time_t timestamp ): > +ReportsBase::ReportsBase( time_t timestamp, std::string symbolSetName ): > reportExtension_m(""), > + symbolSetName_m(symbolSetName), > timestamp_m( timestamp ) > { > } > @@ -31,27 +32,38 @@ ReportsBase::~ReportsBase() > } > > FILE* ReportsBase::OpenFile( > - const char* const fileName > + const char* const fileName, > + const char* const symbolSetName > ) > { > int sc; > FILE *aFile; > std::string file; > > + std::string symbolSetOutputDirectory; > + rld::path::path_join( > + outputDirectory, > + symbolSetName, > + symbolSetOutputDirectory > + ); > + > // Create the output directory if it does not already exist > #ifdef _WIN32 > - sc = _mkdir( outputDirectory ); > + sc = _mkdir( symbolSetOutputDirectory ); > #else > - sc = mkdir( outputDirectory,0755 ); > + sc = mkdir( symbolSetOutputDirectory.c_str(),0755 ); > #endif > if ( (sc == -1) && (errno != EEXIST) ) { > - fprintf(stderr, "Unable to create output directory %s\n", > outputDirectory); > + fprintf( > + stderr, > + "Unable to create output directory %s\n", > + symbolSetOutputDirectory.c_str() > + ); > return NULL; > } > > - file = outputDirectory; > - file += "/"; > - file += fileName; > + file = symbolSetOutputDirectory; > + rld::path::path_join(file, fileName, file); > > // Open the file. > aFile = fopen( file.c_str(), "w" ); > @@ -71,7 +83,7 @@ FILE* ReportsBase::OpenAnnotatedFile( > const char* const fileName > ) > { > - return OpenFile(fileName); > + return OpenFile(fileName, symbolSetName_m.c_str()); > } > > FILE* ReportsBase::OpenBranchFile( > @@ -79,21 +91,21 @@ FILE* ReportsBase::OpenBranchFile( > bool hasBranches > ) > { > - return OpenFile(fileName); > + return OpenFile(fileName, symbolSetName_m.c_str()); > } > > FILE* ReportsBase::OpenCoverageFile( > const char* const fileName > ) > { > - return OpenFile(fileName); > + return OpenFile(fileName, symbolSetName_m.c_str()); > } > > FILE* ReportsBase::OpenNoRangeFile( > const char* const fileName > ) > { > - return OpenFile(fileName); > + return OpenFile(fileName, symbolSetName_m.c_str()); > } > > > @@ -101,14 +113,14 @@ FILE* ReportsBase::OpenSizeFile( > const char* const fileName > ) > { > - return OpenFile(fileName); > + return OpenFile(fileName, symbolSetName_m.c_str()); > } > > FILE* ReportsBase::OpenSymbolSummaryFile( > const char* const fileName > ) > { > - return OpenFile(fileName); > + return OpenFile(fileName, symbolSetName_m.c_str()); > } > > void ReportsBase::CloseFile( > @@ -186,41 +198,42 @@ void ReportsBase::WriteAnnotatedReport( > const char* const fileName > ) { > FILE* aFile = > NULL; > - Coverage::DesiredSymbols::symbolSet_t::iterator ditr; > Coverage::CoverageRanges* theBranches; > Coverage::CoverageRanges* theRanges; > Coverage::CoverageMapBase* > theCoverageMap = NULL; > uint32_t bAddress = > 0; > AnnotatedLineState_t state; > - std::list<Coverage::ObjdumpProcessor::objdumpLine_t>* > theInstructions; > - std::list<Coverage::ObjdumpProcessor::objdumpLine_t>::iterator itr; > + const std::list<Coverage::ObjdumpProcessor::objdumpLine_t>* > theInstructions; > + std::list< > + Coverage::ObjdumpProcessor::objdumpLine_t>::const_iterator itr; > > aFile = OpenAnnotatedFile(fileName); > if (!aFile) > return; > > // Process uncovered branches for each symbol. > - for (ditr = SymbolsToAnalyze->set.begin(); > - ditr != SymbolsToAnalyze->set.end(); > - ditr++) { > + const std::vector<std::string>& symbols = > SymbolsToAnalyze->getSymbolsForSet(symbolSetName_m); > + > + for (const auto& symbol : symbols) { > + const SymbolInformation& info = > SymbolsToAnalyze->allSymbols().at(symbol); > > // If uncoveredRanges and uncoveredBranches don't exist, then the > // symbol was never referenced by any executable. Just skip it. > - if ((ditr->second.uncoveredRanges == NULL) && > - (ditr->second.uncoveredBranches == NULL)) > + if ((info.uncoveredRanges == NULL) && > + (info.uncoveredBranches == NULL)) > continue; > > // If uncoveredRanges and uncoveredBranches are empty, then everything > // must have been covered for this symbol. Just skip it. > - if ((ditr->second.uncoveredRanges->set.empty()) && > - (ditr->second.uncoveredBranches->set.empty())) > + if ((info.uncoveredRanges->set.empty()) && > + (info.uncoveredBranches->set.empty())) > continue; > > - theCoverageMap = ditr->second.unifiedCoverageMap; > - bAddress = ditr->second.baseAddress; > - theInstructions = &(ditr->second.instructions); > - theRanges = ditr->second.uncoveredRanges; > - theBranches = ditr->second.uncoveredBranches; > + theCoverageMap = info.unifiedCoverageMap; > + bAddress = info.baseAddress; > + theInstructions = &(info.instructions); > + theRanges = info.uncoveredRanges; > + theBranches = info.uncoveredBranches; > > // Add annotations to each line where necessary > AnnotatedStart( aFile ); > @@ -274,14 +287,13 @@ void ReportsBase::WriteAnnotatedReport( > void ReportsBase::WriteBranchReport( > const char* const fileName > ) { > - Coverage::DesiredSymbols::symbolSet_t::iterator ditr; > FILE* report = NULL; > Coverage::CoverageRanges::ranges_t::iterator ritr; > Coverage::CoverageRanges* theBranches; > unsigned int count; > bool hasBranches = true; > > - if ((SymbolsToAnalyze->getNumberBranchesFound() == 0) || > + if ((SymbolsToAnalyze->getNumberBranchesFound(symbolSetName_m) == 0) || > (BranchInfoAvailable == false) ) > hasBranches = false; > > @@ -291,15 +303,16 @@ void ReportsBase::WriteBranchReport( > return; > > // If no branches were found then branch coverage is not supported > - if ((SymbolsToAnalyze->getNumberBranchesFound() != 0) && > + if ((SymbolsToAnalyze->getNumberBranchesFound(symbolSetName_m) != 0) && > (BranchInfoAvailable == true) ) { > - // Process uncovered branches for each symbol. > + // Process uncovered branches for each symbol in the set. > + const std::vector<std::string>& symbols = > SymbolsToAnalyze->getSymbolsForSet(symbolSetName_m); > + > count = 0; > - for (ditr = SymbolsToAnalyze->set.begin(); > - ditr != SymbolsToAnalyze->set.end(); > - ditr++) { > + for (const auto& symbol : symbols) { > + const SymbolInformation& info = > SymbolsToAnalyze->allSymbols().at(symbol); > > - theBranches = ditr->second.uncoveredBranches; > + theBranches = info.uncoveredBranches; > > if (theBranches && !theBranches->set.empty()) { > > @@ -307,7 +320,7 @@ void ReportsBase::WriteBranchReport( > ritr != theBranches->set.end() ; > ritr++ ) { > count++; > - PutBranchEntry( report, count, ditr, ritr ); > + PutBranchEntry( report, count, symbol, info, ritr ); > } > } > } > @@ -323,7 +336,6 @@ void ReportsBase::WriteCoverageReport( > const char* const fileName > ) > { > - Coverage::DesiredSymbols::symbolSet_t::iterator ditr; > FILE* report; > Coverage::CoverageRanges::ranges_t::iterator ritr; > Coverage::CoverageRanges* theRanges; > @@ -346,26 +358,27 @@ void ReportsBase::WriteCoverageReport( > } > > // Process uncovered ranges for each symbol. > + const std::vector<std::string>& symbols = > SymbolsToAnalyze->getSymbolsForSet(symbolSetName_m); > + > count = 0; > - for (ditr = SymbolsToAnalyze->set.begin(); > - ditr != SymbolsToAnalyze->set.end(); > - ditr++) { > + for (const auto& symbol : symbols) { > + const SymbolInformation& info = > SymbolsToAnalyze->allSymbols().at(symbol); > > - theRanges = ditr->second.uncoveredRanges; > + theRanges = info.uncoveredRanges; > > // If uncoveredRanges doesn't exist, then the symbol was never > // referenced by any executable. There may be a problem with the > // desired symbols list or with the executables so put something > // in the report. > if (theRanges == NULL) { > - putCoverageNoRange( report, NoRangeFile, count, ditr->first ); > + putCoverageNoRange( report, NoRangeFile, count, symbol ); > count++; > } else if (!theRanges->set.empty()) { > > for (ritr = theRanges->set.begin() ; > ritr != theRanges->set.end() ; > ritr++ ) { > - PutCoverageLine( report, count, ditr, ritr ); > + PutCoverageLine( report, count, symbol, info, ritr ); > count++; > } > } > @@ -383,7 +396,6 @@ void ReportsBase::WriteSizeReport( > const char* const fileName > ) > { > - Coverage::DesiredSymbols::symbolSet_t::iterator ditr; > FILE* report; > Coverage::CoverageRanges::ranges_t::iterator ritr; > Coverage::CoverageRanges* theRanges; > @@ -396,19 +408,20 @@ void ReportsBase::WriteSizeReport( > } > > // Process uncovered ranges for each symbol. > + const std::vector<std::string>& symbols = > SymbolsToAnalyze->getSymbolsForSet(symbolSetName_m); > + > count = 0; > - for (ditr = SymbolsToAnalyze->set.begin(); > - ditr != SymbolsToAnalyze->set.end(); > - ditr++) { > + for (const auto& symbol : symbols) { > + const SymbolInformation& info = > SymbolsToAnalyze->allSymbols().at(symbol); > > - theRanges = ditr->second.uncoveredRanges; > + theRanges = info.uncoveredRanges; > > if (theRanges && !theRanges->set.empty()) { > > for (ritr = theRanges->set.begin() ; > ritr != theRanges->set.end() ; > ritr++ ) { > - PutSizeLine( report, count, ditr, ritr ); > + PutSizeLine( report, count, symbol, ritr ); > count++; > } > } > @@ -421,7 +434,6 @@ void ReportsBase::WriteSymbolSummaryReport( > const char* const fileName > ) > { > - Coverage::DesiredSymbols::symbolSet_t::iterator ditr; > FILE* report; > unsigned int count; > > @@ -432,12 +444,13 @@ void ReportsBase::WriteSymbolSummaryReport( > } > > // Process each symbol. > + const std::vector<std::string>& symbols = > SymbolsToAnalyze->getSymbolsForSet(symbolSetName_m); > + > count = 0; > - for (ditr = SymbolsToAnalyze->set.begin(); > - ditr != SymbolsToAnalyze->set.end(); > - ditr++) { > + for (const auto& symbol : symbols) { > + const SymbolInformation& info = > SymbolsToAnalyze->allSymbols().at(symbol); > > - PutSymbolSummaryLine( report, count, ditr ); > + PutSymbolSummaryLine( report, count, symbol, info ); > count++; > } > > @@ -445,13 +458,13 @@ void ReportsBase::WriteSymbolSummaryReport( > } > > void ReportsBase::WriteSummaryReport( > - const char* const fileName > + const char* const fileName, > + const char* const symbolSetName > ) > { > // Calculate coverage statistics and output results. > uint32_t a; > uint32_t endAddress; > - Coverage::DesiredSymbols::symbolSet_t::iterator itr; > uint32_t notExecuted = 0; > double percentage; > double percentageBranches; > @@ -460,22 +473,23 @@ void ReportsBase::WriteSummaryReport( > FILE* report; > > // Open the report file. > - report = OpenFile( fileName ); > + report = OpenFile( fileName, symbolSetName ); > if ( !report ) { > return; > } > > // Look at each symbol. > - for (itr = SymbolsToAnalyze->set.begin(); > - itr != SymbolsToAnalyze->set.end(); > - itr++) { > + const std::vector<std::string>& symbols = > SymbolsToAnalyze->getSymbolsForSet(symbolSetName); > + > + for (const auto& symbol : symbols) { > + SymbolInformation info = SymbolsToAnalyze->allSymbols().at(symbol); > > // If the symbol's unified coverage map exists, scan through it > // and count bytes. > - theCoverageMap = itr->second.unifiedCoverageMap; > + theCoverageMap = info.unifiedCoverageMap; > if (theCoverageMap) { > > - endAddress = itr->second.stats.sizeInBytes - 1; > + endAddress = info.stats.sizeInBytes - 1; > > for (a = 0; a <= endAddress; a++) { > totalBytes++; > @@ -490,11 +504,12 @@ void ReportsBase::WriteSummaryReport( > percentage *= 100.0; > > percentageBranches = (double) ( > - SymbolsToAnalyze->getNumberBranchesAlwaysTaken() + > - SymbolsToAnalyze->getNumberBranchesNeverTaken() + > - (SymbolsToAnalyze->getNumberBranchesNotExecuted() * 2) > + SymbolsToAnalyze->getNumberBranchesAlwaysTaken(symbolSetName) + > + SymbolsToAnalyze->getNumberBranchesNeverTaken(symbolSetName) + > + (SymbolsToAnalyze->getNumberBranchesNotExecuted(symbolSetName) * 2) > ); > - percentageBranches /= (double) SymbolsToAnalyze->getNumberBranchesFound() > * 2; > + percentageBranches /= > + (double) SymbolsToAnalyze->getNumberBranchesFound(symbolSetName) * 2; > percentageBranches *= 100.0; > > fprintf( report, "Bytes Analyzed : %d\n", totalBytes ); > @@ -504,48 +519,48 @@ void ReportsBase::WriteSummaryReport( > fprintf( > report, > "Unreferenced Symbols : %d\n", > - SymbolsToAnalyze->getNumberUnreferencedSymbols() > + SymbolsToAnalyze->getNumberUnreferencedSymbols(symbolSetName) > ); > fprintf( > report, > "Uncovered ranges found : %d\n\n", > - SymbolsToAnalyze->getNumberUncoveredRanges() > + SymbolsToAnalyze->getNumberUncoveredRanges(symbolSetName) > ); > - if ((SymbolsToAnalyze->getNumberBranchesFound() == 0) || > + if ((SymbolsToAnalyze->getNumberBranchesFound(symbolSetName) == 0) || > (BranchInfoAvailable == false) ) { > fprintf( report, "No branch information available\n" ); > } else { > fprintf( > report, > "Total conditional branches found : %d\n", > - SymbolsToAnalyze->getNumberBranchesFound() > + SymbolsToAnalyze->getNumberBranchesFound(symbolSetName) > ); > fprintf( > report, > "Total branch paths found : %d\n", > - SymbolsToAnalyze->getNumberBranchesFound() * 2 > + SymbolsToAnalyze->getNumberBranchesFound(symbolSetName) * 2 > ); > fprintf( > report, > "Uncovered branch paths found : %d\n", > - SymbolsToAnalyze->getNumberBranchesAlwaysTaken() + > - SymbolsToAnalyze->getNumberBranchesNeverTaken() + > - (SymbolsToAnalyze->getNumberBranchesNotExecuted() * 2) > + SymbolsToAnalyze->getNumberBranchesAlwaysTaken(symbolSetName) + > + SymbolsToAnalyze->getNumberBranchesNeverTaken(symbolSetName) + > + (SymbolsToAnalyze->getNumberBranchesNotExecuted(symbolSetName) * 2) > ); > fprintf( > report, > " %d branches always taken\n", > - SymbolsToAnalyze->getNumberBranchesAlwaysTaken() > + SymbolsToAnalyze->getNumberBranchesAlwaysTaken(symbolSetName) > ); > fprintf( > report, > " %d branches never taken\n", > - SymbolsToAnalyze->getNumberBranchesNeverTaken() > + SymbolsToAnalyze->getNumberBranchesNeverTaken(symbolSetName) > ); > fprintf( > report, > " %d branch paths not executed\n", > - SymbolsToAnalyze->getNumberBranchesNotExecuted() * 2 > + SymbolsToAnalyze->getNumberBranchesNotExecuted(symbolSetName) * 2 > ); > fprintf( > report, > @@ -555,7 +570,7 @@ void ReportsBase::WriteSummaryReport( > } > } > > -void GenerateReports() > +void GenerateReports(const std::string& symbolSetName) > { > typedef std::list<ReportsBase *> reportList_t; > > @@ -568,9 +583,9 @@ void GenerateReports() > > > timestamp = time(NULL); /* get current cal time */ > - reports = new ReportsText(timestamp); > + reports = new ReportsText(timestamp, symbolSetName); > reportList.push_back(reports); > - reports = new ReportsHtml(timestamp); > + reports = new ReportsHtml(timestamp, symbolSetName); > reportList.push_back(reports); > > for (ritr = reportList.begin(); ritr != reportList.end(); ritr++ ) { > @@ -624,7 +639,7 @@ void GenerateReports() > delete reports; > } > > - ReportsBase::WriteSummaryReport( "summary.txt" ); > + ReportsBase::WriteSummaryReport( "summary.txt", symbolSetName.c_str() ); > } > > } > diff --git a/tester/covoar/ReportsBase.h b/tester/covoar/ReportsBase.h > index 7e28fd8..e7b1fb3 100644 > --- a/tester/covoar/ReportsBase.h > +++ b/tester/covoar/ReportsBase.h > @@ -24,7 +24,7 @@ namespace Coverage { > class ReportsBase { > > public: > - ReportsBase( time_t timestamp ); > + ReportsBase( time_t timestamp, std::string symbolSetName ); > virtual ~ReportsBase(); > > /*! > @@ -90,7 +90,8 @@ class ReportsBase { > * This method produces a sumary report for the overall test run. > */ > static void WriteSummaryReport( > - const char* const fileName > + const char* const fileName, > + const char* const symbolSetName > ); > > /*! > @@ -118,6 +119,11 @@ class ReportsBase { > */ > std::string reportExtension_m; > > + /*! > + * This member variable contains the name of the symbol set for the > report. > + */ > + std::string symbolSetName_m; > + > /*! > * This member variable contains the timestamp for the report. > */ > @@ -128,9 +134,11 @@ class ReportsBase { > * correctly. Upon failure NULL is returned. > * > * @param[in] fileName identifies the report file name > + * @param[in] symbolSetName identifies the name of the report's symbol > set > */ > static FILE* OpenFile( > - const char* const fileName > + const char* const fileName, > + const char* const symbolSetName > ); > > /*! > @@ -318,13 +326,15 @@ class ReportsBase { > * > * @param[in] report identifies the report file name > * @param[in] number identifies the line number. > - * @param[in] symbolPtr is a pointer to the symbol information > + * @param[in] symbolName is the symbol's name. > + * @param[in] symbolInfo is the symbol's information. > * @param[in] rangePtr is a pointer to the range information. > */ > virtual bool PutBranchEntry( > FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbolPtr, > + const std::string& symbolName, > + const SymbolInformation& symbolInfo, > Coverage::CoverageRanges::ranges_t::iterator rangePtr > )=0; > > @@ -348,13 +358,15 @@ class ReportsBase { > * > * @param[in] report identifies the report file name > * @param[in] number identifies the line number. > - * @param[in] ditr is a iterator to the symbol information > + * @param[in] symbolName is the symbol's name. > + * @param[in] symbolInfo is the symbol's information. > * @param[in] ritr is a iterator to the range information. > */ > virtual bool PutCoverageLine( > FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator ditr, > + const std::string& symbolName, > + const SymbolInformation& symbolInfo, > Coverage::CoverageRanges::ranges_t::iterator ritr > )=0; > > @@ -363,13 +375,13 @@ class ReportsBase { > * > * @param[in] report identifies the size report file name > * @param[in] number identifies the line number. > - * @param[in] symbol is a pointer to the symbol information > + * @param[in] symbolName is the symbol's name. > * @param[in] range is a iterator to the range information. > */ > virtual bool PutSizeLine( > FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbol, > + const std::string& symbolName, > Coverage::CoverageRanges::ranges_t::iterator range > )=0; > > @@ -378,20 +390,24 @@ class ReportsBase { > * > * @param[in] report identifies the report file name > * @param[in] number identifies the line number. > - * @param[in] symbol is a pointer to the symbol information > + * @param[in] symbolName is the symbol's name. > + * @param[in] symbolInfo is the symbol's information. > */ > virtual bool PutSymbolSummaryLine( > FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbol > + const std::string& symbolName, > + const SymbolInformation& symbolInfo > )=0; > }; > > /*! > * This method iterates over all report set types and generates > * all reports. > + * > + * @param[in] symbolSetName is the name of the symbol set to report on. > */ > -void GenerateReports(); > +void GenerateReports(const std::string& symbolSetName); > > } > > diff --git a/tester/covoar/ReportsHtml.cc b/tester/covoar/ReportsHtml.cc > index 6406a48..7137016 100644 > --- a/tester/covoar/ReportsHtml.cc > +++ b/tester/covoar/ReportsHtml.cc > @@ -31,8 +31,8 @@ > > namespace Coverage { > > - ReportsHtml::ReportsHtml( time_t timestamp ): > - ReportsBase( timestamp ) > + ReportsHtml::ReportsHtml( time_t timestamp, std::string symbolSetName ): > + ReportsBase( timestamp, symbolSetName ) > { > reportExtension_m = ".html"; > } > @@ -113,7 +113,7 @@ namespace Coverage { > FILE* aFile; > > // Open the file > - aFile = ReportsBase::OpenFile( fileName ); > + aFile = ReportsBase::OpenFile( fileName, symbolSetName_m.c_str() ); > > // Put Header information on the file > fprintf( > @@ -488,7 +488,8 @@ namespace Coverage { > FILE* report > ) > { > - if (BranchInfoAvailable && SymbolsToAnalyze->getNumberBranchesFound() != > 0) > + if (BranchInfoAvailable && > + SymbolsToAnalyze->getNumberBranchesFound(symbolSetName_m) != 0) > fprintf( report, "All branch paths taken.\n" ); > else > fprintf( report, "No branch information found.\n" ); > @@ -498,7 +499,8 @@ namespace Coverage { > bool ReportsHtml::PutBranchEntry( > FILE* report, > unsigned int count, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbolPtr, > + const std::string& symbolName, > + const SymbolInformation& symbolInfo, > Coverage::CoverageRanges::ranges_t::iterator rangePtr > ) > { > @@ -519,7 +521,7 @@ namespace Coverage { > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%s</td>\n", > - symbolPtr->first.c_str() > + symbolName.c_str() > ); > > // line > @@ -562,8 +564,8 @@ namespace Coverage { > > // Taken / Not taken counts > lowAddress = rangePtr->lowAddress; > - bAddress = symbolPtr->second.baseAddress; > - theCoverageMap = symbolPtr->second.unifiedCoverageMap; > + bAddress = symbolInfo.baseAddress; > + theCoverageMap = symbolInfo.unifiedCoverageMap; > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%d</td>\n", > @@ -703,7 +705,8 @@ namespace Coverage { > bool ReportsHtml::PutCoverageLine( > FILE* report, > unsigned int count, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbolPtr, > + const std::string& symbolName, > + const SymbolInformation& symbolInfo, > Coverage::CoverageRanges::ranges_t::iterator rangePtr > ) > { > @@ -721,7 +724,7 @@ namespace Coverage { > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%s</td>\n", > - symbolPtr->first.c_str() > + symbolName.c_str() > ); > > // Range > @@ -790,7 +793,7 @@ namespace Coverage { > bool ReportsHtml::PutSizeLine( > FILE* report, > unsigned int count, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbol, > + const std::string& symbolName, > Coverage::CoverageRanges::ranges_t::iterator range > ) > { > @@ -814,7 +817,7 @@ namespace Coverage { > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%s</td>\n", > - symbol->first.c_str() > + symbolName.c_str() > ); > > // line > @@ -842,7 +845,8 @@ namespace Coverage { > bool ReportsHtml::PutSymbolSummaryLine( > FILE* report, > unsigned int count, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbol > + const std::string& symbolName, > + const SymbolInformation& symbolInfo > ) > { > > @@ -856,10 +860,10 @@ namespace Coverage { > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%s</td>\n", > - symbol->first.c_str() > + symbolName.c_str() > ); > > - if (symbol->second.stats.sizeInBytes == 0) { > + if (symbolInfo.stats.sizeInBytes == 0) { > // The symbol has never been seen. Write "unknown" for all columns. > fprintf( > report, > @@ -879,60 +883,60 @@ namespace Coverage { > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%d</td>\n", > - symbol->second.stats.sizeInBytes > + symbolInfo.stats.sizeInBytes > ); > > // Total Size in Instructions > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%d</td>\n", > - symbol->second.stats.sizeInInstructions > + symbolInfo.stats.sizeInInstructions > ); > > // Total Uncovered Ranges > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%d</td>\n", > - symbol->second.stats.uncoveredRanges > + symbolInfo.stats.uncoveredRanges > ); > > // Uncovered Size in Bytes > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%d</td>\n", > - symbol->second.stats.uncoveredBytes > + symbolInfo.stats.uncoveredBytes > ); > > // Uncovered Size in Instructions > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%d</td>\n", > - symbol->second.stats.uncoveredInstructions > + symbolInfo.stats.uncoveredInstructions > ); > > // Total number of branches > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%d</td>\n", > - symbol->second.stats.branchesNotExecuted + > symbol->second.stats.branchesExecuted > + symbolInfo.stats.branchesNotExecuted + > symbolInfo.stats.branchesExecuted > ); > > // Total Always Taken > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%d</td>\n", > - symbol->second.stats.branchesAlwaysTaken > + symbolInfo.stats.branchesAlwaysTaken > ); > > // Total Never Taken > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%d</td>\n", > - symbol->second.stats.branchesNeverTaken > + symbolInfo.stats.branchesNeverTaken > ); > > // % Uncovered Instructions > - if ( symbol->second.stats.sizeInInstructions == 0 ) > + if ( symbolInfo.stats.sizeInInstructions == 0 ) > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">100.00</td>\n" > @@ -941,12 +945,12 @@ namespace Coverage { > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%.2f</td>\n", > - (symbol->second.stats.uncoveredInstructions*100.0)/ > - symbol->second.stats.sizeInInstructions > + (symbolInfo.stats.uncoveredInstructions*100.0)/ > + symbolInfo.stats.sizeInInstructions > ); > > // % Uncovered Bytes > - if ( symbol->second.stats.sizeInBytes == 0 ) > + if ( symbolInfo.stats.sizeInBytes == 0 ) > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">100.00</td>\n" > @@ -955,8 +959,8 @@ namespace Coverage { > fprintf( > report, > "<td class=\"covoar-td\" align=\"center\">%.2f</td>\n", > - (symbol->second.stats.uncoveredBytes*100.0)/ > - symbol->second.stats.sizeInBytes > + (symbolInfo.stats.uncoveredBytes*100.0)/ > + symbolInfo.stats.sizeInBytes > ); > } > > diff --git a/tester/covoar/ReportsHtml.h b/tester/covoar/ReportsHtml.h > index 34193da..7972ce1 100644 > --- a/tester/covoar/ReportsHtml.h > +++ b/tester/covoar/ReportsHtml.h > @@ -22,7 +22,7 @@ namespace Coverage { > class ReportsHtml: public ReportsBase { > > public: > - ReportsHtml( time_t timestamp ); > + ReportsHtml( time_t timestamp, std::string symbolSetName ); > ~ReportsHtml(); > > /*! > @@ -163,7 +163,8 @@ class ReportsHtml: public ReportsBase { > virtual bool PutBranchEntry( > FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbolPtr, > + const std::string& symbolName, > + const SymbolInformation& symbolInfo, > Coverage::CoverageRanges::ranges_t::iterator rangePtr > ); > > @@ -179,7 +180,8 @@ class ReportsHtml: public ReportsBase { > virtual bool PutCoverageLine( > FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator ditr, > + const std::string& symbolName, > + const SymbolInformation& symbolInfo, > Coverage::CoverageRanges::ranges_t::iterator ritr > ); > > @@ -187,7 +189,7 @@ class ReportsHtml: public ReportsBase { > virtual bool PutSizeLine( > FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbol, > + const std::string& symbolName, > Coverage::CoverageRanges::ranges_t::iterator range > ); > > @@ -195,7 +197,8 @@ class ReportsHtml: public ReportsBase { > virtual bool PutSymbolSummaryLine( > FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbol > + const std::string& symbolName, > + const SymbolInformation& symbolInfo > ); > > /* Inherit documentation from base class. */ > diff --git a/tester/covoar/ReportsText.cc b/tester/covoar/ReportsText.cc > index a3923e6..f552cdd 100644 > --- a/tester/covoar/ReportsText.cc > +++ b/tester/covoar/ReportsText.cc > @@ -11,8 +11,8 @@ > > namespace Coverage { > > -ReportsText::ReportsText( time_t timestamp ): > - ReportsBase( timestamp ) > +ReportsText::ReportsText( time_t timestamp, std::string symbolSetName ): > + ReportsBase( timestamp, symbolSetName ) > { > reportExtension_m = ".txt"; > } > @@ -52,7 +52,8 @@ bool ReportsText::PutNoBranchInfo( > FILE* report > ) > { > - if ( BranchInfoAvailable && SymbolsToAnalyze->getNumberBranchesFound() != > 0 ) > + if ( BranchInfoAvailable && > + SymbolsToAnalyze->getNumberBranchesFound(symbolSetName_m) != 0 ) > fprintf( report, "All branch paths taken.\n" ); > else > fprintf( report, "No branch information found.\n" ); > @@ -61,9 +62,10 @@ bool ReportsText::PutNoBranchInfo( > > > bool ReportsText::PutBranchEntry( > - FILE* report, > + FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbolPtr, > + const std::string& symbolName, > + const SymbolInformation& symbolInfo, > Coverage::CoverageRanges::ranges_t::iterator rangePtr > ) > { > @@ -76,8 +78,8 @@ bool ReportsText::PutBranchEntry( > "Symbol : %s (0x%x)\n" > "Line : %s (0x%x)\n" > "Size in Bytes : %d\n", > - symbolPtr->first.c_str(), > - symbolPtr->second.baseAddress, > + symbolName.c_str(), > + symbolInfo.baseAddress, > rangePtr->lowSourceLine.c_str(), > rangePtr->lowAddress, > rangePtr->highAddress - rangePtr->lowAddress + 1 > @@ -153,9 +155,10 @@ void ReportsText::putCoverageNoRange( > } > > bool ReportsText::PutCoverageLine( > - FILE* report, > - unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator ditr, > + FILE* report, > + unsigned int number, > + const std::string& symbolName, > + const SymbolInformation& symbolInfo, > Coverage::CoverageRanges::ranges_t::iterator ritr > ) > { > @@ -171,8 +174,8 @@ bool ReportsText::PutCoverageLine( > "Size in Bytes : %d\n" > "Size in Instructions : %d\n\n", > ritr->id, > - ditr->first.c_str(), > - ditr->second.baseAddress, > + symbolName.c_str(), > + symbolInfo.baseAddress, > ritr->lowSourceLine.c_str(), > ritr->lowAddress, > ritr->highSourceLine.c_str(), > @@ -210,9 +213,9 @@ bool ReportsText::PutCoverageLine( > } > > bool ReportsText::PutSizeLine( > - FILE* report, > - unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbol, > + FILE* report, > + unsigned int number, > + const std::string& symbolName, > Coverage::CoverageRanges::ranges_t::iterator range > ) > { > @@ -220,7 +223,7 @@ bool ReportsText::PutSizeLine( > report, > "%d\t%s\t%s\n", > range->highAddress - range->lowAddress + 1, > - symbol->first.c_str(), > + symbolName.c_str(), > range->lowSourceLine.c_str() > ); > return true; > @@ -229,13 +232,14 @@ bool ReportsText::PutSizeLine( > bool ReportsText::PutSymbolSummaryLine( > FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbol > + const std::string& symbolName, > + const SymbolInformation& symbolInfo > ) > { > float uncoveredBytes; > float uncoveredInstructions; > > - if (symbol->second.stats.sizeInBytes == 0) { > + if (symbolInfo.stats.sizeInBytes == 0) { > fprintf( > report, > "============================================\n" > @@ -245,20 +249,20 @@ bool ReportsText::PutSymbolSummaryLine( > "Therefore there is no size or disassembly for this symbol.\n" > "This could be due to symbol misspelling or lack of a test for\n" > "this symbol.\n", > - symbol->first.c_str() > + symbolName.c_str() > ); > } else { > - if ( symbol->second.stats.sizeInInstructions == 0 ) > + if ( symbolInfo.stats.sizeInInstructions == 0 ) > uncoveredInstructions = 0; > else > - uncoveredInstructions = > (symbol->second.stats.uncoveredInstructions*100.0)/ > - symbol->second.stats.sizeInInstructions; > + uncoveredInstructions = (symbolInfo.stats.uncoveredInstructions*100.0)/ > + symbolInfo.stats.sizeInInstructions; > > - if ( symbol->second.stats.sizeInBytes == 0 ) > + if ( symbolInfo.stats.sizeInBytes == 0 ) > uncoveredBytes = 0; > else > - uncoveredBytes = (symbol->second.stats.uncoveredBytes*100.0)/ > - symbol->second.stats.sizeInBytes; > + uncoveredBytes = (symbolInfo.stats.uncoveredBytes*100.0)/ > + symbolInfo.stats.sizeInBytes; > > fprintf( > report, > @@ -271,12 +275,12 @@ bool ReportsText::PutSymbolSummaryLine( > "Total Never Taken : %d\n" > "Percentage Uncovered Instructions : %.2f\n" > "Percentage Uncovered Bytes : %.2f\n", > - symbol->first.c_str(), > - symbol->second.stats.sizeInBytes, > - symbol->second.stats.sizeInInstructions, > - symbol->second.stats.branchesNotExecuted + > symbol->second.stats.branchesExecuted, > - symbol->second.stats.branchesAlwaysTaken, > - symbol->second.stats.branchesNeverTaken, > + symbolName.c_str(), > + symbolInfo.stats.sizeInBytes, > + symbolInfo.stats.sizeInInstructions, > + symbolInfo.stats.branchesNotExecuted + > symbolInfo.stats.branchesExecuted, > + symbolInfo.stats.branchesAlwaysTaken, > + symbolInfo.stats.branchesNeverTaken, > uncoveredInstructions, > uncoveredBytes > ); > diff --git a/tester/covoar/ReportsText.h b/tester/covoar/ReportsText.h > index 9ae87d4..cf8a813 100644 > --- a/tester/covoar/ReportsText.h > +++ b/tester/covoar/ReportsText.h > @@ -21,7 +21,7 @@ namespace Coverage { > class ReportsText: public ReportsBase { > > public: > - ReportsText( time_t timestamp ); > + ReportsText( time_t timestamp, std::string symbolSetName ); > virtual ~ReportsText(); > > /*! > @@ -83,7 +83,8 @@ class ReportsText: public ReportsBase { > virtual bool PutBranchEntry( > FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbolPtr, > + const std::string& symbolName, > + const SymbolInformation& symbolInfo, > Coverage::CoverageRanges::ranges_t::iterator rangePtr > ); > > @@ -99,7 +100,8 @@ class ReportsText: public ReportsBase { > virtual bool PutCoverageLine( > FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator ditr, > + const std::string& symbolName, > + const SymbolInformation& symbolInfo, > Coverage::CoverageRanges::ranges_t::iterator ritr > ); > > @@ -107,7 +109,7 @@ class ReportsText: public ReportsBase { > virtual bool PutSizeLine( > FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbol, > + const std::string& symbolName, > Coverage::CoverageRanges::ranges_t::iterator range > ); > > @@ -115,7 +117,8 @@ class ReportsText: public ReportsBase { > virtual bool PutSymbolSummaryLine( > FILE* report, > unsigned int number, > - Coverage::DesiredSymbols::symbolSet_t::iterator symbol > + const std::string& symbolName, > + const SymbolInformation& symbolInfo > ); > }; > > diff --git a/tester/covoar/covoar.cc b/tester/covoar/covoar.cc > index 84d883a..8d63132 100644 > --- a/tester/covoar/covoar.cc > +++ b/tester/covoar/covoar.cc > @@ -350,7 +350,7 @@ int covoar( > throw rld::error( "executables and coverage name size mismatch", > "covoar" ); > > if ( Verbose ) > - std::cerr << "Analyzing " << SymbolsToAnalyze->set.size() > + std::cerr << "Analyzing " << SymbolsToAnalyze->allSymbols().size() > << " symbols" << std::endl; > > // Create explanations. > @@ -473,7 +473,9 @@ int covoar( > if (Verbose) > std::cerr << "Generate Reports" << std::endl; > > - Coverage::GenerateReports(); > + for (const auto& setName : SymbolsToAnalyze->getSetNames()) { > + Coverage::GenerateReports(setName); > + } > > // Write explanations that were not found. > if ( explanations ) { > -- > 2.27.0 > > _______________________________________________ > 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