@@ -885,6 +885,52 @@ class CommandObjectMemoryRead : public CommandObjectParsed {
885
885
#define LLDB_OPTIONS_memory_find
886
886
#include " CommandOptions.inc"
887
887
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
+
888
934
// Find the specified data in memory
889
935
class CommandObjectMemoryFind : public CommandObjectParsed {
890
936
public:
@@ -1026,49 +1072,18 @@ class CommandObjectMemoryFind : public CommandObjectParsed {
1026
1072
}
1027
1073
buffer.CopyData (str);
1028
1074
} 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)));
1072
1087
return ;
1073
1088
}
1074
1089
} else {
0 commit comments