summaryrefslogtreecommitdiff
path: root/contrib/llvm-project/lldb/source/Interpreter/OptionValue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/lldb/source/Interpreter/OptionValue.cpp')
-rw-r--r--contrib/llvm-project/lldb/source/Interpreter/OptionValue.cpp615
1 files changed, 615 insertions, 0 deletions
diff --git a/contrib/llvm-project/lldb/source/Interpreter/OptionValue.cpp b/contrib/llvm-project/lldb/source/Interpreter/OptionValue.cpp
new file mode 100644
index 000000000000..00c8642595b7
--- /dev/null
+++ b/contrib/llvm-project/lldb/source/Interpreter/OptionValue.cpp
@@ -0,0 +1,615 @@
+//===-- OptionValue.cpp -----------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/Interpreter/OptionValue.h"
+
+#include "lldb/Interpreter/OptionValues.h"
+#include "lldb/Utility/StringList.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+// Get this value as a uint64_t value if it is encoded as a boolean, uint64_t
+// or int64_t. Other types will cause "fail_value" to be returned
+uint64_t OptionValue::GetUInt64Value(uint64_t fail_value, bool *success_ptr) {
+ if (success_ptr)
+ *success_ptr = true;
+ switch (GetType()) {
+ case OptionValue::eTypeBoolean:
+ return static_cast<OptionValueBoolean *>(this)->GetCurrentValue();
+ case OptionValue::eTypeSInt64:
+ return static_cast<OptionValueSInt64 *>(this)->GetCurrentValue();
+ case OptionValue::eTypeUInt64:
+ return static_cast<OptionValueUInt64 *>(this)->GetCurrentValue();
+ default:
+ break;
+ }
+ if (success_ptr)
+ *success_ptr = false;
+ return fail_value;
+}
+
+Status OptionValue::SetSubValue(const ExecutionContext *exe_ctx,
+ VarSetOperationType op, llvm::StringRef name,
+ llvm::StringRef value) {
+ Status error;
+ error.SetErrorStringWithFormat("SetSubValue is not supported");
+ return error;
+}
+
+OptionValueBoolean *OptionValue::GetAsBoolean() {
+ if (GetType() == OptionValue::eTypeBoolean)
+ return static_cast<OptionValueBoolean *>(this);
+ return nullptr;
+}
+
+const OptionValueBoolean *OptionValue::GetAsBoolean() const {
+ if (GetType() == OptionValue::eTypeBoolean)
+ return static_cast<const OptionValueBoolean *>(this);
+ return nullptr;
+}
+
+const OptionValueChar *OptionValue::GetAsChar() const {
+ if (GetType() == OptionValue::eTypeChar)
+ return static_cast<const OptionValueChar *>(this);
+ return nullptr;
+}
+
+OptionValueChar *OptionValue::GetAsChar() {
+ if (GetType() == OptionValue::eTypeChar)
+ return static_cast<OptionValueChar *>(this);
+ return nullptr;
+}
+
+OptionValueFileSpec *OptionValue::GetAsFileSpec() {
+ if (GetType() == OptionValue::eTypeFileSpec)
+ return static_cast<OptionValueFileSpec *>(this);
+ return nullptr;
+}
+
+const OptionValueFileSpec *OptionValue::GetAsFileSpec() const {
+ if (GetType() == OptionValue::eTypeFileSpec)
+ return static_cast<const OptionValueFileSpec *>(this);
+ return nullptr;
+}
+
+OptionValueFileSpecList *OptionValue::GetAsFileSpecList() {
+ if (GetType() == OptionValue::eTypeFileSpecList)
+ return static_cast<OptionValueFileSpecList *>(this);
+ return nullptr;
+}
+
+const OptionValueFileSpecList *OptionValue::GetAsFileSpecList() const {
+ if (GetType() == OptionValue::eTypeFileSpecList)
+ return static_cast<const OptionValueFileSpecList *>(this);
+ return nullptr;
+}
+
+OptionValueArch *OptionValue::GetAsArch() {
+ if (GetType() == OptionValue::eTypeArch)
+ return static_cast<OptionValueArch *>(this);
+ return nullptr;
+}
+
+const OptionValueArch *OptionValue::GetAsArch() const {
+ if (GetType() == OptionValue::eTypeArch)
+ return static_cast<const OptionValueArch *>(this);
+ return nullptr;
+}
+
+OptionValueArray *OptionValue::GetAsArray() {
+ if (GetType() == OptionValue::eTypeArray)
+ return static_cast<OptionValueArray *>(this);
+ return nullptr;
+}
+
+const OptionValueArray *OptionValue::GetAsArray() const {
+ if (GetType() == OptionValue::eTypeArray)
+ return static_cast<const OptionValueArray *>(this);
+ return nullptr;
+}
+
+OptionValueArgs *OptionValue::GetAsArgs() {
+ if (GetType() == OptionValue::eTypeArgs)
+ return static_cast<OptionValueArgs *>(this);
+ return nullptr;
+}
+
+const OptionValueArgs *OptionValue::GetAsArgs() const {
+ if (GetType() == OptionValue::eTypeArgs)
+ return static_cast<const OptionValueArgs *>(this);
+ return nullptr;
+}
+
+OptionValueDictionary *OptionValue::GetAsDictionary() {
+ if (GetType() == OptionValue::eTypeDictionary)
+ return static_cast<OptionValueDictionary *>(this);
+ return nullptr;
+}
+
+const OptionValueDictionary *OptionValue::GetAsDictionary() const {
+ if (GetType() == OptionValue::eTypeDictionary)
+ return static_cast<const OptionValueDictionary *>(this);
+ return nullptr;
+}
+
+OptionValueEnumeration *OptionValue::GetAsEnumeration() {
+ if (GetType() == OptionValue::eTypeEnum)
+ return static_cast<OptionValueEnumeration *>(this);
+ return nullptr;
+}
+
+const OptionValueEnumeration *OptionValue::GetAsEnumeration() const {
+ if (GetType() == OptionValue::eTypeEnum)
+ return static_cast<const OptionValueEnumeration *>(this);
+ return nullptr;
+}
+
+OptionValueFormat *OptionValue::GetAsFormat() {
+ if (GetType() == OptionValue::eTypeFormat)
+ return static_cast<OptionValueFormat *>(this);
+ return nullptr;
+}
+
+const OptionValueFormat *OptionValue::GetAsFormat() const {
+ if (GetType() == OptionValue::eTypeFormat)
+ return static_cast<const OptionValueFormat *>(this);
+ return nullptr;
+}
+
+OptionValueLanguage *OptionValue::GetAsLanguage() {
+ if (GetType() == OptionValue::eTypeLanguage)
+ return static_cast<OptionValueLanguage *>(this);
+ return nullptr;
+}
+
+const OptionValueLanguage *OptionValue::GetAsLanguage() const {
+ if (GetType() == OptionValue::eTypeLanguage)
+ return static_cast<const OptionValueLanguage *>(this);
+ return nullptr;
+}
+
+OptionValueFormatEntity *OptionValue::GetAsFormatEntity() {
+ if (GetType() == OptionValue::eTypeFormatEntity)
+ return static_cast<OptionValueFormatEntity *>(this);
+ return nullptr;
+}
+
+const OptionValueFormatEntity *OptionValue::GetAsFormatEntity() const {
+ if (GetType() == OptionValue::eTypeFormatEntity)
+ return static_cast<const OptionValueFormatEntity *>(this);
+ return nullptr;
+}
+
+OptionValuePathMappings *OptionValue::GetAsPathMappings() {
+ if (GetType() == OptionValue::eTypePathMap)
+ return static_cast<OptionValuePathMappings *>(this);
+ return nullptr;
+}
+
+const OptionValuePathMappings *OptionValue::GetAsPathMappings() const {
+ if (GetType() == OptionValue::eTypePathMap)
+ return static_cast<const OptionValuePathMappings *>(this);
+ return nullptr;
+}
+
+OptionValueProperties *OptionValue::GetAsProperties() {
+ if (GetType() == OptionValue::eTypeProperties)
+ return static_cast<OptionValueProperties *>(this);
+ return nullptr;
+}
+
+const OptionValueProperties *OptionValue::GetAsProperties() const {
+ if (GetType() == OptionValue::eTypeProperties)
+ return static_cast<const OptionValueProperties *>(this);
+ return nullptr;
+}
+
+OptionValueRegex *OptionValue::GetAsRegex() {
+ if (GetType() == OptionValue::eTypeRegex)
+ return static_cast<OptionValueRegex *>(this);
+ return nullptr;
+}
+
+const OptionValueRegex *OptionValue::GetAsRegex() const {
+ if (GetType() == OptionValue::eTypeRegex)
+ return static_cast<const OptionValueRegex *>(this);
+ return nullptr;
+}
+
+OptionValueSInt64 *OptionValue::GetAsSInt64() {
+ if (GetType() == OptionValue::eTypeSInt64)
+ return static_cast<OptionValueSInt64 *>(this);
+ return nullptr;
+}
+
+const OptionValueSInt64 *OptionValue::GetAsSInt64() const {
+ if (GetType() == OptionValue::eTypeSInt64)
+ return static_cast<const OptionValueSInt64 *>(this);
+ return nullptr;
+}
+
+OptionValueString *OptionValue::GetAsString() {
+ if (GetType() == OptionValue::eTypeString)
+ return static_cast<OptionValueString *>(this);
+ return nullptr;
+}
+
+const OptionValueString *OptionValue::GetAsString() const {
+ if (GetType() == OptionValue::eTypeString)
+ return static_cast<const OptionValueString *>(this);
+ return nullptr;
+}
+
+OptionValueUInt64 *OptionValue::GetAsUInt64() {
+ if (GetType() == OptionValue::eTypeUInt64)
+ return static_cast<OptionValueUInt64 *>(this);
+ return nullptr;
+}
+
+const OptionValueUInt64 *OptionValue::GetAsUInt64() const {
+ if (GetType() == OptionValue::eTypeUInt64)
+ return static_cast<const OptionValueUInt64 *>(this);
+ return nullptr;
+}
+
+OptionValueUUID *OptionValue::GetAsUUID() {
+ if (GetType() == OptionValue::eTypeUUID)
+ return static_cast<OptionValueUUID *>(this);
+ return nullptr;
+}
+
+const OptionValueUUID *OptionValue::GetAsUUID() const {
+ if (GetType() == OptionValue::eTypeUUID)
+ return static_cast<const OptionValueUUID *>(this);
+ return nullptr;
+}
+
+bool OptionValue::GetBooleanValue(bool fail_value) const {
+ const OptionValueBoolean *option_value = GetAsBoolean();
+ if (option_value)
+ return option_value->GetCurrentValue();
+ return fail_value;
+}
+
+bool OptionValue::SetBooleanValue(bool new_value) {
+ OptionValueBoolean *option_value = GetAsBoolean();
+ if (option_value) {
+ option_value->SetCurrentValue(new_value);
+ return true;
+ }
+ return false;
+}
+
+char OptionValue::GetCharValue(char fail_value) const {
+ const OptionValueChar *option_value = GetAsChar();
+ if (option_value)
+ return option_value->GetCurrentValue();
+ return fail_value;
+}
+
+char OptionValue::SetCharValue(char new_value) {
+ OptionValueChar *option_value = GetAsChar();
+ if (option_value) {
+ option_value->SetCurrentValue(new_value);
+ return true;
+ }
+ return false;
+}
+
+int64_t OptionValue::GetEnumerationValue(int64_t fail_value) const {
+ const OptionValueEnumeration *option_value = GetAsEnumeration();
+ if (option_value)
+ return option_value->GetCurrentValue();
+ return fail_value;
+}
+
+bool OptionValue::SetEnumerationValue(int64_t value) {
+ OptionValueEnumeration *option_value = GetAsEnumeration();
+ if (option_value) {
+ option_value->SetCurrentValue(value);
+ return true;
+ }
+ return false;
+}
+
+FileSpec OptionValue::GetFileSpecValue() const {
+ const OptionValueFileSpec *option_value = GetAsFileSpec();
+ if (option_value)
+ return option_value->GetCurrentValue();
+ return FileSpec();
+}
+
+bool OptionValue::SetFileSpecValue(const FileSpec &file_spec) {
+ OptionValueFileSpec *option_value = GetAsFileSpec();
+ if (option_value) {
+ option_value->SetCurrentValue(file_spec, false);
+ return true;
+ }
+ return false;
+}
+
+FileSpecList OptionValue::GetFileSpecListValue() const {
+ const OptionValueFileSpecList *option_value = GetAsFileSpecList();
+ if (option_value)
+ return option_value->GetCurrentValue();
+ return FileSpecList();
+}
+
+lldb::Format OptionValue::GetFormatValue(lldb::Format fail_value) const {
+ const OptionValueFormat *option_value = GetAsFormat();
+ if (option_value)
+ return option_value->GetCurrentValue();
+ return fail_value;
+}
+
+bool OptionValue::SetFormatValue(lldb::Format new_value) {
+ OptionValueFormat *option_value = GetAsFormat();
+ if (option_value) {
+ option_value->SetCurrentValue(new_value);
+ return true;
+ }
+ return false;
+}
+
+lldb::LanguageType
+OptionValue::GetLanguageValue(lldb::LanguageType fail_value) const {
+ const OptionValueLanguage *option_value = GetAsLanguage();
+ if (option_value)
+ return option_value->GetCurrentValue();
+ return fail_value;
+}
+
+bool OptionValue::SetLanguageValue(lldb::LanguageType new_language) {
+ OptionValueLanguage *option_value = GetAsLanguage();
+ if (option_value) {
+ option_value->SetCurrentValue(new_language);
+ return true;
+ }
+ return false;
+}
+
+const FormatEntity::Entry *OptionValue::GetFormatEntity() const {
+ const OptionValueFormatEntity *option_value = GetAsFormatEntity();
+ if (option_value)
+ return &option_value->GetCurrentValue();
+ return nullptr;
+}
+
+const RegularExpression *OptionValue::GetRegexValue() const {
+ const OptionValueRegex *option_value = GetAsRegex();
+ if (option_value)
+ return option_value->GetCurrentValue();
+ return nullptr;
+}
+
+int64_t OptionValue::GetSInt64Value(int64_t fail_value) const {
+ const OptionValueSInt64 *option_value = GetAsSInt64();
+ if (option_value)
+ return option_value->GetCurrentValue();
+ return fail_value;
+}
+
+bool OptionValue::SetSInt64Value(int64_t new_value) {
+ OptionValueSInt64 *option_value = GetAsSInt64();
+ if (option_value) {
+ option_value->SetCurrentValue(new_value);
+ return true;
+ }
+ return false;
+}
+
+llvm::StringRef OptionValue::GetStringValue(llvm::StringRef fail_value) const {
+ const OptionValueString *option_value = GetAsString();
+ if (option_value)
+ return option_value->GetCurrentValueAsRef();
+ return fail_value;
+}
+
+bool OptionValue::SetStringValue(llvm::StringRef new_value) {
+ OptionValueString *option_value = GetAsString();
+ if (option_value) {
+ option_value->SetCurrentValue(new_value);
+ return true;
+ }
+ return false;
+}
+
+uint64_t OptionValue::GetUInt64Value(uint64_t fail_value) const {
+ const OptionValueUInt64 *option_value = GetAsUInt64();
+ if (option_value)
+ return option_value->GetCurrentValue();
+ return fail_value;
+}
+
+bool OptionValue::SetUInt64Value(uint64_t new_value) {
+ OptionValueUInt64 *option_value = GetAsUInt64();
+ if (option_value) {
+ option_value->SetCurrentValue(new_value);
+ return true;
+ }
+ return false;
+}
+
+UUID OptionValue::GetUUIDValue() const {
+ const OptionValueUUID *option_value = GetAsUUID();
+ if (option_value)
+ return option_value->GetCurrentValue();
+ return UUID();
+}
+
+bool OptionValue::SetUUIDValue(const UUID &uuid) {
+ OptionValueUUID *option_value = GetAsUUID();
+ if (option_value) {
+ option_value->SetCurrentValue(uuid);
+ return true;
+ }
+ return false;
+}
+
+const char *OptionValue::GetBuiltinTypeAsCString(Type t) {
+ switch (t) {
+ case eTypeInvalid:
+ return "invalid";
+ case eTypeArch:
+ return "arch";
+ case eTypeArgs:
+ return "arguments";
+ case eTypeArray:
+ return "array";
+ case eTypeBoolean:
+ return "boolean";
+ case eTypeChar:
+ return "char";
+ case eTypeDictionary:
+ return "dictionary";
+ case eTypeEnum:
+ return "enum";
+ case eTypeFileSpec:
+ return "file";
+ case eTypeFileSpecList:
+ return "file-list";
+ case eTypeFormat:
+ return "format";
+ case eTypeFormatEntity:
+ return "format-string";
+ case eTypeLanguage:
+ return "language";
+ case eTypePathMap:
+ return "path-map";
+ case eTypeProperties:
+ return "properties";
+ case eTypeRegex:
+ return "regex";
+ case eTypeSInt64:
+ return "int";
+ case eTypeString:
+ return "string";
+ case eTypeUInt64:
+ return "unsigned";
+ case eTypeUUID:
+ return "uuid";
+ }
+ return nullptr;
+}
+
+lldb::OptionValueSP OptionValue::CreateValueFromCStringForTypeMask(
+ const char *value_cstr, uint32_t type_mask, Status &error) {
+ // If only 1 bit is set in the type mask for a dictionary or array then we
+ // know how to decode a value from a cstring
+ lldb::OptionValueSP value_sp;
+ switch (type_mask) {
+ case 1u << eTypeArch:
+ value_sp.reset(new OptionValueArch());
+ break;
+ case 1u << eTypeBoolean:
+ value_sp.reset(new OptionValueBoolean(false));
+ break;
+ case 1u << eTypeChar:
+ value_sp.reset(new OptionValueChar('\0'));
+ break;
+ case 1u << eTypeFileSpec:
+ value_sp.reset(new OptionValueFileSpec());
+ break;
+ case 1u << eTypeFormat:
+ value_sp.reset(new OptionValueFormat(eFormatInvalid));
+ break;
+ case 1u << eTypeFormatEntity:
+ value_sp.reset(new OptionValueFormatEntity(nullptr));
+ break;
+ case 1u << eTypeLanguage:
+ value_sp.reset(new OptionValueLanguage(eLanguageTypeUnknown));
+ break;
+ case 1u << eTypeSInt64:
+ value_sp.reset(new OptionValueSInt64());
+ break;
+ case 1u << eTypeString:
+ value_sp.reset(new OptionValueString());
+ break;
+ case 1u << eTypeUInt64:
+ value_sp.reset(new OptionValueUInt64());
+ break;
+ case 1u << eTypeUUID:
+ value_sp.reset(new OptionValueUUID());
+ break;
+ }
+
+ if (value_sp)
+ error = value_sp->SetValueFromString(
+ llvm::StringRef::withNullAsEmpty(value_cstr), eVarSetOperationAssign);
+ else
+ error.SetErrorString("unsupported type mask");
+ return value_sp;
+}
+
+bool OptionValue::DumpQualifiedName(Stream &strm) const {
+ bool dumped_something = false;
+ lldb::OptionValueSP m_parent_sp(m_parent_wp.lock());
+ if (m_parent_sp) {
+ if (m_parent_sp->DumpQualifiedName(strm))
+ dumped_something = true;
+ }
+ ConstString name(GetName());
+ if (name) {
+ if (dumped_something)
+ strm.PutChar('.');
+ else
+ dumped_something = true;
+ strm << name;
+ }
+ return dumped_something;
+}
+
+size_t OptionValue::AutoComplete(CommandInterpreter &interpreter,
+ CompletionRequest &request) {
+ request.SetWordComplete(false);
+ return request.GetNumberOfMatches();
+}
+
+Status OptionValue::SetValueFromString(llvm::StringRef value,
+ VarSetOperationType op) {
+ Status error;
+ switch (op) {
+ case eVarSetOperationReplace:
+ error.SetErrorStringWithFormat(
+ "%s objects do not support the 'replace' operation",
+ GetTypeAsCString());
+ break;
+ case eVarSetOperationInsertBefore:
+ error.SetErrorStringWithFormat(
+ "%s objects do not support the 'insert-before' operation",
+ GetTypeAsCString());
+ break;
+ case eVarSetOperationInsertAfter:
+ error.SetErrorStringWithFormat(
+ "%s objects do not support the 'insert-after' operation",
+ GetTypeAsCString());
+ break;
+ case eVarSetOperationRemove:
+ error.SetErrorStringWithFormat(
+ "%s objects do not support the 'remove' operation", GetTypeAsCString());
+ break;
+ case eVarSetOperationAppend:
+ error.SetErrorStringWithFormat(
+ "%s objects do not support the 'append' operation", GetTypeAsCString());
+ break;
+ case eVarSetOperationClear:
+ error.SetErrorStringWithFormat(
+ "%s objects do not support the 'clear' operation", GetTypeAsCString());
+ break;
+ case eVarSetOperationAssign:
+ error.SetErrorStringWithFormat(
+ "%s objects do not support the 'assign' operation", GetTypeAsCString());
+ break;
+ case eVarSetOperationInvalid:
+ error.SetErrorStringWithFormat("invalid operation performed on a %s object",
+ GetTypeAsCString());
+ break;
+ }
+ return error;
+}