@@ -885,6 +885,52 @@ class CommandObjectMemoryRead : public CommandObjectParsed {
885885#define LLDB_OPTIONS_memory_find
886886#include " CommandOptions.inc"
887887
888+ static llvm::Error CopyExpressionResult (ValueObject &result,
889+ DataBufferHeap &buffer) {
890+ uint64_t value = result.GetValueAsUnsigned (0 );
891+ auto size_or_err = result.GetCompilerType ().GetByteSize (nullptr );
892+ if (!size_or_err)
893+ return size_or_err.takeError ();
894+
895+ switch (*size_or_err) {
896+ case 1 : {
897+ uint8_t byte = (uint8_t )value;
898+ buffer.CopyData (&byte, 1 );
899+ } break ;
900+ case 2 : {
901+ uint16_t word = (uint16_t )value;
902+ buffer.CopyData (&word, 2 );
903+ } break ;
904+ case 4 : {
905+ uint32_t lword = (uint32_t )value;
906+ buffer.CopyData (&lword, 4 );
907+ } break ;
908+ case 8 : {
909+ buffer.CopyData (&value, 8 );
910+ } break ;
911+ default :
912+ return llvm::createStringError (
913+ " Only expressions resulting in 1, 2, 4, or 8-byte-sized values are "
914+ " supported. For other pattern sizes the --string (-s) option may be "
915+ " used." );
916+ }
917+
918+ return llvm::Error::success ();
919+ }
920+
921+ static llvm::Expected<ValueObjectSP>
922+ EvaluateExpression (llvm::StringRef expression, StackFrame &frame,
923+ Process &process) {
924+ ValueObjectSP result_sp;
925+ auto status =
926+ process.GetTarget ().EvaluateExpression (expression, &frame, result_sp);
927+ if (status != eExpressionCompleted || !result_sp)
928+ return llvm::createStringError (
929+ " expression evaluation failed. pass a string instead" );
930+
931+ return result_sp;
932+ }
933+
888934// Find the specified data in memory
889935class CommandObjectMemoryFind : public CommandObjectParsed {
890936public:
@@ -1026,49 +1072,18 @@ class CommandObjectMemoryFind : public CommandObjectParsed {
10261072 }
10271073 buffer.CopyData (str);
10281074 } else if (m_memory_options.m_expr .OptionWasSet ()) {
1029- StackFrame *frame = m_exe_ctx.GetFramePtr ();
1030- ValueObjectSP result_sp;
1031- if ((eExpressionCompleted ==
1032- process->GetTarget ().EvaluateExpression (
1033- m_memory_options.m_expr .GetValueAs <llvm::StringRef>().value_or (
1034- " " ),
1035- frame, result_sp)) &&
1036- result_sp) {
1037- uint64_t value = result_sp->GetValueAsUnsigned (0 );
1038- std::optional<uint64_t > size = llvm::expectedToOptional (
1039- result_sp->GetCompilerType ().GetByteSize (nullptr ));
1040- if (!size)
1041- return ;
1042- switch (*size) {
1043- case 1 : {
1044- uint8_t byte = (uint8_t )value;
1045- buffer.CopyData (&byte, 1 );
1046- } break ;
1047- case 2 : {
1048- uint16_t word = (uint16_t )value;
1049- buffer.CopyData (&word, 2 );
1050- } break ;
1051- case 4 : {
1052- uint32_t lword = (uint32_t )value;
1053- buffer.CopyData (&lword, 4 );
1054- } break ;
1055- case 8 : {
1056- buffer.CopyData (&value, 8 );
1057- } break ;
1058- case 3 :
1059- case 5 :
1060- case 6 :
1061- case 7 :
1062- result.AppendError (" unknown type. pass a string instead" );
1063- return ;
1064- default :
1065- result.AppendError (
1066- " result size larger than 8 bytes. pass a string instead" );
1067- return ;
1068- }
1069- } else {
1070- result.AppendError (
1071- " expression evaluation failed. pass a string instead" );
1075+ auto result_or_err = EvaluateExpression (
1076+ m_memory_options.m_expr .GetValueAs <llvm::StringRef>().value_or (" " ),
1077+ m_exe_ctx.GetFrameRef (), *process);
1078+ if (!result_or_err) {
1079+ result.AppendError (llvm::toString (result_or_err.takeError ()));
1080+ return ;
1081+ }
1082+
1083+ ValueObjectSP result_sp = *result_or_err;
1084+
1085+ if (auto err = CopyExpressionResult (*result_sp, buffer)) {
1086+ result.AppendError (llvm::toString (std::move (err)));
10721087 return ;
10731088 }
10741089 } else {
0 commit comments