summaryrefslogtreecommitdiffstats
path: root/tester/covoar/DesiredSymbols.cc
diff options
context:
space:
mode:
authorCillian O'Donnell <cpodonnell8@gmail.com>2018-04-25 21:33:58 +0100
committerChris Johns <chrisj@rtems.org>2018-05-01 09:00:35 +1000
commit3e187baeb9f706b729b2760a51e63a7703a30679 (patch)
treed8a846ebb0ecafeb1318e2fe20a670688f53a1b4 /tester/covoar/DesiredSymbols.cc
parentrtemstoolkit: Remove warnings generated on Windows for fall-thru. (diff)
downloadrtems-tools-3e187baeb9f706b729b2760a51e63a7703a30679.tar.bz2
covoar: Add symbol set reader and ELF data parser to covoar.
Add ability to organize symbol sets of libraries in INI file and then read them with covoar and load the symbols directly from the libraries. rtems-tools/../testing: Add configuration files for coverage analysis. A number of covoar options are not required and are defaulted. Co-author: Krzysztof Miesowicz <krzysztof.miesowicz@gmail.com> Co-author: Vijay Kumar Banerjee <vijaykumar9597@gmail.com> Co-author: Chris Johns <chrisj@rtems.org>
Diffstat (limited to 'tester/covoar/DesiredSymbols.cc')
-rw-r--r--tester/covoar/DesiredSymbols.cc144
1 files changed, 83 insertions, 61 deletions
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 )