130fdc8d8SChris Lattner //===-- SBFunction.cpp ------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/API/SBFunction.h"
1130fdc8d8SChris Lattner #include "lldb/API/SBProcess.h"
12dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
131d273166SGreg Clayton #include "lldb/Core/Disassembler.h"
14ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
151d273166SGreg Clayton #include "lldb/Core/Module.h"
161d273166SGreg Clayton #include "lldb/Symbol/CompileUnit.h"
1730fdc8d8SChris Lattner #include "lldb/Symbol/Function.h"
1805faeb71SGreg Clayton #include "lldb/Symbol/Type.h"
191d273166SGreg Clayton #include "lldb/Target/ExecutionContext.h"
201d273166SGreg Clayton #include "lldb/Target/Target.h"
2130fdc8d8SChris Lattner 
2230fdc8d8SChris Lattner using namespace lldb;
231d273166SGreg Clayton using namespace lldb_private;
2430fdc8d8SChris Lattner 
2530fdc8d8SChris Lattner SBFunction::SBFunction () :
266611103cSGreg Clayton     m_opaque_ptr (NULL)
2730fdc8d8SChris Lattner {
2830fdc8d8SChris Lattner }
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner SBFunction::SBFunction (lldb_private::Function *lldb_object_ptr) :
316611103cSGreg Clayton     m_opaque_ptr (lldb_object_ptr)
3230fdc8d8SChris Lattner {
3330fdc8d8SChris Lattner }
3430fdc8d8SChris Lattner 
3530fdc8d8SChris Lattner SBFunction::~SBFunction ()
3630fdc8d8SChris Lattner {
376611103cSGreg Clayton     m_opaque_ptr = NULL;
3830fdc8d8SChris Lattner }
3930fdc8d8SChris Lattner 
4030fdc8d8SChris Lattner bool
4130fdc8d8SChris Lattner SBFunction::IsValid () const
4230fdc8d8SChris Lattner {
436611103cSGreg Clayton     return m_opaque_ptr != NULL;
4430fdc8d8SChris Lattner }
4530fdc8d8SChris Lattner 
4630fdc8d8SChris Lattner const char *
4730fdc8d8SChris Lattner SBFunction::GetName() const
4830fdc8d8SChris Lattner {
49*cfd1acedSGreg Clayton     const char *cstr = NULL;
506611103cSGreg Clayton     if (m_opaque_ptr)
51*cfd1acedSGreg Clayton         cstr = m_opaque_ptr->GetMangled().GetName().AsCString();
52ceb6b139SCaroline Tice 
53*cfd1acedSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
54ceb6b139SCaroline Tice     if (log)
55*cfd1acedSGreg Clayton     {
56*cfd1acedSGreg Clayton         if (cstr)
57*cfd1acedSGreg Clayton             log->Printf ("SBFunction(%p)::GetName () => \"%s\"", m_opaque_ptr, cstr);
58*cfd1acedSGreg Clayton         else
59*cfd1acedSGreg Clayton             log->Printf ("SBFunction(%p)::GetName () => NULL", m_opaque_ptr);
60*cfd1acedSGreg Clayton     }
61*cfd1acedSGreg Clayton     return cstr;
6230fdc8d8SChris Lattner }
6330fdc8d8SChris Lattner 
6430fdc8d8SChris Lattner const char *
6530fdc8d8SChris Lattner SBFunction::GetMangledName () const
6630fdc8d8SChris Lattner {
67*cfd1acedSGreg Clayton     const char *cstr = NULL;
686611103cSGreg Clayton     if (m_opaque_ptr)
69*cfd1acedSGreg Clayton         cstr = m_opaque_ptr->GetMangled().GetMangledName().AsCString();
70*cfd1acedSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
71*cfd1acedSGreg Clayton     if (log)
72*cfd1acedSGreg Clayton     {
73*cfd1acedSGreg Clayton         if (cstr)
74*cfd1acedSGreg Clayton             log->Printf ("SBFunction(%p)::GetMangledName () => \"%s\"", m_opaque_ptr, cstr);
75*cfd1acedSGreg Clayton         else
76*cfd1acedSGreg Clayton             log->Printf ("SBFunction(%p)::GetMangledName () => NULL", m_opaque_ptr);
77*cfd1acedSGreg Clayton     }
78*cfd1acedSGreg Clayton     return cstr;
7930fdc8d8SChris Lattner }
8030fdc8d8SChris Lattner 
8130fdc8d8SChris Lattner bool
8230fdc8d8SChris Lattner SBFunction::operator == (const SBFunction &rhs) const
8330fdc8d8SChris Lattner {
846611103cSGreg Clayton     return m_opaque_ptr == rhs.m_opaque_ptr;
8530fdc8d8SChris Lattner }
8630fdc8d8SChris Lattner 
8730fdc8d8SChris Lattner bool
8830fdc8d8SChris Lattner SBFunction::operator != (const SBFunction &rhs) const
8930fdc8d8SChris Lattner {
906611103cSGreg Clayton     return m_opaque_ptr != rhs.m_opaque_ptr;
9130fdc8d8SChris Lattner }
92dde9cff3SCaroline Tice 
93dde9cff3SCaroline Tice bool
9405faeb71SGreg Clayton SBFunction::GetDescription (SBStream &s)
95dde9cff3SCaroline Tice {
96dde9cff3SCaroline Tice     if (m_opaque_ptr)
97dde9cff3SCaroline Tice     {
9805faeb71SGreg Clayton         s.Printf ("SBFunction: id = 0x%8.8x, name = %s",
9905faeb71SGreg Clayton                             m_opaque_ptr->GetID(),
10005faeb71SGreg Clayton                             m_opaque_ptr->GetName().AsCString());
10105faeb71SGreg Clayton         Type *func_type = m_opaque_ptr->GetType();
10205faeb71SGreg Clayton         if (func_type)
10305faeb71SGreg Clayton             s.Printf(", type = %s", func_type->GetName().AsCString());
104dde9cff3SCaroline Tice         return true;
105dde9cff3SCaroline Tice     }
10605faeb71SGreg Clayton     s.Printf ("No value");
10705faeb71SGreg Clayton     return false;
10805faeb71SGreg Clayton }
1091d273166SGreg Clayton 
1101d273166SGreg Clayton SBInstructionList
1111d273166SGreg Clayton SBFunction::GetInstructions (SBTarget target)
1121d273166SGreg Clayton {
1131d273166SGreg Clayton     SBInstructionList sb_instructions;
1141d273166SGreg Clayton     if (m_opaque_ptr)
1151d273166SGreg Clayton     {
1161d273166SGreg Clayton         ExecutionContext exe_ctx;
1171d273166SGreg Clayton         if (target.IsValid())
1181d273166SGreg Clayton         {
1191d273166SGreg Clayton             target->CalculateExecutionContext (exe_ctx);
1201d273166SGreg Clayton             exe_ctx.process = target->GetProcessSP().get();
1211d273166SGreg Clayton         }
1221d273166SGreg Clayton         Module *module = m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModule();
1231d273166SGreg Clayton         if (module)
1241d273166SGreg Clayton         {
1251d273166SGreg Clayton             sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module->GetArchitecture(),
1261d273166SGreg Clayton                                                                              exe_ctx,
1271d273166SGreg Clayton                                                                              m_opaque_ptr->GetAddressRange()));
1281d273166SGreg Clayton         }
1291d273166SGreg Clayton     }
1301d273166SGreg Clayton     return sb_instructions;
1311d273166SGreg Clayton }
1321d273166SGreg Clayton 
133750cd175SCaroline Tice lldb_private::Function *
134750cd175SCaroline Tice SBFunction::get ()
135750cd175SCaroline Tice {
136750cd175SCaroline Tice     return m_opaque_ptr;
137750cd175SCaroline Tice }
1381d273166SGreg Clayton 
139