]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Interpreter/OptionValueUUID.cpp
Merge clang 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   request.GetMatches().Clear();
74   ExecutionContext exe_ctx(interpreter.GetExecutionContext());
75   Target *target = exe_ctx.GetTargetPtr();
76   if (target) {
77     auto prefix = request.GetCursorArgumentPrefix();
78     llvm::SmallVector<uint8_t, 20> uuid_bytes;
79     if (UUID::DecodeUUIDBytesFromString(prefix, uuid_bytes).empty()) {
80       const size_t num_modules = target->GetImages().GetSize();
81       for (size_t i = 0; i < num_modules; ++i) {
82         ModuleSP module_sp(target->GetImages().GetModuleAtIndex(i));
83         if (module_sp) {
84           const UUID &module_uuid = module_sp->GetUUID();
85           if (module_uuid.IsValid()) {
86             llvm::ArrayRef<uint8_t> module_bytes = module_uuid.GetBytes();
87             if (module_bytes.size() >= uuid_bytes.size() &&
88                 module_bytes.take_front(uuid_bytes.size()).equals(uuid_bytes)) {
89               request.GetMatches().AppendString(module_uuid.GetAsString());
90             }
91           }
92         }
93       }
94     }
95   }
96   return request.GetMatches().GetSize();
97 }