This adds a new behavior to the -d option which allows the creation of named objdump outputs in the /tmp directory. This allows the outputs to be reused on subsequent runs of covoar rather than running objdump again. --- tester/covoar/ObjdumpProcessor.cc | 22 +++++++++++++--------- tester/covoar/ObjdumpProcessor.h | 6 ++++-- tester/covoar/app_common.cc | 10 ++++++++++ tester/covoar/app_common.h | 1 + tester/covoar/covoar.cc | 23 +++++++++++++++++++---- 5 files changed, 47 insertions(+), 15 deletions(-)
diff --git a/tester/covoar/ObjdumpProcessor.cc b/tester/covoar/ObjdumpProcessor.cc index 9ef2390..fb23ca6 100644 --- a/tester/covoar/ObjdumpProcessor.cc +++ b/tester/covoar/ObjdumpProcessor.cc @@ -236,7 +236,8 @@ namespace Coverage { void ObjdumpProcessor::getFile( std::string fileName, rld::process::tempfile& objdumpFile, - rld::process::tempfile& err + rld::process::tempfile& err, + bool debug ) { rld::process::status status; @@ -245,11 +246,13 @@ namespace Coverage { fileName }; try { - status = rld::process::execute( TargetInfo->getObjdump(), - args, objdumpFile.name(), err.name() ); - if ( (status.type != rld::process::status::normal) - || (status.code != 0) ) { - throw rld::error( "Objdump error", "generating objdump" ); + if (!debug || FileIsNewer( fileName.c_str(), objdumpFile.name().c_str() )) { + status = rld::process::execute( TargetInfo->getObjdump(), + 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 ) { @@ -325,7 +328,8 @@ namespace Coverage { void ObjdumpProcessor::load( ExecutableInfo* const executableInformation, rld::process::tempfile& objdumpFile, - rld::process::tempfile& err + rld::process::tempfile& err, + bool debug ) { std::string currentSymbol = ""; @@ -348,9 +352,9 @@ namespace Coverage { // Obtain the objdump file. if ( !executableInformation->hasDynamicLibrary() ) - getFile( executableInformation->getFileName(), objdumpFile, err ); + getFile( executableInformation->getFileName(), objdumpFile, err, debug ); else - getFile( executableInformation->getLibraryName(), objdumpFile, err ); + getFile( executableInformation->getLibraryName(), objdumpFile, err, debug ); while ( true ) { // Get the line. diff --git a/tester/covoar/ObjdumpProcessor.h b/tester/covoar/ObjdumpProcessor.h index c75755d..4dab001 100644 --- a/tester/covoar/ObjdumpProcessor.h +++ b/tester/covoar/ObjdumpProcessor.h @@ -103,7 +103,8 @@ namespace Coverage { */ void getFile( std::string fileName, rld::process::tempfile& dmp, - rld::process::tempfile& err ); + rld::process::tempfile& err, + bool debug = false ); /*! * This method fills the objdumpList list with all the @@ -122,7 +123,8 @@ namespace Coverage { void load( ExecutableInfo* const executableInformation, rld::process::tempfile& dmp, - rld::process::tempfile& err + rld::process::tempfile& err, + bool debug ); /*! diff --git a/tester/covoar/app_common.cc b/tester/covoar/app_common.cc index 8b490ed..0f3c8e2 100644 --- a/tester/covoar/app_common.cc +++ b/tester/covoar/app_common.cc @@ -116,3 +116,13 @@ bool ReadUntilFound( FILE *file, const char *line ) } while (1); } +std::string GetFileNameFromPath( const std::string& path ) +{ + size_t idx = path.rfind('/', path.length()); + if (idx == std::string::npos) { + return ""; + } + + return path.substr(idx + 1, path.length() - idx); +} + diff --git a/tester/covoar/app_common.h b/tester/covoar/app_common.h index ac32bbd..21e8cfa 100644 --- a/tester/covoar/app_common.h +++ b/tester/covoar/app_common.h @@ -30,5 +30,6 @@ extern char inputBuffer2[MAX_LINE_LENGTH]; bool FileIsNewer( const char *f1, const char *f2 ); bool FileIsReadable( const char *f1 ); bool ReadUntilFound( FILE *file, const char *line ); +std::string GetFileNameFromPath( const std::string& path ); #endif diff --git a/tester/covoar/covoar.cc b/tester/covoar/covoar.cc index bf95cb4..6b2082d 100644 --- a/tester/covoar/covoar.cc +++ b/tester/covoar/covoar.cc @@ -373,8 +373,25 @@ int covoar( exe->setLoadAddress( objdumpProcessor->determineLoadAddress( exe ) ); } - // Load the objdump for the symbols in this executable. - objdumpProcessor->load( exe, objdumpFile, err ); + if (debug) { + std::string name; + + if ( !exe->hasDynamicLibrary() ) { + name = exe->getFileName(); + } else { + name = exe->getLibraryName(); + } + + name = GetFileNameFromPath( name ); + name = buildTarget + "-" + name; + name.insert( 0, "/tmp/" ); + + rld::process::tempfile namedObjdumpFile( name, ".dmp", true ); + objdumpProcessor->load( exe, namedObjdumpFile, err, debug ); + } else { + // Load the objdump for the symbols in this executable. + objdumpProcessor->load( exe, objdumpFile, err, debug ); + } } // @@ -486,8 +503,6 @@ int covoar( //Leave tempfiles around if debug flag (-d) is enabled. if ( debug ) { - objdumpFile.override( "objdump_file" ); - objdumpFile.keep(); err.override( "objdump_exec_log" ); err.keep(); syms.override( "symbols_list" ); -- 2.27.0 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel