180814287SRaphael Isemann //===-- LLVMUserExpression.cpp --------------------------------------------===//
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"
21998c8a1cSRyan Brown #include "lldb/Symbol/Function.h"
22998c8a1cSRyan Brown #include "lldb/Symbol/ObjectFile.h"
23998c8a1cSRyan Brown #include "lldb/Symbol/SymbolVendor.h"
24998c8a1cSRyan Brown #include "lldb/Symbol/Type.h"
25998c8a1cSRyan Brown #include "lldb/Symbol/VariableList.h"
26998c8a1cSRyan Brown #include "lldb/Target/ExecutionContext.h"
27998c8a1cSRyan Brown #include "lldb/Target/Process.h"
28998c8a1cSRyan Brown #include "lldb/Target/StackFrame.h"
29998c8a1cSRyan Brown #include "lldb/Target/Target.h"
30998c8a1cSRyan Brown #include "lldb/Target/ThreadPlan.h"
31998c8a1cSRyan Brown #include "lldb/Target/ThreadPlanCallUserExpression.h"
32bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
33*c34698a8SPavel Labath #include "lldb/Utility/LLDBLog.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 
3952f3a2faSRaphael Isemann char LLVMUserExpression::ID;
4052f3a2faSRaphael Isemann 
LLVMUserExpression(ExecutionContextScope & exe_scope,llvm::StringRef expr,llvm::StringRef prefix,lldb::LanguageType language,ResultType desired_type,const EvaluateExpressionOptions & options)4119a63fc6SJim Ingham LLVMUserExpression::LLVMUserExpression(ExecutionContextScope &exe_scope,
42c5d7df90SZachary Turner                                        llvm::StringRef expr,
43c5d7df90SZachary Turner                                        llvm::StringRef prefix,
4419a63fc6SJim Ingham                                        lldb::LanguageType language,
4519a63fc6SJim Ingham                                        ResultType desired_type,
4652f3a2faSRaphael Isemann                                        const EvaluateExpressionOptions &options)
4752f3a2faSRaphael Isemann     : UserExpression(exe_scope, expr, prefix, language, desired_type, options),
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(),
5152f3a2faSRaphael Isemann       m_materializer_up(), m_jit_module_wp(), m_can_interpret(false),
5252f3a2faSRaphael Isemann       m_materialized_address(LLDB_INVALID_ADDRESS) {}
53998c8a1cSRyan Brown 
~LLVMUserExpression()54b9c1b51eSKate Stone LLVMUserExpression::~LLVMUserExpression() {
55b9c1b51eSKate Stone   if (m_target) {
56998c8a1cSRyan Brown     lldb::ModuleSP jit_module_sp(m_jit_module_wp.lock());
57998c8a1cSRyan Brown     if (jit_module_sp)
58998c8a1cSRyan Brown       m_target->GetImages().Remove(jit_module_sp);
59998c8a1cSRyan Brown   }
60998c8a1cSRyan Brown }
61998c8a1cSRyan Brown 
62998c8a1cSRyan Brown lldb::ExpressionResults
DoExecute(DiagnosticManager & diagnostic_manager,ExecutionContext & exe_ctx,const EvaluateExpressionOptions & options,lldb::UserExpressionSP & shared_ptr_to_me,lldb::ExpressionVariableSP & result)63b9c1b51eSKate Stone LLVMUserExpression::DoExecute(DiagnosticManager &diagnostic_manager,
64b9c1b51eSKate Stone                               ExecutionContext &exe_ctx,
65b9c1b51eSKate Stone                               const EvaluateExpressionOptions &options,
66b9c1b51eSKate Stone                               lldb::UserExpressionSP &shared_ptr_to_me,
67b9c1b51eSKate Stone                               lldb::ExpressionVariableSP &result) {
68b9c1b51eSKate Stone   // The expression log is quite verbose, and if you're just tracking the
6905097246SAdrian Prantl   // execution of the expression, it's quite convenient to have these logs come
7005097246SAdrian Prantl   // out with the STEP log as well.
71a007a6d8SPavel Labath   Log *log(GetLog(LLDBLog::Expressions | LLDBLog::Step));
72998c8a1cSRyan Brown 
733011c7ebSRaphael Isemann   if (m_jit_start_addr == LLDB_INVALID_ADDRESS && !m_can_interpret) {
743011c7ebSRaphael Isemann     diagnostic_manager.PutString(
753011c7ebSRaphael Isemann         eDiagnosticSeverityError,
763011c7ebSRaphael Isemann         "Expression can't be run, because there is no JIT compiled function");
773011c7ebSRaphael Isemann     return lldb::eExpressionSetupError;
783011c7ebSRaphael Isemann   }
793011c7ebSRaphael Isemann 
80998c8a1cSRyan Brown   lldb::addr_t struct_address = LLDB_INVALID_ADDRESS;
81998c8a1cSRyan Brown 
82b9c1b51eSKate Stone   if (!PrepareToExecuteJITExpression(diagnostic_manager, exe_ctx,
83b9c1b51eSKate Stone                                      struct_address)) {
84b9c1b51eSKate Stone     diagnostic_manager.Printf(
85b9c1b51eSKate Stone         eDiagnosticSeverityError,
86b9c1b51eSKate Stone         "errored out in %s, couldn't PrepareToExecuteJITExpression",
87b9c1b51eSKate Stone         __FUNCTION__);
88998c8a1cSRyan Brown     return lldb::eExpressionSetupError;
89998c8a1cSRyan Brown   }
90998c8a1cSRyan Brown 
91998c8a1cSRyan Brown   lldb::addr_t function_stack_bottom = LLDB_INVALID_ADDRESS;
92998c8a1cSRyan Brown   lldb::addr_t function_stack_top = LLDB_INVALID_ADDRESS;
93998c8a1cSRyan Brown 
94b9c1b51eSKate Stone   if (m_can_interpret) {
95998c8a1cSRyan Brown     llvm::Module *module = m_execution_unit_sp->GetModule();
96998c8a1cSRyan Brown     llvm::Function *function = m_execution_unit_sp->GetFunction();
97998c8a1cSRyan Brown 
98b9c1b51eSKate Stone     if (!module || !function) {
99e2411fabSZachary Turner       diagnostic_manager.PutString(
100b9c1b51eSKate Stone           eDiagnosticSeverityError,
101b9c1b51eSKate Stone           "supposed to interpret, but nothing is there");
102998c8a1cSRyan Brown       return lldb::eExpressionSetupError;
103998c8a1cSRyan Brown     }
104998c8a1cSRyan Brown 
10597206d57SZachary Turner     Status interpreter_error;
106998c8a1cSRyan Brown 
107998c8a1cSRyan Brown     std::vector<lldb::addr_t> args;
108998c8a1cSRyan Brown 
109b9c1b51eSKate Stone     if (!AddArguments(exe_ctx, args, struct_address, diagnostic_manager)) {
110b9c1b51eSKate Stone       diagnostic_manager.Printf(eDiagnosticSeverityError,
111b9c1b51eSKate Stone                                 "errored out in %s, couldn't AddArguments",
112579e70c9SSean Callanan                                 __FUNCTION__);
113998c8a1cSRyan Brown       return lldb::eExpressionSetupError;
114998c8a1cSRyan Brown     }
115998c8a1cSRyan Brown 
116998c8a1cSRyan Brown     function_stack_bottom = m_stack_frame_bottom;
117998c8a1cSRyan Brown     function_stack_top = m_stack_frame_top;
118998c8a1cSRyan Brown 
11970355aceSJonas Devlieghere     IRInterpreter::Interpret(*module, *function, args, *m_execution_unit_sp,
12070355aceSJonas Devlieghere                              interpreter_error, function_stack_bottom,
12170355aceSJonas Devlieghere                              function_stack_top, exe_ctx);
122998c8a1cSRyan Brown 
123b9c1b51eSKate Stone     if (!interpreter_error.Success()) {
124b9c1b51eSKate Stone       diagnostic_manager.Printf(eDiagnosticSeverityError,
125b9c1b51eSKate Stone                                 "supposed to interpret, but failed: %s",
126579e70c9SSean Callanan                                 interpreter_error.AsCString());
127998c8a1cSRyan Brown       return lldb::eExpressionDiscarded;
128998c8a1cSRyan Brown     }
129b9c1b51eSKate Stone   } else {
130b9c1b51eSKate Stone     if (!exe_ctx.HasThreadScope()) {
131b9c1b51eSKate Stone       diagnostic_manager.Printf(eDiagnosticSeverityError,
132b9c1b51eSKate Stone                                 "%s called with no thread selected",
133b9c1b51eSKate Stone                                 __FUNCTION__);
134998c8a1cSRyan Brown       return lldb::eExpressionSetupError;
135998c8a1cSRyan Brown     }
136998c8a1cSRyan Brown 
137dbbed971SJim Ingham     // Store away the thread ID for error reporting, in case it exits
138dbbed971SJim Ingham     // during execution:
139dbbed971SJim Ingham     lldb::tid_t expr_thread_id = exe_ctx.GetThreadRef().GetID();
140dbbed971SJim Ingham 
141998c8a1cSRyan Brown     Address wrapper_address(m_jit_start_addr);
142998c8a1cSRyan Brown 
143998c8a1cSRyan Brown     std::vector<lldb::addr_t> args;
144998c8a1cSRyan Brown 
145b9c1b51eSKate Stone     if (!AddArguments(exe_ctx, args, struct_address, diagnostic_manager)) {
146b9c1b51eSKate Stone       diagnostic_manager.Printf(eDiagnosticSeverityError,
147b9c1b51eSKate Stone                                 "errored out in %s, couldn't AddArguments",
148579e70c9SSean Callanan                                 __FUNCTION__);
149998c8a1cSRyan Brown       return lldb::eExpressionSetupError;
150998c8a1cSRyan Brown     }
151998c8a1cSRyan Brown 
152b9c1b51eSKate Stone     lldb::ThreadPlanSP call_plan_sp(new ThreadPlanCallUserExpression(
153b9c1b51eSKate Stone         exe_ctx.GetThreadRef(), wrapper_address, args, options,
154b9c1b51eSKate Stone         shared_ptr_to_me));
155998c8a1cSRyan Brown 
156579e70c9SSean Callanan     StreamString ss;
157b9c1b51eSKate Stone     if (!call_plan_sp || !call_plan_sp->ValidatePlan(&ss)) {
158c156427dSZachary Turner       diagnostic_manager.PutString(eDiagnosticSeverityError, ss.GetString());
159998c8a1cSRyan Brown       return lldb::eExpressionSetupError;
160579e70c9SSean Callanan     }
161998c8a1cSRyan Brown 
162998c8a1cSRyan Brown     ThreadPlanCallUserExpression *user_expression_plan =
163998c8a1cSRyan Brown         static_cast<ThreadPlanCallUserExpression *>(call_plan_sp.get());
164998c8a1cSRyan Brown 
165b9c1b51eSKate Stone     lldb::addr_t function_stack_pointer =
166b9c1b51eSKate Stone         user_expression_plan->GetFunctionStackPointer();
167998c8a1cSRyan Brown 
168998c8a1cSRyan Brown     function_stack_bottom = function_stack_pointer - HostInfo::GetPageSize();
169998c8a1cSRyan Brown     function_stack_top = function_stack_pointer;
170998c8a1cSRyan Brown 
1713011c7ebSRaphael Isemann     LLDB_LOGF(log,
172b9c1b51eSKate Stone               "-- [UserExpression::Execute] Execution of expression begins --");
173998c8a1cSRyan Brown 
174998c8a1cSRyan Brown     if (exe_ctx.GetProcessPtr())
175998c8a1cSRyan Brown       exe_ctx.GetProcessPtr()->SetRunningUserExpression(true);
176998c8a1cSRyan Brown 
177998c8a1cSRyan Brown     lldb::ExpressionResults execution_result =
178b9c1b51eSKate Stone         exe_ctx.GetProcessRef().RunThreadPlan(exe_ctx, call_plan_sp, options,
179b9c1b51eSKate Stone                                               diagnostic_manager);
180998c8a1cSRyan Brown 
181998c8a1cSRyan Brown     if (exe_ctx.GetProcessPtr())
182998c8a1cSRyan Brown       exe_ctx.GetProcessPtr()->SetRunningUserExpression(false);
183998c8a1cSRyan Brown 
18463e5fb76SJonas Devlieghere     LLDB_LOGF(log, "-- [UserExpression::Execute] Execution of expression "
185b9c1b51eSKate Stone                    "completed --");
186998c8a1cSRyan Brown 
187b9c1b51eSKate Stone     if (execution_result == lldb::eExpressionInterrupted ||
188b9c1b51eSKate Stone         execution_result == lldb::eExpressionHitBreakpoint) {
189248a1305SKonrad Kleine       const char *error_desc = nullptr;
190998c8a1cSRyan Brown 
1912a2464ebSDave Lee       if (user_expression_plan) {
1922a2464ebSDave Lee         if (auto real_stop_info_sp = user_expression_plan->GetRealStopInfo())
193998c8a1cSRyan Brown           error_desc = real_stop_info_sp->GetDescription();
194998c8a1cSRyan Brown       }
195998c8a1cSRyan Brown       if (error_desc)
196b9c1b51eSKate Stone         diagnostic_manager.Printf(eDiagnosticSeverityError,
197b9c1b51eSKate Stone                                   "Execution was interrupted, reason: %s.",
198579e70c9SSean Callanan                                   error_desc);
199998c8a1cSRyan Brown       else
200e2411fabSZachary Turner         diagnostic_manager.PutString(eDiagnosticSeverityError,
201b9c1b51eSKate Stone                                      "Execution was interrupted.");
202998c8a1cSRyan Brown 
203b9c1b51eSKate Stone       if ((execution_result == lldb::eExpressionInterrupted &&
204b9c1b51eSKate Stone            options.DoesUnwindOnError()) ||
205b9c1b51eSKate Stone           (execution_result == lldb::eExpressionHitBreakpoint &&
206b9c1b51eSKate Stone            options.DoesIgnoreBreakpoints()))
207579e70c9SSean Callanan         diagnostic_manager.AppendMessageToDiagnostic(
208b9c1b51eSKate Stone             "The process has been returned to the state before expression "
209b9c1b51eSKate Stone             "evaluation.");
210b9c1b51eSKate Stone       else {
211998c8a1cSRyan Brown         if (execution_result == lldb::eExpressionHitBreakpoint)
212998c8a1cSRyan Brown           user_expression_plan->TransferExpressionOwnership();
213579e70c9SSean Callanan         diagnostic_manager.AppendMessageToDiagnostic(
214b9c1b51eSKate Stone             "The process has been left at the point where it was "
215b9c1b51eSKate Stone             "interrupted, "
216b9c1b51eSKate Stone             "use \"thread return -x\" to return to the state before "
217b9c1b51eSKate Stone             "expression evaluation.");
218998c8a1cSRyan Brown       }
219998c8a1cSRyan Brown 
220998c8a1cSRyan Brown       return execution_result;
221b9c1b51eSKate Stone     } else if (execution_result == lldb::eExpressionStoppedForDebug) {
222e2411fabSZachary Turner       diagnostic_manager.PutString(
223579e70c9SSean Callanan           eDiagnosticSeverityRemark,
224998c8a1cSRyan Brown           "Execution was halted at the first instruction of the expression "
225998c8a1cSRyan Brown           "function because \"debug\" was requested.\n"
226b9c1b51eSKate Stone           "Use \"thread return -x\" to return to the state before expression "
227b9c1b51eSKate Stone           "evaluation.");
228998c8a1cSRyan Brown       return execution_result;
229dbbed971SJim Ingham     } else if (execution_result == lldb::eExpressionThreadVanished) {
230dbbed971SJim Ingham       diagnostic_manager.Printf(
231dbbed971SJim Ingham           eDiagnosticSeverityError,
232dbbed971SJim Ingham           "Couldn't complete execution; the thread "
233dbbed971SJim Ingham           "on which the expression was being run: 0x%" PRIx64
234dbbed971SJim Ingham           " exited during its execution.",
235dbbed971SJim Ingham           expr_thread_id);
236dbbed971SJim Ingham       return execution_result;
237b9c1b51eSKate Stone     } else if (execution_result != lldb::eExpressionCompleted) {
238b9c1b51eSKate Stone       diagnostic_manager.Printf(
2393011c7ebSRaphael Isemann           eDiagnosticSeverityError, "Couldn't execute function; result was %s",
240998c8a1cSRyan Brown           Process::ExecutionResultAsCString(execution_result));
241998c8a1cSRyan Brown       return execution_result;
242998c8a1cSRyan Brown     }
243998c8a1cSRyan Brown   }
244998c8a1cSRyan Brown 
245b9c1b51eSKate Stone   if (FinalizeJITExecution(diagnostic_manager, exe_ctx, result,
246b9c1b51eSKate Stone                            function_stack_bottom, function_stack_top)) {
247998c8a1cSRyan Brown     return lldb::eExpressionCompleted;
248b9c1b51eSKate Stone   } else {
249998c8a1cSRyan Brown     return lldb::eExpressionResultUnavailable;
250998c8a1cSRyan Brown   }
251998c8a1cSRyan Brown }
252998c8a1cSRyan Brown 
FinalizeJITExecution(DiagnosticManager & diagnostic_manager,ExecutionContext & exe_ctx,lldb::ExpressionVariableSP & result,lldb::addr_t function_stack_bottom,lldb::addr_t function_stack_top)253b9c1b51eSKate Stone bool LLVMUserExpression::FinalizeJITExecution(
254b9c1b51eSKate Stone     DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
255998c8a1cSRyan Brown     lldb::ExpressionVariableSP &result, lldb::addr_t function_stack_bottom,
256b9c1b51eSKate Stone     lldb::addr_t function_stack_top) {
257a007a6d8SPavel Labath   Log *log = GetLog(LLDBLog::Expressions);
258998c8a1cSRyan Brown 
25963e5fb76SJonas Devlieghere   LLDB_LOGF(log, "-- [UserExpression::FinalizeJITExecution] Dematerializing "
260b9c1b51eSKate Stone                  "after execution --");
261998c8a1cSRyan Brown 
262b9c1b51eSKate Stone   if (!m_dematerializer_sp) {
263579e70c9SSean Callanan     diagnostic_manager.Printf(eDiagnosticSeverityError,
264b9c1b51eSKate Stone                               "Couldn't apply expression side effects : no "
265b9c1b51eSKate Stone                               "dematerializer is present");
266998c8a1cSRyan Brown     return false;
267998c8a1cSRyan Brown   }
268998c8a1cSRyan Brown 
26997206d57SZachary Turner   Status dematerialize_error;
270998c8a1cSRyan Brown 
271b9c1b51eSKate Stone   m_dematerializer_sp->Dematerialize(dematerialize_error, function_stack_bottom,
272b9c1b51eSKate Stone                                      function_stack_top);
273998c8a1cSRyan Brown 
274b9c1b51eSKate Stone   if (!dematerialize_error.Success()) {
275b9c1b51eSKate Stone     diagnostic_manager.Printf(eDiagnosticSeverityError,
276b9c1b51eSKate Stone                               "Couldn't apply expression side effects : %s",
277998c8a1cSRyan Brown                               dematerialize_error.AsCString("unknown error"));
278998c8a1cSRyan Brown     return false;
279998c8a1cSRyan Brown   }
280998c8a1cSRyan Brown 
281b9c1b51eSKate Stone   result =
282b9c1b51eSKate Stone       GetResultAfterDematerialization(exe_ctx.GetBestExecutionContextScope());
283998c8a1cSRyan Brown 
284998c8a1cSRyan Brown   if (result)
285998c8a1cSRyan Brown     result->TransferAddress();
286998c8a1cSRyan Brown 
287998c8a1cSRyan Brown   m_dematerializer_sp.reset();
288998c8a1cSRyan Brown 
289998c8a1cSRyan Brown   return true;
290998c8a1cSRyan Brown }
291998c8a1cSRyan Brown 
PrepareToExecuteJITExpression(DiagnosticManager & diagnostic_manager,ExecutionContext & exe_ctx,lldb::addr_t & struct_address)292b9c1b51eSKate Stone bool LLVMUserExpression::PrepareToExecuteJITExpression(
293b9c1b51eSKate Stone     DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
294b9c1b51eSKate Stone     lldb::addr_t &struct_address) {
295998c8a1cSRyan Brown   lldb::TargetSP target;
296998c8a1cSRyan Brown   lldb::ProcessSP process;
297998c8a1cSRyan Brown   lldb::StackFrameSP frame;
298998c8a1cSRyan Brown 
299b9c1b51eSKate Stone   if (!LockAndCheckContext(exe_ctx, target, process, frame)) {
300e2411fabSZachary Turner     diagnostic_manager.PutString(
301b9c1b51eSKate Stone         eDiagnosticSeverityError,
302579e70c9SSean Callanan         "The context has changed before we could JIT the expression!");
303998c8a1cSRyan Brown     return false;
304998c8a1cSRyan Brown   }
305998c8a1cSRyan Brown 
306b9c1b51eSKate Stone   if (m_jit_start_addr != LLDB_INVALID_ADDRESS || m_can_interpret) {
307b9c1b51eSKate Stone     if (m_materialized_address == LLDB_INVALID_ADDRESS) {
30897206d57SZachary Turner       Status alloc_error;
309998c8a1cSRyan Brown 
310998c8a1cSRyan Brown       IRMemoryMap::AllocationPolicy policy =
311b9c1b51eSKate Stone           m_can_interpret ? IRMemoryMap::eAllocationPolicyHostOnly
312b9c1b51eSKate Stone                           : IRMemoryMap::eAllocationPolicyMirror;
313998c8a1cSRyan Brown 
3142c381414SJim Ingham       const bool zero_memory = false;
3152c381414SJim Ingham 
316b9c1b51eSKate Stone       m_materialized_address = m_execution_unit_sp->Malloc(
317d5b44036SJonas Devlieghere           m_materializer_up->GetStructByteSize(),
318d5b44036SJonas Devlieghere           m_materializer_up->GetStructAlignment(),
319b9c1b51eSKate Stone           lldb::ePermissionsReadable | lldb::ePermissionsWritable, policy,
320b9c1b51eSKate Stone           zero_memory, alloc_error);
321998c8a1cSRyan Brown 
322b9c1b51eSKate Stone       if (!alloc_error.Success()) {
323b9c1b51eSKate Stone         diagnostic_manager.Printf(
324b9c1b51eSKate Stone             eDiagnosticSeverityError,
325579e70c9SSean Callanan             "Couldn't allocate space for materialized struct: %s",
326579e70c9SSean Callanan             alloc_error.AsCString());
327998c8a1cSRyan Brown         return false;
328998c8a1cSRyan Brown       }
329998c8a1cSRyan Brown     }
330998c8a1cSRyan Brown 
331998c8a1cSRyan Brown     struct_address = m_materialized_address;
332998c8a1cSRyan Brown 
333b9c1b51eSKate Stone     if (m_can_interpret && m_stack_frame_bottom == LLDB_INVALID_ADDRESS) {
33497206d57SZachary Turner       Status alloc_error;
335998c8a1cSRyan Brown 
336998c8a1cSRyan Brown       const size_t stack_frame_size = 512 * 1024;
337998c8a1cSRyan Brown 
3382c381414SJim Ingham       const bool zero_memory = false;
3392c381414SJim Ingham 
340b9c1b51eSKate Stone       m_stack_frame_bottom = m_execution_unit_sp->Malloc(
341b9c1b51eSKate Stone           stack_frame_size, 8,
342998c8a1cSRyan Brown           lldb::ePermissionsReadable | lldb::ePermissionsWritable,
343b9c1b51eSKate Stone           IRMemoryMap::eAllocationPolicyHostOnly, zero_memory, alloc_error);
344998c8a1cSRyan Brown 
345998c8a1cSRyan Brown       m_stack_frame_top = m_stack_frame_bottom + stack_frame_size;
346998c8a1cSRyan Brown 
347b9c1b51eSKate Stone       if (!alloc_error.Success()) {
348b9c1b51eSKate Stone         diagnostic_manager.Printf(
349b9c1b51eSKate Stone             eDiagnosticSeverityError,
350b9c1b51eSKate Stone             "Couldn't allocate space for the stack frame: %s",
351579e70c9SSean Callanan             alloc_error.AsCString());
352998c8a1cSRyan Brown         return false;
353998c8a1cSRyan Brown       }
354998c8a1cSRyan Brown     }
355998c8a1cSRyan Brown 
35697206d57SZachary Turner     Status materialize_error;
357998c8a1cSRyan Brown 
358d5b44036SJonas Devlieghere     m_dematerializer_sp = m_materializer_up->Materialize(
359b9c1b51eSKate Stone         frame, *m_execution_unit_sp, struct_address, materialize_error);
360998c8a1cSRyan Brown 
361b9c1b51eSKate Stone     if (!materialize_error.Success()) {
362b9c1b51eSKate Stone       diagnostic_manager.Printf(eDiagnosticSeverityError,
363b9c1b51eSKate Stone                                 "Couldn't materialize: %s",
364579e70c9SSean Callanan                                 materialize_error.AsCString());
365998c8a1cSRyan Brown       return false;
366998c8a1cSRyan Brown     }
367998c8a1cSRyan Brown   }
368998c8a1cSRyan Brown   return true;
369998c8a1cSRyan Brown }
370998c8a1cSRyan Brown 
371