blob: b5983d763be116256e27e29aa01231d3883e0a68 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBFunction.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/API/SBFunction.h"
11#include "lldb/API/SBProcess.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000012#include "lldb/API/SBStream.h"
Greg Clayton1d273162010-10-06 03:09:58 +000013#include "lldb/Core/Disassembler.h"
Caroline Ticeceb6b132010-10-26 03:11:13 +000014#include "lldb/Core/Log.h"
Greg Clayton1d273162010-10-06 03:09:58 +000015#include "lldb/Core/Module.h"
16#include "lldb/Symbol/CompileUnit.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017#include "lldb/Symbol/Function.h"
Greg Clayton05faeb72010-10-07 04:19:01 +000018#include "lldb/Symbol/Type.h"
Greg Claytonfe689042015-11-10 17:47:04 +000019#include "lldb/Symbol/VariableList.h"
Greg Clayton1d273162010-10-06 03:09:58 +000020#include "lldb/Target/ExecutionContext.h"
21#include "lldb/Target/Target.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022
23using namespace lldb;
Greg Clayton1d273162010-10-06 03:09:58 +000024using namespace lldb_private;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000025
26SBFunction::SBFunction () :
Greg Clayton66111032010-06-23 01:19:29 +000027 m_opaque_ptr (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028{
29}
30
31SBFunction::SBFunction (lldb_private::Function *lldb_object_ptr) :
Greg Clayton66111032010-06-23 01:19:29 +000032 m_opaque_ptr (lldb_object_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033{
34}
35
Greg Claytonefabb122010-11-05 23:17:00 +000036SBFunction::SBFunction (const lldb::SBFunction &rhs) :
37 m_opaque_ptr (rhs.m_opaque_ptr)
38{
39}
40
41const SBFunction &
42SBFunction::operator = (const SBFunction &rhs)
43{
44 m_opaque_ptr = rhs.m_opaque_ptr;
45 return *this;
46}
47
Chris Lattner30fdc8d2010-06-08 16:52:24 +000048SBFunction::~SBFunction ()
49{
Greg Clayton66111032010-06-23 01:19:29 +000050 m_opaque_ptr = NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000051}
52
53bool
54SBFunction::IsValid () const
55{
Greg Clayton66111032010-06-23 01:19:29 +000056 return m_opaque_ptr != NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057}
58
59const char *
60SBFunction::GetName() const
61{
Greg Claytoncfd1ace2010-10-31 03:01:06 +000062 const char *cstr = NULL;
Greg Clayton66111032010-06-23 01:19:29 +000063 if (m_opaque_ptr)
Greg Claytonddaf6a72015-07-08 22:32:23 +000064 cstr = m_opaque_ptr->GetName().AsCString();
Caroline Ticeceb6b132010-10-26 03:11:13 +000065
Greg Clayton5160ce52013-03-27 23:08:40 +000066 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000067 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +000068 {
69 if (cstr)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000070 log->Printf ("SBFunction(%p)::GetName () => \"%s\"",
71 static_cast<void*>(m_opaque_ptr), cstr);
Greg Claytoncfd1ace2010-10-31 03:01:06 +000072 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000073 log->Printf ("SBFunction(%p)::GetName () => NULL",
74 static_cast<void*>(m_opaque_ptr));
Greg Claytoncfd1ace2010-10-31 03:01:06 +000075 }
76 return cstr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000077}
78
79const char *
Enrico Granatac1f705c2015-07-06 18:28:46 +000080SBFunction::GetDisplayName() const
81{
82 const char *cstr = NULL;
83 if (m_opaque_ptr)
Greg Claytonddaf6a72015-07-08 22:32:23 +000084 cstr = m_opaque_ptr->GetMangled().GetDisplayDemangledName(m_opaque_ptr->GetLanguage()).AsCString();
Enrico Granatac1f705c2015-07-06 18:28:46 +000085
86 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
87 if (log)
88 {
89 if (cstr)
90 log->Printf ("SBFunction(%p)::GetDisplayName () => \"%s\"",
91 static_cast<void*>(m_opaque_ptr), cstr);
92 else
93 log->Printf ("SBFunction(%p)::GetDisplayName () => NULL",
94 static_cast<void*>(m_opaque_ptr));
95 }
96 return cstr;
97}
98
99const char *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000100SBFunction::GetMangledName () const
101{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000102 const char *cstr = NULL;
Greg Clayton66111032010-06-23 01:19:29 +0000103 if (m_opaque_ptr)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000104 cstr = m_opaque_ptr->GetMangled().GetMangledName().AsCString();
Greg Clayton5160ce52013-03-27 23:08:40 +0000105 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000106 if (log)
107 {
108 if (cstr)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000109 log->Printf ("SBFunction(%p)::GetMangledName () => \"%s\"",
110 static_cast<void*>(m_opaque_ptr), cstr);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000111 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000112 log->Printf ("SBFunction(%p)::GetMangledName () => NULL",
113 static_cast<void*>(m_opaque_ptr));
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000114 }
115 return cstr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000116}
117
118bool
119SBFunction::operator == (const SBFunction &rhs) const
120{
Greg Clayton66111032010-06-23 01:19:29 +0000121 return m_opaque_ptr == rhs.m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000122}
123
124bool
125SBFunction::operator != (const SBFunction &rhs) const
126{
Greg Clayton66111032010-06-23 01:19:29 +0000127 return m_opaque_ptr != rhs.m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000128}
Caroline Ticedde9cff2010-09-20 05:20:02 +0000129
130bool
Greg Clayton05faeb72010-10-07 04:19:01 +0000131SBFunction::GetDescription (SBStream &s)
Caroline Ticedde9cff2010-09-20 05:20:02 +0000132{
133 if (m_opaque_ptr)
134 {
Daniel Malead01b2952012-11-29 21:49:15 +0000135 s.Printf ("SBFunction: id = 0x%8.8" PRIx64 ", name = %s",
Greg Clayton81c22f62011-10-19 18:09:39 +0000136 m_opaque_ptr->GetID(),
137 m_opaque_ptr->GetName().AsCString());
Greg Clayton05faeb72010-10-07 04:19:01 +0000138 Type *func_type = m_opaque_ptr->GetType();
139 if (func_type)
140 s.Printf(", type = %s", func_type->GetName().AsCString());
141 return true;
Caroline Ticedde9cff2010-09-20 05:20:02 +0000142 }
Greg Clayton05faeb72010-10-07 04:19:01 +0000143 s.Printf ("No value");
144 return false;
Caroline Ticedde9cff2010-09-20 05:20:02 +0000145}
Greg Clayton1d273162010-10-06 03:09:58 +0000146
147SBInstructionList
148SBFunction::GetInstructions (SBTarget target)
149{
Jim Ingham0f063ba2013-03-02 00:26:47 +0000150 return GetInstructions (target, NULL);
151}
152
153SBInstructionList
154SBFunction::GetInstructions (SBTarget target, const char *flavor)
155{
Greg Clayton1d273162010-10-06 03:09:58 +0000156 SBInstructionList sb_instructions;
157 if (m_opaque_ptr)
158 {
159 ExecutionContext exe_ctx;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000160 TargetSP target_sp (target.GetSP());
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000161 std::unique_lock<std::recursive_mutex> lock;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000162 if (target_sp)
Greg Clayton1d273162010-10-06 03:09:58 +0000163 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000164 lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000165 target_sp->CalculateExecutionContext (exe_ctx);
166 exe_ctx.SetProcessSP(target_sp->GetProcessSP());
Greg Clayton1d273162010-10-06 03:09:58 +0000167 }
Greg Claytone72dfb32012-02-24 01:59:29 +0000168 ModuleSP module_sp (m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModule());
Greg Claytone1cd1be2012-01-29 20:56:30 +0000169 if (module_sp)
Greg Clayton1d273162010-10-06 03:09:58 +0000170 {
Jason Molenda6b3e6d52013-09-12 23:23:35 +0000171 const bool prefer_file_cache = false;
Greg Claytone1cd1be2012-01-29 20:56:30 +0000172 sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module_sp->GetArchitecture(),
Greg Clayton1080edbc2011-03-25 18:03:16 +0000173 NULL,
Jim Ingham0f063ba2013-03-02 00:26:47 +0000174 flavor,
Greg Clayton1d273162010-10-06 03:09:58 +0000175 exe_ctx,
Jason Molenda6b3e6d52013-09-12 23:23:35 +0000176 m_opaque_ptr->GetAddressRange(),
177 prefer_file_cache));
Greg Clayton1d273162010-10-06 03:09:58 +0000178 }
179 }
180 return sb_instructions;
181}
182
Caroline Tice750cd172010-10-26 23:49:36 +0000183lldb_private::Function *
184SBFunction::get ()
185{
186 return m_opaque_ptr;
187}
Greg Clayton1d273162010-10-06 03:09:58 +0000188
Greg Clayton72eff182010-12-14 04:58:53 +0000189void
190SBFunction::reset (lldb_private::Function *lldb_object_ptr)
191{
192 m_opaque_ptr = lldb_object_ptr;
193}
194
Greg Clayton93d00df2011-03-02 23:01:18 +0000195SBAddress
196SBFunction::GetStartAddress ()
197{
198 SBAddress addr;
199 if (m_opaque_ptr)
200 addr.SetAddress (&m_opaque_ptr->GetAddressRange().GetBaseAddress());
201 return addr;
202}
203
204SBAddress
205SBFunction::GetEndAddress ()
206{
207 SBAddress addr;
208 if (m_opaque_ptr)
209 {
210 addr_t byte_size = m_opaque_ptr->GetAddressRange().GetByteSize();
211 if (byte_size > 0)
212 {
213 addr.SetAddress (&m_opaque_ptr->GetAddressRange().GetBaseAddress());
214 addr->Slide (byte_size);
215 }
216 }
217 return addr;
218}
219
Greg Claytonfe689042015-11-10 17:47:04 +0000220const char *
221SBFunction::GetArgumentName (uint32_t arg_idx)
222{
223 if (m_opaque_ptr)
224 {
225 Block &block = m_opaque_ptr->GetBlock(true);
226 VariableListSP variable_list_sp = block.GetBlockVariableList(true);
227 if (variable_list_sp)
228 {
229 VariableList arguments;
230 variable_list_sp->AppendVariablesWithScope (eValueTypeVariableArgument, arguments, true);
231 lldb::VariableSP variable_sp = arguments.GetVariableAtIndex(arg_idx);
232 if (variable_sp)
233 return variable_sp->GetName().GetCString();
234 }
235 }
236 return nullptr;
237}
Greg Clayton93d00df2011-03-02 23:01:18 +0000238
239uint32_t
240SBFunction::GetPrologueByteSize ()
241{
242 if (m_opaque_ptr)
243 return m_opaque_ptr->GetPrologueByteSize();
244 return 0;
245}
246
Greg Clayton5569e642012-02-06 01:44:54 +0000247SBType
248SBFunction::GetType ()
249{
250 SBType sb_type;
251 if (m_opaque_ptr)
252 {
253 Type *function_type = m_opaque_ptr->GetType();
254 if (function_type)
255 sb_type.ref().SetType (function_type->shared_from_this());
256 }
257 return sb_type;
258}
259
260SBBlock
261SBFunction::GetBlock ()
262{
263 SBBlock sb_block;
264 if (m_opaque_ptr)
265 sb_block.SetPtr (&m_opaque_ptr->GetBlock (true));
266 return sb_block;
267}
268
Enrico Granata6cd8e0c2014-11-17 23:06:20 +0000269lldb::LanguageType
270SBFunction::GetLanguage ()
271{
272 if (m_opaque_ptr)
273 {
274 if (m_opaque_ptr->GetCompileUnit())
275 return m_opaque_ptr->GetCompileUnit()->GetLanguage();
276 }
277 return lldb::eLanguageTypeUnknown;
278}
Greg Clayton5569e642012-02-06 01:44:54 +0000279
Jason Molenda6ab659a2015-07-29 00:42:47 +0000280bool
281SBFunction::GetIsOptimized ()
282{
283 if (m_opaque_ptr)
284 {
285 if (m_opaque_ptr->GetCompileUnit())
286 return m_opaque_ptr->GetCompileUnit()->GetIsOptimized();
287 }
288 return false;
289}