xref: /openbsd-src/gnu/llvm/lldb/source/Interpreter/OptionGroupWatchpoint.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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