diff --git a/lldb/include/lldb/Core/SourceManager.h b/lldb/include/lldb/Core/SourceManager.h --- a/lldb/include/lldb/Core/SourceManager.h +++ b/lldb/include/lldb/Core/SourceManager.h @@ -86,6 +86,9 @@ private: void CommonInitializer(const FileSpec &file_spec, Target *target); + + bool IsNewerThanDebuggedExecutable(llvm::sys::TimePoint<> time); + void Update(llvm::sys::TimePoint<> mod_time); }; typedef std::shared_ptr FileSP; diff --git a/lldb/source/Core/SourceManager.cpp b/lldb/source/Core/SourceManager.cpp --- a/lldb/source/Core/SourceManager.cpp +++ b/lldb/source/Core/SourceManager.cpp @@ -531,12 +531,47 @@ // For now we check each time we want to display info for the file. auto curr_mod_time = FileSystem::Instance().GetModificationTime(m_file_spec); + if (IsNewerThanDebuggedExecutable(curr_mod_time)) + return; + if (curr_mod_time != llvm::sys::TimePoint<>() && m_mod_time != curr_mod_time) { - m_mod_time = curr_mod_time; - m_data_sp = FileSystem::Instance().CreateDataBuffer(m_file_spec); - m_offsets.clear(); + Update(curr_mod_time); + } +} + +bool SourceManager::File::IsNewerThanDebuggedExecutable(llvm::sys::TimePoint<> time) +{ + // Check if we are running in a debugger. + DebuggerSP debugger_sp(m_debugger_wp.lock()); + if (debugger_sp) { + lldb::TargetSP target_sp(debugger_sp->GetSelectedTarget()); + if (target_sp) { + lldb::ModuleSP exec_module_sp(target_sp->GetExecutableModule()); + if (exec_module_sp) { + auto exec_module_mod_time = exec_module_sp->GetModificationTime(); + + // If the source file is newer than the executable don't update, + // otherwise the source file being displayed will be different from + // the executable being ran. + // (We only want to update if the executable has been recompiled) + if (time > exec_module_mod_time) { + // TODO: maybe issue a: + // 'warning: Source file is more recent than executable.' ? + return true; + } + } + } } + + return false; +} + +void SourceManager::File::Update(llvm::sys::TimePoint<> modification_time) +{ + m_data_sp = FileSystem::Instance().CreateDataBuffer(m_file_spec); + m_offsets.clear(); + m_mod_time = modification_time; } size_t SourceManager::File::DisplaySourceLines(uint32_t line,