diff options
Diffstat (limited to 'contrib/llvm-project/lldb/source/Interpreter/OptionValueUUID.cpp')
| -rw-r--r-- | contrib/llvm-project/lldb/source/Interpreter/OptionValueUUID.cpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/contrib/llvm-project/lldb/source/Interpreter/OptionValueUUID.cpp b/contrib/llvm-project/lldb/source/Interpreter/OptionValueUUID.cpp new file mode 100644 index 000000000000..f39b66b77bb0 --- /dev/null +++ b/contrib/llvm-project/lldb/source/Interpreter/OptionValueUUID.cpp @@ -0,0 +1,91 @@ +//===-- OptionValueUUID.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/OptionValueUUID.h" + +#include "lldb/Core/Module.h" +#include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Utility/Stream.h" +#include "lldb/Utility/StringList.h" + +using namespace lldb; +using namespace lldb_private; + +void OptionValueUUID::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, + uint32_t dump_mask) { + if (dump_mask & eDumpOptionType) + strm.Printf("(%s)", GetTypeAsCString()); + if (dump_mask & eDumpOptionValue) { + if (dump_mask & eDumpOptionType) + strm.PutCString(" = "); + m_uuid.Dump(&strm); + } +} + +Status OptionValueUUID::SetValueFromString(llvm::StringRef value, + VarSetOperationType op) { + Status error; + switch (op) { + case eVarSetOperationClear: + Clear(); + NotifyValueChanged(); + break; + + case eVarSetOperationReplace: + case eVarSetOperationAssign: { + if (m_uuid.SetFromStringRef(value) == 0) + error.SetErrorStringWithFormat("invalid uuid string value '%s'", + value.str().c_str()); + else { + m_value_was_set = true; + NotifyValueChanged(); + } + } break; + + case eVarSetOperationInsertBefore: + case eVarSetOperationInsertAfter: + case eVarSetOperationRemove: + case eVarSetOperationAppend: + case eVarSetOperationInvalid: + error = OptionValue::SetValueFromString(value, op); + break; + } + return error; +} + +lldb::OptionValueSP OptionValueUUID::DeepCopy() const { + return OptionValueSP(new OptionValueUUID(*this)); +} + +size_t OptionValueUUID::AutoComplete(CommandInterpreter &interpreter, + CompletionRequest &request) { + request.SetWordComplete(false); + ExecutionContext exe_ctx(interpreter.GetExecutionContext()); + Target *target = exe_ctx.GetTargetPtr(); + if (target) { + auto prefix = request.GetCursorArgumentPrefix(); + llvm::SmallVector<uint8_t, 20> uuid_bytes; + if (UUID::DecodeUUIDBytesFromString(prefix, uuid_bytes).empty()) { + const size_t num_modules = target->GetImages().GetSize(); + for (size_t i = 0; i < num_modules; ++i) { + ModuleSP module_sp(target->GetImages().GetModuleAtIndex(i)); + if (module_sp) { + const UUID &module_uuid = module_sp->GetUUID(); + if (module_uuid.IsValid()) { + llvm::ArrayRef<uint8_t> module_bytes = module_uuid.GetBytes(); + if (module_bytes.size() >= uuid_bytes.size() && + module_bytes.take_front(uuid_bytes.size()).equals(uuid_bytes)) { + request.AddCompletion(module_uuid.GetAsString()); + } + } + } + } + } + } + return request.GetNumberOfMatches(); +} |
