130fdc8d8SChris Lattner //===-- SBModule.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/SBModule.h" 1109960031SGreg Clayton #include "lldb/API/SBAddress.h" 1209960031SGreg Clayton #include "lldb/API/SBFileSpec.h" 1330fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h" 14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 1530fdc8d8SChris Lattner #include "lldb/Core/Module.h" 16ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 1738adbbb8SGreg Clayton #include "lldb/Core/StreamString.h" 1830fdc8d8SChris Lattner 1930fdc8d8SChris Lattner using namespace lldb; 20ceb6b139SCaroline Tice using namespace lldb_private; 2130fdc8d8SChris Lattner 2230fdc8d8SChris Lattner 2330fdc8d8SChris Lattner SBModule::SBModule () : 246611103cSGreg Clayton m_opaque_sp () 2530fdc8d8SChris Lattner { 2630fdc8d8SChris Lattner } 2730fdc8d8SChris Lattner 2830fdc8d8SChris Lattner SBModule::SBModule (const lldb::ModuleSP& module_sp) : 296611103cSGreg Clayton m_opaque_sp (module_sp) 3030fdc8d8SChris Lattner { 3130fdc8d8SChris Lattner } 3230fdc8d8SChris Lattner 33efabb123SGreg Clayton SBModule::SBModule(const SBModule &rhs) : 34efabb123SGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 35efabb123SGreg Clayton { 36efabb123SGreg Clayton } 37efabb123SGreg Clayton 38efabb123SGreg Clayton const SBModule & 39efabb123SGreg Clayton SBModule::operator = (const SBModule &rhs) 40efabb123SGreg Clayton { 41efabb123SGreg Clayton if (this != &rhs) 42efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 43efabb123SGreg Clayton return *this; 44efabb123SGreg Clayton } 45efabb123SGreg Clayton 4630fdc8d8SChris Lattner SBModule::~SBModule () 4730fdc8d8SChris Lattner { 4830fdc8d8SChris Lattner } 4930fdc8d8SChris Lattner 5030fdc8d8SChris Lattner bool 5130fdc8d8SChris Lattner SBModule::IsValid () const 5230fdc8d8SChris Lattner { 536611103cSGreg Clayton return m_opaque_sp.get() != NULL; 5430fdc8d8SChris Lattner } 5530fdc8d8SChris Lattner 5630fdc8d8SChris Lattner SBFileSpec 5730fdc8d8SChris Lattner SBModule::GetFileSpec () const 5830fdc8d8SChris Lattner { 592d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 60ceb6b139SCaroline Tice 6130fdc8d8SChris Lattner SBFileSpec file_spec; 626611103cSGreg Clayton if (m_opaque_sp) 636611103cSGreg Clayton file_spec.SetFileSpec(m_opaque_sp->GetFileSpec()); 64ceb6b139SCaroline Tice 65ceb6b139SCaroline Tice if (log) 66ceb6b139SCaroline Tice { 67cfd1acedSGreg Clayton log->Printf ("SBModule(%p)::GetFileSpec () => SBFileSpec(%p)", 68cfd1acedSGreg Clayton m_opaque_sp.get(), file_spec.get()); 69ceb6b139SCaroline Tice } 70ceb6b139SCaroline Tice 7130fdc8d8SChris Lattner return file_spec; 7230fdc8d8SChris Lattner } 7330fdc8d8SChris Lattner 74*2289fa48SGreg Clayton lldb::SBFileSpec 75*2289fa48SGreg Clayton SBModule::GetPlatformFileSpec () const 76*2289fa48SGreg Clayton { 77*2289fa48SGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 78*2289fa48SGreg Clayton 79*2289fa48SGreg Clayton SBFileSpec file_spec; 80*2289fa48SGreg Clayton if (m_opaque_sp) 81*2289fa48SGreg Clayton file_spec.SetFileSpec(m_opaque_sp->GetPlatformFileSpec()); 82*2289fa48SGreg Clayton 83*2289fa48SGreg Clayton if (log) 84*2289fa48SGreg Clayton { 85*2289fa48SGreg Clayton log->Printf ("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)", 86*2289fa48SGreg Clayton m_opaque_sp.get(), file_spec.get()); 87*2289fa48SGreg Clayton } 88*2289fa48SGreg Clayton 89*2289fa48SGreg Clayton return file_spec; 90*2289fa48SGreg Clayton 91*2289fa48SGreg Clayton } 92*2289fa48SGreg Clayton 93*2289fa48SGreg Clayton bool 94*2289fa48SGreg Clayton SBModule::SetPlatformFileSpec (const lldb::SBFileSpec &platform_file) 95*2289fa48SGreg Clayton { 96*2289fa48SGreg Clayton bool result = false; 97*2289fa48SGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 98*2289fa48SGreg Clayton 99*2289fa48SGreg Clayton if (m_opaque_sp) 100*2289fa48SGreg Clayton { 101*2289fa48SGreg Clayton m_opaque_sp->SetPlatformFileSpec(*platform_file); 102*2289fa48SGreg Clayton result = true; 103*2289fa48SGreg Clayton } 104*2289fa48SGreg Clayton 105*2289fa48SGreg Clayton if (log) 106*2289fa48SGreg Clayton { 107*2289fa48SGreg Clayton log->Printf ("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s%s%s)) => %i", 108*2289fa48SGreg Clayton m_opaque_sp.get(), 109*2289fa48SGreg Clayton platform_file.get(), 110*2289fa48SGreg Clayton platform_file->GetDirectory().GetCString(), 111*2289fa48SGreg Clayton platform_file->GetDirectory() ? "/" : "", 112*2289fa48SGreg Clayton platform_file->GetFilename().GetCString(), 113*2289fa48SGreg Clayton result); 114*2289fa48SGreg Clayton } 115*2289fa48SGreg Clayton return result; 116*2289fa48SGreg Clayton } 117*2289fa48SGreg Clayton 118*2289fa48SGreg Clayton 119*2289fa48SGreg Clayton 12030fdc8d8SChris Lattner const uint8_t * 12130fdc8d8SChris Lattner SBModule::GetUUIDBytes () const 12230fdc8d8SChris Lattner { 1232d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 124ceb6b139SCaroline Tice 1254838131bSGreg Clayton const uint8_t *uuid_bytes = NULL; 1266611103cSGreg Clayton if (m_opaque_sp) 1274838131bSGreg Clayton uuid_bytes = (const uint8_t *)m_opaque_sp->GetUUID().GetBytes(); 128ceb6b139SCaroline Tice 129ceb6b139SCaroline Tice if (log) 1304838131bSGreg Clayton { 1314838131bSGreg Clayton if (uuid_bytes) 1324838131bSGreg Clayton { 1334838131bSGreg Clayton StreamString s; 1344838131bSGreg Clayton m_opaque_sp->GetUUID().Dump (&s); 1354838131bSGreg Clayton log->Printf ("SBModule(%p)::GetUUIDBytes () => %s", m_opaque_sp.get(), s.GetData()); 1364838131bSGreg Clayton } 1374838131bSGreg Clayton else 1384838131bSGreg Clayton log->Printf ("SBModule(%p)::GetUUIDBytes () => NULL", m_opaque_sp.get()); 1394838131bSGreg Clayton } 1404838131bSGreg Clayton return uuid_bytes; 14130fdc8d8SChris Lattner } 14230fdc8d8SChris Lattner 14330fdc8d8SChris Lattner 144df2963edSJohnny Chen const char * 145df2963edSJohnny Chen SBModule::GetUUIDString () const 146df2963edSJohnny Chen { 147df2963edSJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 148df2963edSJohnny Chen 149df2963edSJohnny Chen static char uuid_string[80]; 150df2963edSJohnny Chen const char * uuid_c_string = NULL; 151df2963edSJohnny Chen if (m_opaque_sp) 152df2963edSJohnny Chen uuid_c_string = (const char *)m_opaque_sp->GetUUID().GetAsCString(uuid_string, sizeof(uuid_string)); 153df2963edSJohnny Chen 154df2963edSJohnny Chen if (log) 155df2963edSJohnny Chen { 156df2963edSJohnny Chen if (uuid_c_string) 157df2963edSJohnny Chen { 158df2963edSJohnny Chen StreamString s; 159df2963edSJohnny Chen m_opaque_sp->GetUUID().Dump (&s); 160df2963edSJohnny Chen log->Printf ("SBModule(%p)::GetUUIDString () => %s", m_opaque_sp.get(), s.GetData()); 161df2963edSJohnny Chen } 162df2963edSJohnny Chen else 163df2963edSJohnny Chen log->Printf ("SBModule(%p)::GetUUIDString () => NULL", m_opaque_sp.get()); 164df2963edSJohnny Chen } 165df2963edSJohnny Chen return uuid_c_string; 166df2963edSJohnny Chen } 167df2963edSJohnny Chen 168df2963edSJohnny Chen 16930fdc8d8SChris Lattner bool 17030fdc8d8SChris Lattner SBModule::operator == (const SBModule &rhs) const 17130fdc8d8SChris Lattner { 1726611103cSGreg Clayton if (m_opaque_sp) 1736611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 17430fdc8d8SChris Lattner return false; 17530fdc8d8SChris Lattner } 17630fdc8d8SChris Lattner 17730fdc8d8SChris Lattner bool 17830fdc8d8SChris Lattner SBModule::operator != (const SBModule &rhs) const 17930fdc8d8SChris Lattner { 1806611103cSGreg Clayton if (m_opaque_sp) 1816611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 18230fdc8d8SChris Lattner return false; 18330fdc8d8SChris Lattner } 18430fdc8d8SChris Lattner 18530fdc8d8SChris Lattner lldb::ModuleSP & 18630fdc8d8SChris Lattner SBModule::operator *() 18730fdc8d8SChris Lattner { 1886611103cSGreg Clayton return m_opaque_sp; 18930fdc8d8SChris Lattner } 19030fdc8d8SChris Lattner 19130fdc8d8SChris Lattner lldb_private::Module * 19230fdc8d8SChris Lattner SBModule::operator ->() 19330fdc8d8SChris Lattner { 1946611103cSGreg Clayton return m_opaque_sp.get(); 19530fdc8d8SChris Lattner } 19630fdc8d8SChris Lattner 19730fdc8d8SChris Lattner const lldb_private::Module * 19830fdc8d8SChris Lattner SBModule::operator ->() const 19930fdc8d8SChris Lattner { 2006611103cSGreg Clayton return m_opaque_sp.get(); 20130fdc8d8SChris Lattner } 20230fdc8d8SChris Lattner 20330fdc8d8SChris Lattner lldb_private::Module * 20430fdc8d8SChris Lattner SBModule::get() 20530fdc8d8SChris Lattner { 2066611103cSGreg Clayton return m_opaque_sp.get(); 20730fdc8d8SChris Lattner } 20830fdc8d8SChris Lattner 20930fdc8d8SChris Lattner const lldb_private::Module * 21030fdc8d8SChris Lattner SBModule::get() const 21130fdc8d8SChris Lattner { 2126611103cSGreg Clayton return m_opaque_sp.get(); 21330fdc8d8SChris Lattner } 21430fdc8d8SChris Lattner 21530fdc8d8SChris Lattner 21630fdc8d8SChris Lattner void 21730fdc8d8SChris Lattner SBModule::SetModule (const lldb::ModuleSP& module_sp) 21830fdc8d8SChris Lattner { 2196611103cSGreg Clayton m_opaque_sp = module_sp; 22030fdc8d8SChris Lattner } 22130fdc8d8SChris Lattner 22209960031SGreg Clayton 22309960031SGreg Clayton bool 22409960031SGreg Clayton SBModule::ResolveFileAddress (lldb::addr_t vm_addr, SBAddress& addr) 22509960031SGreg Clayton { 22609960031SGreg Clayton if (m_opaque_sp) 22709960031SGreg Clayton return m_opaque_sp->ResolveFileAddress (vm_addr, *addr); 22809960031SGreg Clayton 22909960031SGreg Clayton addr->Clear(); 23009960031SGreg Clayton return false; 23109960031SGreg Clayton } 23209960031SGreg Clayton 23309960031SGreg Clayton SBSymbolContext 23409960031SGreg Clayton SBModule::ResolveSymbolContextForAddress (const SBAddress& addr, uint32_t resolve_scope) 23509960031SGreg Clayton { 23609960031SGreg Clayton SBSymbolContext sb_sc; 23709960031SGreg Clayton if (m_opaque_sp && addr.IsValid()) 23809960031SGreg Clayton m_opaque_sp->ResolveSymbolContextForAddress (*addr, resolve_scope, *sb_sc); 23909960031SGreg Clayton return sb_sc; 24009960031SGreg Clayton } 24109960031SGreg Clayton 242dde9cff3SCaroline Tice bool 243dde9cff3SCaroline Tice SBModule::GetDescription (SBStream &description) 244dde9cff3SCaroline Tice { 245dde9cff3SCaroline Tice if (m_opaque_sp) 246dde9cff3SCaroline Tice { 247dac97f31SCaroline Tice description.ref(); 248ceb6b139SCaroline Tice m_opaque_sp->GetDescription (description.get()); 249dde9cff3SCaroline Tice } 250dde9cff3SCaroline Tice else 251dde9cff3SCaroline Tice description.Printf ("No value"); 252dde9cff3SCaroline Tice 253dde9cff3SCaroline Tice return true; 254dde9cff3SCaroline Tice } 255bbdabce2SGreg Clayton 256bbdabce2SGreg Clayton size_t 257bbdabce2SGreg Clayton SBModule::GetNumSymbols () 258bbdabce2SGreg Clayton { 259bbdabce2SGreg Clayton if (m_opaque_sp) 260bbdabce2SGreg Clayton { 261bbdabce2SGreg Clayton ObjectFile *obj_file = m_opaque_sp->GetObjectFile(); 262bbdabce2SGreg Clayton if (obj_file) 263bbdabce2SGreg Clayton { 264bbdabce2SGreg Clayton Symtab *symtab = obj_file->GetSymtab(); 265bbdabce2SGreg Clayton if (symtab) 266bbdabce2SGreg Clayton return symtab->GetNumSymbols(); 267bbdabce2SGreg Clayton } 268bbdabce2SGreg Clayton } 269bbdabce2SGreg Clayton return 0; 270bbdabce2SGreg Clayton } 271bbdabce2SGreg Clayton 272bbdabce2SGreg Clayton SBSymbol 273bbdabce2SGreg Clayton SBModule::GetSymbolAtIndex (size_t idx) 274bbdabce2SGreg Clayton { 275bbdabce2SGreg Clayton SBSymbol sb_symbol; 276bbdabce2SGreg Clayton if (m_opaque_sp) 277bbdabce2SGreg Clayton { 278bbdabce2SGreg Clayton ObjectFile *obj_file = m_opaque_sp->GetObjectFile(); 279bbdabce2SGreg Clayton if (obj_file) 280bbdabce2SGreg Clayton { 281bbdabce2SGreg Clayton Symtab *symtab = obj_file->GetSymtab(); 282bbdabce2SGreg Clayton if (symtab) 283bbdabce2SGreg Clayton sb_symbol.SetSymbol(symtab->SymbolAtIndex (idx)); 284bbdabce2SGreg Clayton } 285bbdabce2SGreg Clayton } 286bbdabce2SGreg Clayton return sb_symbol; 287bbdabce2SGreg Clayton } 288