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" 14*ceb6b139SCaroline 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 { 28*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE); 29*ceb6b139SCaroline Tice 30*ceb6b139SCaroline Tice if (log) 31*ceb6b139SCaroline Tice log->Printf ("SBFunction::SBFunction () ==> this = %p", this); 3230fdc8d8SChris Lattner } 3330fdc8d8SChris Lattner 3430fdc8d8SChris Lattner SBFunction::SBFunction (lldb_private::Function *lldb_object_ptr) : 356611103cSGreg Clayton m_opaque_ptr (lldb_object_ptr) 3630fdc8d8SChris Lattner { 37*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE); 38*ceb6b139SCaroline Tice 39*ceb6b139SCaroline Tice if (log) 40*ceb6b139SCaroline Tice { 41*ceb6b139SCaroline Tice SBStream sstr; 42*ceb6b139SCaroline Tice GetDescription (sstr); 43*ceb6b139SCaroline Tice log->Printf ("SBFunction::SBFunction (lldb_Private::Function *lldb_object_ptr) lldb_object_ptr = %p " 44*ceb6b139SCaroline Tice " ==> this = %p (%s)", lldb_object_ptr, this, sstr.GetData()); 45*ceb6b139SCaroline Tice } 4630fdc8d8SChris Lattner } 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner SBFunction::~SBFunction () 4930fdc8d8SChris Lattner { 506611103cSGreg Clayton m_opaque_ptr = NULL; 5130fdc8d8SChris Lattner } 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner bool 5430fdc8d8SChris Lattner SBFunction::IsValid () const 5530fdc8d8SChris Lattner { 566611103cSGreg Clayton return m_opaque_ptr != NULL; 5730fdc8d8SChris Lattner } 5830fdc8d8SChris Lattner 5930fdc8d8SChris Lattner const char * 6030fdc8d8SChris Lattner SBFunction::GetName() const 6130fdc8d8SChris Lattner { 62*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 63*ceb6b139SCaroline Tice 64*ceb6b139SCaroline Tice if (log) 65*ceb6b139SCaroline Tice log->Printf ("SBFunction::GetName ()"); 66*ceb6b139SCaroline Tice 676611103cSGreg Clayton if (m_opaque_ptr) 68*ceb6b139SCaroline Tice { 69*ceb6b139SCaroline Tice if (log) 70*ceb6b139SCaroline Tice log->Printf ("SBFunction::GetName ==> %s", m_opaque_ptr->GetMangled().GetName().AsCString()); 716611103cSGreg Clayton return m_opaque_ptr->GetMangled().GetName().AsCString(); 72*ceb6b139SCaroline Tice } 73*ceb6b139SCaroline Tice 74*ceb6b139SCaroline Tice if (log) 75*ceb6b139SCaroline Tice log->Printf ("SBFunction::GetName ==> NULL"); 7630fdc8d8SChris Lattner return NULL; 7730fdc8d8SChris Lattner } 7830fdc8d8SChris Lattner 7930fdc8d8SChris Lattner const char * 8030fdc8d8SChris Lattner SBFunction::GetMangledName () const 8130fdc8d8SChris Lattner { 826611103cSGreg Clayton if (m_opaque_ptr) 836611103cSGreg Clayton return m_opaque_ptr->GetMangled().GetMangledName().AsCString(); 8430fdc8d8SChris Lattner return NULL; 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 } 9230fdc8d8SChris Lattner 9330fdc8d8SChris Lattner bool 9430fdc8d8SChris Lattner SBFunction::operator != (const SBFunction &rhs) const 9530fdc8d8SChris Lattner { 966611103cSGreg Clayton return m_opaque_ptr != rhs.m_opaque_ptr; 9730fdc8d8SChris Lattner } 98dde9cff3SCaroline Tice 99dde9cff3SCaroline Tice bool 10005faeb71SGreg Clayton SBFunction::GetDescription (SBStream &s) 101dde9cff3SCaroline Tice { 102dde9cff3SCaroline Tice if (m_opaque_ptr) 103dde9cff3SCaroline Tice { 10405faeb71SGreg Clayton s.Printf ("SBFunction: id = 0x%8.8x, name = %s", 10505faeb71SGreg Clayton m_opaque_ptr->GetID(), 10605faeb71SGreg Clayton m_opaque_ptr->GetName().AsCString()); 10705faeb71SGreg Clayton Type *func_type = m_opaque_ptr->GetType(); 10805faeb71SGreg Clayton if (func_type) 10905faeb71SGreg Clayton s.Printf(", type = %s", func_type->GetName().AsCString()); 110dde9cff3SCaroline Tice return true; 111dde9cff3SCaroline Tice } 11205faeb71SGreg Clayton s.Printf ("No value"); 11305faeb71SGreg Clayton return false; 11405faeb71SGreg Clayton } 1151d273166SGreg Clayton 1161d273166SGreg Clayton SBInstructionList 1171d273166SGreg Clayton SBFunction::GetInstructions (SBTarget target) 1181d273166SGreg Clayton { 1191d273166SGreg Clayton SBInstructionList sb_instructions; 1201d273166SGreg Clayton if (m_opaque_ptr) 1211d273166SGreg Clayton { 1221d273166SGreg Clayton ExecutionContext exe_ctx; 1231d273166SGreg Clayton if (target.IsValid()) 1241d273166SGreg Clayton { 1251d273166SGreg Clayton target->CalculateExecutionContext (exe_ctx); 1261d273166SGreg Clayton exe_ctx.process = target->GetProcessSP().get(); 1271d273166SGreg Clayton } 1281d273166SGreg Clayton Module *module = m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModule(); 1291d273166SGreg Clayton if (module) 1301d273166SGreg Clayton { 1311d273166SGreg Clayton sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module->GetArchitecture(), 1321d273166SGreg Clayton exe_ctx, 1331d273166SGreg Clayton m_opaque_ptr->GetAddressRange())); 1341d273166SGreg Clayton } 1351d273166SGreg Clayton } 1361d273166SGreg Clayton return sb_instructions; 1371d273166SGreg Clayton } 1381d273166SGreg Clayton 1391d273166SGreg Clayton 140