LLDB mainline
OptionValue.h
Go to the documentation of this file.
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 LLDB_INTERPRETER_OPTIONVALUE_H
10#define LLDB_INTERPRETER_OPTIONVALUE_H
11
19#include "lldb/Utility/Status.h"
21#include "lldb/Utility/UUID.h"
22#include "lldb/lldb-defines.h"
25#include "llvm/Support/JSON.h"
26
27namespace lldb_private {
28
29// OptionValue
31public:
32 enum Type {
54 };
55
56 enum {
57 eDumpOptionName = (1u << 0),
58 eDumpOptionType = (1u << 1),
59 eDumpOptionValue = (1u << 2),
61 eDumpOptionRaw = (1u << 4),
62 eDumpOptionCommand = (1u << 5),
67 };
68
69 OptionValue() = default;
70
71 virtual ~OptionValue() = default;
72
73 // Subclasses should override these functions
74 virtual Type GetType() const = 0;
75
76 // If this value is always hidden, the avoid showing any info on this value,
77 // just show the info for the child values.
78 virtual bool ValueIsTransparent() const {
79 return GetType() == eTypeProperties;
80 }
81
82 virtual const char *GetTypeAsCString() const {
84 }
85
86 static const char *GetBuiltinTypeAsCString(Type t);
87
88 virtual void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
89 uint32_t dump_mask) = 0;
90
91 // TODO: make this function pure virtual after implementing it in all
92 // child classes.
93 virtual llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) {
94 // Return nullptr which will create a llvm::json::Value() that is a NULL
95 // value. No setting should ever really have a NULL value in JSON. This
96 // indicates an error occurred and if/when we add a FromJSON() it will know
97 // to fail if someone tries to set it with a NULL JSON value.
98 return nullptr;
99 }
100
101 virtual Status
102 SetValueFromString(llvm::StringRef value,
104
105 virtual void Clear() = 0;
106
107 virtual lldb::OptionValueSP
108 DeepCopy(const lldb::OptionValueSP &new_parent) const;
109
110 virtual void AutoComplete(CommandInterpreter &interpreter,
111 CompletionRequest &request);
112
113 // Subclasses can override these functions
114 virtual lldb::OptionValueSP GetSubValue(const ExecutionContext *exe_ctx,
115 llvm::StringRef name,
116 Status &error) const {
117 error.SetErrorStringWithFormat("'%s' is not a value subvalue",
118 name.str().c_str());
119 return lldb::OptionValueSP();
120 }
121
122 virtual Status SetSubValue(const ExecutionContext *exe_ctx,
123 VarSetOperationType op, llvm::StringRef name,
124 llvm::StringRef value);
125
126 virtual bool IsAggregateValue() const { return false; }
127
128 virtual ConstString GetName() const { return ConstString(); }
129
130 virtual bool DumpQualifiedName(Stream &strm) const;
131
132 // Subclasses should NOT override these functions as they use the above
133 // functions to implement functionality
134 uint32_t GetTypeAsMask() { return 1u << GetType(); }
135
137 return 1u << type;
138 }
139
141 // If only one bit is set, then return an appropriate enumeration
142 switch (type_mask) {
143 case 1u << eTypeArch:
144 return eTypeArch;
145 case 1u << eTypeArgs:
146 return eTypeArgs;
147 case 1u << eTypeArray:
148 return eTypeArray;
149 case 1u << eTypeBoolean:
150 return eTypeBoolean;
151 case 1u << eTypeChar:
152 return eTypeChar;
153 case 1u << eTypeDictionary:
154 return eTypeDictionary;
155 case 1u << eTypeEnum:
156 return eTypeEnum;
157 case 1u << eTypeFileLineColumn:
158 return eTypeFileLineColumn;
159 case 1u << eTypeFileSpec:
160 return eTypeFileSpec;
161 case 1u << eTypeFileSpecList:
162 return eTypeFileSpecList;
163 case 1u << eTypeFormat:
164 return eTypeFormat;
165 case 1u << eTypeLanguage:
166 return eTypeLanguage;
167 case 1u << eTypePathMap:
168 return eTypePathMap;
169 case 1u << eTypeProperties:
170 return eTypeProperties;
171 case 1u << eTypeRegex:
172 return eTypeRegex;
173 case 1u << eTypeSInt64:
174 return eTypeSInt64;
175 case 1u << eTypeString:
176 return eTypeString;
177 case 1u << eTypeUInt64:
178 return eTypeUInt64;
179 case 1u << eTypeUUID:
180 return eTypeUUID;
181 }
182 // Else return invalid
183 return eTypeInvalid;
184 }
185
186 static lldb::OptionValueSP
187 CreateValueFromCStringForTypeMask(const char *value_cstr, uint32_t type_mask,
188 Status &error);
189
191 const OptionValueArch *GetAsArch() const;
192
194 const OptionValueArray *GetAsArray() const;
195
197 const OptionValueArgs *GetAsArgs() const;
198
200 const OptionValueBoolean *GetAsBoolean() const;
201
203 const OptionValueChar *GetAsChar() const;
204
207
210
212 const OptionValueFileSpec *GetAsFileSpec() const;
213
216
218 const OptionValueFormat *GetAsFormat() const;
219
221 const OptionValueLanguage *GetAsLanguage() const;
222
225
228
230 const OptionValueRegex *GetAsRegex() const;
231
233 const OptionValueSInt64 *GetAsSInt64() const;
234
236 const OptionValueString *GetAsString() const;
237
239 const OptionValueUInt64 *GetAsUInt64() const;
240
242 const OptionValueUUID *GetAsUUID() const;
243
246
247 bool AppendFileSpecValue(FileSpec file_spec);
248
249 bool OptionWasSet() const { return m_value_was_set; }
250
252
253 void SetParent(const lldb::OptionValueSP &parent_sp) {
254 m_parent_wp = parent_sp;
255 }
256
257 lldb::OptionValueSP GetParent() const { return m_parent_wp.lock(); }
258
259 void SetValueChangedCallback(std::function<void()> callback) {
260 m_callback = std::move(callback);
261 }
262
264 if (m_callback)
265 m_callback();
266 }
267
268 template <typename T, std::enable_if_t<!std::is_pointer_v<T>, bool> = true>
269 std::optional<T> GetValueAs() const {
270 if constexpr (std::is_same_v<T, uint64_t>)
271 return GetUInt64Value();
272 if constexpr (std::is_same_v<T, int64_t>)
273 return GetSInt64Value();
274 if constexpr (std::is_same_v<T, bool>)
275 return GetBooleanValue();
276 if constexpr (std::is_same_v<T, char>)
277 return GetCharValue();
278 if constexpr (std::is_same_v<T, lldb::Format>)
279 return GetFormatValue();
280 if constexpr (std::is_same_v<T, FileSpec>)
281 return GetFileSpecValue();
282 if constexpr (std::is_same_v<T, FileSpecList>)
283 return GetFileSpecListValue();
284 if constexpr (std::is_same_v<T, lldb::LanguageType>)
285 return GetLanguageValue();
286 if constexpr (std::is_same_v<T, llvm::StringRef>)
287 return GetStringValue();
288 if constexpr (std::is_same_v<T, ArchSpec>)
289 return GetArchSpecValue();
290 if constexpr (std::is_enum_v<T>)
291 if (std::optional<int64_t> value = GetEnumerationValue())
292 return static_cast<T>(*value);
293 return {};
294 }
295
296 template <typename T,
297 typename U = typename std::remove_const<
298 typename std::remove_pointer<T>::type>::type,
299 std::enable_if_t<std::is_pointer_v<T>, bool> = true>
300 T GetValueAs() const {
301 if constexpr (std::is_same_v<U, FormatEntity::Entry>)
302 return GetFormatEntity();
303 if constexpr (std::is_same_v<U, RegularExpression>)
304 return GetRegexValue();
305 return {};
306 }
307
308 bool SetValueAs(bool v) { return SetBooleanValue(v); }
309
310 bool SetValueAs(char v) { return SetCharValue(v); }
311
312 bool SetValueAs(uint64_t v) { return SetUInt64Value(v); }
313
314 bool SetValueAs(int64_t v) { return SetSInt64Value(v); }
315
316 bool SetValueAs(UUID v) { return SetUUIDValue(v); }
317
318 bool SetValueAs(llvm::StringRef v) { return SetStringValue(v); }
319
321
323
324 bool SetValueAs(FileSpec v) { return SetFileSpecValue(v); }
325
326 bool SetValueAs(ArchSpec v) { return SetArchSpecValue(v); }
327
328 template <typename T, std::enable_if_t<std::is_enum_v<T>, bool> = true>
329 bool SetValueAs(T t) {
330 return SetEnumerationValue(t);
331 }
332
333protected:
335
336 // Must be overriden by a derived class for correct downcasting the result of
337 // DeepCopy to it. Inherit from Cloneable to avoid doing this manually.
338 virtual lldb::OptionValueSP Clone() const = 0;
339
340 lldb::OptionValueWP m_parent_wp;
341 std::function<void()> m_callback;
342 bool m_value_was_set = false; // This can be used to see if a value has been
343 // set by a call to SetValueFromCString(). It is
344 // often handy to know if an option value was
345 // set from the command line or as a setting,
346 // versus if we just have the default value that
347 // was already populated in the option value.
348private:
349 std::optional<ArchSpec> GetArchSpecValue() const;
350 bool SetArchSpecValue(ArchSpec arch_spec);
351
352 std::optional<bool> GetBooleanValue() const;
353 bool SetBooleanValue(bool new_value);
354
355 std::optional<char> GetCharValue() const;
356 bool SetCharValue(char new_value);
357
358 std::optional<int64_t> GetEnumerationValue() const;
359 bool SetEnumerationValue(int64_t value);
360
361 std::optional<FileSpec> GetFileSpecValue() const;
362 bool SetFileSpecValue(FileSpec file_spec);
363
364 std::optional<FileSpecList> GetFileSpecListValue() const;
365
366 std::optional<int64_t> GetSInt64Value() const;
367 bool SetSInt64Value(int64_t new_value);
368
369 std::optional<uint64_t> GetUInt64Value() const;
370 bool SetUInt64Value(uint64_t new_value);
371
372 std::optional<lldb::Format> GetFormatValue() const;
373 bool SetFormatValue(lldb::Format new_value);
374
375 std::optional<lldb::LanguageType> GetLanguageValue() const;
376 bool SetLanguageValue(lldb::LanguageType new_language);
377
378 std::optional<llvm::StringRef> GetStringValue() const;
379 bool SetStringValue(llvm::StringRef new_value);
380
381 std::optional<UUID> GetUUIDValue() const;
382 bool SetUUIDValue(const UUID &uuid);
383
385 const RegularExpression *GetRegexValue() const;
386};
387
388} // namespace lldb_private
389
390#endif // LLDB_INTERPRETER_OPTIONVALUE_H
static llvm::raw_ostream & error(Stream &strm)
An architecture specification class.
Definition: ArchSpec.h:31
"lldb/Utility/ArgCompletionRequest.h"
A uniqued constant string class.
Definition: ConstString.h:39
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
A file utility class.
Definition: FileSpec.h:56
virtual bool DumpQualifiedName(Stream &strm) const
std::optional< char > GetCharValue() const
std::optional< FileSpecList > GetFileSpecListValue() const
bool SetArchSpecValue(ArchSpec arch_spec)
virtual ~OptionValue()=default
void SetValueChangedCallback(std::function< void()> callback)
Definition: OptionValue.h:259
std::optional< ArchSpec > GetArchSpecValue() const
OptionValueDictionary * GetAsDictionary()
virtual lldb::OptionValueSP GetSubValue(const ExecutionContext *exe_ctx, llvm::StringRef name, Status &error) const
Definition: OptionValue.h:114
virtual Status SetValueFromString(llvm::StringRef value, VarSetOperationType op=eVarSetOperationAssign)
OptionValueSInt64 * GetAsSInt64()
std::optional< FileSpec > GetFileSpecValue() const
static lldb::OptionValueSP CreateValueFromCStringForTypeMask(const char *value_cstr, uint32_t type_mask, Status &error)
std::optional< uint64_t > GetUInt64Value() const
virtual llvm::json::Value ToJSON(const ExecutionContext *exe_ctx)
Definition: OptionValue.h:93
bool SetFileSpecValue(FileSpec file_spec)
virtual void DumpValue(const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)=0
virtual lldb::OptionValueSP Clone() const =0
virtual Type GetType() const =0
lldb::OptionValueWP m_parent_wp
Definition: OptionValue.h:340
OptionValueFileSpecList * GetAsFileSpecList()
Definition: OptionValue.cpp:62
virtual bool ValueIsTransparent() const
Definition: OptionValue.h:78
OptionValueRegex * GetAsRegex()
virtual bool IsAggregateValue() const
Definition: OptionValue.h:126
void SetParent(const lldb::OptionValueSP &parent_sp)
Definition: OptionValue.h:253
OptionValueUInt64 * GetAsUInt64()
OptionValueFormatEntity * GetAsFormatEntity()
bool SetValueAs(lldb::Format v)
Definition: OptionValue.h:322
bool SetCharValue(char new_value)
OptionValuePathMappings * GetAsPathMappings()
virtual void AutoComplete(CommandInterpreter &interpreter, CompletionRequest &request)
OptionValueProperties * GetAsProperties()
static OptionValue::Type ConvertTypeMaskToType(uint32_t type_mask)
Definition: OptionValue.h:140
OptionValueEnumeration * GetAsEnumeration()
virtual lldb::OptionValueSP DeepCopy(const lldb::OptionValueSP &new_parent) const
static const char * GetBuiltinTypeAsCString(Type t)
bool SetValueAs(lldb::LanguageType v)
Definition: OptionValue.h:320
OptionValueFormat * GetAsFormat()
virtual void Clear()=0
bool SetValueAs(uint64_t v)
Definition: OptionValue.h:312
lldb::OptionValueSP GetParent() const
Definition: OptionValue.h:257
virtual ConstString GetName() const
Definition: OptionValue.h:128
OptionValueArgs * GetAsArgs()
Definition: OptionValue.cpp:98
virtual const char * GetTypeAsCString() const
Definition: OptionValue.h:82
OptionValueChar * GetAsChar()
Definition: OptionValue.cpp:44
bool AppendFileSpecValue(FileSpec file_spec)
OptionValueArray * GetAsArray()
Definition: OptionValue.cpp:86
std::optional< lldb::LanguageType > GetLanguageValue() const
bool SetStringValue(llvm::StringRef new_value)
std::optional< int64_t > GetSInt64Value() const
bool SetUUIDValue(const UUID &uuid)
std::optional< lldb::Format > GetFormatValue() const
std::optional< int64_t > GetEnumerationValue() const
std::optional< bool > GetBooleanValue() const
bool SetValueAs(llvm::StringRef v)
Definition: OptionValue.h:318
bool SetBooleanValue(bool new_value)
std::optional< llvm::StringRef > GetStringValue() const
OptionValueBoolean * GetAsBoolean()
Definition: OptionValue.cpp:26
OptionValueFileSpec * GetAsFileSpec()
Definition: OptionValue.cpp:50
const RegularExpression * GetRegexValue() const
const FormatEntity::Entry * GetFormatEntity() const
bool SetEnumerationValue(int64_t value)
OptionValueUUID * GetAsUUID()
std::optional< T > GetValueAs() const
Definition: OptionValue.h:269
bool SetUInt64Value(uint64_t new_value)
OptionValueArch * GetAsArch()
Definition: OptionValue.cpp:74
bool SetValueAs(int64_t v)
Definition: OptionValue.h:314
bool SetValueAs(ArchSpec v)
Definition: OptionValue.h:326
bool SetFormatValue(lldb::Format new_value)
bool SetLanguageValue(lldb::LanguageType new_language)
static uint32_t ConvertTypeToMask(OptionValue::Type type)
Definition: OptionValue.h:136
std::function< void()> m_callback
Definition: OptionValue.h:341
OptionValueLanguage * GetAsLanguage()
std::optional< UUID > GetUUIDValue() const
bool SetValueAs(FileSpec v)
Definition: OptionValue.h:324
bool SetSInt64Value(int64_t new_value)
virtual Status SetSubValue(const ExecutionContext *exe_ctx, VarSetOperationType op, llvm::StringRef name, llvm::StringRef value)
Definition: OptionValue.cpp:18
OptionValueString * GetAsString()
An error handling class.
Definition: Status.h:44
A stream class that can stream formatted output to a file.
Definition: Stream.h:28
A class that represents a running process on the host machine.
Definition: SBAttachInfo.h:14
VarSetOperationType
Settable state variable types.
Format
Display format definitions.
LanguageType
Programming language type.