diff options
Diffstat (limited to 'lldb/source')
-rw-r--r-- | lldb/source/Core/Module.cpp | 76 | ||||
-rw-r--r-- | lldb/source/Core/ModuleList.cpp | 29 | ||||
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp | 2 |
3 files changed, 48 insertions, 59 deletions
diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index ee01dfe3f30..b3fac25a7c4 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -134,7 +134,8 @@ Module::Module (const ModuleSpec &module_spec) : m_did_parse_uuid (false), m_did_init_ast (false), m_is_dynamic_loader_module (false), - m_was_modified (false) + m_file_has_changed (false), + m_first_file_changed_log (false) { // Scope for locker below... { @@ -176,7 +177,8 @@ Module::Module(const FileSpec& file_spec, m_did_parse_uuid (false), m_did_init_ast (false), m_is_dynamic_loader_module (false), - m_was_modified (false) + m_file_has_changed (false), + m_first_file_changed_log (false) { // Scope for locker below... { @@ -803,32 +805,44 @@ Module::ReportError (const char *format, ...) } } +bool +Module::FileHasChanged () const +{ + if (m_file_has_changed == false) + m_file_has_changed = (m_file.GetModificationTime() != m_mod_time); + return m_file_has_changed; +} + void Module::ReportErrorIfModifyDetected (const char *format, ...) { - if (!GetModified(true) && GetModified(false)) + if (m_first_file_changed_log == false) { - if (format) + if (FileHasChanged ()) { - StreamString strm; - strm.PutCString("error: the object file "); - GetDescription(&strm, lldb::eDescriptionLevelFull); - strm.PutCString (" has been modified\n"); - - va_list args; - va_start (args, format); - strm.PrintfVarArg(format, args); - va_end (args); - - const int format_len = strlen(format); - if (format_len > 0) + m_first_file_changed_log = true; + if (format) { - const char last_char = format[format_len-1]; - if (last_char != '\n' || last_char != '\r') - strm.EOL(); + StreamString strm; + strm.PutCString("error: the object file "); + GetDescription(&strm, lldb::eDescriptionLevelFull); + strm.PutCString (" has been modified\n"); + + va_list args; + va_start (args, format); + strm.PrintfVarArg(format, args); + va_end (args); + + const int format_len = strlen(format); + if (format_len > 0) + { + const char last_char = format[format_len-1]; + if (last_char != '\n' || last_char != '\r') + strm.EOL(); + } + strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n"); + Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); } - strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n"); - Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); } } } @@ -893,26 +907,6 @@ Module::LogMessageVerboseBacktrace (Log *log, const char *format, ...) } } -bool -Module::GetModified (bool use_cached_only) -{ - if (m_was_modified == false && use_cached_only == false) - { - TimeValue curr_mod_time (m_file.GetModificationTime()); - m_was_modified = curr_mod_time != m_mod_time; - } - return m_was_modified; -} - -bool -Module::SetModified (bool b) -{ - const bool prev_value = m_was_modified; - m_was_modified = b; - return prev_value; -} - - void Module::Dump(Stream *s) { diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp index d6f29a6b49e..5507428c53e 100644 --- a/lldb/source/Core/ModuleList.cpp +++ b/lldb/source/Core/ModuleList.cpp @@ -710,24 +710,21 @@ ModuleList::GetSharedModule for (uint32_t module_idx = 0; module_idx < num_matching_modules; ++module_idx) { module_sp = matching_module_list.GetModuleAtIndex(module_idx); - // If we had a UUID and we found a match, then that is good enough for a match - if (uuid_ptr) - break; - if (module_file_spec) + + // Make sure the file for the module hasn't been modified + if (module_sp->FileHasChanged()) { - // If we didn't have a UUID in mind when looking for the object file, - // then we should make sure the modification time hasn't changed! - TimeValue file_spec_mod_time(module_file_spec.GetModificationTime()); - if (file_spec_mod_time.IsValid()) - { - if (file_spec_mod_time == module_sp->GetModificationTime()) - return error; - } + if (old_module_sp_ptr && !old_module_sp_ptr->get()) + *old_module_sp_ptr = module_sp; + shared_module_list.Remove (module_sp); + module_sp.reset(); + } + else + { + // The module matches and the module was not modified from + // when it was last loaded. + return error; } - if (old_module_sp_ptr && !old_module_sp_ptr->get()) - *old_module_sp_ptr = module_sp; - shared_module_list.Remove (module_sp); - module_sp.reset(); } } } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp index 1fc5e573c6f..fa89339abb1 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp @@ -2127,8 +2127,6 @@ DWARFDebugInfoEntry::GetAbbreviationDeclarationPtr (SymbolFileDWARF* dwarf2Data, if (abbrev_decl->Code() == abbrev_code) return abbrev_decl; - // Only log if we are the one to figure out that the module was modified - // which is indicated by SetModified() returning false. dwarf2Data->GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("0x%8.8x: the DWARF debug information has been modified (abbrev code was %u, and is now %u)", GetOffset(), (uint32_t)abbrev_decl->Code(), |