diff options
Diffstat (limited to 'tester/covoar/TraceConverter.cc')
-rw-r--r-- | tester/covoar/TraceConverter.cc | 174 |
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; } |