Author: Emre Kultursay Date: 2020-04-20T16:24:25+02:00 New Revision: acae69d08c88b701e25318f8d4100f5542c44407
URL: https://github.com/llvm/llvm-project/commit/acae69d08c88b701e25318f8d4100f5542c44407 DIFF: https://github.com/llvm/llvm-project/commit/acae69d08c88b701e25318f8d4100f5542c44407.diff LOG: [lldb] Add new LLDB setting: use-source-cache Summary: LLDB memory-maps large source files, and at the same time, caches all source files in the Source Cache. On Windows, memory-mapped source files are not writeable, causing bad user experience in IDEs (such as errors when saving edited files). IDEs should have the ability to disable the Source Cache at LLDB startup, so that users can edit source files while debugging. Bug: llvm.org/PR45310 Reviewers: labath, JDevlieghere, jingham Reviewed By: labath Subscribers: lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D76804 Added: Modified: lldb/include/lldb/API/SBDebugger.h lldb/include/lldb/Core/Debugger.h lldb/include/lldb/Core/SourceManager.h lldb/source/API/SBDebugger.cpp lldb/source/Core/CoreProperties.td lldb/source/Core/Debugger.cpp lldb/source/Core/SourceManager.cpp Removed: ################################################################################ diff --git a/lldb/include/lldb/API/SBDebugger.h b/lldb/include/lldb/API/SBDebugger.h index 84879be5e0db..21fe77fa4f15 100644 --- a/lldb/include/lldb/API/SBDebugger.h +++ b/lldb/include/lldb/API/SBDebugger.h @@ -199,6 +199,10 @@ class LLDB_API SBDebugger { bool GetUseColor() const; + bool SetUseSourceCache(bool use_source_cache); + + bool GetUseSourceCache() const; + static bool GetDefaultArchitecture(char *arch_name, size_t arch_name_len); static bool SetDefaultArchitecture(const char *arch_name); diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h index 4340f32fd6f3..0524e63beb59 100644 --- a/lldb/include/lldb/Core/Debugger.h +++ b/lldb/include/lldb/Core/Debugger.h @@ -273,6 +273,10 @@ class Debugger : public std::enable_shared_from_this<Debugger>, bool SetUseColor(bool use_color); + bool GetUseSourceCache() const; + + bool SetUseSourceCache(bool use_source_cache); + bool GetHighlightSource() const; lldb::StopShowColumn GetStopShowColumn() const; diff --git a/lldb/include/lldb/Core/SourceManager.h b/lldb/include/lldb/Core/SourceManager.h index c039200ca442..90ee59402d98 100644 --- a/lldb/include/lldb/Core/SourceManager.h +++ b/lldb/include/lldb/Core/SourceManager.h @@ -101,6 +101,9 @@ class SourceManager { void AddSourceFile(const FileSP &file_sp); FileSP FindSourceFile(const FileSpec &file_spec) const; + // Removes all elements from the cache. + void Clear() { m_file_cache.clear(); } + protected: typedef std::map<FileSpec, FileSP> FileCache; FileCache m_file_cache; diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp index 1aeb5e2ca9ff..414d85e64363 100644 --- a/lldb/source/API/SBDebugger.cpp +++ b/lldb/source/API/SBDebugger.cpp @@ -1374,6 +1374,18 @@ bool SBDebugger::GetUseColor() const { return (m_opaque_sp ? m_opaque_sp->GetUseColor() : false); } +bool SBDebugger::SetUseSourceCache(bool value) { + LLDB_RECORD_METHOD(bool, SBDebugger, SetUseSourceCache, (bool), value); + + return (m_opaque_sp ? m_opaque_sp->SetUseSourceCache(value) : false); +} + +bool SBDebugger::GetUseSourceCache() const { + LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, GetUseSourceCache); + + return (m_opaque_sp ? m_opaque_sp->GetUseSourceCache() : false); +} + bool SBDebugger::GetDescription(SBStream &description) { LLDB_RECORD_METHOD(bool, SBDebugger, GetDescription, (lldb::SBStream &), description); diff --git a/lldb/source/Core/CoreProperties.td b/lldb/source/Core/CoreProperties.td index 73294349438a..b04738175f34 100644 --- a/lldb/source/Core/CoreProperties.td +++ b/lldb/source/Core/CoreProperties.td @@ -103,6 +103,10 @@ let Definition = "debugger" in { Global, DefaultTrue, Desc<"Whether to use Ansi color codes or not.">; + def UseSourceCache: Property<"use-source-cache", "Boolean">, + Global, + DefaultTrue, + Desc<"Whether to cache source files in memory or not.">; def AutoOneLineSummaries: Property<"auto-one-line-summaries", "Boolean">, Global, DefaultTrue, diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index 68eb856b85f0..1d4bf0dafb72 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -212,6 +212,11 @@ Status Debugger::SetPropertyValue(const ExecutionContext *exe_ctx, // use-color changed. Ping the prompt so it can reset the ansi terminal // codes. SetPrompt(GetPrompt()); + } else if (property_path == g_debugger_properties[ePropertyUseSourceCache].name) { + // use-source-cache changed. Wipe out the cache contents if it was disabled. + if (!GetUseSourceCache()) { + m_source_file_cache.Clear(); + } } else if (is_load_script && target_sp && load_script_old_value == eLoadScriptFromSymFileWarn) { if (target_sp->TargetProperties::GetLoadScriptFromSymbolFile() == @@ -338,6 +343,20 @@ bool Debugger::SetUseColor(bool b) { return ret; } +bool Debugger::GetUseSourceCache() const { + const uint32_t idx = ePropertyUseSourceCache; + return m_collection_sp->GetPropertyAtIndexAsBoolean( + nullptr, idx, g_debugger_properties[idx].default_uint_value != 0); +} + +bool Debugger::SetUseSourceCache(bool b) { + const uint32_t idx = ePropertyUseSourceCache; + bool ret = m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); + if (!ret) { + m_source_file_cache.Clear(); + } + return ret; +} bool Debugger::GetHighlightSource() const { const uint32_t idx = ePropertyHighlightSource; return m_collection_sp->GetPropertyAtIndexAsBoolean( diff --git a/lldb/source/Core/SourceManager.cpp b/lldb/source/Core/SourceManager.cpp index 7f46bd2e0fb0..593459ba4509 100644 --- a/lldb/source/Core/SourceManager.cpp +++ b/lldb/source/Core/SourceManager.cpp @@ -72,7 +72,7 @@ SourceManager::FileSP SourceManager::GetFile(const FileSpec &file_spec) { FileSP file_sp; if (same_as_previous) file_sp = m_last_file_sp; - else if (debugger_sp) + else if (debugger_sp && debugger_sp->GetUseSourceCache()) file_sp = debugger_sp->GetSourceFileCache().FindSourceFile(file_spec); TargetSP target_sp(m_target_wp.lock()); @@ -95,7 +95,7 @@ SourceManager::FileSP SourceManager::GetFile(const FileSpec &file_spec) { else file_sp = std::make_shared<File>(file_spec, debugger_sp); - if (debugger_sp) + if (debugger_sp && debugger_sp->GetUseSourceCache()) debugger_sp->GetSourceFileCache().AddSourceFile(file_sp); } return file_sp; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits