ThreadPlanCallFunctionUsingABI.cpp revision 288943
1//===-- ThreadPlanCallFunctionUsingABI.cpp ------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "lldb/Target/ThreadPlanCallFunctionUsingABI.h" 11 12// C Includes 13// C++ Includes 14// Other libraries and framework includes 15 16// Project includes 17#include "lldb/Core/Address.h" 18#include "lldb/Core/Log.h" 19#include "lldb/Core/Stream.h" 20#include "lldb/Target/Process.h" 21#include "lldb/Target/RegisterContext.h" 22#include "lldb/Target/Target.h" 23#include "lldb/Target/Thread.h" 24 25using namespace lldb; 26using namespace lldb_private; 27 28//-------------------------------------------------------------------------------------------- 29// ThreadPlanCallFunctionUsingABI: Plan to call a single function using the ABI instead of JIT 30//------------------------------------------------------------------------------------------- 31ThreadPlanCallFunctionUsingABI::ThreadPlanCallFunctionUsingABI (Thread &thread, 32 const Address &function, 33 llvm::Type &prototype, 34 llvm::Type &return_type, 35 llvm::ArrayRef<ABI::CallArgument> args, 36 const EvaluateExpressionOptions &options) : 37 ThreadPlanCallFunction(thread,function,options), 38 m_return_type(return_type) 39{ 40 lldb::addr_t start_load_addr = LLDB_INVALID_ADDRESS; 41 lldb::addr_t function_load_addr = LLDB_INVALID_ADDRESS; 42 ABI *abi = nullptr; 43 44 if (!ConstructorSetup(thread, abi, start_load_addr, function_load_addr)) 45 return; 46 47 if (!abi->PrepareTrivialCall(thread, 48 m_function_sp, 49 function_load_addr, 50 start_load_addr, 51 prototype, 52 args)) 53 return; 54 55 ReportRegisterState("ABI Function call was set up. Register state was:"); 56 57 m_valid = true; 58} 59 60ThreadPlanCallFunctionUsingABI::~ThreadPlanCallFunctionUsingABI() 61{ 62 63} 64 65void 66ThreadPlanCallFunctionUsingABI::GetDescription(Stream *s, DescriptionLevel level) 67{ 68 if (level == eDescriptionLevelBrief) 69 { 70 s->Printf("Function call thread plan using ABI instead of JIT"); 71 } 72 else 73 { 74 TargetSP target_sp(m_thread.CalculateTarget()); 75 s->Printf("Thread plan to call 0x%" PRIx64" using ABI instead of JIT", m_function_addr.GetLoadAddress(target_sp.get())); 76 } 77} 78 79void 80ThreadPlanCallFunctionUsingABI::SetReturnValue() 81{ 82 ProcessSP process_sp(m_thread.GetProcess()); 83 const ABI *abi = process_sp ? process_sp->GetABI().get() : NULL; 84 85 // Ask the abi for the return value 86 if (abi) 87 { 88 const bool persistent = false; 89 m_return_valobj_sp = abi->GetReturnValueObject(m_thread, m_return_type, persistent); 90 } 91} 92