blob: 028725cbae2ce8a7857fda6d66b0fd27c0c82d9b [file] [log] [blame]
Chris Lattner24943d22010-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 Tice98f930f2010-09-20 05:20:02 +000012#include "lldb/API/SBStream.h"
Greg Clayton5c4c7462010-10-06 03:09:58 +000013#include "lldb/Core/Disassembler.h"
Caroline Tice7826c882010-10-26 03:11:13 +000014#include "lldb/Core/Log.h"
Greg Clayton5c4c7462010-10-06 03:09:58 +000015#include "lldb/Core/Module.h"
16#include "lldb/Symbol/CompileUnit.h"
Chris Lattner24943d22010-06-08 16:52:24 +000017#include "lldb/Symbol/Function.h"
Greg Claytond8c62532010-10-07 04:19:01 +000018#include "lldb/Symbol/Type.h"
Greg Clayton5c4c7462010-10-06 03:09:58 +000019#include "lldb/Target/ExecutionContext.h"
20#include "lldb/Target/Target.h"
Chris Lattner24943d22010-06-08 16:52:24 +000021
22using namespace lldb;
Greg Clayton5c4c7462010-10-06 03:09:58 +000023using namespace lldb_private;
Chris Lattner24943d22010-06-08 16:52:24 +000024
25SBFunction::SBFunction () :
Greg Clayton63094e02010-06-23 01:19:29 +000026 m_opaque_ptr (NULL)
Chris Lattner24943d22010-06-08 16:52:24 +000027{
28}
29
30SBFunction::SBFunction (lldb_private::Function *lldb_object_ptr) :
Greg Clayton63094e02010-06-23 01:19:29 +000031 m_opaque_ptr (lldb_object_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +000032{
33}
34
Greg Clayton538eb822010-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 Lattner24943d22010-06-08 16:52:24 +000047SBFunction::~SBFunction ()
48{
Greg Clayton63094e02010-06-23 01:19:29 +000049 m_opaque_ptr = NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000050}
51
52bool
53SBFunction::IsValid () const
54{
Greg Clayton63094e02010-06-23 01:19:29 +000055 return m_opaque_ptr != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000056}
57
58const char *
59SBFunction::GetName() const
60{
Greg Clayton49ce6822010-10-31 03:01:06 +000061 const char *cstr = NULL;
Greg Clayton63094e02010-06-23 01:19:29 +000062 if (m_opaque_ptr)
Greg Clayton49ce6822010-10-31 03:01:06 +000063 cstr = m_opaque_ptr->GetMangled().GetName().AsCString();
Caroline Tice7826c882010-10-26 03:11:13 +000064
Greg Claytone005f2c2010-11-06 01:53:30 +000065 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000066 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +000067 {
68 if (cstr)
69 log->Printf ("SBFunction(%p)::GetName () => \"%s\"", m_opaque_ptr, cstr);
70 else
71 log->Printf ("SBFunction(%p)::GetName () => NULL", m_opaque_ptr);
72 }
73 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +000074}
75
76const char *
77SBFunction::GetMangledName () const
78{
Greg Clayton49ce6822010-10-31 03:01:06 +000079 const char *cstr = NULL;
Greg Clayton63094e02010-06-23 01:19:29 +000080 if (m_opaque_ptr)
Greg Clayton49ce6822010-10-31 03:01:06 +000081 cstr = m_opaque_ptr->GetMangled().GetMangledName().AsCString();
Greg Claytone005f2c2010-11-06 01:53:30 +000082 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +000083 if (log)
84 {
85 if (cstr)
86 log->Printf ("SBFunction(%p)::GetMangledName () => \"%s\"", m_opaque_ptr, cstr);
87 else
88 log->Printf ("SBFunction(%p)::GetMangledName () => NULL", m_opaque_ptr);
89 }
90 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +000091}
92
93bool
94SBFunction::operator == (const SBFunction &rhs) const
95{
Greg Clayton63094e02010-06-23 01:19:29 +000096 return m_opaque_ptr == rhs.m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +000097}
98
99bool
100SBFunction::operator != (const SBFunction &rhs) const
101{
Greg Clayton63094e02010-06-23 01:19:29 +0000102 return m_opaque_ptr != rhs.m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000103}
Caroline Tice98f930f2010-09-20 05:20:02 +0000104
105bool
Greg Claytond8c62532010-10-07 04:19:01 +0000106SBFunction::GetDescription (SBStream &s)
Caroline Tice98f930f2010-09-20 05:20:02 +0000107{
108 if (m_opaque_ptr)
109 {
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000110 s.Printf ("SBFunction: id = 0x%8.8" PRIx64 ", name = %s",
Greg Clayton444e35b2011-10-19 18:09:39 +0000111 m_opaque_ptr->GetID(),
112 m_opaque_ptr->GetName().AsCString());
Greg Claytond8c62532010-10-07 04:19:01 +0000113 Type *func_type = m_opaque_ptr->GetType();
114 if (func_type)
115 s.Printf(", type = %s", func_type->GetName().AsCString());
116 return true;
Caroline Tice98f930f2010-09-20 05:20:02 +0000117 }
Greg Claytond8c62532010-10-07 04:19:01 +0000118 s.Printf ("No value");
119 return false;
Caroline Tice98f930f2010-09-20 05:20:02 +0000120}
Greg Clayton5c4c7462010-10-06 03:09:58 +0000121
122SBInstructionList
123SBFunction::GetInstructions (SBTarget target)
124{
125 SBInstructionList sb_instructions;
126 if (m_opaque_ptr)
127 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000128 Mutex::Locker api_locker;
Greg Clayton5c4c7462010-10-06 03:09:58 +0000129 ExecutionContext exe_ctx;
Greg Clayton334d33a2012-01-30 07:41:31 +0000130 TargetSP target_sp (target.GetSP());
131 if (target_sp)
Greg Clayton5c4c7462010-10-06 03:09:58 +0000132 {
Jim Ingham1b584eb2012-05-04 23:02:50 +0000133 api_locker.Lock (target_sp->GetAPIMutex());
Greg Clayton334d33a2012-01-30 07:41:31 +0000134 target_sp->CalculateExecutionContext (exe_ctx);
135 exe_ctx.SetProcessSP(target_sp->GetProcessSP());
Greg Clayton5c4c7462010-10-06 03:09:58 +0000136 }
Greg Clayton3508c382012-02-24 01:59:29 +0000137 ModuleSP module_sp (m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModule());
Greg Clayton13d24fb2012-01-29 20:56:30 +0000138 if (module_sp)
Greg Clayton5c4c7462010-10-06 03:09:58 +0000139 {
Greg Clayton13d24fb2012-01-29 20:56:30 +0000140 sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module_sp->GetArchitecture(),
Greg Clayton149731c2011-03-25 18:03:16 +0000141 NULL,
Greg Clayton5c4c7462010-10-06 03:09:58 +0000142 exe_ctx,
143 m_opaque_ptr->GetAddressRange()));
144 }
145 }
146 return sb_instructions;
147}
148
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000149lldb_private::Function *
150SBFunction::get ()
151{
152 return m_opaque_ptr;
153}
Greg Clayton5c4c7462010-10-06 03:09:58 +0000154
Greg Claytondd62d722010-12-14 04:58:53 +0000155void
156SBFunction::reset (lldb_private::Function *lldb_object_ptr)
157{
158 m_opaque_ptr = lldb_object_ptr;
159}
160
Greg Clayton89f1aa72011-03-02 23:01:18 +0000161SBAddress
162SBFunction::GetStartAddress ()
163{
164 SBAddress addr;
165 if (m_opaque_ptr)
166 addr.SetAddress (&m_opaque_ptr->GetAddressRange().GetBaseAddress());
167 return addr;
168}
169
170SBAddress
171SBFunction::GetEndAddress ()
172{
173 SBAddress addr;
174 if (m_opaque_ptr)
175 {
176 addr_t byte_size = m_opaque_ptr->GetAddressRange().GetByteSize();
177 if (byte_size > 0)
178 {
179 addr.SetAddress (&m_opaque_ptr->GetAddressRange().GetBaseAddress());
180 addr->Slide (byte_size);
181 }
182 }
183 return addr;
184}
185
186
187uint32_t
188SBFunction::GetPrologueByteSize ()
189{
190 if (m_opaque_ptr)
191 return m_opaque_ptr->GetPrologueByteSize();
192 return 0;
193}
194
Greg Clayton7dd5c512012-02-06 01:44:54 +0000195SBType
196SBFunction::GetType ()
197{
198 SBType sb_type;
199 if (m_opaque_ptr)
200 {
201 Type *function_type = m_opaque_ptr->GetType();
202 if (function_type)
203 sb_type.ref().SetType (function_type->shared_from_this());
204 }
205 return sb_type;
206}
207
208SBBlock
209SBFunction::GetBlock ()
210{
211 SBBlock sb_block;
212 if (m_opaque_ptr)
213 sb_block.SetPtr (&m_opaque_ptr->GetBlock (true));
214 return sb_block;
215}
216
217
Greg Clayton89f1aa72011-03-02 23:01:18 +0000218