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