1 //===-- OptionValueUUID.cpp -----------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lldb/Interpreter/OptionValueUUID.h" 10 11 #include "lldb/Core/Module.h" 12 #include "lldb/Interpreter/CommandInterpreter.h" 13 #include "lldb/Utility/Stream.h" 14 #include "lldb/Utility/StringList.h" 15 16 using namespace lldb; 17 using namespace lldb_private; 18 19 void OptionValueUUID::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, 20 uint32_t dump_mask) { 21 if (dump_mask & eDumpOptionType) 22 strm.Printf("(%s)", GetTypeAsCString()); 23 if (dump_mask & eDumpOptionValue) { 24 if (dump_mask & eDumpOptionType) 25 strm.PutCString(" = "); 26 m_uuid.Dump(strm); 27 } 28 } 29 30 Status OptionValueUUID::SetValueFromString(llvm::StringRef value, 31 VarSetOperationType op) { 32 Status error; 33 switch (op) { 34 case eVarSetOperationClear: 35 Clear(); 36 NotifyValueChanged(); 37 break; 38 39 case eVarSetOperationReplace: 40 case eVarSetOperationAssign: { 41 if (!m_uuid.SetFromStringRef(value)) 42 error.SetErrorStringWithFormat("invalid uuid string value '%s'", 43 value.str().c_str()); 44 else { 45 m_value_was_set = true; 46 NotifyValueChanged(); 47 } 48 } break; 49 50 case eVarSetOperationInsertBefore: 51 case eVarSetOperationInsertAfter: 52 case eVarSetOperationRemove: 53 case eVarSetOperationAppend: 54 case eVarSetOperationInvalid: 55 error = OptionValue::SetValueFromString(value, op); 56 break; 57 } 58 return error; 59 } 60 61 void OptionValueUUID::AutoComplete(CommandInterpreter &interpreter, 62 CompletionRequest &request) { 63 ExecutionContext exe_ctx(interpreter.GetExecutionContext()); 64 Target *target = exe_ctx.GetTargetPtr(); 65 if (!target) 66 return; 67 auto prefix = request.GetCursorArgumentPrefix(); 68 llvm::SmallVector<uint8_t, 20> uuid_bytes; 69 if (!UUID::DecodeUUIDBytesFromString(prefix, uuid_bytes).empty()) 70 return; 71 const size_t num_modules = target->GetImages().GetSize(); 72 for (size_t i = 0; i < num_modules; ++i) { 73 ModuleSP module_sp(target->GetImages().GetModuleAtIndex(i)); 74 if (!module_sp) 75 continue; 76 const UUID &module_uuid = module_sp->GetUUID(); 77 if (!module_uuid.IsValid()) 78 continue; 79 request.TryCompleteCurrentArg(module_uuid.GetAsString()); 80 } 81 } 82