1dda28197Spatrick //===-- OptionGroupWatchpoint.cpp -----------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick
9061da546Spatrick #include "lldb/Interpreter/OptionGroupWatchpoint.h"
10061da546Spatrick
11061da546Spatrick #include "lldb/Host/OptionParser.h"
12061da546Spatrick #include "lldb/Interpreter/OptionArgParser.h"
13061da546Spatrick #include "lldb/lldb-enumerations.h"
14061da546Spatrick
15061da546Spatrick using namespace lldb;
16061da546Spatrick using namespace lldb_private;
17061da546Spatrick
18061da546Spatrick static constexpr OptionEnumValueElement g_watch_type[] = {
19061da546Spatrick {
20061da546Spatrick OptionGroupWatchpoint::eWatchRead,
21061da546Spatrick "read",
22061da546Spatrick "Watch for read",
23061da546Spatrick },
24061da546Spatrick {
25061da546Spatrick OptionGroupWatchpoint::eWatchWrite,
26061da546Spatrick "write",
27061da546Spatrick "Watch for write",
28061da546Spatrick },
29061da546Spatrick {
30061da546Spatrick OptionGroupWatchpoint::eWatchReadWrite,
31061da546Spatrick "read_write",
32061da546Spatrick "Watch for read/write",
33061da546Spatrick },
34061da546Spatrick };
35061da546Spatrick
36061da546Spatrick static constexpr OptionEnumValueElement g_watch_size[] = {
37061da546Spatrick {
38061da546Spatrick 1,
39061da546Spatrick "1",
40061da546Spatrick "Watch for byte size of 1",
41061da546Spatrick },
42061da546Spatrick {
43061da546Spatrick 2,
44061da546Spatrick "2",
45061da546Spatrick "Watch for byte size of 2",
46061da546Spatrick },
47061da546Spatrick {
48061da546Spatrick 4,
49061da546Spatrick "4",
50061da546Spatrick "Watch for byte size of 4",
51061da546Spatrick },
52061da546Spatrick {
53061da546Spatrick 8,
54061da546Spatrick "8",
55061da546Spatrick "Watch for byte size of 8",
56061da546Spatrick },
57061da546Spatrick };
58061da546Spatrick
59061da546Spatrick static constexpr OptionDefinition g_option_table[] = {
60061da546Spatrick {LLDB_OPT_SET_1, false, "watch", 'w', OptionParser::eRequiredArgument,
61061da546Spatrick nullptr, OptionEnumValues(g_watch_type), 0, eArgTypeWatchType,
62061da546Spatrick "Specify the type of watching to perform."},
63061da546Spatrick {LLDB_OPT_SET_1, false, "size", 's', OptionParser::eRequiredArgument,
64061da546Spatrick nullptr, OptionEnumValues(g_watch_size), 0, eArgTypeByteSize,
65061da546Spatrick "Number of bytes to use to watch a region."}};
66061da546Spatrick
IsWatchSizeSupported(uint32_t watch_size)67061da546Spatrick bool OptionGroupWatchpoint::IsWatchSizeSupported(uint32_t watch_size) {
68061da546Spatrick for (const auto& size : g_watch_size) {
69061da546Spatrick if (0 == size.value)
70061da546Spatrick break;
71061da546Spatrick if (watch_size == size.value)
72061da546Spatrick return true;
73061da546Spatrick }
74061da546Spatrick return false;
75061da546Spatrick }
76061da546Spatrick
77061da546Spatrick Status
SetOptionValue(uint32_t option_idx,llvm::StringRef option_arg,ExecutionContext * execution_context)78061da546Spatrick OptionGroupWatchpoint::SetOptionValue(uint32_t option_idx,
79061da546Spatrick llvm::StringRef option_arg,
80061da546Spatrick ExecutionContext *execution_context) {
81061da546Spatrick Status error;
82061da546Spatrick const int short_option = g_option_table[option_idx].short_option;
83061da546Spatrick switch (short_option) {
84061da546Spatrick case 'w': {
85061da546Spatrick WatchType tmp_watch_type;
86061da546Spatrick tmp_watch_type = (WatchType)OptionArgParser::ToOptionEnum(
87061da546Spatrick option_arg, g_option_table[option_idx].enum_values, 0, error);
88061da546Spatrick if (error.Success()) {
89061da546Spatrick watch_type = tmp_watch_type;
90061da546Spatrick watch_type_specified = true;
91061da546Spatrick }
92061da546Spatrick break;
93061da546Spatrick }
94061da546Spatrick case 's':
95061da546Spatrick watch_size = (uint32_t)OptionArgParser::ToOptionEnum(
96061da546Spatrick option_arg, g_option_table[option_idx].enum_values, 0, error);
97061da546Spatrick break;
98061da546Spatrick
99061da546Spatrick default:
100061da546Spatrick llvm_unreachable("Unimplemented option");
101061da546Spatrick }
102061da546Spatrick
103061da546Spatrick return error;
104061da546Spatrick }
105061da546Spatrick
OptionParsingStarting(ExecutionContext * execution_context)106061da546Spatrick void OptionGroupWatchpoint::OptionParsingStarting(
107061da546Spatrick ExecutionContext *execution_context) {
108061da546Spatrick watch_type_specified = false;
109061da546Spatrick watch_type = eWatchInvalid;
110061da546Spatrick watch_size = 0;
111061da546Spatrick }
112061da546Spatrick
GetDefinitions()113061da546Spatrick llvm::ArrayRef<OptionDefinition> OptionGroupWatchpoint::GetDefinitions() {
114*f6aab3d8Srobert return llvm::ArrayRef(g_option_table);
115061da546Spatrick }
116