]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/include/lldb/Interpreter/OptionValue.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / include / lldb / Interpreter / OptionValue.h
1 //===-- OptionValue.h -------------------------------------------*- C++ -*-===//
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 #ifndef liblldb_OptionValue_h_
10 #define liblldb_OptionValue_h_
11
12 #include "lldb/Core/FormatEntity.h"
13 #include "lldb/Utility/CompletionRequest.h"
14 #include "lldb/Utility/ConstString.h"
15 #include "lldb/Utility/Status.h"
16 #include "lldb/lldb-defines.h"
17 #include "lldb/lldb-private-enumerations.h"
18 #include "lldb/lldb-private-interfaces.h"
19
20 namespace lldb_private {
21
22 // OptionValue
23 class OptionValue {
24 public:
25   enum Type {
26     eTypeInvalid = 0,
27     eTypeArch,
28     eTypeArgs,
29     eTypeArray,
30     eTypeBoolean,
31     eTypeChar,
32     eTypeDictionary,
33     eTypeEnum,
34     eTypeFileSpec,
35     eTypeFileSpecList,
36     eTypeFormat,
37     eTypeLanguage,
38     eTypePathMap,
39     eTypeProperties,
40     eTypeRegex,
41     eTypeSInt64,
42     eTypeString,
43     eTypeUInt64,
44     eTypeUUID,
45     eTypeFormatEntity
46   };
47
48   enum {
49     eDumpOptionName = (1u << 0),
50     eDumpOptionType = (1u << 1),
51     eDumpOptionValue = (1u << 2),
52     eDumpOptionDescription = (1u << 3),
53     eDumpOptionRaw = (1u << 4),
54     eDumpOptionCommand = (1u << 5),
55     eDumpGroupValue = (eDumpOptionName | eDumpOptionType | eDumpOptionValue),
56     eDumpGroupHelp =
57         (eDumpOptionName | eDumpOptionType | eDumpOptionDescription),
58     eDumpGroupExport = (eDumpOptionCommand | eDumpOptionName | eDumpOptionValue)
59   };
60
61   OptionValue()
62       : m_callback(nullptr), m_baton(nullptr), m_value_was_set(false) {}
63
64   OptionValue(const OptionValue &rhs)
65       : m_callback(rhs.m_callback), m_baton(rhs.m_baton),
66         m_value_was_set(rhs.m_value_was_set) {}
67
68   virtual ~OptionValue() = default;
69
70   // Subclasses should override these functions
71   virtual Type GetType() const = 0;
72
73   // If this value is always hidden, the avoid showing any info on this value,
74   // just show the info for the child values.
75   virtual bool ValueIsTransparent() const {
76     return GetType() == eTypeProperties;
77   }
78
79   virtual const char *GetTypeAsCString() const {
80     return GetBuiltinTypeAsCString(GetType());
81   }
82
83   static const char *GetBuiltinTypeAsCString(Type t);
84
85   virtual void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
86                          uint32_t dump_mask) = 0;
87
88   virtual Status
89   SetValueFromString(llvm::StringRef value,
90                      VarSetOperationType op = eVarSetOperationAssign);
91
92   virtual bool Clear() = 0;
93
94   virtual lldb::OptionValueSP DeepCopy() const = 0;
95
96   virtual size_t AutoComplete(CommandInterpreter &interpreter,
97                               CompletionRequest &request);
98
99   // Subclasses can override these functions
100   virtual lldb::OptionValueSP GetSubValue(const ExecutionContext *exe_ctx,
101                                           llvm::StringRef name,
102                                           bool will_modify,
103                                           Status &error) const {
104     error.SetErrorStringWithFormat("'%s' is not a value subvalue", name.str().c_str());
105     return lldb::OptionValueSP();
106   }
107
108   virtual Status SetSubValue(const ExecutionContext *exe_ctx,
109                              VarSetOperationType op, llvm::StringRef name,
110                              llvm::StringRef value);
111
112   virtual bool IsAggregateValue() const { return false; }
113
114   virtual ConstString GetName() const { return ConstString(); }
115
116   virtual bool DumpQualifiedName(Stream &strm) const;
117
118   // Subclasses should NOT override these functions as they use the above
119   // functions to implement functionality
120   uint32_t GetTypeAsMask() { return 1u << GetType(); }
121
122   static uint32_t ConvertTypeToMask(OptionValue::Type type) {
123     return 1u << type;
124   }
125
126   static OptionValue::Type ConvertTypeMaskToType(uint32_t type_mask) {
127     // If only one bit is set, then return an appropriate enumeration
128     switch (type_mask) {
129     case 1u << eTypeArch:
130       return eTypeArch;
131     case 1u << eTypeArgs:
132       return eTypeArgs;
133     case 1u << eTypeArray:
134       return eTypeArray;
135     case 1u << eTypeBoolean:
136       return eTypeBoolean;
137     case 1u << eTypeChar:
138       return eTypeChar;
139     case 1u << eTypeDictionary:
140       return eTypeDictionary;
141     case 1u << eTypeEnum:
142       return eTypeEnum;
143     case 1u << eTypeFileSpec:
144       return eTypeFileSpec;
145     case 1u << eTypeFileSpecList:
146       return eTypeFileSpecList;
147     case 1u << eTypeFormat:
148       return eTypeFormat;
149     case 1u << eTypeLanguage:
150       return eTypeLanguage;
151     case 1u << eTypePathMap:
152       return eTypePathMap;
153     case 1u << eTypeProperties:
154       return eTypeProperties;
155     case 1u << eTypeRegex:
156       return eTypeRegex;
157     case 1u << eTypeSInt64:
158       return eTypeSInt64;
159     case 1u << eTypeString:
160       return eTypeString;
161     case 1u << eTypeUInt64:
162       return eTypeUInt64;
163     case 1u << eTypeUUID:
164       return eTypeUUID;
165     }
166     // Else return invalid
167     return eTypeInvalid;
168   }
169
170   static lldb::OptionValueSP
171   CreateValueFromCStringForTypeMask(const char *value_cstr, uint32_t type_mask,
172                                     Status &error);
173
174   // Get this value as a uint64_t value if it is encoded as a boolean, uint64_t
175   // or int64_t. Other types will cause "fail_value" to be returned
176   uint64_t GetUInt64Value(uint64_t fail_value, bool *success_ptr);
177
178   OptionValueArch *GetAsArch();
179
180   const OptionValueArch *GetAsArch() const;
181
182   OptionValueArray *GetAsArray();
183
184   const OptionValueArray *GetAsArray() const;
185
186   OptionValueArgs *GetAsArgs();
187
188   const OptionValueArgs *GetAsArgs() const;
189
190   OptionValueBoolean *GetAsBoolean();
191
192   OptionValueChar *GetAsChar();
193
194   const OptionValueBoolean *GetAsBoolean() const;
195
196   const OptionValueChar *GetAsChar() const;
197
198   OptionValueDictionary *GetAsDictionary();
199
200   const OptionValueDictionary *GetAsDictionary() const;
201
202   OptionValueEnumeration *GetAsEnumeration();
203
204   const OptionValueEnumeration *GetAsEnumeration() const;
205
206   OptionValueFileSpec *GetAsFileSpec();
207
208   const OptionValueFileSpec *GetAsFileSpec() const;
209
210   OptionValueFileSpecList *GetAsFileSpecList();
211
212   const OptionValueFileSpecList *GetAsFileSpecList() const;
213
214   OptionValueFormat *GetAsFormat();
215
216   const OptionValueFormat *GetAsFormat() const;
217
218   OptionValueLanguage *GetAsLanguage();
219
220   const OptionValueLanguage *GetAsLanguage() const;
221
222   OptionValuePathMappings *GetAsPathMappings();
223
224   const OptionValuePathMappings *GetAsPathMappings() const;
225
226   OptionValueProperties *GetAsProperties();
227
228   const OptionValueProperties *GetAsProperties() const;
229
230   OptionValueRegex *GetAsRegex();
231
232   const OptionValueRegex *GetAsRegex() const;
233
234   OptionValueSInt64 *GetAsSInt64();
235
236   const OptionValueSInt64 *GetAsSInt64() const;
237
238   OptionValueString *GetAsString();
239
240   const OptionValueString *GetAsString() const;
241
242   OptionValueUInt64 *GetAsUInt64();
243
244   const OptionValueUInt64 *GetAsUInt64() const;
245
246   OptionValueUUID *GetAsUUID();
247
248   const OptionValueUUID *GetAsUUID() const;
249
250   OptionValueFormatEntity *GetAsFormatEntity();
251
252   const OptionValueFormatEntity *GetAsFormatEntity() const;
253
254   bool GetBooleanValue(bool fail_value = false) const;
255
256   bool SetBooleanValue(bool new_value);
257
258   char GetCharValue(char fail_value) const;
259
260   char SetCharValue(char new_value);
261
262   int64_t GetEnumerationValue(int64_t fail_value = -1) const;
263
264   bool SetEnumerationValue(int64_t value);
265
266   FileSpec GetFileSpecValue() const;
267
268   bool SetFileSpecValue(const FileSpec &file_spec);
269
270   FileSpecList GetFileSpecListValue() const;
271
272   lldb::Format
273   GetFormatValue(lldb::Format fail_value = lldb::eFormatDefault) const;
274
275   bool SetFormatValue(lldb::Format new_value);
276
277   lldb::LanguageType GetLanguageValue(
278       lldb::LanguageType fail_value = lldb::eLanguageTypeUnknown) const;
279
280   bool SetLanguageValue(lldb::LanguageType new_language);
281
282   const FormatEntity::Entry *GetFormatEntity() const;
283
284   const RegularExpression *GetRegexValue() const;
285
286   int64_t GetSInt64Value(int64_t fail_value = 0) const;
287
288   bool SetSInt64Value(int64_t new_value);
289
290   llvm::StringRef GetStringValue(llvm::StringRef fail_value) const;
291   llvm::StringRef GetStringValue() const { return GetStringValue(llvm::StringRef()); }
292
293   bool SetStringValue(llvm::StringRef new_value);
294
295   uint64_t GetUInt64Value(uint64_t fail_value = 0) const;
296
297   bool SetUInt64Value(uint64_t new_value);
298
299   UUID GetUUIDValue() const;
300
301   bool SetUUIDValue(const UUID &uuid);
302
303   bool OptionWasSet() const { return m_value_was_set; }
304
305   void SetOptionWasSet() { m_value_was_set = true; }
306
307   void SetParent(const lldb::OptionValueSP &parent_sp) {
308     m_parent_wp = parent_sp;
309   }
310
311   void SetValueChangedCallback(OptionValueChangedCallback callback,
312                                void *baton) {
313     assert(m_callback == nullptr);
314     m_callback = callback;
315     m_baton = baton;
316   }
317
318   void NotifyValueChanged() {
319     if (m_callback)
320       m_callback(m_baton, this);
321   }
322
323 protected:
324   lldb::OptionValueWP m_parent_wp;
325   OptionValueChangedCallback m_callback;
326   void *m_baton;
327   bool m_value_was_set; // This can be used to see if a value has been set
328                         // by a call to SetValueFromCString(). It is often
329                         // handy to know if an option value was set from the
330                         // command line or as a setting, versus if we just have
331                         // the default value that was already populated in the
332                         // option value.
333 };
334
335 } // namespace lldb_private
336
337 #endif // liblldb_OptionValue_h_