]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Interpreter/OptionValueUUID.cpp
Merge lldb trunk r338150 (just before the 7.0.0 branch point), and
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Interpreter / OptionValueUUID.cpp
1 //===-- OptionValueUUID.cpp ------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "lldb/Interpreter/OptionValueUUID.h"
11
12 // C Includes
13 // C++ Includes
14 // Other libraries and framework includes
15 // Project includes
16 #include "lldb/Core/Module.h"
17 #include "lldb/Interpreter/CommandInterpreter.h"
18 #include "lldb/Utility/Stream.h"
19 #include "lldb/Utility/StringList.h"
20
21 using namespace lldb;
22 using namespace lldb_private;
23
24 void OptionValueUUID::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
25                                 uint32_t dump_mask) {
26   if (dump_mask & eDumpOptionType)
27     strm.Printf("(%s)", GetTypeAsCString());
28   if (dump_mask & eDumpOptionValue) {
29     if (dump_mask & eDumpOptionType)
30       strm.PutCString(" = ");
31     m_uuid.Dump(&strm);
32   }
33 }
34
35 Status OptionValueUUID::SetValueFromString(llvm::StringRef value,
36                                            VarSetOperationType op) {
37   Status error;
38   switch (op) {
39   case eVarSetOperationClear:
40     Clear();
41     NotifyValueChanged();
42     break;
43
44   case eVarSetOperationReplace:
45   case eVarSetOperationAssign: {
46     if (m_uuid.SetFromStringRef(value) == 0)
47       error.SetErrorStringWithFormat("invalid uuid string value '%s'",
48                                      value.str().c_str());
49     else {
50       m_value_was_set = true;
51       NotifyValueChanged();
52     }
53   } break;
54
55   case eVarSetOperationInsertBefore:
56   case eVarSetOperationInsertAfter:
57   case eVarSetOperationRemove:
58   case eVarSetOperationAppend:
59   case eVarSetOperationInvalid:
60     error = OptionValue::SetValueFromString(value, op);
61     break;
62   }
63   return error;
64 }
65
66 lldb::OptionValueSP OptionValueUUID::DeepCopy() const {
67   return OptionValueSP(new OptionValueUUID(*this));
68 }
69
70 size_t OptionValueUUID::AutoComplete(CommandInterpreter &interpreter,
71                                      CompletionRequest &request) {
72   request.SetWordComplete(false);
73   ExecutionContext exe_ctx(interpreter.GetExecutionContext());
74   Target *target = exe_ctx.GetTargetPtr();
75   if (target) {
76     auto prefix = request.GetCursorArgumentPrefix();
77     llvm::SmallVector<uint8_t, 20> uuid_bytes;
78     if (UUID::DecodeUUIDBytesFromString(prefix, uuid_bytes).empty()) {
79       const size_t num_modules = target->GetImages().GetSize();
80       for (size_t i = 0; i < num_modules; ++i) {
81         ModuleSP module_sp(target->GetImages().GetModuleAtIndex(i));
82         if (module_sp) {
83           const UUID &module_uuid = module_sp->GetUUID();
84           if (module_uuid.IsValid()) {
85             llvm::ArrayRef<uint8_t> module_bytes = module_uuid.GetBytes();
86             if (module_bytes.size() >= uuid_bytes.size() &&
87                 module_bytes.take_front(uuid_bytes.size()).equals(uuid_bytes)) {
88               request.AddCompletion(module_uuid.GetAsString());
89             }
90           }
91         }
92       }
93     }
94   }
95   return request.GetNumberOfMatches();
96 }