@@ -70,174 +70,172 @@ LLVMUserExpression::DoExecute(DiagnosticManager &diagnostic_manager,
70
70
Log *log (lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_EXPRESSIONS |
71
71
LIBLLDB_LOG_STEP));
72
72
73
- if (m_jit_start_addr != LLDB_INVALID_ADDRESS || m_can_interpret) {
74
- lldb::addr_t struct_address = LLDB_INVALID_ADDRESS;
73
+ if (m_jit_start_addr == LLDB_INVALID_ADDRESS && !m_can_interpret) {
74
+ diagnostic_manager.PutString (
75
+ eDiagnosticSeverityError,
76
+ " Expression can't be run, because there is no JIT compiled function" );
77
+ return lldb::eExpressionSetupError;
78
+ }
75
79
76
- if (!PrepareToExecuteJITExpression (diagnostic_manager, exe_ctx,
77
- struct_address)) {
78
- diagnostic_manager.Printf (
80
+ lldb::addr_t struct_address = LLDB_INVALID_ADDRESS;
81
+
82
+ if (!PrepareToExecuteJITExpression (diagnostic_manager, exe_ctx,
83
+ struct_address)) {
84
+ diagnostic_manager.Printf (
85
+ eDiagnosticSeverityError,
86
+ " errored out in %s, couldn't PrepareToExecuteJITExpression" ,
87
+ __FUNCTION__);
88
+ return lldb::eExpressionSetupError;
89
+ }
90
+
91
+ lldb::addr_t function_stack_bottom = LLDB_INVALID_ADDRESS;
92
+ lldb::addr_t function_stack_top = LLDB_INVALID_ADDRESS;
93
+
94
+ if (m_can_interpret) {
95
+ llvm::Module *module = m_execution_unit_sp->GetModule ();
96
+ llvm::Function *function = m_execution_unit_sp->GetFunction ();
97
+
98
+ if (!module || !function) {
99
+ diagnostic_manager.PutString (
79
100
eDiagnosticSeverityError,
80
- " errored out in %s, couldn't PrepareToExecuteJITExpression" ,
81
- __FUNCTION__);
101
+ " supposed to interpret, but nothing is there" );
82
102
return lldb::eExpressionSetupError;
83
103
}
84
104
85
- lldb::addr_t function_stack_bottom = LLDB_INVALID_ADDRESS;
86
- lldb::addr_t function_stack_top = LLDB_INVALID_ADDRESS;
105
+ Status interpreter_error;
87
106
88
- if (m_can_interpret) {
89
- llvm::Module *module = m_execution_unit_sp->GetModule ();
90
- llvm::Function *function = m_execution_unit_sp->GetFunction ();
107
+ std::vector<lldb::addr_t > args;
91
108
92
- if (!module || !function ) {
93
- diagnostic_manager.PutString (
94
- eDiagnosticSeverityError ,
95
- " supposed to interpret, but nothing is there " );
96
- return lldb::eExpressionSetupError;
97
- }
109
+ if (!AddArguments (exe_ctx, args, struct_address, diagnostic_manager) ) {
110
+ diagnostic_manager.Printf (eDiagnosticSeverityError,
111
+ " errored out in %s, couldn't AddArguments " ,
112
+ __FUNCTION__ );
113
+ return lldb::eExpressionSetupError;
114
+ }
98
115
99
- Status interpreter_error;
116
+ function_stack_bottom = m_stack_frame_bottom;
117
+ function_stack_top = m_stack_frame_top;
100
118
101
- std::vector<lldb::addr_t > args;
119
+ IRInterpreter::Interpret (*module, *function, args, *m_execution_unit_sp,
120
+ interpreter_error, function_stack_bottom,
121
+ function_stack_top, exe_ctx);
102
122
103
- if (!AddArguments (exe_ctx, args, struct_address, diagnostic_manager)) {
104
- diagnostic_manager.Printf (eDiagnosticSeverityError,
105
- " errored out in %s, couldn't AddArguments" ,
106
- __FUNCTION__);
107
- return lldb::eExpressionSetupError;
108
- }
123
+ if (!interpreter_error.Success ()) {
124
+ diagnostic_manager.Printf (eDiagnosticSeverityError,
125
+ " supposed to interpret, but failed: %s" ,
126
+ interpreter_error.AsCString ());
127
+ return lldb::eExpressionDiscarded;
128
+ }
129
+ } else {
130
+ if (!exe_ctx.HasThreadScope ()) {
131
+ diagnostic_manager.Printf (eDiagnosticSeverityError,
132
+ " %s called with no thread selected" ,
133
+ __FUNCTION__);
134
+ return lldb::eExpressionSetupError;
135
+ }
109
136
110
- function_stack_bottom = m_stack_frame_bottom;
111
- function_stack_top = m_stack_frame_top;
137
+ Address wrapper_address (m_jit_start_addr);
112
138
113
- IRInterpreter::Interpret (*module, *function, args, *m_execution_unit_sp,
114
- interpreter_error, function_stack_bottom,
115
- function_stack_top, exe_ctx);
139
+ std::vector<lldb::addr_t > args;
116
140
117
- if (!interpreter_error.Success ()) {
118
- diagnostic_manager.Printf (eDiagnosticSeverityError,
119
- " supposed to interpret, but failed: %s" ,
120
- interpreter_error.AsCString ());
121
- return lldb::eExpressionDiscarded;
122
- }
123
- } else {
124
- if (!exe_ctx.HasThreadScope ()) {
125
- diagnostic_manager.Printf (eDiagnosticSeverityError,
126
- " %s called with no thread selected" ,
127
- __FUNCTION__);
128
- return lldb::eExpressionSetupError;
129
- }
141
+ if (!AddArguments (exe_ctx, args, struct_address, diagnostic_manager)) {
142
+ diagnostic_manager.Printf (eDiagnosticSeverityError,
143
+ " errored out in %s, couldn't AddArguments" ,
144
+ __FUNCTION__);
145
+ return lldb::eExpressionSetupError;
146
+ }
147
+
148
+ lldb::ThreadPlanSP call_plan_sp (new ThreadPlanCallUserExpression (
149
+ exe_ctx.GetThreadRef (), wrapper_address, args, options,
150
+ shared_ptr_to_me));
151
+
152
+ StreamString ss;
153
+ if (!call_plan_sp || !call_plan_sp->ValidatePlan (&ss)) {
154
+ diagnostic_manager.PutString (eDiagnosticSeverityError, ss.GetString ());
155
+ return lldb::eExpressionSetupError;
156
+ }
130
157
131
- Address wrapper_address (m_jit_start_addr);
158
+ ThreadPlanCallUserExpression *user_expression_plan =
159
+ static_cast <ThreadPlanCallUserExpression *>(call_plan_sp.get ());
132
160
133
- std::vector<lldb::addr_t > args;
161
+ lldb::addr_t function_stack_pointer =
162
+ user_expression_plan->GetFunctionStackPointer ();
134
163
135
- if (!AddArguments (exe_ctx, args, struct_address, diagnostic_manager)) {
136
- diagnostic_manager.Printf (eDiagnosticSeverityError,
137
- " errored out in %s, couldn't AddArguments" ,
138
- __FUNCTION__);
139
- return lldb::eExpressionSetupError;
140
- }
164
+ function_stack_bottom = function_stack_pointer - HostInfo::GetPageSize ();
165
+ function_stack_top = function_stack_pointer;
141
166
142
- lldb::ThreadPlanSP call_plan_sp (new ThreadPlanCallUserExpression (
143
- exe_ctx.GetThreadRef (), wrapper_address, args, options,
144
- shared_ptr_to_me));
167
+ LLDB_LOGF (log ,
168
+ " -- [UserExpression::Execute] Execution of expression begins --" );
145
169
146
- StreamString ss;
147
- if (!call_plan_sp || !call_plan_sp->ValidatePlan (&ss)) {
148
- diagnostic_manager.PutString (eDiagnosticSeverityError, ss.GetString ());
149
- return lldb::eExpressionSetupError;
150
- }
170
+ if (exe_ctx.GetProcessPtr ())
171
+ exe_ctx.GetProcessPtr ()->SetRunningUserExpression (true );
172
+
173
+ lldb::ExpressionResults execution_result =
174
+ exe_ctx.GetProcessRef ().RunThreadPlan (exe_ctx, call_plan_sp, options,
175
+ diagnostic_manager);
176
+
177
+ if (exe_ctx.GetProcessPtr ())
178
+ exe_ctx.GetProcessPtr ()->SetRunningUserExpression (false );
151
179
152
- ThreadPlanCallUserExpression *user_expression_plan =
153
- static_cast <ThreadPlanCallUserExpression *>(call_plan_sp.get ());
154
-
155
- lldb::addr_t function_stack_pointer =
156
- user_expression_plan->GetFunctionStackPointer ();
157
-
158
- function_stack_bottom = function_stack_pointer - HostInfo::GetPageSize ();
159
- function_stack_top = function_stack_pointer;
160
-
161
- LLDB_LOGF (
162
- log ,
163
- " -- [UserExpression::Execute] Execution of expression begins --" );
164
-
165
- if (exe_ctx.GetProcessPtr ())
166
- exe_ctx.GetProcessPtr ()->SetRunningUserExpression (true );
167
-
168
- lldb::ExpressionResults execution_result =
169
- exe_ctx.GetProcessRef ().RunThreadPlan (exe_ctx, call_plan_sp, options,
170
- diagnostic_manager);
171
-
172
- if (exe_ctx.GetProcessPtr ())
173
- exe_ctx.GetProcessPtr ()->SetRunningUserExpression (false );
174
-
175
- LLDB_LOGF (log , " -- [UserExpression::Execute] Execution of expression "
176
- " completed --" );
177
-
178
- if (execution_result == lldb::eExpressionInterrupted ||
179
- execution_result == lldb::eExpressionHitBreakpoint) {
180
- const char *error_desc = nullptr ;
181
-
182
- if (call_plan_sp) {
183
- lldb::StopInfoSP real_stop_info_sp = call_plan_sp->GetRealStopInfo ();
184
- if (real_stop_info_sp)
185
- error_desc = real_stop_info_sp->GetDescription ();
186
- }
187
- if (error_desc)
188
- diagnostic_manager.Printf (eDiagnosticSeverityError,
189
- " Execution was interrupted, reason: %s." ,
190
- error_desc);
191
- else
192
- diagnostic_manager.PutString (eDiagnosticSeverityError,
193
- " Execution was interrupted." );
194
-
195
- if ((execution_result == lldb::eExpressionInterrupted &&
196
- options.DoesUnwindOnError ()) ||
197
- (execution_result == lldb::eExpressionHitBreakpoint &&
198
- options.DoesIgnoreBreakpoints ()))
199
- diagnostic_manager.AppendMessageToDiagnostic (
200
- " The process has been returned to the state before expression "
201
- " evaluation." );
202
- else {
203
- if (execution_result == lldb::eExpressionHitBreakpoint)
204
- user_expression_plan->TransferExpressionOwnership ();
205
- diagnostic_manager.AppendMessageToDiagnostic (
206
- " The process has been left at the point where it was "
207
- " interrupted, "
208
- " use \" thread return -x\" to return to the state before "
209
- " expression evaluation." );
210
- }
211
-
212
- return execution_result;
213
- } else if (execution_result == lldb::eExpressionStoppedForDebug) {
214
- diagnostic_manager.PutString (
215
- eDiagnosticSeverityRemark,
216
- " Execution was halted at the first instruction of the expression "
217
- " function because \" debug\" was requested.\n "
218
- " Use \" thread return -x\" to return to the state before expression "
180
+ LLDB_LOGF (log , " -- [UserExpression::Execute] Execution of expression "
181
+ " completed --" );
182
+
183
+ if (execution_result == lldb::eExpressionInterrupted ||
184
+ execution_result == lldb::eExpressionHitBreakpoint) {
185
+ const char *error_desc = nullptr ;
186
+
187
+ if (call_plan_sp) {
188
+ lldb::StopInfoSP real_stop_info_sp = call_plan_sp->GetRealStopInfo ();
189
+ if (real_stop_info_sp)
190
+ error_desc = real_stop_info_sp->GetDescription ();
191
+ }
192
+ if (error_desc)
193
+ diagnostic_manager.Printf (eDiagnosticSeverityError,
194
+ " Execution was interrupted, reason: %s." ,
195
+ error_desc);
196
+ else
197
+ diagnostic_manager.PutString (eDiagnosticSeverityError,
198
+ " Execution was interrupted." );
199
+
200
+ if ((execution_result == lldb::eExpressionInterrupted &&
201
+ options.DoesUnwindOnError ()) ||
202
+ (execution_result == lldb::eExpressionHitBreakpoint &&
203
+ options.DoesIgnoreBreakpoints ()))
204
+ diagnostic_manager.AppendMessageToDiagnostic (
205
+ " The process has been returned to the state before expression "
219
206
" evaluation." );
220
- return execution_result;
221
- } else if (execution_result != lldb::eExpressionCompleted) {
222
- diagnostic_manager.Printf (
223
- eDiagnosticSeverityError,
224
- " Couldn't execute function; result was %s" ,
225
- Process::ExecutionResultAsCString (execution_result));
226
- return execution_result;
207
+ else {
208
+ if (execution_result == lldb::eExpressionHitBreakpoint)
209
+ user_expression_plan->TransferExpressionOwnership ();
210
+ diagnostic_manager.AppendMessageToDiagnostic (
211
+ " The process has been left at the point where it was "
212
+ " interrupted, "
213
+ " use \" thread return -x\" to return to the state before "
214
+ " expression evaluation." );
227
215
}
228
- }
229
216
230
- if (FinalizeJITExecution (diagnostic_manager, exe_ctx, result,
231
- function_stack_bottom, function_stack_top)) {
232
- return lldb::eExpressionCompleted;
233
- } else {
234
- return lldb::eExpressionResultUnavailable;
217
+ return execution_result;
218
+ } else if (execution_result == lldb::eExpressionStoppedForDebug) {
219
+ diagnostic_manager.PutString (
220
+ eDiagnosticSeverityRemark,
221
+ " Execution was halted at the first instruction of the expression "
222
+ " function because \" debug\" was requested.\n "
223
+ " Use \" thread return -x\" to return to the state before expression "
224
+ " evaluation." );
225
+ return execution_result;
226
+ } else if (execution_result != lldb::eExpressionCompleted) {
227
+ diagnostic_manager.Printf (
228
+ eDiagnosticSeverityError, " Couldn't execute function; result was %s" ,
229
+ Process::ExecutionResultAsCString (execution_result));
230
+ return execution_result;
235
231
}
232
+ }
233
+
234
+ if (FinalizeJITExecution (diagnostic_manager, exe_ctx, result,
235
+ function_stack_bottom, function_stack_top)) {
236
+ return lldb::eExpressionCompleted;
236
237
} else {
237
- diagnostic_manager.PutString (
238
- eDiagnosticSeverityError,
239
- " Expression can't be run, because there is no JIT compiled function" );
240
- return lldb::eExpressionSetupError;
238
+ return lldb::eExpressionResultUnavailable;
241
239
}
242
240
}
243
241
0 commit comments