blob: 2ec6072b51eba620946a355ca7834a7f80b01e64 [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 Clayton1d273162010-10-06 03:09:58 +000019#include "lldb/Target/ExecutionContext.h"
20#include "lldb/Target/Target.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021
22using namespace lldb;
Greg Clayton1d273162010-10-06 03:09:58 +000023using namespace lldb_private;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024
25SBFunction::SBFunction () :
Greg Clayton66111032010-06-23 01:19:29 +000026 m_opaque_ptr (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000027{
28}
29
30SBFunction::SBFunction (lldb_private::Function *lldb_object_ptr) :
Greg Clayton66111032010-06-23 01:19:29 +000031 m_opaque_ptr (lldb_object_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032{
33}
34
Greg Claytonefabb122010-11-05 23:17:00 +000035SBFunction::SBFunction (const lldb::SBFunction &rhs) :
36 m_opaque_ptr (rhs.m_opaque_ptr)
37{
38}
39
40const SBFunction &
41SBFunction::operator = (const SBFunction &rhs)
42{
43 m_opaque_ptr = rhs.m_opaque_ptr;
44 return *this;
45}
46
Chris Lattner30fdc8d2010-06-08 16:52:24 +000047SBFunction::~SBFunction ()
48{
Greg Clayton66111032010-06-23 01:19:29 +000049 m_opaque_ptr = NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000050}
51
52bool
53SBFunction::IsValid () const
54{
Greg Clayton66111032010-06-23 01:19:29 +000055 return m_opaque_ptr != NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000056}
57
58const char *
59SBFunction::GetName() const
60{
Greg Claytoncfd1ace2010-10-31 03:01:06 +000061 const char *cstr = NULL;
Greg Clayton66111032010-06-23 01:19:29 +000062 if (m_opaque_ptr)
Greg Claytonddaf6a72015-07-08 22:32:23 +000063 cstr = m_opaque_ptr->GetName().AsCString();
Caroline Ticeceb6b132010-10-26 03:11:13 +000064
Greg Clayton5160ce52013-03-27 23:08:40 +000065 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000066 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +000067 {
68 if (cstr)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000069 log->Printf ("SBFunction(%p)::GetName () => \"%s\"",
70 static_cast<void*>(m_opaque_ptr), cstr);
Greg Claytoncfd1ace2010-10-31 03:01:06 +000071 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000072 log->Printf ("SBFunction(%p)::GetName () => NULL",
73 static_cast<void*>(m_opaque_ptr));
Greg Claytoncfd1ace2010-10-31 03:01:06 +000074 }
75 return cstr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000076}
77
78const char *
Enrico Granatac1f705c2015-07-06 18:28:46 +000079SBFunction::GetDisplayName() const
80{
81 const char *cstr = NULL;
82 if (m_opaque_ptr)
Greg Claytonddaf6a72015-07-08 22:32:23 +000083 cstr = m_opaque_ptr->GetMangled().GetDisplayDemangledName(m_opaque_ptr->GetLanguage()).AsCString();
Enrico Granatac1f705c2015-07-06 18:28:46 +000084
85 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
86 if (log)
87 {
88 if (cstr)
89 log->Printf ("SBFunction(%p)::GetDisplayName () => \"%s\"",
90 static_cast<void*>(m_opaque_ptr), cstr);
91 else
92 log->Printf ("SBFunction(%p)::GetDisplayName () => NULL",
93 static_cast<void*>(m_opaque_ptr));
94 }
95 return cstr;
96}
97
98const char *
Chris Lattner30fdc8d2010-06-08 16:52:24 +000099SBFunction::GetMangledName () const
100{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000101 const char *cstr = NULL;
Greg Clayton66111032010-06-23 01:19:29 +0000102 if (m_opaque_ptr)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000103 cstr = m_opaque_ptr->GetMangled().GetMangledName().AsCString();
Greg Clayton5160ce52013-03-27 23:08:40 +0000104 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000105 if (log)
106 {
107 if (cstr)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000108 log->Printf ("SBFunction(%p)::GetMangledName () => \"%s\"",
109 static_cast<void*>(m_opaque_ptr), cstr);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000110 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000111 log->Printf ("SBFunction(%p)::GetMangledName () => NULL",
112 static_cast<void*>(m_opaque_ptr));
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000113 }
114 return cstr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000115}
116
117bool
118SBFunction::operator == (const SBFunction &rhs) const
119{
Greg Clayton66111032010-06-23 01:19:29 +0000120 return m_opaque_ptr == rhs.m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000121}
122
123bool
124SBFunction::operator != (const SBFunction &rhs) const
125{
Greg Clayton66111032010-06-23 01:19:29 +0000126 return m_opaque_ptr != rhs.m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000127}
Caroline Ticedde9cff2010-09-20 05:20:02 +0000128
129bool
Greg Clayton05faeb72010-10-07 04:19:01 +0000130SBFunction::GetDescription (SBStream &s)
Caroline Ticedde9cff2010-09-20 05:20:02 +0000131{
132 if (m_opaque_ptr)
133 {
Daniel Malead01b2952012-11-29 21:49:15 +0000134 s.Printf ("SBFunction: id = 0x%8.8" PRIx64 ", name = %s",
Greg Clayton81c22f62011-10-19 18:09:39 +0000135 m_opaque_ptr->GetID(),
136 m_opaque_ptr->GetName().AsCString());
Greg Clayton05faeb72010-10-07 04:19:01 +0000137 Type *func_type = m_opaque_ptr->GetType();
138 if (func_type)
139 s.Printf(", type = %s", func_type->GetName().AsCString());
140 return true;
Caroline Ticedde9cff2010-09-20 05:20:02 +0000141 }
Greg Clayton05faeb72010-10-07 04:19:01 +0000142 s.Printf ("No value");
143 return false;
Caroline Ticedde9cff2010-09-20 05:20:02 +0000144}
Greg Clayton1d273162010-10-06 03:09:58 +0000145
146SBInstructionList
147SBFunction::GetInstructions (SBTarget target)
148{
Jim Ingham0f063ba2013-03-02 00:26:47 +0000149 return GetInstructions (target, NULL);
150}
151
152SBInstructionList
153SBFunction::GetInstructions (SBTarget target, const char *flavor)
154{
Greg Clayton1d273162010-10-06 03:09:58 +0000155 SBInstructionList sb_instructions;
156 if (m_opaque_ptr)
157 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000158 Mutex::Locker api_locker;
Greg Clayton1d273162010-10-06 03:09:58 +0000159 ExecutionContext exe_ctx;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000160 TargetSP target_sp (target.GetSP());
161 if (target_sp)
Greg Clayton1d273162010-10-06 03:09:58 +0000162 {
Jim Ingham10ebffa2012-05-04 23:02:50 +0000163 api_locker.Lock (target_sp->GetAPIMutex());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000164 target_sp->CalculateExecutionContext (exe_ctx);
165 exe_ctx.SetProcessSP(target_sp->GetProcessSP());
Greg Clayton1d273162010-10-06 03:09:58 +0000166 }
Greg Claytone72dfb32012-02-24 01:59:29 +0000167 ModuleSP module_sp (m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModule());
Greg Claytone1cd1be2012-01-29 20:56:30 +0000168 if (module_sp)
Greg Clayton1d273162010-10-06 03:09:58 +0000169 {
Jason Molenda6b3e6d52013-09-12 23:23:35 +0000170 const bool prefer_file_cache = false;
Greg Claytone1cd1be2012-01-29 20:56:30 +0000171 sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module_sp->GetArchitecture(),
Greg Clayton1080edbc2011-03-25 18:03:16 +0000172 NULL,
Jim Ingham0f063ba2013-03-02 00:26:47 +0000173 flavor,
Greg Clayton1d273162010-10-06 03:09:58 +0000174 exe_ctx,
Jason Molenda6b3e6d52013-09-12 23:23:35 +0000175 m_opaque_ptr->GetAddressRange(),
176 prefer_file_cache));
Greg Clayton1d273162010-10-06 03:09:58 +0000177 }
178 }
179 return sb_instructions;
180}
181
Caroline Tice750cd172010-10-26 23:49:36 +0000182lldb_private::Function *
183SBFunction::get ()
184{
185 return m_opaque_ptr;
186}
Greg Clayton1d273162010-10-06 03:09:58 +0000187
Greg Clayton72eff182010-12-14 04:58:53 +0000188void
189SBFunction::reset (lldb_private::Function *lldb_object_ptr)
190{
191 m_opaque_ptr = lldb_object_ptr;
192}
193
Greg Clayton93d00df2011-03-02 23:01:18 +0000194SBAddress
195SBFunction::GetStartAddress ()
196{
197 SBAddress addr;
198 if (m_opaque_ptr)
199 addr.SetAddress (&m_opaque_ptr->GetAddressRange().GetBaseAddress());
200 return addr;
201}
202
203SBAddress
204SBFunction::GetEndAddress ()
205{
206 SBAddress addr;
207 if (m_opaque_ptr)
208 {
209 addr_t byte_size = m_opaque_ptr->GetAddressRange().GetByteSize();
210 if (byte_size > 0)
211 {
212 addr.SetAddress (&m_opaque_ptr->GetAddressRange().GetBaseAddress());
213 addr->Slide (byte_size);
214 }
215 }
216 return addr;
217}
218
219
220uint32_t
221SBFunction::GetPrologueByteSize ()
222{
223 if (m_opaque_ptr)
224 return m_opaque_ptr->GetPrologueByteSize();
225 return 0;
226}
227
Greg Clayton5569e642012-02-06 01:44:54 +0000228SBType
229SBFunction::GetType ()
230{
231 SBType sb_type;
232 if (m_opaque_ptr)
233 {
234 Type *function_type = m_opaque_ptr->GetType();
235 if (function_type)
236 sb_type.ref().SetType (function_type->shared_from_this());
237 }
238 return sb_type;
239}
240
241SBBlock
242SBFunction::GetBlock ()
243{
244 SBBlock sb_block;
245 if (m_opaque_ptr)
246 sb_block.SetPtr (&m_opaque_ptr->GetBlock (true));
247 return sb_block;
248}
249
Enrico Granata6cd8e0c2014-11-17 23:06:20 +0000250lldb::LanguageType
251SBFunction::GetLanguage ()
252{
253 if (m_opaque_ptr)
254 {
255 if (m_opaque_ptr->GetCompileUnit())
256 return m_opaque_ptr->GetCompileUnit()->GetLanguage();
257 }
258 return lldb::eLanguageTypeUnknown;
259}
Greg Clayton5569e642012-02-06 01:44:54 +0000260
Greg Clayton93d00df2011-03-02 23:01:18 +0000261