[Lldb-commits] [lldb] 46a28a9 - [lldb] Create a property to store the REPL language
Jonas Devlieghere via lldb-commits
lldb-commits at lists.llvm.org
Wed Jan 5 15:03:52 PST 2022
Author: Jonas Devlieghere
Date: 2022-01-05T15:03:46-08:00
New Revision: 46a28a954e5e813f64ff458891b2d0891963c7d8
URL: https://github.com/llvm/llvm-project/commit/46a28a954e5e813f64ff458891b2d0891963c7d8
DIFF: https://github.com/llvm/llvm-project/commit/46a28a954e5e813f64ff458891b2d0891963c7d8.diff
LOG: [lldb] Create a property to store the REPL language
Until the introduction of the C++ REPL, there was always a single REPL
language. Several places relied on this assumption through
repl_languages.GetSingularLanguage. Now that this is no longer the case,
we need a way to specify a selected/preferred REPL language. This patch
does that with the help of a debugger property, taking inspiration from
how we store the scripting language.
Differential revision: https://reviews.llvm.org/D116697
Added:
Modified:
lldb/include/lldb/API/SBDebugger.h
lldb/include/lldb/Core/Debugger.h
lldb/include/lldb/Interpreter/OptionValueProperties.h
lldb/source/API/SBDebugger.cpp
lldb/source/Core/CoreProperties.td
lldb/source/Core/Debugger.cpp
lldb/source/Interpreter/CommandInterpreter.cpp
lldb/source/Interpreter/OptionValueProperties.cpp
lldb/source/Target/Target.cpp
lldb/tools/driver/Driver.cpp
Removed:
################################################################################
diff --git a/lldb/include/lldb/API/SBDebugger.h b/lldb/include/lldb/API/SBDebugger.h
index 1c771330cddce..a82c147053eb9 100644
--- a/lldb/include/lldb/API/SBDebugger.h
+++ b/lldb/include/lldb/API/SBDebugger.h
@@ -306,6 +306,10 @@ class LLDB_API SBDebugger {
void SetScriptLanguage(lldb::ScriptLanguage script_lang);
+ lldb::LanguageType GetREPLLanguage() const;
+
+ void SetREPLLanguage(lldb::LanguageType repl_lang);
+
bool GetCloseInputOnEOF() const;
void SetCloseInputOnEOF(bool b);
diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h
index 1ab21bec54c99..f9a1f1eea54f2 100644
--- a/lldb/include/lldb/Core/Debugger.h
+++ b/lldb/include/lldb/Core/Debugger.h
@@ -306,6 +306,10 @@ class Debugger : public std::enable_shared_from_this<Debugger>,
bool SetScriptLanguage(lldb::ScriptLanguage script_lang);
+ lldb::LanguageType GetREPLLanguage() const;
+
+ bool SetREPLLanguage(lldb::LanguageType repl_lang);
+
uint32_t GetTerminalWidth() const;
bool SetTerminalWidth(uint32_t term_width);
diff --git a/lldb/include/lldb/Interpreter/OptionValueProperties.h b/lldb/include/lldb/Interpreter/OptionValueProperties.h
index 6fa5403ac1429..3e5685b7f0bf2 100644
--- a/lldb/include/lldb/Interpreter/OptionValueProperties.h
+++ b/lldb/include/lldb/Interpreter/OptionValueProperties.h
@@ -114,6 +114,9 @@ class OptionValueProperties
GetPropertyAtIndexAsOptionValueLanguage(const ExecutionContext *exe_ctx,
uint32_t idx) const;
+ bool SetPropertyAtIndexAsLanguage(const ExecutionContext *exe_ctx,
+ uint32_t idx, lldb::LanguageType lang);
+
bool GetPropertyAtIndexAsArgs(const ExecutionContext *exe_ctx, uint32_t idx,
Args &args) const;
diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp
index fa5dcb57de7ee..c8522b79ad89e 100644
--- a/lldb/source/API/SBDebugger.cpp
+++ b/lldb/source/API/SBDebugger.cpp
@@ -1425,6 +1425,22 @@ void SBDebugger::SetScriptLanguage(ScriptLanguage script_lang) {
}
}
+LanguageType SBDebugger::GetREPLLanguage() const {
+ LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBDebugger,
+ GetREPLLanguage);
+
+ return (m_opaque_sp ? m_opaque_sp->GetREPLLanguage() : eLanguageTypeUnknown);
+}
+
+void SBDebugger::SetREPLLanguage(LanguageType repl_lang) {
+ LLDB_RECORD_METHOD(void, SBDebugger, SetREPLLanguage, (lldb::LanguageType),
+ repl_lang);
+
+ if (m_opaque_sp) {
+ m_opaque_sp->SetREPLLanguage(repl_lang);
+ }
+}
+
bool SBDebugger::SetUseExternalEditor(bool value) {
LLDB_RECORD_METHOD(bool, SBDebugger, SetUseExternalEditor, (bool), value);
@@ -1870,6 +1886,9 @@ template <> void RegisterMethods<SBDebugger>(Registry &R) {
GetScriptLanguage, ());
LLDB_REGISTER_METHOD(void, SBDebugger, SetScriptLanguage,
(lldb::ScriptLanguage));
+ LLDB_REGISTER_METHOD_CONST(lldb::LanguageType, SBDebugger, GetREPLLanguage,
+ ());
+ LLDB_REGISTER_METHOD(void, SBDebugger, SetREPLLanguage, (lldb::LanguageType));
LLDB_REGISTER_METHOD(bool, SBDebugger, SetUseExternalEditor, (bool));
LLDB_REGISTER_METHOD(bool, SBDebugger, GetUseExternalEditor, ());
LLDB_REGISTER_METHOD(bool, SBDebugger, SetUseColor, (bool));
diff --git a/lldb/source/Core/CoreProperties.td b/lldb/source/Core/CoreProperties.td
index 038ed00905f1a..399407075a7e0 100644
--- a/lldb/source/Core/CoreProperties.td
+++ b/lldb/source/Core/CoreProperties.td
@@ -62,6 +62,10 @@ let Definition = "debugger" in {
DefaultEnumValue<"eScriptLanguagePython">,
EnumValues<"OptionEnumValues(g_language_enumerators)">,
Desc<"The script language to be used for evaluating user-written scripts.">;
+ def REPLLanguage: Property<"repl-lang", "Language">,
+ Global,
+ DefaultEnumValue<"eLanguageTypeUnknown">,
+ Desc<"The language to use for the REPL.">;
def StopDisassemblyCount: Property<"stop-disassembly-count", "SInt64">,
Global,
DefaultUnsignedValue<4>,
diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp
index ae454fae3322f..49cc21b659518 100644
--- a/lldb/source/Core/Debugger.cpp
+++ b/lldb/source/Core/Debugger.cpp
@@ -25,6 +25,7 @@
#include "lldb/Interpreter/CommandInterpreter.h"
#include "lldb/Interpreter/CommandReturnObject.h"
#include "lldb/Interpreter/OptionValue.h"
+#include "lldb/Interpreter/OptionValueLanguage.h"
#include "lldb/Interpreter/OptionValueProperties.h"
#include "lldb/Interpreter/OptionValueSInt64.h"
#include "lldb/Interpreter/OptionValueString.h"
@@ -324,6 +325,20 @@ bool Debugger::SetScriptLanguage(lldb::ScriptLanguage script_lang) {
script_lang);
}
+lldb::LanguageType Debugger::GetREPLLanguage() const {
+ const uint32_t idx = ePropertyREPLLanguage;
+ OptionValueLanguage *value =
+ m_collection_sp->GetPropertyAtIndexAsOptionValueLanguage(nullptr, idx);
+ if (value)
+ return value->GetCurrentValue();
+ return LanguageType();
+}
+
+bool Debugger::SetREPLLanguage(lldb::LanguageType repl_lang) {
+ const uint32_t idx = ePropertyREPLLanguage;
+ return m_collection_sp->SetPropertyAtIndexAsLanguage(nullptr, idx, repl_lang);
+}
+
uint32_t Debugger::GetTerminalWidth() const {
const uint32_t idx = ePropertyTerminalWidth;
return m_collection_sp->GetPropertyAtIndexAsSInt64(
@@ -1753,17 +1768,20 @@ Status Debugger::RunREPL(LanguageType language, const char *repl_options) {
Status err;
FileSpec repl_executable;
+ if (language == eLanguageTypeUnknown)
+ language = GetREPLLanguage();
+
if (language == eLanguageTypeUnknown) {
LanguageSet repl_languages = Language::GetLanguagesSupportingREPLs();
if (auto single_lang = repl_languages.GetSingularLanguage()) {
language = *single_lang;
} else if (repl_languages.Empty()) {
- err.SetErrorStringWithFormat(
+ err.SetErrorString(
"LLDB isn't configured with REPL support for any languages.");
return err;
} else {
- err.SetErrorStringWithFormat(
+ err.SetErrorString(
"Multiple possible REPL languages. Please specify a language.");
return err;
}
diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp
index bd03f18b47c07..085b06bce0eae 100644
--- a/lldb/source/Interpreter/CommandInterpreter.cpp
+++ b/lldb/source/Interpreter/CommandInterpreter.cpp
@@ -2259,13 +2259,15 @@ static void GetHomeInitFile(llvm::SmallVectorImpl<char> &init_file,
FileSystem::Instance().Resolve(init_file);
}
-static void GetHomeREPLInitFile(llvm::SmallVectorImpl<char> &init_file) {
- LanguageSet repl_languages = Language::GetLanguagesSupportingREPLs();
- LanguageType language = eLanguageTypeUnknown;
- if (auto main_repl_language = repl_languages.GetSingularLanguage())
- language = *main_repl_language;
- else
- return;
+static void GetHomeREPLInitFile(llvm::SmallVectorImpl<char> &init_file,
+ LanguageType language) {
+ if (language == eLanguageTypeUnknown) {
+ LanguageSet repl_languages = Language::GetLanguagesSupportingREPLs();
+ if (auto main_repl_language = repl_languages.GetSingularLanguage())
+ language = *main_repl_language;
+ else
+ return;
+ }
std::string init_file_name =
(llvm::Twine(".lldbinit-") +
@@ -2355,7 +2357,7 @@ void CommandInterpreter::SourceInitFileHome(CommandReturnObject &result,
llvm::SmallString<128> init_file;
if (is_repl)
- GetHomeREPLInitFile(init_file);
+ GetHomeREPLInitFile(init_file, GetDebugger().GetREPLLanguage());
if (init_file.empty())
GetHomeInitFile(init_file);
diff --git a/lldb/source/Interpreter/OptionValueProperties.cpp b/lldb/source/Interpreter/OptionValueProperties.cpp
index 1a8f2f0ab1809..6e6580574edf7 100644
--- a/lldb/source/Interpreter/OptionValueProperties.cpp
+++ b/lldb/source/Interpreter/OptionValueProperties.cpp
@@ -226,6 +226,17 @@ OptionValueProperties::GetPropertyAtIndexAsOptionValueLanguage(
return nullptr;
}
+bool OptionValueProperties::SetPropertyAtIndexAsLanguage(
+ const ExecutionContext *exe_ctx, uint32_t idx, const LanguageType lang) {
+ const Property *property = GetPropertyAtIndex(exe_ctx, true, idx);
+ if (property) {
+ OptionValue *value = property->GetValue().get();
+ if (value)
+ return value->SetLanguageValue(lang);
+ }
+ return false;
+}
+
bool OptionValueProperties::GetPropertyAtIndexAsArgs(
const ExecutionContext *exe_ctx, uint32_t idx, Args &args) const {
const Property *property = GetPropertyAtIndex(exe_ctx, false, idx);
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index fa860399aca7b..01e51c0577aae 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -212,17 +212,20 @@ const lldb::ProcessSP &Target::GetProcessSP() const { return m_process_sp; }
lldb::REPLSP Target::GetREPL(Status &err, lldb::LanguageType language,
const char *repl_options, bool can_create) {
+ if (language == eLanguageTypeUnknown)
+ language = m_debugger.GetREPLLanguage();
+
if (language == eLanguageTypeUnknown) {
LanguageSet repl_languages = Language::GetLanguagesSupportingREPLs();
if (auto single_lang = repl_languages.GetSingularLanguage()) {
language = *single_lang;
} else if (repl_languages.Empty()) {
- err.SetErrorStringWithFormat(
+ err.SetErrorString(
"LLDB isn't configured with REPL support for any languages.");
return REPLSP();
} else {
- err.SetErrorStringWithFormat(
+ err.SetErrorString(
"Multiple possible REPL languages. Please specify a language.");
return REPLSP();
}
diff --git a/lldb/tools/driver/Driver.cpp b/lldb/tools/driver/Driver.cpp
index 2ed9958e51da9..233e0dd977d34 100644
--- a/lldb/tools/driver/Driver.cpp
+++ b/lldb/tools/driver/Driver.cpp
@@ -296,6 +296,7 @@ SBError Driver::ProcessArgs(const opt::InputArgList &args, bool &exiting) {
arg_value);
return error;
}
+ m_debugger.SetREPLLanguage(m_option_data.m_repl_lang);
}
if (args.hasArg(OPT_repl)) {
More information about the lldb-commits
mailing list