OptionGroupWatchpoint.cpp revision 360784
1//===-- OptionGroupWatchpoint.cpp -------------------------------*- 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#include "lldb/Interpreter/OptionGroupWatchpoint.h"
10
11#include "lldb/Host/OptionParser.h"
12#include "lldb/Interpreter/OptionArgParser.h"
13#include "lldb/lldb-enumerations.h"
14
15using namespace lldb;
16using namespace lldb_private;
17
18static constexpr OptionEnumValueElement g_watch_type[] = {
19    {
20        OptionGroupWatchpoint::eWatchRead,
21        "read",
22        "Watch for read",
23    },
24    {
25        OptionGroupWatchpoint::eWatchWrite,
26        "write",
27        "Watch for write",
28    },
29    {
30        OptionGroupWatchpoint::eWatchReadWrite,
31        "read_write",
32        "Watch for read/write",
33    },
34};
35
36static constexpr OptionEnumValueElement g_watch_size[] = {
37    {
38        1,
39        "1",
40        "Watch for byte size of 1",
41    },
42    {
43        2,
44        "2",
45        "Watch for byte size of 2",
46    },
47    {
48        4,
49        "4",
50        "Watch for byte size of 4",
51    },
52    {
53        8,
54        "8",
55        "Watch for byte size of 8",
56    },
57};
58
59static constexpr OptionDefinition g_option_table[] = {
60    {LLDB_OPT_SET_1, false, "watch", 'w', OptionParser::eRequiredArgument,
61     nullptr, OptionEnumValues(g_watch_type), 0, eArgTypeWatchType,
62     "Specify the type of watching to perform."},
63    {LLDB_OPT_SET_1, false, "size", 's', OptionParser::eRequiredArgument,
64     nullptr, OptionEnumValues(g_watch_size), 0, eArgTypeByteSize,
65     "Number of bytes to use to watch a region."}};
66
67bool OptionGroupWatchpoint::IsWatchSizeSupported(uint32_t watch_size) {
68  for (const auto& size : g_watch_size) {
69    if (0  == size.value)
70      break;
71    if (watch_size == size.value)
72      return true;
73  }
74  return false;
75}
76
77OptionGroupWatchpoint::OptionGroupWatchpoint() : OptionGroup() {}
78
79OptionGroupWatchpoint::~OptionGroupWatchpoint() {}
80
81Status
82OptionGroupWatchpoint::SetOptionValue(uint32_t option_idx,
83                                      llvm::StringRef option_arg,
84                                      ExecutionContext *execution_context) {
85  Status error;
86  const int short_option = g_option_table[option_idx].short_option;
87  switch (short_option) {
88  case 'w': {
89    WatchType tmp_watch_type;
90    tmp_watch_type = (WatchType)OptionArgParser::ToOptionEnum(
91        option_arg, g_option_table[option_idx].enum_values, 0, error);
92    if (error.Success()) {
93      watch_type = tmp_watch_type;
94      watch_type_specified = true;
95    }
96    break;
97  }
98  case 's':
99    watch_size = (uint32_t)OptionArgParser::ToOptionEnum(
100        option_arg, g_option_table[option_idx].enum_values, 0, error);
101    break;
102
103  default:
104    llvm_unreachable("Unimplemented option");
105  }
106
107  return error;
108}
109
110void OptionGroupWatchpoint::OptionParsingStarting(
111    ExecutionContext *execution_context) {
112  watch_type_specified = false;
113  watch_type = eWatchInvalid;
114  watch_size = 0;
115}
116
117llvm::ArrayRef<OptionDefinition> OptionGroupWatchpoint::GetDefinitions() {
118  return llvm::makeArrayRef(g_option_table);
119}
120