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 { 33*750cd175SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 34ceb6b139SCaroline Tice 35ceb6b139SCaroline Tice if (log) 36ceb6b139SCaroline Tice { 37ceb6b139SCaroline Tice SBStream sstr; 38ceb6b139SCaroline Tice GetDescription (sstr); 39*750cd175SCaroline Tice log->Printf ("SBFunction::SBFunction (lldb_object_ptr=%p) => this.obj = %p ('%s')", lldb_object_ptr, 40*750cd175SCaroline Tice m_opaque_ptr, sstr.GetData()); 41*750cd175SCaroline Tice 42ceb6b139SCaroline Tice } 4330fdc8d8SChris Lattner } 4430fdc8d8SChris Lattner 4530fdc8d8SChris Lattner SBFunction::~SBFunction () 4630fdc8d8SChris Lattner { 476611103cSGreg Clayton m_opaque_ptr = NULL; 4830fdc8d8SChris Lattner } 4930fdc8d8SChris Lattner 5030fdc8d8SChris Lattner bool 5130fdc8d8SChris Lattner SBFunction::IsValid () const 5230fdc8d8SChris Lattner { 536611103cSGreg Clayton return m_opaque_ptr != NULL; 5430fdc8d8SChris Lattner } 5530fdc8d8SChris Lattner 5630fdc8d8SChris Lattner const char * 5730fdc8d8SChris Lattner SBFunction::GetName() const 5830fdc8d8SChris Lattner { 59ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 60ceb6b139SCaroline Tice 61*750cd175SCaroline Tice //if (log) 62*750cd175SCaroline Tice // log->Printf ("SBFunction::GetName ()"); 63ceb6b139SCaroline Tice 646611103cSGreg Clayton if (m_opaque_ptr) 65ceb6b139SCaroline Tice { 66ceb6b139SCaroline Tice if (log) 67*750cd175SCaroline Tice log->Printf ("SBFunction::GetName (this.obj=%p) => '%s'", m_opaque_ptr, 68*750cd175SCaroline Tice m_opaque_ptr->GetMangled().GetName().AsCString()); 696611103cSGreg Clayton return m_opaque_ptr->GetMangled().GetName().AsCString(); 70ceb6b139SCaroline Tice } 71ceb6b139SCaroline Tice 72ceb6b139SCaroline Tice if (log) 73*750cd175SCaroline Tice log->Printf ("SBFunction::GetName (this.obj=%p) => NULL", m_opaque_ptr); 7430fdc8d8SChris Lattner return NULL; 7530fdc8d8SChris Lattner } 7630fdc8d8SChris Lattner 7730fdc8d8SChris Lattner const char * 7830fdc8d8SChris Lattner SBFunction::GetMangledName () const 7930fdc8d8SChris Lattner { 806611103cSGreg Clayton if (m_opaque_ptr) 816611103cSGreg Clayton return m_opaque_ptr->GetMangled().GetMangledName().AsCString(); 8230fdc8d8SChris Lattner return NULL; 8330fdc8d8SChris Lattner } 8430fdc8d8SChris Lattner 8530fdc8d8SChris Lattner bool 8630fdc8d8SChris Lattner SBFunction::operator == (const SBFunction &rhs) const 8730fdc8d8SChris Lattner { 886611103cSGreg Clayton return m_opaque_ptr == rhs.m_opaque_ptr; 8930fdc8d8SChris Lattner } 9030fdc8d8SChris Lattner 9130fdc8d8SChris Lattner bool 9230fdc8d8SChris Lattner SBFunction::operator != (const SBFunction &rhs) const 9330fdc8d8SChris Lattner { 946611103cSGreg Clayton return m_opaque_ptr != rhs.m_opaque_ptr; 9530fdc8d8SChris Lattner } 96dde9cff3SCaroline Tice 97dde9cff3SCaroline Tice bool 9805faeb71SGreg Clayton SBFunction::GetDescription (SBStream &s) 99dde9cff3SCaroline Tice { 100dde9cff3SCaroline Tice if (m_opaque_ptr) 101dde9cff3SCaroline Tice { 10205faeb71SGreg Clayton s.Printf ("SBFunction: id = 0x%8.8x, name = %s", 10305faeb71SGreg Clayton m_opaque_ptr->GetID(), 10405faeb71SGreg Clayton m_opaque_ptr->GetName().AsCString()); 10505faeb71SGreg Clayton Type *func_type = m_opaque_ptr->GetType(); 10605faeb71SGreg Clayton if (func_type) 10705faeb71SGreg Clayton s.Printf(", type = %s", func_type->GetName().AsCString()); 108dde9cff3SCaroline Tice return true; 109dde9cff3SCaroline Tice } 11005faeb71SGreg Clayton s.Printf ("No value"); 11105faeb71SGreg Clayton return false; 11205faeb71SGreg Clayton } 1131d273166SGreg Clayton 1141d273166SGreg Clayton SBInstructionList 1151d273166SGreg Clayton SBFunction::GetInstructions (SBTarget target) 1161d273166SGreg Clayton { 1171d273166SGreg Clayton SBInstructionList sb_instructions; 1181d273166SGreg Clayton if (m_opaque_ptr) 1191d273166SGreg Clayton { 1201d273166SGreg Clayton ExecutionContext exe_ctx; 1211d273166SGreg Clayton if (target.IsValid()) 1221d273166SGreg Clayton { 1231d273166SGreg Clayton target->CalculateExecutionContext (exe_ctx); 1241d273166SGreg Clayton exe_ctx.process = target->GetProcessSP().get(); 1251d273166SGreg Clayton } 1261d273166SGreg Clayton Module *module = m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModule(); 1271d273166SGreg Clayton if (module) 1281d273166SGreg Clayton { 1291d273166SGreg Clayton sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module->GetArchitecture(), 1301d273166SGreg Clayton exe_ctx, 1311d273166SGreg Clayton m_opaque_ptr->GetAddressRange())); 1321d273166SGreg Clayton } 1331d273166SGreg Clayton } 1341d273166SGreg Clayton return sb_instructions; 1351d273166SGreg Clayton } 1361d273166SGreg Clayton 137*750cd175SCaroline Tice lldb_private::Function * 138*750cd175SCaroline Tice SBFunction::get () 139*750cd175SCaroline Tice { 140*750cd175SCaroline Tice return m_opaque_ptr; 141*750cd175SCaroline Tice } 1421d273166SGreg Clayton 143