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" 13dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 14fe356d35SGreg Clayton #include "lldb/API/SBSymbolContextList.h" 1530fdc8d8SChris Lattner #include "lldb/Core/Module.h" 16ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 1738adbbb8SGreg Clayton #include "lldb/Core/StreamString.h" 18*dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectList.h" 19*dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectVariable.h" 20*dea8cb4fSGreg Clayton #include "lldb/Symbol/VariableList.h" 21*dea8cb4fSGreg Clayton #include "lldb/Target/Target.h" 2230fdc8d8SChris Lattner 2330fdc8d8SChris Lattner using namespace lldb; 24ceb6b139SCaroline Tice using namespace lldb_private; 2530fdc8d8SChris Lattner 2630fdc8d8SChris Lattner 2730fdc8d8SChris Lattner SBModule::SBModule () : 286611103cSGreg Clayton m_opaque_sp () 2930fdc8d8SChris Lattner { 3030fdc8d8SChris Lattner } 3130fdc8d8SChris Lattner 3230fdc8d8SChris Lattner SBModule::SBModule (const lldb::ModuleSP& module_sp) : 336611103cSGreg Clayton m_opaque_sp (module_sp) 3430fdc8d8SChris Lattner { 3530fdc8d8SChris Lattner } 3630fdc8d8SChris Lattner 37efabb123SGreg Clayton SBModule::SBModule(const SBModule &rhs) : 38efabb123SGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 39efabb123SGreg Clayton { 40efabb123SGreg Clayton } 41efabb123SGreg Clayton 42efabb123SGreg Clayton const SBModule & 43efabb123SGreg Clayton SBModule::operator = (const SBModule &rhs) 44efabb123SGreg Clayton { 45efabb123SGreg Clayton if (this != &rhs) 46efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 47efabb123SGreg Clayton return *this; 48efabb123SGreg Clayton } 49efabb123SGreg Clayton 5030fdc8d8SChris Lattner SBModule::~SBModule () 5130fdc8d8SChris Lattner { 5230fdc8d8SChris Lattner } 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner bool 5530fdc8d8SChris Lattner SBModule::IsValid () const 5630fdc8d8SChris Lattner { 576611103cSGreg Clayton return m_opaque_sp.get() != NULL; 5830fdc8d8SChris Lattner } 5930fdc8d8SChris Lattner 6030fdc8d8SChris Lattner SBFileSpec 6130fdc8d8SChris Lattner SBModule::GetFileSpec () const 6230fdc8d8SChris Lattner { 632d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 64ceb6b139SCaroline Tice 6530fdc8d8SChris Lattner SBFileSpec file_spec; 666611103cSGreg Clayton if (m_opaque_sp) 676611103cSGreg Clayton file_spec.SetFileSpec(m_opaque_sp->GetFileSpec()); 68ceb6b139SCaroline Tice 69ceb6b139SCaroline Tice if (log) 70ceb6b139SCaroline Tice { 71cfd1acedSGreg Clayton log->Printf ("SBModule(%p)::GetFileSpec () => SBFileSpec(%p)", 72cfd1acedSGreg Clayton m_opaque_sp.get(), file_spec.get()); 73ceb6b139SCaroline Tice } 74ceb6b139SCaroline Tice 7530fdc8d8SChris Lattner return file_spec; 7630fdc8d8SChris Lattner } 7730fdc8d8SChris Lattner 782289fa48SGreg Clayton lldb::SBFileSpec 792289fa48SGreg Clayton SBModule::GetPlatformFileSpec () const 802289fa48SGreg Clayton { 812289fa48SGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 822289fa48SGreg Clayton 832289fa48SGreg Clayton SBFileSpec file_spec; 842289fa48SGreg Clayton if (m_opaque_sp) 852289fa48SGreg Clayton file_spec.SetFileSpec(m_opaque_sp->GetPlatformFileSpec()); 862289fa48SGreg Clayton 872289fa48SGreg Clayton if (log) 882289fa48SGreg Clayton { 892289fa48SGreg Clayton log->Printf ("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)", 902289fa48SGreg Clayton m_opaque_sp.get(), file_spec.get()); 912289fa48SGreg Clayton } 922289fa48SGreg Clayton 932289fa48SGreg Clayton return file_spec; 942289fa48SGreg Clayton 952289fa48SGreg Clayton } 962289fa48SGreg Clayton 972289fa48SGreg Clayton bool 982289fa48SGreg Clayton SBModule::SetPlatformFileSpec (const lldb::SBFileSpec &platform_file) 992289fa48SGreg Clayton { 1002289fa48SGreg Clayton bool result = false; 1012289fa48SGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1022289fa48SGreg Clayton 1032289fa48SGreg Clayton if (m_opaque_sp) 1042289fa48SGreg Clayton { 1052289fa48SGreg Clayton m_opaque_sp->SetPlatformFileSpec(*platform_file); 1062289fa48SGreg Clayton result = true; 1072289fa48SGreg Clayton } 1082289fa48SGreg Clayton 1092289fa48SGreg Clayton if (log) 1102289fa48SGreg Clayton { 1112289fa48SGreg Clayton log->Printf ("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s%s%s)) => %i", 1122289fa48SGreg Clayton m_opaque_sp.get(), 1132289fa48SGreg Clayton platform_file.get(), 1142289fa48SGreg Clayton platform_file->GetDirectory().GetCString(), 1152289fa48SGreg Clayton platform_file->GetDirectory() ? "/" : "", 1162289fa48SGreg Clayton platform_file->GetFilename().GetCString(), 1172289fa48SGreg Clayton result); 1182289fa48SGreg Clayton } 1192289fa48SGreg Clayton return result; 1202289fa48SGreg Clayton } 1212289fa48SGreg Clayton 1222289fa48SGreg Clayton 1232289fa48SGreg Clayton 12430fdc8d8SChris Lattner const uint8_t * 12530fdc8d8SChris Lattner SBModule::GetUUIDBytes () const 12630fdc8d8SChris Lattner { 1272d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 128ceb6b139SCaroline Tice 1294838131bSGreg Clayton const uint8_t *uuid_bytes = NULL; 1306611103cSGreg Clayton if (m_opaque_sp) 1314838131bSGreg Clayton uuid_bytes = (const uint8_t *)m_opaque_sp->GetUUID().GetBytes(); 132ceb6b139SCaroline Tice 133ceb6b139SCaroline Tice if (log) 1344838131bSGreg Clayton { 1354838131bSGreg Clayton if (uuid_bytes) 1364838131bSGreg Clayton { 1374838131bSGreg Clayton StreamString s; 1384838131bSGreg Clayton m_opaque_sp->GetUUID().Dump (&s); 1394838131bSGreg Clayton log->Printf ("SBModule(%p)::GetUUIDBytes () => %s", m_opaque_sp.get(), s.GetData()); 1404838131bSGreg Clayton } 1414838131bSGreg Clayton else 1424838131bSGreg Clayton log->Printf ("SBModule(%p)::GetUUIDBytes () => NULL", m_opaque_sp.get()); 1434838131bSGreg Clayton } 1444838131bSGreg Clayton return uuid_bytes; 14530fdc8d8SChris Lattner } 14630fdc8d8SChris Lattner 14730fdc8d8SChris Lattner 148df2963edSJohnny Chen const char * 149df2963edSJohnny Chen SBModule::GetUUIDString () const 150df2963edSJohnny Chen { 151df2963edSJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 152df2963edSJohnny Chen 153df2963edSJohnny Chen static char uuid_string[80]; 154df2963edSJohnny Chen const char * uuid_c_string = NULL; 155df2963edSJohnny Chen if (m_opaque_sp) 156df2963edSJohnny Chen uuid_c_string = (const char *)m_opaque_sp->GetUUID().GetAsCString(uuid_string, sizeof(uuid_string)); 157df2963edSJohnny Chen 158df2963edSJohnny Chen if (log) 159df2963edSJohnny Chen { 160df2963edSJohnny Chen if (uuid_c_string) 161df2963edSJohnny Chen { 162df2963edSJohnny Chen StreamString s; 163df2963edSJohnny Chen m_opaque_sp->GetUUID().Dump (&s); 164df2963edSJohnny Chen log->Printf ("SBModule(%p)::GetUUIDString () => %s", m_opaque_sp.get(), s.GetData()); 165df2963edSJohnny Chen } 166df2963edSJohnny Chen else 167df2963edSJohnny Chen log->Printf ("SBModule(%p)::GetUUIDString () => NULL", m_opaque_sp.get()); 168df2963edSJohnny Chen } 169df2963edSJohnny Chen return uuid_c_string; 170df2963edSJohnny Chen } 171df2963edSJohnny Chen 172df2963edSJohnny Chen 17330fdc8d8SChris Lattner bool 17430fdc8d8SChris Lattner SBModule::operator == (const SBModule &rhs) const 17530fdc8d8SChris Lattner { 1766611103cSGreg Clayton if (m_opaque_sp) 1776611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 17830fdc8d8SChris Lattner return false; 17930fdc8d8SChris Lattner } 18030fdc8d8SChris Lattner 18130fdc8d8SChris Lattner bool 18230fdc8d8SChris Lattner SBModule::operator != (const SBModule &rhs) const 18330fdc8d8SChris Lattner { 1846611103cSGreg Clayton if (m_opaque_sp) 1856611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 18630fdc8d8SChris Lattner return false; 18730fdc8d8SChris Lattner } 18830fdc8d8SChris Lattner 18930fdc8d8SChris Lattner lldb::ModuleSP & 19030fdc8d8SChris Lattner SBModule::operator *() 19130fdc8d8SChris Lattner { 1926611103cSGreg Clayton return m_opaque_sp; 19330fdc8d8SChris Lattner } 19430fdc8d8SChris Lattner 19530fdc8d8SChris Lattner lldb_private::Module * 19630fdc8d8SChris Lattner SBModule::operator ->() 19730fdc8d8SChris Lattner { 1986611103cSGreg Clayton return m_opaque_sp.get(); 19930fdc8d8SChris Lattner } 20030fdc8d8SChris Lattner 20130fdc8d8SChris Lattner const lldb_private::Module * 20230fdc8d8SChris Lattner SBModule::operator ->() const 20330fdc8d8SChris Lattner { 2046611103cSGreg Clayton return m_opaque_sp.get(); 20530fdc8d8SChris Lattner } 20630fdc8d8SChris Lattner 20730fdc8d8SChris Lattner lldb_private::Module * 20830fdc8d8SChris Lattner SBModule::get() 20930fdc8d8SChris Lattner { 2106611103cSGreg Clayton return m_opaque_sp.get(); 21130fdc8d8SChris Lattner } 21230fdc8d8SChris Lattner 21330fdc8d8SChris Lattner const lldb_private::Module * 21430fdc8d8SChris Lattner SBModule::get() const 21530fdc8d8SChris Lattner { 2166611103cSGreg Clayton return m_opaque_sp.get(); 21730fdc8d8SChris Lattner } 21830fdc8d8SChris Lattner 21930fdc8d8SChris Lattner 22030fdc8d8SChris Lattner void 22130fdc8d8SChris Lattner SBModule::SetModule (const lldb::ModuleSP& module_sp) 22230fdc8d8SChris Lattner { 2236611103cSGreg Clayton m_opaque_sp = module_sp; 22430fdc8d8SChris Lattner } 22530fdc8d8SChris Lattner 22609960031SGreg Clayton 22709960031SGreg Clayton bool 22809960031SGreg Clayton SBModule::ResolveFileAddress (lldb::addr_t vm_addr, SBAddress& addr) 22909960031SGreg Clayton { 230a25bf6efSJohnny Chen if (m_opaque_sp && addr.IsValid()) 23109960031SGreg Clayton return m_opaque_sp->ResolveFileAddress (vm_addr, *addr); 23209960031SGreg Clayton 233a25bf6efSJohnny Chen if (addr.IsValid()) 23409960031SGreg Clayton addr->Clear(); 23509960031SGreg Clayton return false; 23609960031SGreg Clayton } 23709960031SGreg Clayton 23809960031SGreg Clayton SBSymbolContext 23909960031SGreg Clayton SBModule::ResolveSymbolContextForAddress (const SBAddress& addr, uint32_t resolve_scope) 24009960031SGreg Clayton { 24109960031SGreg Clayton SBSymbolContext sb_sc; 24209960031SGreg Clayton if (m_opaque_sp && addr.IsValid()) 24309960031SGreg Clayton m_opaque_sp->ResolveSymbolContextForAddress (*addr, resolve_scope, *sb_sc); 24409960031SGreg Clayton return sb_sc; 24509960031SGreg Clayton } 24609960031SGreg Clayton 247dde9cff3SCaroline Tice bool 248dde9cff3SCaroline Tice SBModule::GetDescription (SBStream &description) 249dde9cff3SCaroline Tice { 250dde9cff3SCaroline Tice if (m_opaque_sp) 251dde9cff3SCaroline Tice { 252dac97f31SCaroline Tice description.ref(); 253ceb6b139SCaroline Tice m_opaque_sp->GetDescription (description.get()); 254dde9cff3SCaroline Tice } 255dde9cff3SCaroline Tice else 256dde9cff3SCaroline Tice description.Printf ("No value"); 257dde9cff3SCaroline Tice 258dde9cff3SCaroline Tice return true; 259dde9cff3SCaroline Tice } 260bbdabce2SGreg Clayton 261bbdabce2SGreg Clayton size_t 262bbdabce2SGreg Clayton SBModule::GetNumSymbols () 263bbdabce2SGreg Clayton { 264bbdabce2SGreg Clayton if (m_opaque_sp) 265bbdabce2SGreg Clayton { 266bbdabce2SGreg Clayton ObjectFile *obj_file = m_opaque_sp->GetObjectFile(); 267bbdabce2SGreg Clayton if (obj_file) 268bbdabce2SGreg Clayton { 269bbdabce2SGreg Clayton Symtab *symtab = obj_file->GetSymtab(); 270bbdabce2SGreg Clayton if (symtab) 271bbdabce2SGreg Clayton return symtab->GetNumSymbols(); 272bbdabce2SGreg Clayton } 273bbdabce2SGreg Clayton } 274bbdabce2SGreg Clayton return 0; 275bbdabce2SGreg Clayton } 276bbdabce2SGreg Clayton 277bbdabce2SGreg Clayton SBSymbol 278bbdabce2SGreg Clayton SBModule::GetSymbolAtIndex (size_t idx) 279bbdabce2SGreg Clayton { 280bbdabce2SGreg Clayton SBSymbol sb_symbol; 281bbdabce2SGreg Clayton if (m_opaque_sp) 282bbdabce2SGreg Clayton { 283bbdabce2SGreg Clayton ObjectFile *obj_file = m_opaque_sp->GetObjectFile(); 284bbdabce2SGreg Clayton if (obj_file) 285bbdabce2SGreg Clayton { 286bbdabce2SGreg Clayton Symtab *symtab = obj_file->GetSymtab(); 287bbdabce2SGreg Clayton if (symtab) 288bbdabce2SGreg Clayton sb_symbol.SetSymbol(symtab->SymbolAtIndex (idx)); 289bbdabce2SGreg Clayton } 290bbdabce2SGreg Clayton } 291bbdabce2SGreg Clayton return sb_symbol; 292bbdabce2SGreg Clayton } 293fe356d35SGreg Clayton 294fe356d35SGreg Clayton uint32_t 295fe356d35SGreg Clayton SBModule::FindFunctions (const char *name, 296fe356d35SGreg Clayton uint32_t name_type_mask, 297fe356d35SGreg Clayton bool append, 298fe356d35SGreg Clayton lldb::SBSymbolContextList& sc_list) 299fe356d35SGreg Clayton { 300fe356d35SGreg Clayton if (!append) 301fe356d35SGreg Clayton sc_list.Clear(); 302fe356d35SGreg Clayton if (m_opaque_sp) 303fe356d35SGreg Clayton { 304fe356d35SGreg Clayton const bool symbols_ok = true; 305fe356d35SGreg Clayton return m_opaque_sp->FindFunctions (ConstString(name), 306fe356d35SGreg Clayton name_type_mask, 307fe356d35SGreg Clayton symbols_ok, 308fe356d35SGreg Clayton append, 309fe356d35SGreg Clayton *sc_list); 310fe356d35SGreg Clayton } 311fe356d35SGreg Clayton return 0; 312fe356d35SGreg Clayton } 313fe356d35SGreg Clayton 314*dea8cb4fSGreg Clayton 315*dea8cb4fSGreg Clayton SBValueList 316*dea8cb4fSGreg Clayton SBModule::FindGlobalVariables (SBTarget &target, const char *name, uint32_t max_matches) 317*dea8cb4fSGreg Clayton { 318*dea8cb4fSGreg Clayton SBValueList sb_value_list; 319*dea8cb4fSGreg Clayton if (m_opaque_sp) 320*dea8cb4fSGreg Clayton { 321*dea8cb4fSGreg Clayton VariableList variable_list; 322*dea8cb4fSGreg Clayton const uint32_t match_count = m_opaque_sp->FindGlobalVariables (ConstString (name), 323*dea8cb4fSGreg Clayton false, 324*dea8cb4fSGreg Clayton max_matches, 325*dea8cb4fSGreg Clayton variable_list); 326*dea8cb4fSGreg Clayton 327*dea8cb4fSGreg Clayton if (match_count > 0) 328*dea8cb4fSGreg Clayton { 329*dea8cb4fSGreg Clayton ValueObjectList &value_object_list = sb_value_list.ref(); 330*dea8cb4fSGreg Clayton for (uint32_t i=0; i<match_count; ++i) 331*dea8cb4fSGreg Clayton { 332*dea8cb4fSGreg Clayton lldb::ValueObjectSP valobj_sp; 333*dea8cb4fSGreg Clayton if (target.IsValid()) 334*dea8cb4fSGreg Clayton valobj_sp = ValueObjectVariable::Create (target.get(), variable_list.GetVariableAtIndex(i)); 335*dea8cb4fSGreg Clayton else 336*dea8cb4fSGreg Clayton valobj_sp = ValueObjectVariable::Create (NULL, variable_list.GetVariableAtIndex(i)); 337*dea8cb4fSGreg Clayton if (valobj_sp) 338*dea8cb4fSGreg Clayton value_object_list.Append(valobj_sp); 339*dea8cb4fSGreg Clayton } 340*dea8cb4fSGreg Clayton } 341*dea8cb4fSGreg Clayton } 342*dea8cb4fSGreg Clayton 343*dea8cb4fSGreg Clayton return sb_value_list; 344*dea8cb4fSGreg Clayton } 345