2013-08-23 13:46:38 -04:00
//===-- OptionGroupWatchpoint.cpp -------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
# include "lldb/Interpreter/OptionGroupWatchpoint.h"
// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
# include "lldb/lldb-enumerations.h"
# include "lldb/Interpreter/Args.h"
# include "lldb/Utility/Utils.h"
using namespace lldb ;
using namespace lldb_private ;
static OptionEnumValueElement g_watch_type [ ] =
{
{ OptionGroupWatchpoint : : eWatchRead , " read " , " Watch for read " } ,
{ OptionGroupWatchpoint : : eWatchWrite , " write " , " Watch for write " } ,
{ OptionGroupWatchpoint : : eWatchReadWrite , " read_write " , " Watch for read/write " } ,
2014-11-25 16:00:58 -05:00
{ 0 , nullptr , nullptr }
2013-08-23 13:46:38 -04:00
} ;
static OptionEnumValueElement g_watch_size [ ] =
{
{ 1 , " 1 " , " Watch for byte size of 1 " } ,
{ 2 , " 2 " , " Watch for byte size of 2 " } ,
{ 4 , " 4 " , " Watch for byte size of 4 " } ,
{ 8 , " 8 " , " Watch for byte size of 8 " } ,
2014-11-25 16:00:58 -05:00
{ 0 , nullptr , nullptr }
2013-08-23 13:46:38 -04:00
} ;
static OptionDefinition
g_option_table [ ] =
{
2014-11-25 16:00:58 -05:00
{ LLDB_OPT_SET_1 , false , " watch " , ' w ' , OptionParser : : eRequiredArgument , nullptr , g_watch_type , 0 , eArgTypeWatchType , " Specify the type of watching to perform. " } ,
2015-07-03 12:57:06 -04:00
{ LLDB_OPT_SET_1 , false , " size " , ' s ' , OptionParser : : eRequiredArgument , nullptr , g_watch_size , 0 , eArgTypeByteSize , " Number of bytes to use to watch a region. " }
2013-08-23 13:46:38 -04:00
} ;
bool
OptionGroupWatchpoint : : IsWatchSizeSupported ( uint32_t watch_size )
{
for ( uint32_t i = 0 ; i < llvm : : array_lengthof ( g_watch_size ) ; + + i )
{
if ( g_watch_size [ i ] . value = = 0 )
break ;
if ( watch_size = = g_watch_size [ i ] . value )
return true ;
}
return false ;
}
OptionGroupWatchpoint : : OptionGroupWatchpoint ( ) :
OptionGroup ( )
{
}
OptionGroupWatchpoint : : ~ OptionGroupWatchpoint ( )
{
}
Error
OptionGroupWatchpoint : : SetOptionValue ( CommandInterpreter & interpreter ,
uint32_t option_idx ,
const char * option_arg )
{
Error error ;
const int short_option = g_option_table [ option_idx ] . short_option ;
switch ( short_option )
{
case ' w ' :
{
WatchType tmp_watch_type ;
tmp_watch_type = ( WatchType ) Args : : StringToOptionEnum ( option_arg , g_option_table [ option_idx ] . enum_values , 0 , error ) ;
if ( error . Success ( ) )
{
watch_type = tmp_watch_type ;
watch_type_specified = true ;
}
break ;
}
2015-07-03 12:57:06 -04:00
case ' s ' :
2013-08-23 13:46:38 -04:00
watch_size = ( uint32_t ) Args : : StringToOptionEnum ( option_arg , g_option_table [ option_idx ] . enum_values , 0 , error ) ;
break ;
default :
error . SetErrorStringWithFormat ( " unrecognized short option '%c' " , short_option ) ;
break ;
}
return error ;
}
void
OptionGroupWatchpoint : : OptionParsingStarting ( CommandInterpreter & interpreter )
{
watch_type_specified = false ;
watch_type = eWatchInvalid ;
watch_size = 0 ;
}
const OptionDefinition *
OptionGroupWatchpoint : : GetDefinitions ( )
{
return g_option_table ;
}
uint32_t
OptionGroupWatchpoint : : GetNumDefinitions ( )
{
return llvm : : array_lengthof ( g_option_table ) ;
}