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" 141d273166SGreg Clayton #include "lldb/Core/Module.h" 151d273166SGreg Clayton #include "lldb/Symbol/CompileUnit.h" 1630fdc8d8SChris Lattner #include "lldb/Symbol/Function.h" 17*05faeb71SGreg Clayton #include "lldb/Symbol/Type.h" 181d273166SGreg Clayton #include "lldb/Target/ExecutionContext.h" 191d273166SGreg Clayton #include "lldb/Target/Target.h" 2030fdc8d8SChris Lattner 2130fdc8d8SChris Lattner using namespace lldb; 221d273166SGreg Clayton using namespace lldb_private; 2330fdc8d8SChris Lattner 2430fdc8d8SChris Lattner SBFunction::SBFunction () : 256611103cSGreg Clayton m_opaque_ptr (NULL) 2630fdc8d8SChris Lattner { 2730fdc8d8SChris Lattner } 2830fdc8d8SChris Lattner 2930fdc8d8SChris Lattner SBFunction::SBFunction (lldb_private::Function *lldb_object_ptr) : 306611103cSGreg Clayton m_opaque_ptr (lldb_object_ptr) 3130fdc8d8SChris Lattner { 3230fdc8d8SChris Lattner } 3330fdc8d8SChris Lattner 3430fdc8d8SChris Lattner SBFunction::~SBFunction () 3530fdc8d8SChris Lattner { 366611103cSGreg Clayton m_opaque_ptr = NULL; 3730fdc8d8SChris Lattner } 3830fdc8d8SChris Lattner 3930fdc8d8SChris Lattner bool 4030fdc8d8SChris Lattner SBFunction::IsValid () const 4130fdc8d8SChris Lattner { 426611103cSGreg Clayton return m_opaque_ptr != NULL; 4330fdc8d8SChris Lattner } 4430fdc8d8SChris Lattner 4530fdc8d8SChris Lattner const char * 4630fdc8d8SChris Lattner SBFunction::GetName() const 4730fdc8d8SChris Lattner { 486611103cSGreg Clayton if (m_opaque_ptr) 496611103cSGreg Clayton return m_opaque_ptr->GetMangled().GetName().AsCString(); 5030fdc8d8SChris Lattner return NULL; 5130fdc8d8SChris Lattner } 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner const char * 5430fdc8d8SChris Lattner SBFunction::GetMangledName () const 5530fdc8d8SChris Lattner { 566611103cSGreg Clayton if (m_opaque_ptr) 576611103cSGreg Clayton return m_opaque_ptr->GetMangled().GetMangledName().AsCString(); 5830fdc8d8SChris Lattner return NULL; 5930fdc8d8SChris Lattner } 6030fdc8d8SChris Lattner 6130fdc8d8SChris Lattner bool 6230fdc8d8SChris Lattner SBFunction::operator == (const SBFunction &rhs) const 6330fdc8d8SChris Lattner { 646611103cSGreg Clayton return m_opaque_ptr == rhs.m_opaque_ptr; 6530fdc8d8SChris Lattner } 6630fdc8d8SChris Lattner 6730fdc8d8SChris Lattner bool 6830fdc8d8SChris Lattner SBFunction::operator != (const SBFunction &rhs) const 6930fdc8d8SChris Lattner { 706611103cSGreg Clayton return m_opaque_ptr != rhs.m_opaque_ptr; 7130fdc8d8SChris Lattner } 72dde9cff3SCaroline Tice 73dde9cff3SCaroline Tice bool 74*05faeb71SGreg Clayton SBFunction::GetDescription (SBStream &s) 75dde9cff3SCaroline Tice { 76dde9cff3SCaroline Tice if (m_opaque_ptr) 77dde9cff3SCaroline Tice { 78*05faeb71SGreg Clayton s.Printf ("SBFunction: id = 0x%8.8x, name = %s", 79*05faeb71SGreg Clayton m_opaque_ptr->GetID(), 80*05faeb71SGreg Clayton m_opaque_ptr->GetName().AsCString()); 81*05faeb71SGreg Clayton Type *func_type = m_opaque_ptr->GetType(); 82*05faeb71SGreg Clayton if (func_type) 83*05faeb71SGreg Clayton s.Printf(", type = %s", func_type->GetName().AsCString()); 84dde9cff3SCaroline Tice return true; 85dde9cff3SCaroline Tice } 86*05faeb71SGreg Clayton s.Printf ("No value"); 87*05faeb71SGreg Clayton return false; 88*05faeb71SGreg Clayton } 891d273166SGreg Clayton 901d273166SGreg Clayton SBInstructionList 911d273166SGreg Clayton SBFunction::GetInstructions (SBTarget target) 921d273166SGreg Clayton { 931d273166SGreg Clayton SBInstructionList sb_instructions; 941d273166SGreg Clayton if (m_opaque_ptr) 951d273166SGreg Clayton { 961d273166SGreg Clayton ExecutionContext exe_ctx; 971d273166SGreg Clayton if (target.IsValid()) 981d273166SGreg Clayton { 991d273166SGreg Clayton target->CalculateExecutionContext (exe_ctx); 1001d273166SGreg Clayton exe_ctx.process = target->GetProcessSP().get(); 1011d273166SGreg Clayton } 1021d273166SGreg Clayton Module *module = m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModule(); 1031d273166SGreg Clayton if (module) 1041d273166SGreg Clayton { 1051d273166SGreg Clayton sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module->GetArchitecture(), 1061d273166SGreg Clayton exe_ctx, 1071d273166SGreg Clayton m_opaque_ptr->GetAddressRange())); 1081d273166SGreg Clayton } 1091d273166SGreg Clayton } 1101d273166SGreg Clayton return sb_instructions; 1111d273166SGreg Clayton } 1121d273166SGreg Clayton 1131d273166SGreg Clayton 114