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