summaryrefslogtreecommitdiffstats
path: root/tester/covoar/TraceConverter.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tester/covoar/TraceConverter.cc')
-rw-r--r--tester/covoar/TraceConverter.cc174
1 files changed, 118 insertions, 56 deletions
diff --git a/tester/covoar/TraceConverter.cc b/tester/covoar/TraceConverter.cc
index 16c69d4..e393268 100644
--- a/tester/covoar/TraceConverter.cc
+++ b/tester/covoar/TraceConverter.cc
@@ -27,20 +27,18 @@
#define kill(p,s) raise(s)
#endif
-char* progname;
+std::string progname;
void usage()
{
- fprintf(
- stderr,
- "Usage: %s [-v] -c CPU -e executable -t tracefile [-E logfile]\n",
- progname
- );
- exit(1);
+ std::cerr << "Usage: "
+ << progname
+ << " [-v] -c CPU -e executable -t tracefile [-E logfile]"
+ << std::endl;
+ exit( 1 );
}
-static void
-fatal_signal( int signum )
+static void fatal_signal( int signum )
{
signal( signum, SIG_DFL );
@@ -53,20 +51,23 @@ fatal_signal( int signum )
kill( getpid(), signum );
}
-static void
-setup_signals( void )
+static void setup_signals()
{
- if ( signal (SIGINT, SIG_IGN) != SIG_IGN )
+ if ( signal (SIGINT, SIG_IGN) != SIG_IGN ) {
signal( SIGINT, fatal_signal );
+ }
#ifdef SIGHUP
- if ( signal( SIGHUP, SIG_IGN ) != SIG_IGN )
+ if ( signal( SIGHUP, SIG_IGN ) != SIG_IGN ) {
signal( SIGHUP, fatal_signal );
+ }
#endif
- if ( signal( SIGTERM, SIG_IGN ) != SIG_IGN )
+ if ( signal( SIGTERM, SIG_IGN ) != SIG_IGN ) {
signal( SIGTERM, fatal_signal );
+ }
#ifdef SIGPIPE
- if ( signal( SIGPIPE, SIG_IGN ) != SIG_IGN )
+ if ( signal( SIGPIPE, SIG_IGN ) != SIG_IGN ) {
signal( SIGPIPE, fatal_signal );
+ }
#endif
#ifdef SIGCHLD
signal( SIGCHLD, SIG_DFL );
@@ -78,20 +79,45 @@ int main(
char** argv
)
{
- int opt;
- Trace::TraceReaderLogQEMU log;
- Trace::TraceWriterQEMU trace;
- const char *cpuname = "";
- const char *executable = "";
- const char *tracefile = "";
- const char *logname = "/tmp/qemu.log";
- Coverage::ExecutableInfo* executableInfo;
- rld::process::tempfile objdumpFile( ".dmp" );
- rld::process::tempfile err( ".err" );
- Coverage::DesiredSymbols symbolsToAnalyze;
- bool verbose = false;
- std::string dynamicLibrary;
- int ec = 0;
+ int opt;
+ Trace::TraceReaderLogQEMU log;
+ Trace::TraceWriterQEMU trace;
+ std::string cpuname;
+ std::string executable;
+ std::string tracefile;
+ std::string logname = "/tmp/qemu.log";
+ Coverage::ExecutableInfo* executableInfo;
+ Coverage::DesiredSymbols symbolsToAnalyze;
+ bool verbose = false;
+ std::string dynamicLibrary;
+ int ec = 0;
+ std::shared_ptr<Target::TargetBase> targetInfo;
+ rld::process::tempfile *objdumpFile;
+ rld::process::tempfile *err;
+
+ try
+ {
+ objdumpFile = new rld::process::tempfile( ".dmp" );
+ }
+ catch ( rld::error re )
+ {
+ std::cerr << "Failed to make .dmp tempfile " << std::endl;
+ ec = 10;
+
+ return ec;
+ }
+
+ try
+ {
+ err = new rld::process::tempfile( ".err" );
+ }
+ catch ( rld::error re )
+ {
+ std::cerr << "Failed to make .err tempfile " << std::endl;
+ ec = 10;
+
+ return ec;
+ }
setup_signals();
@@ -100,52 +126,64 @@ int main(
//
progname = argv[0];
- while ((opt = getopt(argc, argv, "c:e:l:L:t:v")) != -1) {
- switch (opt) {
- case 'c': cpuname = optarg; break;
- case 'e': executable = optarg; break;
- case 'l': logname = optarg; break;
+ while ( (opt = getopt( argc, argv, "c:e:l:L:t:v" ) ) != -1 ) {
+ switch ( opt ) {
+ case 'c': cpuname = optarg; break;
+ case 'e': executable = optarg; break;
+ case 'l': logname = optarg; break;
case 'L': dynamicLibrary = optarg; break;
- case 't': tracefile = optarg; break;
- case 'v': verbose = true; break;
- default: usage();
+ case 't': tracefile = optarg; break;
+ case 'v': verbose = true; break;
+ default: usage();
}
}
// Make sure we have all the required parameters
- if ( !cpuname ) {
- fprintf( stderr, "cpuname not specified\n" );
+ if ( cpuname.empty() ) {
+ std::cerr << "cpuname not specified" << std::endl;
usage();
}
- if ( !executable ) {
- fprintf( stderr, "executable not specified\n" );
+ if ( executable.empty() ) {
+ std::cerr << "executable not specified" << std::endl;
usage();
}
- if ( !tracefile ) {
- fprintf( stderr, "output trace file not specified\n" );
+ if ( tracefile.empty() ) {
+ std::cerr << "output trace file not specified" << std::endl;
usage();
}
+
// Create toolnames.
- std::shared_ptr<Target::TargetBase>
- targetInfo( Target::TargetFactory( cpuname ) );
+ try
+ {
+ targetInfo.reset( Target::TargetFactory( cpuname ) );
+ }
+ catch ( rld::error re )
+ {
+ std::cerr << "error: "
+ << re.where << ": " << re.what
+ << std::endl;
+ ec = 10;
+
+ return ec;
+ }
Coverage::ObjdumpProcessor objdumpProcessor( symbolsToAnalyze, targetInfo );
- if ( !dynamicLibrary.empty() )
+ if ( !dynamicLibrary.empty() ) {
executableInfo = new Coverage::ExecutableInfo(
- executable,
+ executable.c_str(),
dynamicLibrary,
false,
symbolsToAnalyze
);
- else {
+ } else {
try
{
executableInfo = new Coverage::ExecutableInfo(
- executable,
+ executable.c_str(),
"",
false,
symbolsToAnalyze
@@ -161,13 +199,37 @@ int main(
}
// If a dynamic library was specified, determine the load address.
- if ( !dynamicLibrary.empty() )
- executableInfo->setLoadAddress(
- objdumpProcessor.determineLoadAddress( executableInfo )
- );
- objdumpProcessor.loadAddressTable( executableInfo, objdumpFile, err );
- log.processFile( logname, objdumpProcessor );
- trace.writeFile( tracefile, &log, verbose );
+ if ( !dynamicLibrary.empty() ) {
+ try
+ {
+ executableInfo->setLoadAddress(
+ objdumpProcessor.determineLoadAddress( executableInfo )
+ );
+ }
+ catch ( rld::error re )
+ {
+ std::cerr << "error: "
+ << re.where << ": " << re.what
+ << std::endl;
+ ec = 10;
+
+ return ec;
+ }
+ }
+
+ try
+ {
+ objdumpProcessor.loadAddressTable( executableInfo, *objdumpFile, *err );
+ log.processFile( logname.c_str(), objdumpProcessor );
+ trace.writeFile( tracefile.c_str(), &log, verbose );
+ }
+ catch ( rld::error re )
+ {
+ std::cerr << "error: "
+ << re.where << ": " << re.what
+ << std::endl;
+ ec = 10;
+ }
return ec;
}