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"
13*1d273166SGreg Clayton #include "lldb/Core/Disassembler.h"
14*1d273166SGreg Clayton #include "lldb/Core/Module.h"
15*1d273166SGreg Clayton #include "lldb/Symbol/CompileUnit.h"
1630fdc8d8SChris Lattner #include "lldb/Symbol/Function.h"
17*1d273166SGreg Clayton #include "lldb/Target/ExecutionContext.h"
18*1d273166SGreg Clayton #include "lldb/Target/Target.h"
1930fdc8d8SChris Lattner 
2030fdc8d8SChris Lattner using namespace lldb;
21*1d273166SGreg Clayton using namespace lldb_private;
2230fdc8d8SChris Lattner 
2330fdc8d8SChris Lattner SBFunction::SBFunction () :
246611103cSGreg Clayton     m_opaque_ptr (NULL)
2530fdc8d8SChris Lattner {
2630fdc8d8SChris Lattner }
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner SBFunction::SBFunction (lldb_private::Function *lldb_object_ptr) :
296611103cSGreg Clayton     m_opaque_ptr (lldb_object_ptr)
3030fdc8d8SChris Lattner {
3130fdc8d8SChris Lattner }
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner SBFunction::~SBFunction ()
3430fdc8d8SChris Lattner {
356611103cSGreg Clayton     m_opaque_ptr = NULL;
3630fdc8d8SChris Lattner }
3730fdc8d8SChris Lattner 
3830fdc8d8SChris Lattner bool
3930fdc8d8SChris Lattner SBFunction::IsValid () const
4030fdc8d8SChris Lattner {
416611103cSGreg Clayton     return m_opaque_ptr != NULL;
4230fdc8d8SChris Lattner }
4330fdc8d8SChris Lattner 
4430fdc8d8SChris Lattner const char *
4530fdc8d8SChris Lattner SBFunction::GetName() const
4630fdc8d8SChris Lattner {
476611103cSGreg Clayton     if (m_opaque_ptr)
486611103cSGreg Clayton         return m_opaque_ptr->GetMangled().GetName().AsCString();
4930fdc8d8SChris Lattner     return NULL;
5030fdc8d8SChris Lattner }
5130fdc8d8SChris Lattner 
5230fdc8d8SChris Lattner const char *
5330fdc8d8SChris Lattner SBFunction::GetMangledName () const
5430fdc8d8SChris Lattner {
556611103cSGreg Clayton     if (m_opaque_ptr)
566611103cSGreg Clayton         return m_opaque_ptr->GetMangled().GetMangledName().AsCString();
5730fdc8d8SChris Lattner     return NULL;
5830fdc8d8SChris Lattner }
5930fdc8d8SChris Lattner 
6030fdc8d8SChris Lattner bool
6130fdc8d8SChris Lattner SBFunction::operator == (const SBFunction &rhs) const
6230fdc8d8SChris Lattner {
636611103cSGreg Clayton     return m_opaque_ptr == rhs.m_opaque_ptr;
6430fdc8d8SChris Lattner }
6530fdc8d8SChris Lattner 
6630fdc8d8SChris Lattner bool
6730fdc8d8SChris Lattner SBFunction::operator != (const SBFunction &rhs) const
6830fdc8d8SChris Lattner {
696611103cSGreg Clayton     return m_opaque_ptr != rhs.m_opaque_ptr;
7030fdc8d8SChris Lattner }
71dde9cff3SCaroline Tice 
72dde9cff3SCaroline Tice bool
73dde9cff3SCaroline Tice SBFunction::GetDescription (SBStream &description)
74dde9cff3SCaroline Tice {
75dde9cff3SCaroline Tice     if (m_opaque_ptr)
76dde9cff3SCaroline Tice     {
77dac97f31SCaroline Tice         description.ref();
78dde9cff3SCaroline Tice         m_opaque_ptr->Dump (description.get(), false);
79dde9cff3SCaroline Tice     }
80dde9cff3SCaroline Tice     else
81dde9cff3SCaroline Tice         description.Printf ("No value");
82dde9cff3SCaroline Tice 
83dde9cff3SCaroline Tice     return true;
84dde9cff3SCaroline Tice }
85*1d273166SGreg Clayton 
86*1d273166SGreg Clayton SBInstructionList
87*1d273166SGreg Clayton SBFunction::GetInstructions (SBTarget target)
88*1d273166SGreg Clayton {
89*1d273166SGreg Clayton     SBInstructionList sb_instructions;
90*1d273166SGreg Clayton     if (m_opaque_ptr)
91*1d273166SGreg Clayton     {
92*1d273166SGreg Clayton         ExecutionContext exe_ctx;
93*1d273166SGreg Clayton         if (target.IsValid())
94*1d273166SGreg Clayton         {
95*1d273166SGreg Clayton             target->CalculateExecutionContext (exe_ctx);
96*1d273166SGreg Clayton             exe_ctx.process = target->GetProcessSP().get();
97*1d273166SGreg Clayton         }
98*1d273166SGreg Clayton         Module *module = m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModule();
99*1d273166SGreg Clayton         if (module)
100*1d273166SGreg Clayton         {
101*1d273166SGreg Clayton             sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module->GetArchitecture(),
102*1d273166SGreg Clayton                                                                              exe_ctx,
103*1d273166SGreg Clayton                                                                              m_opaque_ptr->GetAddressRange()));
104*1d273166SGreg Clayton         }
105*1d273166SGreg Clayton     }
106*1d273166SGreg Clayton     return sb_instructions;
107*1d273166SGreg Clayton }
108*1d273166SGreg Clayton 
109*1d273166SGreg Clayton 
110