annotate lldb/source/Expression/LLVMUserExpression.cpp @ 173:0572611fdcc8 llvm10 llvm12

reorgnization done
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 11:55:54 +0900
parents 1d019706d866
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===-- LLVMUserExpression.cpp --------------------------------------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9
anatofuz
parents:
diff changeset
10 #include "lldb/Expression/LLVMUserExpression.h"
anatofuz
parents:
diff changeset
11 #include "lldb/Core/Module.h"
anatofuz
parents:
diff changeset
12 #include "lldb/Core/StreamFile.h"
anatofuz
parents:
diff changeset
13 #include "lldb/Core/ValueObjectConstResult.h"
anatofuz
parents:
diff changeset
14 #include "lldb/Expression/DiagnosticManager.h"
anatofuz
parents:
diff changeset
15 #include "lldb/Expression/ExpressionVariable.h"
anatofuz
parents:
diff changeset
16 #include "lldb/Expression/IRExecutionUnit.h"
anatofuz
parents:
diff changeset
17 #include "lldb/Expression/IRInterpreter.h"
anatofuz
parents:
diff changeset
18 #include "lldb/Expression/Materializer.h"
anatofuz
parents:
diff changeset
19 #include "lldb/Host/HostInfo.h"
anatofuz
parents:
diff changeset
20 #include "lldb/Symbol/Block.h"
anatofuz
parents:
diff changeset
21 #include "lldb/Symbol/Function.h"
anatofuz
parents:
diff changeset
22 #include "lldb/Symbol/ObjectFile.h"
anatofuz
parents:
diff changeset
23 #include "lldb/Symbol/SymbolVendor.h"
anatofuz
parents:
diff changeset
24 #include "lldb/Symbol/Type.h"
anatofuz
parents:
diff changeset
25 #include "lldb/Symbol/VariableList.h"
anatofuz
parents:
diff changeset
26 #include "lldb/Target/ExecutionContext.h"
anatofuz
parents:
diff changeset
27 #include "lldb/Target/Process.h"
anatofuz
parents:
diff changeset
28 #include "lldb/Target/StackFrame.h"
anatofuz
parents:
diff changeset
29 #include "lldb/Target/Target.h"
anatofuz
parents:
diff changeset
30 #include "lldb/Target/ThreadPlan.h"
anatofuz
parents:
diff changeset
31 #include "lldb/Target/ThreadPlanCallUserExpression.h"
anatofuz
parents:
diff changeset
32 #include "lldb/Utility/ConstString.h"
anatofuz
parents:
diff changeset
33 #include "lldb/Utility/Log.h"
anatofuz
parents:
diff changeset
34 #include "lldb/Utility/StreamString.h"
anatofuz
parents:
diff changeset
35
anatofuz
parents:
diff changeset
36 using namespace lldb_private;
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 char LLVMUserExpression::ID;
anatofuz
parents:
diff changeset
39
anatofuz
parents:
diff changeset
40 LLVMUserExpression::LLVMUserExpression(ExecutionContextScope &exe_scope,
anatofuz
parents:
diff changeset
41 llvm::StringRef expr,
anatofuz
parents:
diff changeset
42 llvm::StringRef prefix,
anatofuz
parents:
diff changeset
43 lldb::LanguageType language,
anatofuz
parents:
diff changeset
44 ResultType desired_type,
anatofuz
parents:
diff changeset
45 const EvaluateExpressionOptions &options)
anatofuz
parents:
diff changeset
46 : UserExpression(exe_scope, expr, prefix, language, desired_type, options),
anatofuz
parents:
diff changeset
47 m_stack_frame_bottom(LLDB_INVALID_ADDRESS),
anatofuz
parents:
diff changeset
48 m_stack_frame_top(LLDB_INVALID_ADDRESS), m_allow_cxx(false),
anatofuz
parents:
diff changeset
49 m_allow_objc(false), m_transformed_text(), m_execution_unit_sp(),
anatofuz
parents:
diff changeset
50 m_materializer_up(), m_jit_module_wp(), m_can_interpret(false),
anatofuz
parents:
diff changeset
51 m_materialized_address(LLDB_INVALID_ADDRESS) {}
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 LLVMUserExpression::~LLVMUserExpression() {
anatofuz
parents:
diff changeset
54 if (m_target) {
anatofuz
parents:
diff changeset
55 lldb::ModuleSP jit_module_sp(m_jit_module_wp.lock());
anatofuz
parents:
diff changeset
56 if (jit_module_sp)
anatofuz
parents:
diff changeset
57 m_target->GetImages().Remove(jit_module_sp);
anatofuz
parents:
diff changeset
58 }
anatofuz
parents:
diff changeset
59 }
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 lldb::ExpressionResults
anatofuz
parents:
diff changeset
62 LLVMUserExpression::DoExecute(DiagnosticManager &diagnostic_manager,
anatofuz
parents:
diff changeset
63 ExecutionContext &exe_ctx,
anatofuz
parents:
diff changeset
64 const EvaluateExpressionOptions &options,
anatofuz
parents:
diff changeset
65 lldb::UserExpressionSP &shared_ptr_to_me,
anatofuz
parents:
diff changeset
66 lldb::ExpressionVariableSP &result) {
anatofuz
parents:
diff changeset
67 // The expression log is quite verbose, and if you're just tracking the
anatofuz
parents:
diff changeset
68 // execution of the expression, it's quite convenient to have these logs come
anatofuz
parents:
diff changeset
69 // out with the STEP log as well.
anatofuz
parents:
diff changeset
70 Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_EXPRESSIONS |
anatofuz
parents:
diff changeset
71 LIBLLDB_LOG_STEP));
anatofuz
parents:
diff changeset
72
anatofuz
parents:
diff changeset
73 if (m_jit_start_addr == LLDB_INVALID_ADDRESS && !m_can_interpret) {
anatofuz
parents:
diff changeset
74 diagnostic_manager.PutString(
anatofuz
parents:
diff changeset
75 eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
76 "Expression can't be run, because there is no JIT compiled function");
anatofuz
parents:
diff changeset
77 return lldb::eExpressionSetupError;
anatofuz
parents:
diff changeset
78 }
anatofuz
parents:
diff changeset
79
anatofuz
parents:
diff changeset
80 lldb::addr_t struct_address = LLDB_INVALID_ADDRESS;
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 if (!PrepareToExecuteJITExpression(diagnostic_manager, exe_ctx,
anatofuz
parents:
diff changeset
83 struct_address)) {
anatofuz
parents:
diff changeset
84 diagnostic_manager.Printf(
anatofuz
parents:
diff changeset
85 eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
86 "errored out in %s, couldn't PrepareToExecuteJITExpression",
anatofuz
parents:
diff changeset
87 __FUNCTION__);
anatofuz
parents:
diff changeset
88 return lldb::eExpressionSetupError;
anatofuz
parents:
diff changeset
89 }
anatofuz
parents:
diff changeset
90
anatofuz
parents:
diff changeset
91 lldb::addr_t function_stack_bottom = LLDB_INVALID_ADDRESS;
anatofuz
parents:
diff changeset
92 lldb::addr_t function_stack_top = LLDB_INVALID_ADDRESS;
anatofuz
parents:
diff changeset
93
anatofuz
parents:
diff changeset
94 if (m_can_interpret) {
anatofuz
parents:
diff changeset
95 llvm::Module *module = m_execution_unit_sp->GetModule();
anatofuz
parents:
diff changeset
96 llvm::Function *function = m_execution_unit_sp->GetFunction();
anatofuz
parents:
diff changeset
97
anatofuz
parents:
diff changeset
98 if (!module || !function) {
anatofuz
parents:
diff changeset
99 diagnostic_manager.PutString(
anatofuz
parents:
diff changeset
100 eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
101 "supposed to interpret, but nothing is there");
anatofuz
parents:
diff changeset
102 return lldb::eExpressionSetupError;
anatofuz
parents:
diff changeset
103 }
anatofuz
parents:
diff changeset
104
anatofuz
parents:
diff changeset
105 Status interpreter_error;
anatofuz
parents:
diff changeset
106
anatofuz
parents:
diff changeset
107 std::vector<lldb::addr_t> args;
anatofuz
parents:
diff changeset
108
anatofuz
parents:
diff changeset
109 if (!AddArguments(exe_ctx, args, struct_address, diagnostic_manager)) {
anatofuz
parents:
diff changeset
110 diagnostic_manager.Printf(eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
111 "errored out in %s, couldn't AddArguments",
anatofuz
parents:
diff changeset
112 __FUNCTION__);
anatofuz
parents:
diff changeset
113 return lldb::eExpressionSetupError;
anatofuz
parents:
diff changeset
114 }
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 function_stack_bottom = m_stack_frame_bottom;
anatofuz
parents:
diff changeset
117 function_stack_top = m_stack_frame_top;
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 IRInterpreter::Interpret(*module, *function, args, *m_execution_unit_sp,
anatofuz
parents:
diff changeset
120 interpreter_error, function_stack_bottom,
anatofuz
parents:
diff changeset
121 function_stack_top, exe_ctx);
anatofuz
parents:
diff changeset
122
anatofuz
parents:
diff changeset
123 if (!interpreter_error.Success()) {
anatofuz
parents:
diff changeset
124 diagnostic_manager.Printf(eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
125 "supposed to interpret, but failed: %s",
anatofuz
parents:
diff changeset
126 interpreter_error.AsCString());
anatofuz
parents:
diff changeset
127 return lldb::eExpressionDiscarded;
anatofuz
parents:
diff changeset
128 }
anatofuz
parents:
diff changeset
129 } else {
anatofuz
parents:
diff changeset
130 if (!exe_ctx.HasThreadScope()) {
anatofuz
parents:
diff changeset
131 diagnostic_manager.Printf(eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
132 "%s called with no thread selected",
anatofuz
parents:
diff changeset
133 __FUNCTION__);
anatofuz
parents:
diff changeset
134 return lldb::eExpressionSetupError;
anatofuz
parents:
diff changeset
135 }
anatofuz
parents:
diff changeset
136
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
137 // Store away the thread ID for error reporting, in case it exits
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
138 // during execution:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
139 lldb::tid_t expr_thread_id = exe_ctx.GetThreadRef().GetID();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
140
150
anatofuz
parents:
diff changeset
141 Address wrapper_address(m_jit_start_addr);
anatofuz
parents:
diff changeset
142
anatofuz
parents:
diff changeset
143 std::vector<lldb::addr_t> args;
anatofuz
parents:
diff changeset
144
anatofuz
parents:
diff changeset
145 if (!AddArguments(exe_ctx, args, struct_address, diagnostic_manager)) {
anatofuz
parents:
diff changeset
146 diagnostic_manager.Printf(eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
147 "errored out in %s, couldn't AddArguments",
anatofuz
parents:
diff changeset
148 __FUNCTION__);
anatofuz
parents:
diff changeset
149 return lldb::eExpressionSetupError;
anatofuz
parents:
diff changeset
150 }
anatofuz
parents:
diff changeset
151
anatofuz
parents:
diff changeset
152 lldb::ThreadPlanSP call_plan_sp(new ThreadPlanCallUserExpression(
anatofuz
parents:
diff changeset
153 exe_ctx.GetThreadRef(), wrapper_address, args, options,
anatofuz
parents:
diff changeset
154 shared_ptr_to_me));
anatofuz
parents:
diff changeset
155
anatofuz
parents:
diff changeset
156 StreamString ss;
anatofuz
parents:
diff changeset
157 if (!call_plan_sp || !call_plan_sp->ValidatePlan(&ss)) {
anatofuz
parents:
diff changeset
158 diagnostic_manager.PutString(eDiagnosticSeverityError, ss.GetString());
anatofuz
parents:
diff changeset
159 return lldb::eExpressionSetupError;
anatofuz
parents:
diff changeset
160 }
anatofuz
parents:
diff changeset
161
anatofuz
parents:
diff changeset
162 ThreadPlanCallUserExpression *user_expression_plan =
anatofuz
parents:
diff changeset
163 static_cast<ThreadPlanCallUserExpression *>(call_plan_sp.get());
anatofuz
parents:
diff changeset
164
anatofuz
parents:
diff changeset
165 lldb::addr_t function_stack_pointer =
anatofuz
parents:
diff changeset
166 user_expression_plan->GetFunctionStackPointer();
anatofuz
parents:
diff changeset
167
anatofuz
parents:
diff changeset
168 function_stack_bottom = function_stack_pointer - HostInfo::GetPageSize();
anatofuz
parents:
diff changeset
169 function_stack_top = function_stack_pointer;
anatofuz
parents:
diff changeset
170
anatofuz
parents:
diff changeset
171 LLDB_LOGF(log,
anatofuz
parents:
diff changeset
172 "-- [UserExpression::Execute] Execution of expression begins --");
anatofuz
parents:
diff changeset
173
anatofuz
parents:
diff changeset
174 if (exe_ctx.GetProcessPtr())
anatofuz
parents:
diff changeset
175 exe_ctx.GetProcessPtr()->SetRunningUserExpression(true);
anatofuz
parents:
diff changeset
176
anatofuz
parents:
diff changeset
177 lldb::ExpressionResults execution_result =
anatofuz
parents:
diff changeset
178 exe_ctx.GetProcessRef().RunThreadPlan(exe_ctx, call_plan_sp, options,
anatofuz
parents:
diff changeset
179 diagnostic_manager);
anatofuz
parents:
diff changeset
180
anatofuz
parents:
diff changeset
181 if (exe_ctx.GetProcessPtr())
anatofuz
parents:
diff changeset
182 exe_ctx.GetProcessPtr()->SetRunningUserExpression(false);
anatofuz
parents:
diff changeset
183
anatofuz
parents:
diff changeset
184 LLDB_LOGF(log, "-- [UserExpression::Execute] Execution of expression "
anatofuz
parents:
diff changeset
185 "completed --");
anatofuz
parents:
diff changeset
186
anatofuz
parents:
diff changeset
187 if (execution_result == lldb::eExpressionInterrupted ||
anatofuz
parents:
diff changeset
188 execution_result == lldb::eExpressionHitBreakpoint) {
anatofuz
parents:
diff changeset
189 const char *error_desc = nullptr;
anatofuz
parents:
diff changeset
190
anatofuz
parents:
diff changeset
191 if (call_plan_sp) {
anatofuz
parents:
diff changeset
192 lldb::StopInfoSP real_stop_info_sp = call_plan_sp->GetRealStopInfo();
anatofuz
parents:
diff changeset
193 if (real_stop_info_sp)
anatofuz
parents:
diff changeset
194 error_desc = real_stop_info_sp->GetDescription();
anatofuz
parents:
diff changeset
195 }
anatofuz
parents:
diff changeset
196 if (error_desc)
anatofuz
parents:
diff changeset
197 diagnostic_manager.Printf(eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
198 "Execution was interrupted, reason: %s.",
anatofuz
parents:
diff changeset
199 error_desc);
anatofuz
parents:
diff changeset
200 else
anatofuz
parents:
diff changeset
201 diagnostic_manager.PutString(eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
202 "Execution was interrupted.");
anatofuz
parents:
diff changeset
203
anatofuz
parents:
diff changeset
204 if ((execution_result == lldb::eExpressionInterrupted &&
anatofuz
parents:
diff changeset
205 options.DoesUnwindOnError()) ||
anatofuz
parents:
diff changeset
206 (execution_result == lldb::eExpressionHitBreakpoint &&
anatofuz
parents:
diff changeset
207 options.DoesIgnoreBreakpoints()))
anatofuz
parents:
diff changeset
208 diagnostic_manager.AppendMessageToDiagnostic(
anatofuz
parents:
diff changeset
209 "The process has been returned to the state before expression "
anatofuz
parents:
diff changeset
210 "evaluation.");
anatofuz
parents:
diff changeset
211 else {
anatofuz
parents:
diff changeset
212 if (execution_result == lldb::eExpressionHitBreakpoint)
anatofuz
parents:
diff changeset
213 user_expression_plan->TransferExpressionOwnership();
anatofuz
parents:
diff changeset
214 diagnostic_manager.AppendMessageToDiagnostic(
anatofuz
parents:
diff changeset
215 "The process has been left at the point where it was "
anatofuz
parents:
diff changeset
216 "interrupted, "
anatofuz
parents:
diff changeset
217 "use \"thread return -x\" to return to the state before "
anatofuz
parents:
diff changeset
218 "expression evaluation.");
anatofuz
parents:
diff changeset
219 }
anatofuz
parents:
diff changeset
220
anatofuz
parents:
diff changeset
221 return execution_result;
anatofuz
parents:
diff changeset
222 } else if (execution_result == lldb::eExpressionStoppedForDebug) {
anatofuz
parents:
diff changeset
223 diagnostic_manager.PutString(
anatofuz
parents:
diff changeset
224 eDiagnosticSeverityRemark,
anatofuz
parents:
diff changeset
225 "Execution was halted at the first instruction of the expression "
anatofuz
parents:
diff changeset
226 "function because \"debug\" was requested.\n"
anatofuz
parents:
diff changeset
227 "Use \"thread return -x\" to return to the state before expression "
anatofuz
parents:
diff changeset
228 "evaluation.");
anatofuz
parents:
diff changeset
229 return execution_result;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
230 } else if (execution_result == lldb::eExpressionThreadVanished) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
231 diagnostic_manager.Printf(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
232 eDiagnosticSeverityError,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
233 "Couldn't complete execution; the thread "
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
234 "on which the expression was being run: 0x%" PRIx64
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
235 " exited during its execution.",
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
236 expr_thread_id);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
237 return execution_result;
150
anatofuz
parents:
diff changeset
238 } else if (execution_result != lldb::eExpressionCompleted) {
anatofuz
parents:
diff changeset
239 diagnostic_manager.Printf(
anatofuz
parents:
diff changeset
240 eDiagnosticSeverityError, "Couldn't execute function; result was %s",
anatofuz
parents:
diff changeset
241 Process::ExecutionResultAsCString(execution_result));
anatofuz
parents:
diff changeset
242 return execution_result;
anatofuz
parents:
diff changeset
243 }
anatofuz
parents:
diff changeset
244 }
anatofuz
parents:
diff changeset
245
anatofuz
parents:
diff changeset
246 if (FinalizeJITExecution(diagnostic_manager, exe_ctx, result,
anatofuz
parents:
diff changeset
247 function_stack_bottom, function_stack_top)) {
anatofuz
parents:
diff changeset
248 return lldb::eExpressionCompleted;
anatofuz
parents:
diff changeset
249 } else {
anatofuz
parents:
diff changeset
250 return lldb::eExpressionResultUnavailable;
anatofuz
parents:
diff changeset
251 }
anatofuz
parents:
diff changeset
252 }
anatofuz
parents:
diff changeset
253
anatofuz
parents:
diff changeset
254 bool LLVMUserExpression::FinalizeJITExecution(
anatofuz
parents:
diff changeset
255 DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
anatofuz
parents:
diff changeset
256 lldb::ExpressionVariableSP &result, lldb::addr_t function_stack_bottom,
anatofuz
parents:
diff changeset
257 lldb::addr_t function_stack_top) {
anatofuz
parents:
diff changeset
258 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
anatofuz
parents:
diff changeset
259
anatofuz
parents:
diff changeset
260 LLDB_LOGF(log, "-- [UserExpression::FinalizeJITExecution] Dematerializing "
anatofuz
parents:
diff changeset
261 "after execution --");
anatofuz
parents:
diff changeset
262
anatofuz
parents:
diff changeset
263 if (!m_dematerializer_sp) {
anatofuz
parents:
diff changeset
264 diagnostic_manager.Printf(eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
265 "Couldn't apply expression side effects : no "
anatofuz
parents:
diff changeset
266 "dematerializer is present");
anatofuz
parents:
diff changeset
267 return false;
anatofuz
parents:
diff changeset
268 }
anatofuz
parents:
diff changeset
269
anatofuz
parents:
diff changeset
270 Status dematerialize_error;
anatofuz
parents:
diff changeset
271
anatofuz
parents:
diff changeset
272 m_dematerializer_sp->Dematerialize(dematerialize_error, function_stack_bottom,
anatofuz
parents:
diff changeset
273 function_stack_top);
anatofuz
parents:
diff changeset
274
anatofuz
parents:
diff changeset
275 if (!dematerialize_error.Success()) {
anatofuz
parents:
diff changeset
276 diagnostic_manager.Printf(eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
277 "Couldn't apply expression side effects : %s",
anatofuz
parents:
diff changeset
278 dematerialize_error.AsCString("unknown error"));
anatofuz
parents:
diff changeset
279 return false;
anatofuz
parents:
diff changeset
280 }
anatofuz
parents:
diff changeset
281
anatofuz
parents:
diff changeset
282 result =
anatofuz
parents:
diff changeset
283 GetResultAfterDematerialization(exe_ctx.GetBestExecutionContextScope());
anatofuz
parents:
diff changeset
284
anatofuz
parents:
diff changeset
285 if (result)
anatofuz
parents:
diff changeset
286 result->TransferAddress();
anatofuz
parents:
diff changeset
287
anatofuz
parents:
diff changeset
288 m_dematerializer_sp.reset();
anatofuz
parents:
diff changeset
289
anatofuz
parents:
diff changeset
290 return true;
anatofuz
parents:
diff changeset
291 }
anatofuz
parents:
diff changeset
292
anatofuz
parents:
diff changeset
293 bool LLVMUserExpression::PrepareToExecuteJITExpression(
anatofuz
parents:
diff changeset
294 DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
anatofuz
parents:
diff changeset
295 lldb::addr_t &struct_address) {
anatofuz
parents:
diff changeset
296 lldb::TargetSP target;
anatofuz
parents:
diff changeset
297 lldb::ProcessSP process;
anatofuz
parents:
diff changeset
298 lldb::StackFrameSP frame;
anatofuz
parents:
diff changeset
299
anatofuz
parents:
diff changeset
300 if (!LockAndCheckContext(exe_ctx, target, process, frame)) {
anatofuz
parents:
diff changeset
301 diagnostic_manager.PutString(
anatofuz
parents:
diff changeset
302 eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
303 "The context has changed before we could JIT the expression!");
anatofuz
parents:
diff changeset
304 return false;
anatofuz
parents:
diff changeset
305 }
anatofuz
parents:
diff changeset
306
anatofuz
parents:
diff changeset
307 if (m_jit_start_addr != LLDB_INVALID_ADDRESS || m_can_interpret) {
anatofuz
parents:
diff changeset
308 if (m_materialized_address == LLDB_INVALID_ADDRESS) {
anatofuz
parents:
diff changeset
309 Status alloc_error;
anatofuz
parents:
diff changeset
310
anatofuz
parents:
diff changeset
311 IRMemoryMap::AllocationPolicy policy =
anatofuz
parents:
diff changeset
312 m_can_interpret ? IRMemoryMap::eAllocationPolicyHostOnly
anatofuz
parents:
diff changeset
313 : IRMemoryMap::eAllocationPolicyMirror;
anatofuz
parents:
diff changeset
314
anatofuz
parents:
diff changeset
315 const bool zero_memory = false;
anatofuz
parents:
diff changeset
316
anatofuz
parents:
diff changeset
317 m_materialized_address = m_execution_unit_sp->Malloc(
anatofuz
parents:
diff changeset
318 m_materializer_up->GetStructByteSize(),
anatofuz
parents:
diff changeset
319 m_materializer_up->GetStructAlignment(),
anatofuz
parents:
diff changeset
320 lldb::ePermissionsReadable | lldb::ePermissionsWritable, policy,
anatofuz
parents:
diff changeset
321 zero_memory, alloc_error);
anatofuz
parents:
diff changeset
322
anatofuz
parents:
diff changeset
323 if (!alloc_error.Success()) {
anatofuz
parents:
diff changeset
324 diagnostic_manager.Printf(
anatofuz
parents:
diff changeset
325 eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
326 "Couldn't allocate space for materialized struct: %s",
anatofuz
parents:
diff changeset
327 alloc_error.AsCString());
anatofuz
parents:
diff changeset
328 return false;
anatofuz
parents:
diff changeset
329 }
anatofuz
parents:
diff changeset
330 }
anatofuz
parents:
diff changeset
331
anatofuz
parents:
diff changeset
332 struct_address = m_materialized_address;
anatofuz
parents:
diff changeset
333
anatofuz
parents:
diff changeset
334 if (m_can_interpret && m_stack_frame_bottom == LLDB_INVALID_ADDRESS) {
anatofuz
parents:
diff changeset
335 Status alloc_error;
anatofuz
parents:
diff changeset
336
anatofuz
parents:
diff changeset
337 const size_t stack_frame_size = 512 * 1024;
anatofuz
parents:
diff changeset
338
anatofuz
parents:
diff changeset
339 const bool zero_memory = false;
anatofuz
parents:
diff changeset
340
anatofuz
parents:
diff changeset
341 m_stack_frame_bottom = m_execution_unit_sp->Malloc(
anatofuz
parents:
diff changeset
342 stack_frame_size, 8,
anatofuz
parents:
diff changeset
343 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
anatofuz
parents:
diff changeset
344 IRMemoryMap::eAllocationPolicyHostOnly, zero_memory, alloc_error);
anatofuz
parents:
diff changeset
345
anatofuz
parents:
diff changeset
346 m_stack_frame_top = m_stack_frame_bottom + stack_frame_size;
anatofuz
parents:
diff changeset
347
anatofuz
parents:
diff changeset
348 if (!alloc_error.Success()) {
anatofuz
parents:
diff changeset
349 diagnostic_manager.Printf(
anatofuz
parents:
diff changeset
350 eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
351 "Couldn't allocate space for the stack frame: %s",
anatofuz
parents:
diff changeset
352 alloc_error.AsCString());
anatofuz
parents:
diff changeset
353 return false;
anatofuz
parents:
diff changeset
354 }
anatofuz
parents:
diff changeset
355 }
anatofuz
parents:
diff changeset
356
anatofuz
parents:
diff changeset
357 Status materialize_error;
anatofuz
parents:
diff changeset
358
anatofuz
parents:
diff changeset
359 m_dematerializer_sp = m_materializer_up->Materialize(
anatofuz
parents:
diff changeset
360 frame, *m_execution_unit_sp, struct_address, materialize_error);
anatofuz
parents:
diff changeset
361
anatofuz
parents:
diff changeset
362 if (!materialize_error.Success()) {
anatofuz
parents:
diff changeset
363 diagnostic_manager.Printf(eDiagnosticSeverityError,
anatofuz
parents:
diff changeset
364 "Couldn't materialize: %s",
anatofuz
parents:
diff changeset
365 materialize_error.AsCString());
anatofuz
parents:
diff changeset
366 return false;
anatofuz
parents:
diff changeset
367 }
anatofuz
parents:
diff changeset
368 }
anatofuz
parents:
diff changeset
369 return true;
anatofuz
parents:
diff changeset
370 }
anatofuz
parents:
diff changeset
371