This adds a new macro USE_TEMPLFILE 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. --- rtemstoolkit/rld-process.cpp | 12 ++++++++++++ rtemstoolkit/rld-process.h | 9 +++++++++ tester/covoar/ObjdumpProcessor.cc | 16 +++++++++++----- tester/covoar/app_common.cc | 10 ++++++++++ tester/covoar/app_common.h | 1 + tester/covoar/covoar.cc | 20 ++++++++++++++++++++ 6 files changed, 63 insertions(+), 5 deletions(-)
diff --git a/rtemstoolkit/rld-process.cpp b/rtemstoolkit/rld-process.cpp index 30e0605..d0352cb 100644 --- a/rtemstoolkit/rld-process.cpp +++ b/rtemstoolkit/rld-process.cpp @@ -169,6 +169,18 @@ namespace rld _name = temporaries.get (suffix, _keep); } + tempfile::tempfile ( + const std::string& name, + const std::string& suffix, + bool _keep + ) : _name(name + suffix), + suffix(suffix), + overridden (false), + fd (-1), + level (0) + { + } + tempfile::~tempfile () { try diff --git a/rtemstoolkit/rld-process.h b/rtemstoolkit/rld-process.h index fc9b7bc..16e0322 100644 --- a/rtemstoolkit/rld-process.h +++ b/rtemstoolkit/rld-process.h @@ -114,6 +114,15 @@ namespace rld */ tempfile (const std::string& suffix = ".rldxx", bool keep = false); + /** + * Get a temporary file name given a name and a suffix. + */ + tempfile ( + const std::string& name, + const std::string& suffix, + bool _keep = false + ); + /** * Clean up the temporary file. */ diff --git a/tester/covoar/ObjdumpProcessor.cc b/tester/covoar/ObjdumpProcessor.cc index 00824f1..f130819 100644 --- a/tester/covoar/ObjdumpProcessor.cc +++ b/tester/covoar/ObjdumpProcessor.cc @@ -245,12 +245,18 @@ 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" ); + #ifndef USE_TEMPFILE + if (FileIsNewer( fileName.c_str(), objdumpFile.name().c_str() )) { + #endif + 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" ); + } + #ifndef USE_TEMPFILE } + #endif } catch( rld::error& err ) { std::cout << "Error while running " << TargetInfo->getObjdump() 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..bc1b7cf 100644 --- a/tester/covoar/covoar.cc +++ b/tester/covoar/covoar.cc @@ -162,7 +162,9 @@ int covoar( FILE* gcnosFile = NULL; Gcov::GcovData* gcovFile; const char* singleExecutable = NULL; + #ifdef USE_TEMPFILE rld::process::tempfile objdumpFile( ".dmp" ); + #endif rld::process::tempfile err( ".err" ); rld::process::tempfile syms( ".syms" ); bool debug = false; @@ -373,6 +375,22 @@ int covoar( exe->setLoadAddress( objdumpProcessor->determineLoadAddress( exe ) ); } + #ifndef USE_TEMPFILE + 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 objdumpFile( name, ".dmp", true ); + #endif + // Load the objdump for the symbols in this executable. objdumpProcessor->load( exe, objdumpFile, err ); } @@ -486,8 +504,10 @@ int covoar( //Leave tempfiles around if debug flag (-d) is enabled. if ( debug ) { + #ifdef USE_TEMPFILE objdumpFile.override( "objdump_file" ); objdumpFile.keep(); + #endif 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