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"
15*bb089697SAlex 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 
164998c8a1cSRyan Brown       if (log)
165b9c1b51eSKate Stone         log->Printf(
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 
178998c8a1cSRyan Brown       if (log)
179b9c1b51eSKate Stone         log->Printf("-- [UserExpression::Execute] Execution of expression "
180b9c1b51eSKate Stone                     "completed --");
181998c8a1cSRyan Brown 
182b9c1b51eSKate Stone       if (execution_result == lldb::eExpressionInterrupted ||
183b9c1b51eSKate Stone           execution_result == lldb::eExpressionHitBreakpoint) {
184248a1305SKonrad Kleine         const char *error_desc = nullptr;
185998c8a1cSRyan Brown 
186b9c1b51eSKate Stone         if (call_plan_sp) {
187998c8a1cSRyan Brown           lldb::StopInfoSP real_stop_info_sp = call_plan_sp->GetRealStopInfo();
188998c8a1cSRyan Brown           if (real_stop_info_sp)
189998c8a1cSRyan Brown             error_desc = real_stop_info_sp->GetDescription();
190998c8a1cSRyan Brown         }
191998c8a1cSRyan Brown         if (error_desc)
192b9c1b51eSKate Stone           diagnostic_manager.Printf(eDiagnosticSeverityError,
193b9c1b51eSKate Stone                                     "Execution was interrupted, reason: %s.",
194579e70c9SSean Callanan                                     error_desc);
195998c8a1cSRyan Brown         else
196e2411fabSZachary Turner           diagnostic_manager.PutString(eDiagnosticSeverityError,
197b9c1b51eSKate Stone                                        "Execution was interrupted.");
198998c8a1cSRyan Brown 
199b9c1b51eSKate Stone         if ((execution_result == lldb::eExpressionInterrupted &&
200b9c1b51eSKate Stone              options.DoesUnwindOnError()) ||
201b9c1b51eSKate Stone             (execution_result == lldb::eExpressionHitBreakpoint &&
202b9c1b51eSKate Stone              options.DoesIgnoreBreakpoints()))
203579e70c9SSean Callanan           diagnostic_manager.AppendMessageToDiagnostic(
204b9c1b51eSKate Stone               "The process has been returned to the state before expression "
205b9c1b51eSKate Stone               "evaluation.");
206b9c1b51eSKate Stone         else {
207998c8a1cSRyan Brown           if (execution_result == lldb::eExpressionHitBreakpoint)
208998c8a1cSRyan Brown             user_expression_plan->TransferExpressionOwnership();
209579e70c9SSean Callanan           diagnostic_manager.AppendMessageToDiagnostic(
210b9c1b51eSKate Stone               "The process has been left at the point where it was "
211b9c1b51eSKate Stone               "interrupted, "
212b9c1b51eSKate Stone               "use \"thread return -x\" to return to the state before "
213b9c1b51eSKate Stone               "expression evaluation.");
214998c8a1cSRyan Brown         }
215998c8a1cSRyan Brown 
216998c8a1cSRyan Brown         return execution_result;
217b9c1b51eSKate Stone       } else if (execution_result == lldb::eExpressionStoppedForDebug) {
218e2411fabSZachary Turner         diagnostic_manager.PutString(
219579e70c9SSean Callanan             eDiagnosticSeverityRemark,
220998c8a1cSRyan Brown             "Execution was halted at the first instruction of the expression "
221998c8a1cSRyan Brown             "function because \"debug\" was requested.\n"
222b9c1b51eSKate Stone             "Use \"thread return -x\" to return to the state before expression "
223b9c1b51eSKate Stone             "evaluation.");
224998c8a1cSRyan Brown         return execution_result;
225b9c1b51eSKate Stone       } else if (execution_result != lldb::eExpressionCompleted) {
226b9c1b51eSKate Stone         diagnostic_manager.Printf(
227b9c1b51eSKate Stone             eDiagnosticSeverityError,
228b9c1b51eSKate Stone             "Couldn't execute function; result was %s",
229998c8a1cSRyan Brown             Process::ExecutionResultAsCString(execution_result));
230998c8a1cSRyan Brown         return execution_result;
231998c8a1cSRyan Brown       }
232998c8a1cSRyan Brown     }
233998c8a1cSRyan Brown 
234b9c1b51eSKate Stone     if (FinalizeJITExecution(diagnostic_manager, exe_ctx, result,
235b9c1b51eSKate Stone                              function_stack_bottom, function_stack_top)) {
236998c8a1cSRyan Brown       return lldb::eExpressionCompleted;
237b9c1b51eSKate Stone     } else {
238998c8a1cSRyan Brown       return lldb::eExpressionResultUnavailable;
239998c8a1cSRyan Brown     }
240b9c1b51eSKate Stone   } else {
241e2411fabSZachary Turner     diagnostic_manager.PutString(
242b9c1b51eSKate Stone         eDiagnosticSeverityError,
243579e70c9SSean Callanan         "Expression can't be run, because there is no JIT compiled function");
244998c8a1cSRyan Brown     return lldb::eExpressionSetupError;
245998c8a1cSRyan Brown   }
246998c8a1cSRyan Brown }
247998c8a1cSRyan Brown 
248b9c1b51eSKate Stone bool LLVMUserExpression::FinalizeJITExecution(
249b9c1b51eSKate Stone     DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
250998c8a1cSRyan Brown     lldb::ExpressionVariableSP &result, lldb::addr_t function_stack_bottom,
251b9c1b51eSKate Stone     lldb::addr_t function_stack_top) {
252998c8a1cSRyan Brown   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
253998c8a1cSRyan Brown 
254998c8a1cSRyan Brown   if (log)
255b9c1b51eSKate Stone     log->Printf("-- [UserExpression::FinalizeJITExecution] Dematerializing "
256b9c1b51eSKate Stone                 "after execution --");
257998c8a1cSRyan Brown 
258b9c1b51eSKate Stone   if (!m_dematerializer_sp) {
259579e70c9SSean Callanan     diagnostic_manager.Printf(eDiagnosticSeverityError,
260b9c1b51eSKate Stone                               "Couldn't apply expression side effects : no "
261b9c1b51eSKate Stone                               "dematerializer is present");
262998c8a1cSRyan Brown     return false;
263998c8a1cSRyan Brown   }
264998c8a1cSRyan Brown 
26597206d57SZachary Turner   Status dematerialize_error;
266998c8a1cSRyan Brown 
267b9c1b51eSKate Stone   m_dematerializer_sp->Dematerialize(dematerialize_error, function_stack_bottom,
268b9c1b51eSKate Stone                                      function_stack_top);
269998c8a1cSRyan Brown 
270b9c1b51eSKate Stone   if (!dematerialize_error.Success()) {
271b9c1b51eSKate Stone     diagnostic_manager.Printf(eDiagnosticSeverityError,
272b9c1b51eSKate Stone                               "Couldn't apply expression side effects : %s",
273998c8a1cSRyan Brown                               dematerialize_error.AsCString("unknown error"));
274998c8a1cSRyan Brown     return false;
275998c8a1cSRyan Brown   }
276998c8a1cSRyan Brown 
277b9c1b51eSKate Stone   result =
278b9c1b51eSKate Stone       GetResultAfterDematerialization(exe_ctx.GetBestExecutionContextScope());
279998c8a1cSRyan Brown 
280998c8a1cSRyan Brown   if (result)
281998c8a1cSRyan Brown     result->TransferAddress();
282998c8a1cSRyan Brown 
283998c8a1cSRyan Brown   m_dematerializer_sp.reset();
284998c8a1cSRyan Brown 
285998c8a1cSRyan Brown   return true;
286998c8a1cSRyan Brown }
287998c8a1cSRyan Brown 
288b9c1b51eSKate Stone bool LLVMUserExpression::PrepareToExecuteJITExpression(
289b9c1b51eSKate Stone     DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
290b9c1b51eSKate Stone     lldb::addr_t &struct_address) {
291998c8a1cSRyan Brown   lldb::TargetSP target;
292998c8a1cSRyan Brown   lldb::ProcessSP process;
293998c8a1cSRyan Brown   lldb::StackFrameSP frame;
294998c8a1cSRyan Brown 
295b9c1b51eSKate Stone   if (!LockAndCheckContext(exe_ctx, target, process, frame)) {
296e2411fabSZachary Turner     diagnostic_manager.PutString(
297b9c1b51eSKate Stone         eDiagnosticSeverityError,
298579e70c9SSean Callanan         "The context has changed before we could JIT the expression!");
299998c8a1cSRyan Brown     return false;
300998c8a1cSRyan Brown   }
301998c8a1cSRyan Brown 
302b9c1b51eSKate Stone   if (m_jit_start_addr != LLDB_INVALID_ADDRESS || m_can_interpret) {
303b9c1b51eSKate Stone     if (m_materialized_address == LLDB_INVALID_ADDRESS) {
30497206d57SZachary Turner       Status alloc_error;
305998c8a1cSRyan Brown 
306998c8a1cSRyan Brown       IRMemoryMap::AllocationPolicy policy =
307b9c1b51eSKate Stone           m_can_interpret ? IRMemoryMap::eAllocationPolicyHostOnly
308b9c1b51eSKate Stone                           : IRMemoryMap::eAllocationPolicyMirror;
309998c8a1cSRyan Brown 
3102c381414SJim Ingham       const bool zero_memory = false;
3112c381414SJim Ingham 
312b9c1b51eSKate Stone       m_materialized_address = m_execution_unit_sp->Malloc(
313d5b44036SJonas Devlieghere           m_materializer_up->GetStructByteSize(),
314d5b44036SJonas Devlieghere           m_materializer_up->GetStructAlignment(),
315b9c1b51eSKate Stone           lldb::ePermissionsReadable | lldb::ePermissionsWritable, policy,
316b9c1b51eSKate Stone           zero_memory, alloc_error);
317998c8a1cSRyan Brown 
318b9c1b51eSKate Stone       if (!alloc_error.Success()) {
319b9c1b51eSKate Stone         diagnostic_manager.Printf(
320b9c1b51eSKate Stone             eDiagnosticSeverityError,
321579e70c9SSean Callanan             "Couldn't allocate space for materialized struct: %s",
322579e70c9SSean Callanan             alloc_error.AsCString());
323998c8a1cSRyan Brown         return false;
324998c8a1cSRyan Brown       }
325998c8a1cSRyan Brown     }
326998c8a1cSRyan Brown 
327998c8a1cSRyan Brown     struct_address = m_materialized_address;
328998c8a1cSRyan Brown 
329b9c1b51eSKate Stone     if (m_can_interpret && m_stack_frame_bottom == LLDB_INVALID_ADDRESS) {
33097206d57SZachary Turner       Status alloc_error;
331998c8a1cSRyan Brown 
332998c8a1cSRyan Brown       const size_t stack_frame_size = 512 * 1024;
333998c8a1cSRyan Brown 
3342c381414SJim Ingham       const bool zero_memory = false;
3352c381414SJim Ingham 
336b9c1b51eSKate Stone       m_stack_frame_bottom = m_execution_unit_sp->Malloc(
337b9c1b51eSKate Stone           stack_frame_size, 8,
338998c8a1cSRyan Brown           lldb::ePermissionsReadable | lldb::ePermissionsWritable,
339b9c1b51eSKate Stone           IRMemoryMap::eAllocationPolicyHostOnly, zero_memory, alloc_error);
340998c8a1cSRyan Brown 
341998c8a1cSRyan Brown       m_stack_frame_top = m_stack_frame_bottom + stack_frame_size;
342998c8a1cSRyan Brown 
343b9c1b51eSKate Stone       if (!alloc_error.Success()) {
344b9c1b51eSKate Stone         diagnostic_manager.Printf(
345b9c1b51eSKate Stone             eDiagnosticSeverityError,
346b9c1b51eSKate Stone             "Couldn't allocate space for the stack frame: %s",
347579e70c9SSean Callanan             alloc_error.AsCString());
348998c8a1cSRyan Brown         return false;
349998c8a1cSRyan Brown       }
350998c8a1cSRyan Brown     }
351998c8a1cSRyan Brown 
35297206d57SZachary Turner     Status materialize_error;
353998c8a1cSRyan Brown 
354d5b44036SJonas Devlieghere     m_dematerializer_sp = m_materializer_up->Materialize(
355b9c1b51eSKate Stone         frame, *m_execution_unit_sp, struct_address, materialize_error);
356998c8a1cSRyan Brown 
357b9c1b51eSKate Stone     if (!materialize_error.Success()) {
358b9c1b51eSKate Stone       diagnostic_manager.Printf(eDiagnosticSeverityError,
359b9c1b51eSKate Stone                                 "Couldn't materialize: %s",
360579e70c9SSean Callanan                                 materialize_error.AsCString());
361998c8a1cSRyan Brown       return false;
362998c8a1cSRyan Brown     }
363998c8a1cSRyan Brown   }
364998c8a1cSRyan Brown   return true;
365998c8a1cSRyan Brown }
366998c8a1cSRyan Brown 
367b9c1b51eSKate Stone lldb::ModuleSP LLVMUserExpression::GetJITModule() {
368998c8a1cSRyan Brown   if (m_execution_unit_sp)
369998c8a1cSRyan Brown     return m_execution_unit_sp->GetJITModule();
370998c8a1cSRyan Brown   return lldb::ModuleSP();
371998c8a1cSRyan Brown }
372