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