1998c8a1cSRyan Brown //===-- LLVMUserExpression.cpp ----------------------------------*- C++ -*-===//
2998c8a1cSRyan Brown //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6998c8a1cSRyan Brown //
7998c8a1cSRyan Brown //===----------------------------------------------------------------------===//
8998c8a1cSRyan Brown 
9998c8a1cSRyan Brown 
10998c8a1cSRyan Brown #include "lldb/Expression/LLVMUserExpression.h"
11998c8a1cSRyan Brown #include "lldb/Core/Module.h"
12998c8a1cSRyan Brown #include "lldb/Core/StreamFile.h"
13998c8a1cSRyan Brown #include "lldb/Core/ValueObjectConstResult.h"
14579e70c9SSean Callanan #include "lldb/Expression/DiagnosticManager.h"
15bb089697SAlex Langford #include "lldb/Expression/ExpressionVariable.h"
16998c8a1cSRyan Brown #include "lldb/Expression/IRExecutionUnit.h"
17998c8a1cSRyan Brown #include "lldb/Expression/IRInterpreter.h"
18998c8a1cSRyan Brown #include "lldb/Expression/Materializer.h"
19998c8a1cSRyan Brown #include "lldb/Host/HostInfo.h"
20998c8a1cSRyan Brown #include "lldb/Symbol/Block.h"
21579e70c9SSean Callanan #include "lldb/Symbol/ClangExternalASTSourceCommon.h"
22998c8a1cSRyan Brown #include "lldb/Symbol/Function.h"
23998c8a1cSRyan Brown #include "lldb/Symbol/ObjectFile.h"
24998c8a1cSRyan Brown #include "lldb/Symbol/SymbolVendor.h"
25998c8a1cSRyan Brown #include "lldb/Symbol/Type.h"
26998c8a1cSRyan Brown #include "lldb/Symbol/VariableList.h"
27998c8a1cSRyan Brown #include "lldb/Target/ExecutionContext.h"
28998c8a1cSRyan Brown #include "lldb/Target/Process.h"
29998c8a1cSRyan Brown #include "lldb/Target/StackFrame.h"
30998c8a1cSRyan Brown #include "lldb/Target/Target.h"
31998c8a1cSRyan Brown #include "lldb/Target/ThreadPlan.h"
32998c8a1cSRyan Brown #include "lldb/Target/ThreadPlanCallUserExpression.h"
33bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
346f9e6901SZachary Turner #include "lldb/Utility/Log.h"
35bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h"
36998c8a1cSRyan Brown 
37998c8a1cSRyan Brown using namespace lldb_private;
38998c8a1cSRyan Brown 
3919a63fc6SJim Ingham LLVMUserExpression::LLVMUserExpression(ExecutionContextScope &exe_scope,
40c5d7df90SZachary Turner                                        llvm::StringRef expr,
41c5d7df90SZachary Turner                                        llvm::StringRef prefix,
4219a63fc6SJim Ingham                                        lldb::LanguageType language,
4319a63fc6SJim Ingham                                        ResultType desired_type,
447e34d78dSAdrian Prantl                                        const EvaluateExpressionOptions &options,
457e34d78dSAdrian Prantl                                        ExpressionKind kind)
467e34d78dSAdrian Prantl     : UserExpression(exe_scope, expr, prefix, language, desired_type, options,
477e34d78dSAdrian Prantl                      kind),
48998c8a1cSRyan Brown       m_stack_frame_bottom(LLDB_INVALID_ADDRESS),
49d5b44036SJonas Devlieghere       m_stack_frame_top(LLDB_INVALID_ADDRESS), m_allow_cxx(false),
50d5b44036SJonas Devlieghere       m_allow_objc(false), m_transformed_text(), m_execution_unit_sp(),
51d5b44036SJonas Devlieghere       m_materializer_up(), m_jit_module_wp(), m_enforce_valid_object(true),
52d5b44036SJonas Devlieghere       m_in_cplusplus_method(false), m_in_objectivec_method(false),
53248a1305SKonrad Kleine       m_in_static_method(false), m_needs_object_ptr(false), m_target(nullptr),
54d5b44036SJonas Devlieghere       m_can_interpret(false), m_materialized_address(LLDB_INVALID_ADDRESS) {}
55998c8a1cSRyan Brown 
56b9c1b51eSKate Stone LLVMUserExpression::~LLVMUserExpression() {
57b9c1b51eSKate Stone   if (m_target) {
58998c8a1cSRyan Brown     lldb::ModuleSP jit_module_sp(m_jit_module_wp.lock());
59998c8a1cSRyan Brown     if (jit_module_sp)
60998c8a1cSRyan Brown       m_target->GetImages().Remove(jit_module_sp);
61998c8a1cSRyan Brown   }
62998c8a1cSRyan Brown }
63998c8a1cSRyan Brown 
64998c8a1cSRyan Brown lldb::ExpressionResults
65b9c1b51eSKate Stone LLVMUserExpression::DoExecute(DiagnosticManager &diagnostic_manager,
66b9c1b51eSKate Stone                               ExecutionContext &exe_ctx,
67b9c1b51eSKate Stone                               const EvaluateExpressionOptions &options,
68b9c1b51eSKate Stone                               lldb::UserExpressionSP &shared_ptr_to_me,
69b9c1b51eSKate Stone                               lldb::ExpressionVariableSP &result) {
70b9c1b51eSKate Stone   // The expression log is quite verbose, and if you're just tracking the
7105097246SAdrian Prantl   // execution of the expression, it's quite convenient to have these logs come
7205097246SAdrian Prantl   // out with the STEP log as well.
73b9c1b51eSKate Stone   Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_EXPRESSIONS |
74b9c1b51eSKate Stone                                                   LIBLLDB_LOG_STEP));
75998c8a1cSRyan Brown 
76b9c1b51eSKate Stone   if (m_jit_start_addr != LLDB_INVALID_ADDRESS || m_can_interpret) {
77998c8a1cSRyan Brown     lldb::addr_t struct_address = LLDB_INVALID_ADDRESS;
78998c8a1cSRyan Brown 
79b9c1b51eSKate Stone     if (!PrepareToExecuteJITExpression(diagnostic_manager, exe_ctx,
80b9c1b51eSKate Stone                                        struct_address)) {
81b9c1b51eSKate Stone       diagnostic_manager.Printf(
82b9c1b51eSKate Stone           eDiagnosticSeverityError,
83b9c1b51eSKate Stone           "errored out in %s, couldn't PrepareToExecuteJITExpression",
84b9c1b51eSKate Stone           __FUNCTION__);
85998c8a1cSRyan Brown       return lldb::eExpressionSetupError;
86998c8a1cSRyan Brown     }
87998c8a1cSRyan Brown 
88998c8a1cSRyan Brown     lldb::addr_t function_stack_bottom = LLDB_INVALID_ADDRESS;
89998c8a1cSRyan Brown     lldb::addr_t function_stack_top = LLDB_INVALID_ADDRESS;
90998c8a1cSRyan Brown 
91b9c1b51eSKate Stone     if (m_can_interpret) {
92998c8a1cSRyan Brown       llvm::Module *module = m_execution_unit_sp->GetModule();
93998c8a1cSRyan Brown       llvm::Function *function = m_execution_unit_sp->GetFunction();
94998c8a1cSRyan Brown 
95b9c1b51eSKate Stone       if (!module || !function) {
96e2411fabSZachary Turner         diagnostic_manager.PutString(
97b9c1b51eSKate Stone             eDiagnosticSeverityError,
98b9c1b51eSKate Stone             "supposed to interpret, but nothing is there");
99998c8a1cSRyan Brown         return lldb::eExpressionSetupError;
100998c8a1cSRyan Brown       }
101998c8a1cSRyan Brown 
10297206d57SZachary Turner       Status interpreter_error;
103998c8a1cSRyan Brown 
104998c8a1cSRyan Brown       std::vector<lldb::addr_t> args;
105998c8a1cSRyan Brown 
106b9c1b51eSKate Stone       if (!AddArguments(exe_ctx, args, struct_address, diagnostic_manager)) {
107b9c1b51eSKate Stone         diagnostic_manager.Printf(eDiagnosticSeverityError,
108b9c1b51eSKate Stone                                   "errored out in %s, couldn't AddArguments",
109579e70c9SSean Callanan                                   __FUNCTION__);
110998c8a1cSRyan Brown         return lldb::eExpressionSetupError;
111998c8a1cSRyan Brown       }
112998c8a1cSRyan Brown 
113998c8a1cSRyan Brown       function_stack_bottom = m_stack_frame_bottom;
114998c8a1cSRyan Brown       function_stack_top = m_stack_frame_top;
115998c8a1cSRyan Brown 
11670355aceSJonas Devlieghere       IRInterpreter::Interpret(*module, *function, args, *m_execution_unit_sp,
11770355aceSJonas Devlieghere                                interpreter_error, function_stack_bottom,
11870355aceSJonas Devlieghere                                function_stack_top, exe_ctx);
119998c8a1cSRyan Brown 
120b9c1b51eSKate Stone       if (!interpreter_error.Success()) {
121b9c1b51eSKate Stone         diagnostic_manager.Printf(eDiagnosticSeverityError,
122b9c1b51eSKate Stone                                   "supposed to interpret, but failed: %s",
123579e70c9SSean Callanan                                   interpreter_error.AsCString());
124998c8a1cSRyan Brown         return lldb::eExpressionDiscarded;
125998c8a1cSRyan Brown       }
126b9c1b51eSKate Stone     } else {
127b9c1b51eSKate Stone       if (!exe_ctx.HasThreadScope()) {
128b9c1b51eSKate Stone         diagnostic_manager.Printf(eDiagnosticSeverityError,
129b9c1b51eSKate Stone                                   "%s called with no thread selected",
130b9c1b51eSKate Stone                                   __FUNCTION__);
131998c8a1cSRyan Brown         return lldb::eExpressionSetupError;
132998c8a1cSRyan Brown       }
133998c8a1cSRyan Brown 
134998c8a1cSRyan Brown       Address wrapper_address(m_jit_start_addr);
135998c8a1cSRyan Brown 
136998c8a1cSRyan Brown       std::vector<lldb::addr_t> args;
137998c8a1cSRyan Brown 
138b9c1b51eSKate Stone       if (!AddArguments(exe_ctx, args, struct_address, diagnostic_manager)) {
139b9c1b51eSKate Stone         diagnostic_manager.Printf(eDiagnosticSeverityError,
140b9c1b51eSKate Stone                                   "errored out in %s, couldn't AddArguments",
141579e70c9SSean Callanan                                   __FUNCTION__);
142998c8a1cSRyan Brown         return lldb::eExpressionSetupError;
143998c8a1cSRyan Brown       }
144998c8a1cSRyan Brown 
145b9c1b51eSKate Stone       lldb::ThreadPlanSP call_plan_sp(new ThreadPlanCallUserExpression(
146b9c1b51eSKate Stone           exe_ctx.GetThreadRef(), wrapper_address, args, options,
147b9c1b51eSKate Stone           shared_ptr_to_me));
148998c8a1cSRyan Brown 
149579e70c9SSean Callanan       StreamString ss;
150b9c1b51eSKate Stone       if (!call_plan_sp || !call_plan_sp->ValidatePlan(&ss)) {
151c156427dSZachary Turner         diagnostic_manager.PutString(eDiagnosticSeverityError, ss.GetString());
152998c8a1cSRyan Brown         return lldb::eExpressionSetupError;
153579e70c9SSean Callanan       }
154998c8a1cSRyan Brown 
155998c8a1cSRyan Brown       ThreadPlanCallUserExpression *user_expression_plan =
156998c8a1cSRyan Brown           static_cast<ThreadPlanCallUserExpression *>(call_plan_sp.get());
157998c8a1cSRyan Brown 
158b9c1b51eSKate Stone       lldb::addr_t function_stack_pointer =
159b9c1b51eSKate Stone           user_expression_plan->GetFunctionStackPointer();
160998c8a1cSRyan Brown 
161998c8a1cSRyan Brown       function_stack_bottom = function_stack_pointer - HostInfo::GetPageSize();
162998c8a1cSRyan Brown       function_stack_top = function_stack_pointer;
163998c8a1cSRyan Brown 
164*63e5fb76SJonas Devlieghere       LLDB_LOGF(
165*63e5fb76SJonas Devlieghere           log,
166b9c1b51eSKate Stone           "-- [UserExpression::Execute] Execution of expression begins --");
167998c8a1cSRyan Brown 
168998c8a1cSRyan Brown       if (exe_ctx.GetProcessPtr())
169998c8a1cSRyan Brown         exe_ctx.GetProcessPtr()->SetRunningUserExpression(true);
170998c8a1cSRyan Brown 
171998c8a1cSRyan Brown       lldb::ExpressionResults execution_result =
172b9c1b51eSKate Stone           exe_ctx.GetProcessRef().RunThreadPlan(exe_ctx, call_plan_sp, options,
173b9c1b51eSKate Stone                                                 diagnostic_manager);
174998c8a1cSRyan Brown 
175998c8a1cSRyan Brown       if (exe_ctx.GetProcessPtr())
176998c8a1cSRyan Brown         exe_ctx.GetProcessPtr()->SetRunningUserExpression(false);
177998c8a1cSRyan Brown 
178*63e5fb76SJonas Devlieghere       LLDB_LOGF(log, "-- [UserExpression::Execute] Execution of expression "
179b9c1b51eSKate Stone                      "completed --");
180998c8a1cSRyan Brown 
181b9c1b51eSKate Stone       if (execution_result == lldb::eExpressionInterrupted ||
182b9c1b51eSKate Stone           execution_result == lldb::eExpressionHitBreakpoint) {
183248a1305SKonrad Kleine         const char *error_desc = nullptr;
184998c8a1cSRyan Brown 
185b9c1b51eSKate Stone         if (call_plan_sp) {
186998c8a1cSRyan Brown           lldb::StopInfoSP real_stop_info_sp = call_plan_sp->GetRealStopInfo();
187998c8a1cSRyan Brown           if (real_stop_info_sp)
188998c8a1cSRyan Brown             error_desc = real_stop_info_sp->GetDescription();
189998c8a1cSRyan Brown         }
190998c8a1cSRyan Brown         if (error_desc)
191b9c1b51eSKate Stone           diagnostic_manager.Printf(eDiagnosticSeverityError,
192b9c1b51eSKate Stone                                     "Execution was interrupted, reason: %s.",
193579e70c9SSean Callanan                                     error_desc);
194998c8a1cSRyan Brown         else
195e2411fabSZachary Turner           diagnostic_manager.PutString(eDiagnosticSeverityError,
196b9c1b51eSKate Stone                                        "Execution was interrupted.");
197998c8a1cSRyan Brown 
198b9c1b51eSKate Stone         if ((execution_result == lldb::eExpressionInterrupted &&
199b9c1b51eSKate Stone              options.DoesUnwindOnError()) ||
200b9c1b51eSKate Stone             (execution_result == lldb::eExpressionHitBreakpoint &&
201b9c1b51eSKate Stone              options.DoesIgnoreBreakpoints()))
202579e70c9SSean Callanan           diagnostic_manager.AppendMessageToDiagnostic(
203b9c1b51eSKate Stone               "The process has been returned to the state before expression "
204b9c1b51eSKate Stone               "evaluation.");
205b9c1b51eSKate Stone         else {
206998c8a1cSRyan Brown           if (execution_result == lldb::eExpressionHitBreakpoint)
207998c8a1cSRyan Brown             user_expression_plan->TransferExpressionOwnership();
208579e70c9SSean Callanan           diagnostic_manager.AppendMessageToDiagnostic(
209b9c1b51eSKate Stone               "The process has been left at the point where it was "
210b9c1b51eSKate Stone               "interrupted, "
211b9c1b51eSKate Stone               "use \"thread return -x\" to return to the state before "
212b9c1b51eSKate Stone               "expression evaluation.");
213998c8a1cSRyan Brown         }
214998c8a1cSRyan Brown 
215998c8a1cSRyan Brown         return execution_result;
216b9c1b51eSKate Stone       } else if (execution_result == lldb::eExpressionStoppedForDebug) {
217e2411fabSZachary Turner         diagnostic_manager.PutString(
218579e70c9SSean Callanan             eDiagnosticSeverityRemark,
219998c8a1cSRyan Brown             "Execution was halted at the first instruction of the expression "
220998c8a1cSRyan Brown             "function because \"debug\" was requested.\n"
221b9c1b51eSKate Stone             "Use \"thread return -x\" to return to the state before expression "
222b9c1b51eSKate Stone             "evaluation.");
223998c8a1cSRyan Brown         return execution_result;
224b9c1b51eSKate Stone       } else if (execution_result != lldb::eExpressionCompleted) {
225b9c1b51eSKate Stone         diagnostic_manager.Printf(
226b9c1b51eSKate Stone             eDiagnosticSeverityError,
227b9c1b51eSKate Stone             "Couldn't execute function; result was %s",
228998c8a1cSRyan Brown             Process::ExecutionResultAsCString(execution_result));
229998c8a1cSRyan Brown         return execution_result;
230998c8a1cSRyan Brown       }
231998c8a1cSRyan Brown     }
232998c8a1cSRyan Brown 
233b9c1b51eSKate Stone     if (FinalizeJITExecution(diagnostic_manager, exe_ctx, result,
234b9c1b51eSKate Stone                              function_stack_bottom, function_stack_top)) {
235998c8a1cSRyan Brown       return lldb::eExpressionCompleted;
236b9c1b51eSKate Stone     } else {
237998c8a1cSRyan Brown       return lldb::eExpressionResultUnavailable;
238998c8a1cSRyan Brown     }
239b9c1b51eSKate Stone   } else {
240e2411fabSZachary Turner     diagnostic_manager.PutString(
241b9c1b51eSKate Stone         eDiagnosticSeverityError,
242579e70c9SSean Callanan         "Expression can't be run, because there is no JIT compiled function");
243998c8a1cSRyan Brown     return lldb::eExpressionSetupError;
244998c8a1cSRyan Brown   }
245998c8a1cSRyan Brown }
246998c8a1cSRyan Brown 
247b9c1b51eSKate Stone bool LLVMUserExpression::FinalizeJITExecution(
248b9c1b51eSKate Stone     DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
249998c8a1cSRyan Brown     lldb::ExpressionVariableSP &result, lldb::addr_t function_stack_bottom,
250b9c1b51eSKate Stone     lldb::addr_t function_stack_top) {
251998c8a1cSRyan Brown   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
252998c8a1cSRyan Brown 
253*63e5fb76SJonas Devlieghere   LLDB_LOGF(log, "-- [UserExpression::FinalizeJITExecution] Dematerializing "
254b9c1b51eSKate Stone                  "after execution --");
255998c8a1cSRyan Brown 
256b9c1b51eSKate Stone   if (!m_dematerializer_sp) {
257579e70c9SSean Callanan     diagnostic_manager.Printf(eDiagnosticSeverityError,
258b9c1b51eSKate Stone                               "Couldn't apply expression side effects : no "
259b9c1b51eSKate Stone                               "dematerializer is present");
260998c8a1cSRyan Brown     return false;
261998c8a1cSRyan Brown   }
262998c8a1cSRyan Brown 
26397206d57SZachary Turner   Status dematerialize_error;
264998c8a1cSRyan Brown 
265b9c1b51eSKate Stone   m_dematerializer_sp->Dematerialize(dematerialize_error, function_stack_bottom,
266b9c1b51eSKate Stone                                      function_stack_top);
267998c8a1cSRyan Brown 
268b9c1b51eSKate Stone   if (!dematerialize_error.Success()) {
269b9c1b51eSKate Stone     diagnostic_manager.Printf(eDiagnosticSeverityError,
270b9c1b51eSKate Stone                               "Couldn't apply expression side effects : %s",
271998c8a1cSRyan Brown                               dematerialize_error.AsCString("unknown error"));
272998c8a1cSRyan Brown     return false;
273998c8a1cSRyan Brown   }
274998c8a1cSRyan Brown 
275b9c1b51eSKate Stone   result =
276b9c1b51eSKate Stone       GetResultAfterDematerialization(exe_ctx.GetBestExecutionContextScope());
277998c8a1cSRyan Brown 
278998c8a1cSRyan Brown   if (result)
279998c8a1cSRyan Brown     result->TransferAddress();
280998c8a1cSRyan Brown 
281998c8a1cSRyan Brown   m_dematerializer_sp.reset();
282998c8a1cSRyan Brown 
283998c8a1cSRyan Brown   return true;
284998c8a1cSRyan Brown }
285998c8a1cSRyan Brown 
286b9c1b51eSKate Stone bool LLVMUserExpression::PrepareToExecuteJITExpression(
287b9c1b51eSKate Stone     DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
288b9c1b51eSKate Stone     lldb::addr_t &struct_address) {
289998c8a1cSRyan Brown   lldb::TargetSP target;
290998c8a1cSRyan Brown   lldb::ProcessSP process;
291998c8a1cSRyan Brown   lldb::StackFrameSP frame;
292998c8a1cSRyan Brown 
293b9c1b51eSKate Stone   if (!LockAndCheckContext(exe_ctx, target, process, frame)) {
294e2411fabSZachary Turner     diagnostic_manager.PutString(
295b9c1b51eSKate Stone         eDiagnosticSeverityError,
296579e70c9SSean Callanan         "The context has changed before we could JIT the expression!");
297998c8a1cSRyan Brown     return false;
298998c8a1cSRyan Brown   }
299998c8a1cSRyan Brown 
300b9c1b51eSKate Stone   if (m_jit_start_addr != LLDB_INVALID_ADDRESS || m_can_interpret) {
301b9c1b51eSKate Stone     if (m_materialized_address == LLDB_INVALID_ADDRESS) {
30297206d57SZachary Turner       Status alloc_error;
303998c8a1cSRyan Brown 
304998c8a1cSRyan Brown       IRMemoryMap::AllocationPolicy policy =
305b9c1b51eSKate Stone           m_can_interpret ? IRMemoryMap::eAllocationPolicyHostOnly
306b9c1b51eSKate Stone                           : IRMemoryMap::eAllocationPolicyMirror;
307998c8a1cSRyan Brown 
3082c381414SJim Ingham       const bool zero_memory = false;
3092c381414SJim Ingham 
310b9c1b51eSKate Stone       m_materialized_address = m_execution_unit_sp->Malloc(
311d5b44036SJonas Devlieghere           m_materializer_up->GetStructByteSize(),
312d5b44036SJonas Devlieghere           m_materializer_up->GetStructAlignment(),
313b9c1b51eSKate Stone           lldb::ePermissionsReadable | lldb::ePermissionsWritable, policy,
314b9c1b51eSKate Stone           zero_memory, alloc_error);
315998c8a1cSRyan Brown 
316b9c1b51eSKate Stone       if (!alloc_error.Success()) {
317b9c1b51eSKate Stone         diagnostic_manager.Printf(
318b9c1b51eSKate Stone             eDiagnosticSeverityError,
319579e70c9SSean Callanan             "Couldn't allocate space for materialized struct: %s",
320579e70c9SSean Callanan             alloc_error.AsCString());
321998c8a1cSRyan Brown         return false;
322998c8a1cSRyan Brown       }
323998c8a1cSRyan Brown     }
324998c8a1cSRyan Brown 
325998c8a1cSRyan Brown     struct_address = m_materialized_address;
326998c8a1cSRyan Brown 
327b9c1b51eSKate Stone     if (m_can_interpret && m_stack_frame_bottom == LLDB_INVALID_ADDRESS) {
32897206d57SZachary Turner       Status alloc_error;
329998c8a1cSRyan Brown 
330998c8a1cSRyan Brown       const size_t stack_frame_size = 512 * 1024;
331998c8a1cSRyan Brown 
3322c381414SJim Ingham       const bool zero_memory = false;
3332c381414SJim Ingham 
334b9c1b51eSKate Stone       m_stack_frame_bottom = m_execution_unit_sp->Malloc(
335b9c1b51eSKate Stone           stack_frame_size, 8,
336998c8a1cSRyan Brown           lldb::ePermissionsReadable | lldb::ePermissionsWritable,
337b9c1b51eSKate Stone           IRMemoryMap::eAllocationPolicyHostOnly, zero_memory, alloc_error);
338998c8a1cSRyan Brown 
339998c8a1cSRyan Brown       m_stack_frame_top = m_stack_frame_bottom + stack_frame_size;
340998c8a1cSRyan Brown 
341b9c1b51eSKate Stone       if (!alloc_error.Success()) {
342b9c1b51eSKate Stone         diagnostic_manager.Printf(
343b9c1b51eSKate Stone             eDiagnosticSeverityError,
344b9c1b51eSKate Stone             "Couldn't allocate space for the stack frame: %s",
345579e70c9SSean Callanan             alloc_error.AsCString());
346998c8a1cSRyan Brown         return false;
347998c8a1cSRyan Brown       }
348998c8a1cSRyan Brown     }
349998c8a1cSRyan Brown 
35097206d57SZachary Turner     Status materialize_error;
351998c8a1cSRyan Brown 
352d5b44036SJonas Devlieghere     m_dematerializer_sp = m_materializer_up->Materialize(
353b9c1b51eSKate Stone         frame, *m_execution_unit_sp, struct_address, materialize_error);
354998c8a1cSRyan Brown 
355b9c1b51eSKate Stone     if (!materialize_error.Success()) {
356b9c1b51eSKate Stone       diagnostic_manager.Printf(eDiagnosticSeverityError,
357b9c1b51eSKate Stone                                 "Couldn't materialize: %s",
358579e70c9SSean Callanan                                 materialize_error.AsCString());
359998c8a1cSRyan Brown       return false;
360998c8a1cSRyan Brown     }
361998c8a1cSRyan Brown   }
362998c8a1cSRyan Brown   return true;
363998c8a1cSRyan Brown }
364998c8a1cSRyan Brown 
365b9c1b51eSKate Stone lldb::ModuleSP LLVMUserExpression::GetJITModule() {
366998c8a1cSRyan Brown   if (m_execution_unit_sp)
367998c8a1cSRyan Brown     return m_execution_unit_sp->GetJITModule();
368998c8a1cSRyan Brown   return lldb::ModuleSP();
369998c8a1cSRyan Brown }
370