1 //===-- FunctionCaller.cpp ------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "lldb/Expression/FunctionCaller.h"
10 #include "lldb/Core/Module.h"
11 #include "lldb/Core/Progress.h"
12 #include "lldb/Expression/DiagnosticManager.h"
13 #include "lldb/Expression/IRExecutionUnit.h"
14 #include "lldb/Interpreter/CommandReturnObject.h"
15 #include "lldb/Symbol/Function.h"
16 #include "lldb/Symbol/Type.h"
17 #include "lldb/Target/ExecutionContext.h"
18 #include "lldb/Target/Process.h"
19 #include "lldb/Target/RegisterContext.h"
20 #include "lldb/Target/Target.h"
21 #include "lldb/Target/Thread.h"
22 #include "lldb/Target/ThreadPlan.h"
23 #include "lldb/Target/ThreadPlanCallFunction.h"
24 #include "lldb/Utility/DataExtractor.h"
25 #include "lldb/Utility/ErrorMessages.h"
26 #include "lldb/Utility/LLDBLog.h"
27 #include "lldb/Utility/Log.h"
28 #include "lldb/Utility/State.h"
29 #include "lldb/ValueObject/ValueObject.h"
30 #include "lldb/ValueObject/ValueObjectList.h"
32 using namespace lldb_private
;
34 char FunctionCaller::ID
;
36 // FunctionCaller constructor
37 FunctionCaller::FunctionCaller(ExecutionContextScope
&exe_scope
,
38 const CompilerType
&return_type
,
39 const Address
&functionAddress
,
40 const ValueList
&arg_value_list
,
42 : Expression(exe_scope
), m_execution_unit_sp(), m_parser(),
43 m_jit_module_wp(), m_name(name
? name
: "<unknown>"),
44 m_function_ptr(nullptr), m_function_addr(functionAddress
),
45 m_function_return_type(return_type
),
46 m_wrapper_function_name("__lldb_caller_function"),
47 m_wrapper_struct_name("__lldb_caller_struct"), m_wrapper_args_addrs(),
48 m_struct_valid(false), m_struct_size(0), m_return_size(0),
49 m_return_offset(0), m_arg_values(arg_value_list
), m_compiled(false),
51 m_jit_process_wp
= lldb::ProcessWP(exe_scope
.CalculateProcess());
52 // Can't make a FunctionCaller without a process.
53 assert(m_jit_process_wp
.lock());
57 FunctionCaller::~FunctionCaller() {
58 lldb::ProcessSP
process_sp(m_jit_process_wp
.lock());
60 lldb::ModuleSP
jit_module_sp(m_jit_module_wp
.lock());
62 process_sp
->GetTarget().GetImages().Remove(jit_module_sp
);
66 bool FunctionCaller::WriteFunctionWrapper(
67 ExecutionContext
&exe_ctx
, DiagnosticManager
&diagnostic_manager
) {
68 Process
*process
= exe_ctx
.GetProcessPtr();
71 diagnostic_manager
.Printf(lldb::eSeverityError
, "no process.");
75 lldb::ProcessSP
jit_process_sp(m_jit_process_wp
.lock());
77 if (process
!= jit_process_sp
.get()) {
78 diagnostic_manager
.Printf(lldb::eSeverityError
,
79 "process does not match the stored process.");
83 if (process
->GetState() != lldb::eStateStopped
) {
84 diagnostic_manager
.Printf(lldb::eSeverityError
, "process is not stopped");
89 diagnostic_manager
.Printf(lldb::eSeverityError
, "function not compiled");
96 bool can_interpret
= false; // should stay that way
98 Status
jit_error(m_parser
->PrepareForExecution(
99 m_jit_start_addr
, m_jit_end_addr
, m_execution_unit_sp
, exe_ctx
,
100 can_interpret
, eExecutionPolicyAlways
));
102 if (!jit_error
.Success()) {
103 diagnostic_manager
.Printf(lldb::eSeverityError
,
104 "Error in PrepareForExecution: %s.",
105 jit_error
.AsCString());
109 if (m_parser
->GetGenerateDebugInfo()) {
110 lldb::ModuleSP
jit_module_sp(m_execution_unit_sp
->GetJITModule());
113 ConstString
const_func_name(FunctionName());
115 jit_file
.SetFilename(const_func_name
);
116 jit_module_sp
->SetFileSpecAndObjectName(jit_file
, ConstString());
117 m_jit_module_wp
= jit_module_sp
;
118 process
->GetTarget().GetImages().Append(jit_module_sp
,
122 if (process
&& m_jit_start_addr
)
123 m_jit_process_wp
= process
->shared_from_this();
130 bool FunctionCaller::WriteFunctionArguments(
131 ExecutionContext
&exe_ctx
, lldb::addr_t
&args_addr_ref
,
132 DiagnosticManager
&diagnostic_manager
) {
133 return WriteFunctionArguments(exe_ctx
, args_addr_ref
, m_arg_values
,
137 // FIXME: Assure that the ValueList we were passed in is consistent with the one
138 // that defined this function.
140 bool FunctionCaller::WriteFunctionArguments(
141 ExecutionContext
&exe_ctx
, lldb::addr_t
&args_addr_ref
,
142 ValueList
&arg_values
, DiagnosticManager
&diagnostic_manager
) {
143 // All the information to reconstruct the struct is provided by the
145 if (!m_struct_valid
) {
146 diagnostic_manager
.PutString(lldb::eSeverityError
,
147 "Argument information was not correctly "
148 "parsed, so the function cannot be called.");
153 lldb::ExpressionResults return_value
= lldb::eExpressionSetupError
;
155 Process
*process
= exe_ctx
.GetProcessPtr();
157 if (process
== nullptr)
160 lldb::ProcessSP
jit_process_sp(m_jit_process_wp
.lock());
162 if (process
!= jit_process_sp
.get())
165 if (args_addr_ref
== LLDB_INVALID_ADDRESS
) {
166 args_addr_ref
= process
->AllocateMemory(
167 m_struct_size
, lldb::ePermissionsReadable
| lldb::ePermissionsWritable
,
169 if (args_addr_ref
== LLDB_INVALID_ADDRESS
)
171 m_wrapper_args_addrs
.push_back(args_addr_ref
);
173 // Make sure this is an address that we've already handed out.
174 if (find(m_wrapper_args_addrs
.begin(), m_wrapper_args_addrs
.end(),
175 args_addr_ref
) == m_wrapper_args_addrs
.end()) {
180 // TODO: verify fun_addr needs to be a callable address
182 m_function_addr
.GetCallableLoadAddress(exe_ctx
.GetTargetPtr()));
183 uint64_t first_offset
= m_member_offsets
[0];
184 process
->WriteScalarToMemory(args_addr_ref
+ first_offset
, fun_addr
,
185 process
->GetAddressByteSize(), error
);
187 // FIXME: We will need to extend this for Variadic functions.
191 size_t num_args
= arg_values
.GetSize();
192 if (num_args
!= m_arg_values
.GetSize()) {
193 diagnostic_manager
.Printf(
194 lldb::eSeverityError
,
195 "Wrong number of arguments - was: %" PRIu64
" should be: %" PRIu64
"",
196 (uint64_t)num_args
, (uint64_t)m_arg_values
.GetSize());
200 for (size_t i
= 0; i
< num_args
; i
++) {
201 // FIXME: We should sanity check sizes.
203 uint64_t offset
= m_member_offsets
[i
+ 1]; // Clang sizes are in bytes.
204 Value
*arg_value
= arg_values
.GetValueAtIndex(i
);
206 // FIXME: For now just do scalars:
208 // Special case: if it's a pointer, don't do anything (the ABI supports
211 if (arg_value
->GetValueType() == Value::ValueType::HostAddress
&&
212 arg_value
->GetContextType() == Value::ContextType::Invalid
&&
213 arg_value
->GetCompilerType().IsPointerType())
216 const Scalar
&arg_scalar
= arg_value
->ResolveValue(&exe_ctx
);
218 if (!process
->WriteScalarToMemory(args_addr_ref
+ offset
, arg_scalar
,
219 arg_scalar
.GetByteSize(), error
))
226 bool FunctionCaller::InsertFunction(ExecutionContext
&exe_ctx
,
227 lldb::addr_t
&args_addr_ref
,
228 DiagnosticManager
&diagnostic_manager
) {
229 // Since we might need to call allocate memory and maybe call code to make
230 // the caller, we need to be stopped.
231 Process
*process
= exe_ctx
.GetProcessPtr();
233 diagnostic_manager
.PutString(lldb::eSeverityError
, "no process");
236 if (process
->GetState() != lldb::eStateStopped
) {
237 diagnostic_manager
.PutString(lldb::eSeverityError
, "process running");
240 if (CompileFunction(exe_ctx
.GetThreadSP(), diagnostic_manager
) != 0)
242 if (!WriteFunctionWrapper(exe_ctx
, diagnostic_manager
))
244 if (!WriteFunctionArguments(exe_ctx
, args_addr_ref
, diagnostic_manager
))
247 Log
*log
= GetLog(LLDBLog::Step
);
248 LLDB_LOGF(log
, "Call Address: 0x%" PRIx64
" Struct Address: 0x%" PRIx64
".\n",
249 m_jit_start_addr
, args_addr_ref
);
254 lldb::ThreadPlanSP
FunctionCaller::GetThreadPlanToCallFunction(
255 ExecutionContext
&exe_ctx
, lldb::addr_t args_addr
,
256 const EvaluateExpressionOptions
&options
,
257 DiagnosticManager
&diagnostic_manager
) {
258 Log
*log(GetLog(LLDBLog::Expressions
| LLDBLog::Step
));
261 "-- [FunctionCaller::GetThreadPlanToCallFunction] Creating "
262 "thread plan to call function \"%s\" --",
265 // FIXME: Use the errors Stream for better error reporting.
266 Thread
*thread
= exe_ctx
.GetThreadPtr();
267 if (thread
== nullptr) {
268 diagnostic_manager
.PutString(
269 lldb::eSeverityError
, "Can't call a function without a valid thread.");
273 // Okay, now run the function:
275 Address
wrapper_address(m_jit_start_addr
);
277 lldb::addr_t args
= {args_addr
};
279 lldb::ThreadPlanSP
new_plan_sp(new ThreadPlanCallFunction(
280 *thread
, wrapper_address
, CompilerType(), args
, options
));
281 new_plan_sp
->SetIsControllingPlan(true);
282 new_plan_sp
->SetOkayToDiscard(false);
286 bool FunctionCaller::FetchFunctionResults(ExecutionContext
&exe_ctx
,
287 lldb::addr_t args_addr
,
289 // Read the return value - it is the last field in the struct:
290 // FIXME: How does clang tell us there's no return value? We need to handle
292 // FIXME: Create our ThreadPlanCallFunction with the return CompilerType, and
293 // then use GetReturnValueObject
294 // to fetch the value. That way we can fetch any values we need.
296 Log
*log(GetLog(LLDBLog::Expressions
| LLDBLog::Step
));
299 "-- [FunctionCaller::FetchFunctionResults] Fetching function "
300 "results for \"%s\"--",
303 Process
*process
= exe_ctx
.GetProcessPtr();
305 if (process
== nullptr)
308 lldb::ProcessSP
jit_process_sp(m_jit_process_wp
.lock());
310 if (process
!= jit_process_sp
.get())
314 ret_value
.GetScalar() = process
->ReadUnsignedIntegerFromMemory(
315 args_addr
+ m_return_offset
, m_return_size
, 0, error
);
320 ret_value
.SetCompilerType(m_function_return_type
);
321 ret_value
.SetValueType(Value::ValueType::Scalar
);
325 void FunctionCaller::DeallocateFunctionResults(ExecutionContext
&exe_ctx
,
326 lldb::addr_t args_addr
) {
327 std::list
<lldb::addr_t
>::iterator pos
;
328 pos
= std::find(m_wrapper_args_addrs
.begin(), m_wrapper_args_addrs
.end(),
330 if (pos
!= m_wrapper_args_addrs
.end())
331 m_wrapper_args_addrs
.erase(pos
);
333 exe_ctx
.GetProcessRef().DeallocateMemory(args_addr
);
336 lldb::ExpressionResults
FunctionCaller::ExecuteFunction(
337 ExecutionContext
&exe_ctx
, lldb::addr_t
*args_addr_ptr
,
338 const EvaluateExpressionOptions
&options
,
339 DiagnosticManager
&diagnostic_manager
, Value
&results
) {
340 lldb::ExpressionResults return_value
= lldb::eExpressionSetupError
;
343 exe_ctx
.GetTargetPtr() ? &exe_ctx
.GetTargetPtr()->GetDebugger() : nullptr;
344 Progress
progress("Calling function", FunctionName(), {}, debugger
);
346 // FunctionCaller::ExecuteFunction execution is always just to get the
347 // result. Unless explicitly asked for, ignore breakpoints and unwind on
349 const bool enable_debugging
=
350 exe_ctx
.GetTargetPtr() &&
351 exe_ctx
.GetTargetPtr()->GetDebugUtilityExpression();
352 EvaluateExpressionOptions real_options
= options
;
353 real_options
.SetDebug(false); // This halts the expression for debugging.
354 real_options
.SetGenerateDebugInfo(enable_debugging
);
355 real_options
.SetUnwindOnError(!enable_debugging
);
356 real_options
.SetIgnoreBreakpoints(!enable_debugging
);
358 lldb::addr_t args_addr
;
360 if (args_addr_ptr
!= nullptr)
361 args_addr
= *args_addr_ptr
;
363 args_addr
= LLDB_INVALID_ADDRESS
;
365 if (CompileFunction(exe_ctx
.GetThreadSP(), diagnostic_manager
) != 0)
366 return lldb::eExpressionSetupError
;
368 if (args_addr
== LLDB_INVALID_ADDRESS
) {
369 if (!InsertFunction(exe_ctx
, args_addr
, diagnostic_manager
))
370 return lldb::eExpressionSetupError
;
373 Log
*log(GetLog(LLDBLog::Expressions
| LLDBLog::Step
));
376 "== [FunctionCaller::ExecuteFunction] Executing function \"%s\" ==",
379 lldb::ThreadPlanSP call_plan_sp
= GetThreadPlanToCallFunction(
380 exe_ctx
, args_addr
, real_options
, diagnostic_manager
);
382 return lldb::eExpressionSetupError
;
384 // We need to make sure we record the fact that we are running an expression
385 // here otherwise this fact will fail to be recorded when fetching an
386 // Objective-C object description
387 if (exe_ctx
.GetProcessPtr())
388 exe_ctx
.GetProcessPtr()->SetRunningUserExpression(true);
390 return_value
= exe_ctx
.GetProcessRef().RunThreadPlan(
391 exe_ctx
, call_plan_sp
, real_options
, diagnostic_manager
);
394 if (return_value
!= lldb::eExpressionCompleted
) {
396 "== [FunctionCaller::ExecuteFunction] Execution of \"%s\" "
397 "completed abnormally: %s ==",
398 m_name
.c_str(), toString(return_value
).c_str());
401 "== [FunctionCaller::ExecuteFunction] Execution of \"%s\" "
402 "completed normally ==",
407 if (exe_ctx
.GetProcessPtr())
408 exe_ctx
.GetProcessPtr()->SetRunningUserExpression(false);
410 if (args_addr_ptr
!= nullptr)
411 *args_addr_ptr
= args_addr
;
413 if (return_value
!= lldb::eExpressionCompleted
)
416 FetchFunctionResults(exe_ctx
, args_addr
, results
);
418 if (args_addr_ptr
== nullptr)
419 DeallocateFunctionResults(exe_ctx
, args_addr
);
421 return lldb::eExpressionCompleted
;