]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/llvm/tools/lldb/source/API/SBFunction.cpp
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / llvm / tools / lldb / source / API / SBFunction.cpp
1 //===-- 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"
12 #include "lldb/API/SBStream.h"
13 #include "lldb/Core/Disassembler.h"
14 #include "lldb/Core/Log.h"
15 #include "lldb/Core/Module.h"
16 #include "lldb/Symbol/CompileUnit.h"
17 #include "lldb/Symbol/Function.h"
18 #include "lldb/Symbol/Type.h"
19 #include "lldb/Target/ExecutionContext.h"
20 #include "lldb/Target/Target.h"
21
22 using namespace lldb;
23 using namespace lldb_private;
24
25 SBFunction::SBFunction () :
26     m_opaque_ptr (NULL)
27 {
28 }
29
30 SBFunction::SBFunction (lldb_private::Function *lldb_object_ptr) :
31     m_opaque_ptr (lldb_object_ptr)
32 {
33 }
34
35 SBFunction::SBFunction (const lldb::SBFunction &rhs) :
36     m_opaque_ptr (rhs.m_opaque_ptr)
37 {
38 }
39
40 const SBFunction &
41 SBFunction::operator = (const SBFunction &rhs)
42 {
43     m_opaque_ptr = rhs.m_opaque_ptr;
44     return *this;
45 }
46
47 SBFunction::~SBFunction ()
48 {
49     m_opaque_ptr = NULL;
50 }
51
52 bool
53 SBFunction::IsValid () const
54 {
55     return m_opaque_ptr != NULL;
56 }
57
58 const char *
59 SBFunction::GetName() const
60 {
61     const char *cstr = NULL;
62     if (m_opaque_ptr)
63         cstr = m_opaque_ptr->GetMangled().GetName().AsCString();
64
65     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
66     if (log)
67     {
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;
74 }
75
76 const char *
77 SBFunction::GetMangledName () const
78 {
79     const char *cstr = NULL;
80     if (m_opaque_ptr)
81         cstr = m_opaque_ptr->GetMangled().GetMangledName().AsCString();
82     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
83     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;
91 }
92
93 bool
94 SBFunction::operator == (const SBFunction &rhs) const
95 {
96     return m_opaque_ptr == rhs.m_opaque_ptr;
97 }
98
99 bool
100 SBFunction::operator != (const SBFunction &rhs) const
101 {
102     return m_opaque_ptr != rhs.m_opaque_ptr;
103 }
104
105 bool
106 SBFunction::GetDescription (SBStream &s)
107 {
108     if (m_opaque_ptr)
109     {
110         s.Printf ("SBFunction: id = 0x%8.8" PRIx64 ", name = %s",
111                   m_opaque_ptr->GetID(),
112                   m_opaque_ptr->GetName().AsCString());
113         Type *func_type = m_opaque_ptr->GetType();
114         if (func_type)
115             s.Printf(", type = %s", func_type->GetName().AsCString());
116         return true;
117     }
118     s.Printf ("No value");
119     return false;
120 }
121
122 SBInstructionList
123 SBFunction::GetInstructions (SBTarget target)
124 {
125     return GetInstructions (target, NULL);
126 }
127
128 SBInstructionList
129 SBFunction::GetInstructions (SBTarget target, const char *flavor)
130 {
131     SBInstructionList sb_instructions;
132     if (m_opaque_ptr)
133     {
134         Mutex::Locker api_locker;
135         ExecutionContext exe_ctx;
136         TargetSP target_sp (target.GetSP());
137         if (target_sp)
138         {
139             api_locker.Lock (target_sp->GetAPIMutex());
140             target_sp->CalculateExecutionContext (exe_ctx);
141             exe_ctx.SetProcessSP(target_sp->GetProcessSP());
142         }
143         ModuleSP module_sp (m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModule());
144         if (module_sp)
145         {
146             const bool prefer_file_cache = false;
147             sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module_sp->GetArchitecture(),
148                                                                              NULL,
149                                                                              flavor,
150                                                                              exe_ctx,
151                                                                              m_opaque_ptr->GetAddressRange(),
152                                                                              prefer_file_cache));
153         }
154     }
155     return sb_instructions;
156 }
157
158 lldb_private::Function *
159 SBFunction::get ()
160 {
161     return m_opaque_ptr;
162 }
163
164 void
165 SBFunction::reset (lldb_private::Function *lldb_object_ptr)
166 {
167     m_opaque_ptr = lldb_object_ptr;
168 }
169
170 SBAddress
171 SBFunction::GetStartAddress ()
172 {
173     SBAddress addr;
174     if (m_opaque_ptr)
175         addr.SetAddress (&m_opaque_ptr->GetAddressRange().GetBaseAddress());
176     return addr;
177 }
178
179 SBAddress
180 SBFunction::GetEndAddress ()
181 {
182     SBAddress addr;
183     if (m_opaque_ptr)
184     {
185         addr_t byte_size = m_opaque_ptr->GetAddressRange().GetByteSize();
186         if (byte_size > 0)
187         {
188             addr.SetAddress (&m_opaque_ptr->GetAddressRange().GetBaseAddress());
189             addr->Slide (byte_size);
190         }
191     }
192     return addr;
193 }
194
195
196 uint32_t
197 SBFunction::GetPrologueByteSize ()
198 {
199     if (m_opaque_ptr)
200         return m_opaque_ptr->GetPrologueByteSize();
201     return 0;
202 }
203
204 SBType
205 SBFunction::GetType ()
206 {
207     SBType sb_type;
208     if (m_opaque_ptr)
209     {
210         Type *function_type = m_opaque_ptr->GetType();
211         if (function_type)
212             sb_type.ref().SetType (function_type->shared_from_this());
213     }
214     return sb_type;
215 }
216
217 SBBlock
218 SBFunction::GetBlock ()
219 {
220     SBBlock sb_block;
221     if (m_opaque_ptr)
222         sb_block.SetPtr (&m_opaque_ptr->GetBlock (true));
223     return sb_block;
224 }
225
226
227