summaryrefslogtreecommitdiffstats
path: root/lldb/source/Target/Target.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Target/Target.cpp')
-rw-r--r--lldb/source/Target/Target.cpp231
1 files changed, 231 insertions, 0 deletions
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index 7d91f1e5186..f67c8cef692 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -35,6 +35,7 @@ using namespace lldb_private;
//----------------------------------------------------------------------
Target::Target(Debugger &debugger) :
Broadcaster("Target"),
+ TargetInstanceSettings (*(Target::GetSettingsController().get())),
m_debugger (debugger),
m_images(),
m_section_load_list (),
@@ -743,3 +744,233 @@ Target::GetScratchClangASTContext()
{
return m_scratch_ast_context_ap.get();
}
+
+lldb::UserSettingsControllerSP
+Target::GetSettingsController (bool finish)
+{
+ static lldb::UserSettingsControllerSP g_settings_controller (new SettingsController);
+ static bool initialized = false;
+
+ if (!initialized)
+ {
+ initialized = UserSettingsController::InitializeSettingsController (g_settings_controller,
+ Target::SettingsController::global_settings_table,
+ Target::SettingsController::instance_settings_table);
+ }
+
+ if (finish)
+ {
+ UserSettingsController::FinalizeSettingsController (g_settings_controller);
+ g_settings_controller.reset();
+ initialized = false;
+ }
+
+ return g_settings_controller;
+}
+
+ArchSpec
+Target::GetDefaultArchitecture ()
+{
+ lldb::UserSettingsControllerSP settings_controller = Target::GetSettingsController();
+ lldb::SettableVariableType var_type;
+ Error err;
+ StringList result = settings_controller->GetVariable ("target.default-arch", var_type, "[]", err);
+
+ const char *default_name = "";
+ if (result.GetSize() == 1 && err.Success())
+ default_name = result.GetStringAtIndex (0);
+
+ ArchSpec default_arch (default_name);
+ return default_arch;
+}
+
+void
+Target::SetDefaultArchitecture (ArchSpec new_arch)
+{
+ if (new_arch.IsValid())
+ Target::GetSettingsController ()->SetVariable ("target.default-arch", new_arch.AsCString(),
+ lldb::eVarSetOperationAssign, false, "[]");
+}
+
+//--------------------------------------------------------------
+// class Target::SettingsController
+//--------------------------------------------------------------
+
+Target::SettingsController::SettingsController () :
+ UserSettingsController ("target", Debugger::GetSettingsController()),
+ m_default_architecture ()
+{
+ m_default_settings.reset (new TargetInstanceSettings (*this, false,
+ InstanceSettings::GetDefaultName().AsCString()));
+}
+
+Target::SettingsController::~SettingsController ()
+{
+}
+
+lldb::InstanceSettingsSP
+Target::SettingsController::CreateInstanceSettings (const char *instance_name)
+{
+ TargetInstanceSettings *new_settings = new TargetInstanceSettings (*(Target::GetSettingsController().get()),
+ false, instance_name);
+ lldb::InstanceSettingsSP new_settings_sp (new_settings);
+ return new_settings_sp;
+}
+
+const ConstString &
+Target::SettingsController::DefArchVarName ()
+{
+ static ConstString def_arch_var_name ("default-arch");
+
+ return def_arch_var_name;
+}
+
+bool
+Target::SettingsController::SetGlobalVariable (const ConstString &var_name,
+ const char *index_value,
+ const char *value,
+ const SettingEntry &entry,
+ const lldb::VarSetOperationType op,
+ Error&err)
+{
+ if (var_name == DefArchVarName())
+ {
+ ArchSpec tmp_spec (value);
+ if (tmp_spec.IsValid())
+ m_default_architecture = tmp_spec;
+ else
+ err.SetErrorStringWithFormat ("'%s' is not a valid architecture.", value);
+ }
+ return true;
+}
+
+
+bool
+Target::SettingsController::GetGlobalVariable (const ConstString &var_name,
+ StringList &value,
+ Error &err)
+{
+ if (var_name == DefArchVarName())
+ {
+ value.AppendString (m_default_architecture.AsCString());
+ return true;
+ }
+ else
+ err.SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString());
+
+ return false;
+}
+
+//--------------------------------------------------------------
+// class TargetInstanceSettings
+//--------------------------------------------------------------
+
+TargetInstanceSettings::TargetInstanceSettings (UserSettingsController &owner, bool live_instance,
+ const char *name) :
+ InstanceSettings (owner, (name == NULL ? InstanceSettings::InvalidName().AsCString() : name), live_instance)
+{
+ // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called
+ // until the vtables for TargetInstanceSettings are properly set up, i.e. AFTER all the initializers.
+ // For this reason it has to be called here, rather than in the initializer or in the parent constructor.
+ // This is true for CreateInstanceName() too.
+
+ if (GetInstanceName () == InstanceSettings::InvalidName())
+ {
+ ChangeInstanceName (std::string (CreateInstanceName().AsCString()));
+ m_owner.RegisterInstanceSettings (this);
+ }
+
+ if (live_instance)
+ {
+ const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
+ CopyInstanceSettings (pending_settings,false);
+ //m_owner.RemovePendingSettings (m_instance_name);
+ }
+}
+
+TargetInstanceSettings::TargetInstanceSettings (const TargetInstanceSettings &rhs) :
+ InstanceSettings (*(Target::GetSettingsController().get()), CreateInstanceName().AsCString())
+{
+ if (m_instance_name != InstanceSettings::GetDefaultName())
+ {
+ const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
+ CopyInstanceSettings (pending_settings,false);
+ //m_owner.RemovePendingSettings (m_instance_name);
+ }
+}
+
+TargetInstanceSettings::~TargetInstanceSettings ()
+{
+}
+
+TargetInstanceSettings&
+TargetInstanceSettings::operator= (const TargetInstanceSettings &rhs)
+{
+ if (this != &rhs)
+ {
+ }
+
+ return *this;
+}
+
+
+void
+TargetInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name,
+ const char *index_value,
+ const char *value,
+ const ConstString &instance_name,
+ const SettingEntry &entry,
+ lldb::VarSetOperationType op,
+ Error &err,
+ bool pending)
+{
+ // Currently 'target' does not have any instance settings.
+}
+
+void
+TargetInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings,
+ bool pending)
+{
+ // Currently 'target' does not have any instance settings.
+}
+
+void
+TargetInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry,
+ const ConstString &var_name,
+ StringList &value,
+ Error &err)
+{
+ // Currently 'target' does not have any instance settings.
+}
+
+const ConstString
+TargetInstanceSettings::CreateInstanceName ()
+{
+ static int instance_count = 1;
+ StreamString sstr;
+
+ sstr.Printf ("target_%d", instance_count);
+ ++instance_count;
+
+ const ConstString ret_val (sstr.GetData());
+ return ret_val;
+}
+
+//--------------------------------------------------
+// Target::SettingsController Variable Tables
+//--------------------------------------------------
+
+SettingEntry
+Target::SettingsController::global_settings_table[] =
+{
+ //{ "var-name", var-type , "default", enum-table, init'd, hidden, "help-text"},
+ { "default-arch", eSetVarTypeString, "x86_64", NULL, false, false, "Default architecture to choose, when there's a choice." },
+ { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL }
+};
+
+SettingEntry
+Target::SettingsController::instance_settings_table[] =
+{
+ //{ "var-name", var-type, "default", enum-table, init'd, hidden, "help-text"},
+ { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL }
+};
OpenPOWER on IntegriCloud