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" 13c9660546SGreg Clayton #include "lldb/API/SBProcess.h" 14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 15fe356d35SGreg Clayton #include "lldb/API/SBSymbolContextList.h" 1630fdc8d8SChris Lattner #include "lldb/Core/Module.h" 17ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 181f746071SGreg Clayton #include "lldb/Core/Section.h" 1938adbbb8SGreg Clayton #include "lldb/Core/StreamString.h" 20dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectList.h" 21dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectVariable.h" 221f746071SGreg Clayton #include "lldb/Symbol/ObjectFile.h" 236f3533fbSEnrico Granata #include "lldb/Symbol/SymbolVendor.h" 241f746071SGreg Clayton #include "lldb/Symbol/Symtab.h" 25dea8cb4fSGreg Clayton #include "lldb/Symbol/VariableList.h" 26dea8cb4fSGreg Clayton #include "lldb/Target/Target.h" 2730fdc8d8SChris Lattner 2830fdc8d8SChris Lattner using namespace lldb; 29ceb6b139SCaroline Tice using namespace lldb_private; 3030fdc8d8SChris Lattner 3130fdc8d8SChris Lattner 3230fdc8d8SChris Lattner SBModule::SBModule () : 336611103cSGreg Clayton m_opaque_sp () 3430fdc8d8SChris Lattner { 3530fdc8d8SChris Lattner } 3630fdc8d8SChris Lattner 3730fdc8d8SChris Lattner SBModule::SBModule (const lldb::ModuleSP& module_sp) : 386611103cSGreg Clayton m_opaque_sp (module_sp) 3930fdc8d8SChris Lattner { 4030fdc8d8SChris Lattner } 4130fdc8d8SChris Lattner 42efabb123SGreg Clayton SBModule::SBModule(const SBModule &rhs) : 43efabb123SGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 44efabb123SGreg Clayton { 45efabb123SGreg Clayton } 46efabb123SGreg Clayton 47c9660546SGreg Clayton SBModule::SBModule (lldb::SBProcess &process, lldb::addr_t header_addr) : 48c9660546SGreg Clayton m_opaque_sp () 49c9660546SGreg Clayton { 50c9660546SGreg Clayton ProcessSP process_sp (process.GetSP()); 51c9660546SGreg Clayton if (process_sp) 52c859e2d5SGreg Clayton { 53c859e2d5SGreg Clayton const bool add_image_to_target = true; 54c859e2d5SGreg Clayton const bool load_image_sections_in_target = true; 55c859e2d5SGreg Clayton m_opaque_sp = process_sp->ReadModuleFromMemory (FileSpec(), 56c859e2d5SGreg Clayton header_addr, 57c859e2d5SGreg Clayton add_image_to_target, 58c859e2d5SGreg Clayton load_image_sections_in_target); 59c859e2d5SGreg Clayton } 60c9660546SGreg Clayton } 61c9660546SGreg Clayton 62efabb123SGreg Clayton const SBModule & 63efabb123SGreg Clayton SBModule::operator = (const SBModule &rhs) 64efabb123SGreg Clayton { 65efabb123SGreg Clayton if (this != &rhs) 66efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 67efabb123SGreg Clayton return *this; 68efabb123SGreg Clayton } 69efabb123SGreg Clayton 7030fdc8d8SChris Lattner SBModule::~SBModule () 7130fdc8d8SChris Lattner { 7230fdc8d8SChris Lattner } 7330fdc8d8SChris Lattner 7430fdc8d8SChris Lattner bool 7530fdc8d8SChris Lattner SBModule::IsValid () const 7630fdc8d8SChris Lattner { 776611103cSGreg Clayton return m_opaque_sp.get() != NULL; 7830fdc8d8SChris Lattner } 7930fdc8d8SChris Lattner 805d3bca4eSJim Ingham void 815d3bca4eSJim Ingham SBModule::Clear() 825d3bca4eSJim Ingham { 835d3bca4eSJim Ingham m_opaque_sp.reset(); 845d3bca4eSJim Ingham } 855d3bca4eSJim Ingham 8630fdc8d8SChris Lattner SBFileSpec 8730fdc8d8SChris Lattner SBModule::GetFileSpec () const 8830fdc8d8SChris Lattner { 892d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 90ceb6b139SCaroline Tice 9130fdc8d8SChris Lattner SBFileSpec file_spec; 92c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 93c2ff9318SGreg Clayton if (module_sp) 94c2ff9318SGreg Clayton file_spec.SetFileSpec(module_sp->GetFileSpec()); 95ceb6b139SCaroline Tice 96ceb6b139SCaroline Tice if (log) 97ceb6b139SCaroline Tice { 98cfd1acedSGreg Clayton log->Printf ("SBModule(%p)::GetFileSpec () => SBFileSpec(%p)", 99c2ff9318SGreg Clayton module_sp.get(), file_spec.get()); 100ceb6b139SCaroline Tice } 101ceb6b139SCaroline Tice 10230fdc8d8SChris Lattner return file_spec; 10330fdc8d8SChris Lattner } 10430fdc8d8SChris Lattner 1052289fa48SGreg Clayton lldb::SBFileSpec 1062289fa48SGreg Clayton SBModule::GetPlatformFileSpec () const 1072289fa48SGreg Clayton { 1082289fa48SGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1092289fa48SGreg Clayton 1102289fa48SGreg Clayton SBFileSpec file_spec; 111c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 112c2ff9318SGreg Clayton if (module_sp) 113c2ff9318SGreg Clayton file_spec.SetFileSpec(module_sp->GetPlatformFileSpec()); 1142289fa48SGreg Clayton 1152289fa48SGreg Clayton if (log) 1162289fa48SGreg Clayton { 1172289fa48SGreg Clayton log->Printf ("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)", 118c2ff9318SGreg Clayton module_sp.get(), file_spec.get()); 1192289fa48SGreg Clayton } 1202289fa48SGreg Clayton 1212289fa48SGreg Clayton return file_spec; 1222289fa48SGreg Clayton 1232289fa48SGreg Clayton } 1242289fa48SGreg Clayton 1252289fa48SGreg Clayton bool 1262289fa48SGreg Clayton SBModule::SetPlatformFileSpec (const lldb::SBFileSpec &platform_file) 1272289fa48SGreg Clayton { 1282289fa48SGreg Clayton bool result = false; 1292289fa48SGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1302289fa48SGreg Clayton 131c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 132c2ff9318SGreg Clayton if (module_sp) 1332289fa48SGreg Clayton { 134c2ff9318SGreg Clayton module_sp->SetPlatformFileSpec(*platform_file); 1352289fa48SGreg Clayton result = true; 1362289fa48SGreg Clayton } 1372289fa48SGreg Clayton 1382289fa48SGreg Clayton if (log) 1392289fa48SGreg Clayton { 1402289fa48SGreg Clayton log->Printf ("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s%s%s)) => %i", 141c2ff9318SGreg Clayton module_sp.get(), 1422289fa48SGreg Clayton platform_file.get(), 1432289fa48SGreg Clayton platform_file->GetDirectory().GetCString(), 1442289fa48SGreg Clayton platform_file->GetDirectory() ? "/" : "", 1452289fa48SGreg Clayton platform_file->GetFilename().GetCString(), 1462289fa48SGreg Clayton result); 1472289fa48SGreg Clayton } 1482289fa48SGreg Clayton return result; 1492289fa48SGreg Clayton } 1502289fa48SGreg Clayton 1512289fa48SGreg Clayton 1522289fa48SGreg Clayton 15330fdc8d8SChris Lattner const uint8_t * 15430fdc8d8SChris Lattner SBModule::GetUUIDBytes () const 15530fdc8d8SChris Lattner { 1562d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 157ceb6b139SCaroline Tice 1584838131bSGreg Clayton const uint8_t *uuid_bytes = NULL; 159c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 160c2ff9318SGreg Clayton if (module_sp) 161c2ff9318SGreg Clayton uuid_bytes = (const uint8_t *)module_sp->GetUUID().GetBytes(); 162ceb6b139SCaroline Tice 163ceb6b139SCaroline Tice if (log) 1644838131bSGreg Clayton { 1654838131bSGreg Clayton if (uuid_bytes) 1664838131bSGreg Clayton { 1674838131bSGreg Clayton StreamString s; 168c2ff9318SGreg Clayton module_sp->GetUUID().Dump (&s); 169c2ff9318SGreg Clayton log->Printf ("SBModule(%p)::GetUUIDBytes () => %s", module_sp.get(), s.GetData()); 1704838131bSGreg Clayton } 1714838131bSGreg Clayton else 172c2ff9318SGreg Clayton log->Printf ("SBModule(%p)::GetUUIDBytes () => NULL", module_sp.get()); 1734838131bSGreg Clayton } 1744838131bSGreg Clayton return uuid_bytes; 17530fdc8d8SChris Lattner } 17630fdc8d8SChris Lattner 17730fdc8d8SChris Lattner 178df2963edSJohnny Chen const char * 179df2963edSJohnny Chen SBModule::GetUUIDString () const 180df2963edSJohnny Chen { 181df2963edSJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 182df2963edSJohnny Chen 183df2963edSJohnny Chen static char uuid_string[80]; 184df2963edSJohnny Chen const char * uuid_c_string = NULL; 185c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 186c2ff9318SGreg Clayton if (module_sp) 187c2ff9318SGreg Clayton uuid_c_string = (const char *)module_sp->GetUUID().GetAsCString(uuid_string, sizeof(uuid_string)); 188df2963edSJohnny Chen 189df2963edSJohnny Chen if (log) 190df2963edSJohnny Chen { 191df2963edSJohnny Chen if (uuid_c_string) 192df2963edSJohnny Chen { 193df2963edSJohnny Chen StreamString s; 194c2ff9318SGreg Clayton module_sp->GetUUID().Dump (&s); 195c2ff9318SGreg Clayton log->Printf ("SBModule(%p)::GetUUIDString () => %s", module_sp.get(), s.GetData()); 196df2963edSJohnny Chen } 197df2963edSJohnny Chen else 198c2ff9318SGreg Clayton log->Printf ("SBModule(%p)::GetUUIDString () => NULL", module_sp.get()); 199df2963edSJohnny Chen } 200df2963edSJohnny Chen return uuid_c_string; 201df2963edSJohnny Chen } 202df2963edSJohnny Chen 203df2963edSJohnny Chen 20430fdc8d8SChris Lattner bool 20530fdc8d8SChris Lattner SBModule::operator == (const SBModule &rhs) const 20630fdc8d8SChris Lattner { 2076611103cSGreg Clayton if (m_opaque_sp) 2086611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 20930fdc8d8SChris Lattner return false; 21030fdc8d8SChris Lattner } 21130fdc8d8SChris Lattner 21230fdc8d8SChris Lattner bool 21330fdc8d8SChris Lattner SBModule::operator != (const SBModule &rhs) const 21430fdc8d8SChris Lattner { 2156611103cSGreg Clayton if (m_opaque_sp) 2166611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 21730fdc8d8SChris Lattner return false; 21830fdc8d8SChris Lattner } 21930fdc8d8SChris Lattner 220acdbe816SGreg Clayton ModuleSP 221acdbe816SGreg Clayton SBModule::GetSP () const 222cac9c5f9SGreg Clayton { 223cac9c5f9SGreg Clayton return m_opaque_sp; 224cac9c5f9SGreg Clayton } 22530fdc8d8SChris Lattner 22630fdc8d8SChris Lattner void 227acdbe816SGreg Clayton SBModule::SetSP (const ModuleSP &module_sp) 22830fdc8d8SChris Lattner { 2296611103cSGreg Clayton m_opaque_sp = module_sp; 23030fdc8d8SChris Lattner } 23130fdc8d8SChris Lattner 232cac9c5f9SGreg Clayton SBAddress 233cac9c5f9SGreg Clayton SBModule::ResolveFileAddress (lldb::addr_t vm_addr) 23409960031SGreg Clayton { 235cac9c5f9SGreg Clayton lldb::SBAddress sb_addr; 236c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 237c2ff9318SGreg Clayton if (module_sp) 238cac9c5f9SGreg Clayton { 239cac9c5f9SGreg Clayton Address addr; 240c2ff9318SGreg Clayton if (module_sp->ResolveFileAddress (vm_addr, addr)) 241cac9c5f9SGreg Clayton sb_addr.ref() = addr; 242cac9c5f9SGreg Clayton } 243cac9c5f9SGreg Clayton return sb_addr; 24409960031SGreg Clayton } 24509960031SGreg Clayton 24609960031SGreg Clayton SBSymbolContext 24709960031SGreg Clayton SBModule::ResolveSymbolContextForAddress (const SBAddress& addr, uint32_t resolve_scope) 24809960031SGreg Clayton { 24909960031SGreg Clayton SBSymbolContext sb_sc; 250c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 251c2ff9318SGreg Clayton if (module_sp && addr.IsValid()) 252c2ff9318SGreg Clayton module_sp->ResolveSymbolContextForAddress (addr.ref(), resolve_scope, *sb_sc); 25309960031SGreg Clayton return sb_sc; 25409960031SGreg Clayton } 25509960031SGreg Clayton 256dde9cff3SCaroline Tice bool 257dde9cff3SCaroline Tice SBModule::GetDescription (SBStream &description) 258dde9cff3SCaroline Tice { 259da7bc7d0SGreg Clayton Stream &strm = description.ref(); 260da7bc7d0SGreg Clayton 261c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 262c2ff9318SGreg Clayton if (module_sp) 263dde9cff3SCaroline Tice { 264c2ff9318SGreg Clayton module_sp->GetDescription (&strm); 265dde9cff3SCaroline Tice } 266dde9cff3SCaroline Tice else 267da7bc7d0SGreg Clayton strm.PutCString ("No value"); 268dde9cff3SCaroline Tice 269dde9cff3SCaroline Tice return true; 270dde9cff3SCaroline Tice } 271bbdabce2SGreg Clayton 272873a7a4bSJohnny Chen uint32_t 273873a7a4bSJohnny Chen SBModule::GetNumCompileUnits() 274873a7a4bSJohnny Chen { 275873a7a4bSJohnny Chen ModuleSP module_sp (GetSP ()); 276873a7a4bSJohnny Chen if (module_sp) 277873a7a4bSJohnny Chen { 278873a7a4bSJohnny Chen return module_sp->GetNumCompileUnits (); 279873a7a4bSJohnny Chen } 280873a7a4bSJohnny Chen return 0; 281873a7a4bSJohnny Chen } 282873a7a4bSJohnny Chen 283873a7a4bSJohnny Chen SBCompileUnit 284873a7a4bSJohnny Chen SBModule::GetCompileUnitAtIndex (uint32_t index) 285873a7a4bSJohnny Chen { 286873a7a4bSJohnny Chen SBCompileUnit sb_cu; 287873a7a4bSJohnny Chen ModuleSP module_sp (GetSP ()); 288873a7a4bSJohnny Chen if (module_sp) 289873a7a4bSJohnny Chen { 290873a7a4bSJohnny Chen CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex (index); 291873a7a4bSJohnny Chen sb_cu.reset(cu_sp.get()); 292873a7a4bSJohnny Chen } 293873a7a4bSJohnny Chen return sb_cu; 294873a7a4bSJohnny Chen } 295873a7a4bSJohnny Chen 296bbdabce2SGreg Clayton size_t 297bbdabce2SGreg Clayton SBModule::GetNumSymbols () 298bbdabce2SGreg Clayton { 299c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 300c2ff9318SGreg Clayton if (module_sp) 301bbdabce2SGreg Clayton { 302c2ff9318SGreg Clayton ObjectFile *obj_file = module_sp->GetObjectFile(); 303bbdabce2SGreg Clayton if (obj_file) 304bbdabce2SGreg Clayton { 305bbdabce2SGreg Clayton Symtab *symtab = obj_file->GetSymtab(); 306bbdabce2SGreg Clayton if (symtab) 307bbdabce2SGreg Clayton return symtab->GetNumSymbols(); 308bbdabce2SGreg Clayton } 309bbdabce2SGreg Clayton } 310bbdabce2SGreg Clayton return 0; 311bbdabce2SGreg Clayton } 312bbdabce2SGreg Clayton 313bbdabce2SGreg Clayton SBSymbol 314bbdabce2SGreg Clayton SBModule::GetSymbolAtIndex (size_t idx) 315bbdabce2SGreg Clayton { 316bbdabce2SGreg Clayton SBSymbol sb_symbol; 317c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 318c2ff9318SGreg Clayton if (module_sp) 319bbdabce2SGreg Clayton { 320c2ff9318SGreg Clayton ObjectFile *obj_file = module_sp->GetObjectFile(); 321bbdabce2SGreg Clayton if (obj_file) 322bbdabce2SGreg Clayton { 323bbdabce2SGreg Clayton Symtab *symtab = obj_file->GetSymtab(); 324bbdabce2SGreg Clayton if (symtab) 325bbdabce2SGreg Clayton sb_symbol.SetSymbol(symtab->SymbolAtIndex (idx)); 326bbdabce2SGreg Clayton } 327bbdabce2SGreg Clayton } 328bbdabce2SGreg Clayton return sb_symbol; 329bbdabce2SGreg Clayton } 330fe356d35SGreg Clayton 331*e14e1925SGreg Clayton lldb::SBSymbol 332*e14e1925SGreg Clayton SBModule::FindSymbol (const char *name, 333*e14e1925SGreg Clayton lldb::SymbolType symbol_type) 334*e14e1925SGreg Clayton { 335*e14e1925SGreg Clayton SBSymbol sb_symbol; 336*e14e1925SGreg Clayton if (name && name[0]) 337*e14e1925SGreg Clayton { 338*e14e1925SGreg Clayton ModuleSP module_sp (GetSP ()); 339*e14e1925SGreg Clayton if (module_sp) 340*e14e1925SGreg Clayton { 341*e14e1925SGreg Clayton ObjectFile *obj_file = module_sp->GetObjectFile(); 342*e14e1925SGreg Clayton if (obj_file) 343*e14e1925SGreg Clayton { 344*e14e1925SGreg Clayton Symtab *symtab = obj_file->GetSymtab(); 345*e14e1925SGreg Clayton if (symtab) 346*e14e1925SGreg Clayton sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType(ConstString(name), symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny)); 347*e14e1925SGreg Clayton } 348*e14e1925SGreg Clayton } 349*e14e1925SGreg Clayton } 350*e14e1925SGreg Clayton return sb_symbol; 351*e14e1925SGreg Clayton } 352*e14e1925SGreg Clayton 353*e14e1925SGreg Clayton 354*e14e1925SGreg Clayton lldb::SBSymbolContextList 355*e14e1925SGreg Clayton SBModule::FindSymbols (const char *name, lldb::SymbolType symbol_type) 356*e14e1925SGreg Clayton { 357*e14e1925SGreg Clayton SBSymbolContextList sb_sc_list; 358*e14e1925SGreg Clayton if (name && name[0]) 359*e14e1925SGreg Clayton { 360*e14e1925SGreg Clayton ModuleSP module_sp (GetSP ()); 361*e14e1925SGreg Clayton if (module_sp) 362*e14e1925SGreg Clayton { 363*e14e1925SGreg Clayton ObjectFile *obj_file = module_sp->GetObjectFile(); 364*e14e1925SGreg Clayton if (obj_file) 365*e14e1925SGreg Clayton { 366*e14e1925SGreg Clayton Symtab *symtab = obj_file->GetSymtab(); 367*e14e1925SGreg Clayton if (symtab) 368*e14e1925SGreg Clayton { 369*e14e1925SGreg Clayton std::vector<uint32_t> matching_symbol_indexes; 370*e14e1925SGreg Clayton const size_t num_matches = symtab->FindAllSymbolsWithNameAndType(ConstString(name), symbol_type, matching_symbol_indexes); 371*e14e1925SGreg Clayton if (num_matches) 372*e14e1925SGreg Clayton { 373*e14e1925SGreg Clayton SymbolContext sc; 374*e14e1925SGreg Clayton sc.module_sp = module_sp; 375*e14e1925SGreg Clayton SymbolContextList &sc_list = *sb_sc_list; 376*e14e1925SGreg Clayton for (size_t i=0; i<num_matches; ++i) 377*e14e1925SGreg Clayton { 378*e14e1925SGreg Clayton sc.symbol = symtab->SymbolAtIndex (matching_symbol_indexes[i]); 379*e14e1925SGreg Clayton if (sc.symbol) 380*e14e1925SGreg Clayton sc_list.Append(sc); 381*e14e1925SGreg Clayton } 382*e14e1925SGreg Clayton } 383*e14e1925SGreg Clayton } 384*e14e1925SGreg Clayton } 385*e14e1925SGreg Clayton } 386*e14e1925SGreg Clayton } 387*e14e1925SGreg Clayton return sb_sc_list; 388*e14e1925SGreg Clayton 389*e14e1925SGreg Clayton } 390*e14e1925SGreg Clayton 391*e14e1925SGreg Clayton 392*e14e1925SGreg Clayton 393cac9c5f9SGreg Clayton size_t 394cac9c5f9SGreg Clayton SBModule::GetNumSections () 395cac9c5f9SGreg Clayton { 396c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 397c2ff9318SGreg Clayton if (module_sp) 398cac9c5f9SGreg Clayton { 399c2ff9318SGreg Clayton ObjectFile *obj_file = module_sp->GetObjectFile(); 400cac9c5f9SGreg Clayton if (obj_file) 401cac9c5f9SGreg Clayton { 402cac9c5f9SGreg Clayton SectionList *section_list = obj_file->GetSectionList (); 403cac9c5f9SGreg Clayton if (section_list) 404cac9c5f9SGreg Clayton return section_list->GetSize(); 405cac9c5f9SGreg Clayton } 406cac9c5f9SGreg Clayton } 407cac9c5f9SGreg Clayton return 0; 408cac9c5f9SGreg Clayton } 409cac9c5f9SGreg Clayton 410cac9c5f9SGreg Clayton SBSection 411cac9c5f9SGreg Clayton SBModule::GetSectionAtIndex (size_t idx) 412cac9c5f9SGreg Clayton { 413cac9c5f9SGreg Clayton SBSection sb_section; 414c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 415c2ff9318SGreg Clayton if (module_sp) 416cac9c5f9SGreg Clayton { 417c2ff9318SGreg Clayton ObjectFile *obj_file = module_sp->GetObjectFile(); 418cac9c5f9SGreg Clayton if (obj_file) 419cac9c5f9SGreg Clayton { 420cac9c5f9SGreg Clayton SectionList *section_list = obj_file->GetSectionList (); 421cac9c5f9SGreg Clayton 422cac9c5f9SGreg Clayton if (section_list) 423e72dfb32SGreg Clayton sb_section.SetSP(section_list->GetSectionAtIndex (idx)); 424cac9c5f9SGreg Clayton } 425cac9c5f9SGreg Clayton } 426cac9c5f9SGreg Clayton return sb_section; 427cac9c5f9SGreg Clayton } 428cac9c5f9SGreg Clayton 4295569e64eSGreg Clayton lldb::SBSymbolContextList 430fe356d35SGreg Clayton SBModule::FindFunctions (const char *name, 4315569e64eSGreg Clayton uint32_t name_type_mask) 432fe356d35SGreg Clayton { 4335569e64eSGreg Clayton lldb::SBSymbolContextList sb_sc_list; 434c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 435c2ff9318SGreg Clayton if (name && module_sp) 436fe356d35SGreg Clayton { 4375569e64eSGreg Clayton const bool append = true; 438fe356d35SGreg Clayton const bool symbols_ok = true; 4399df05fbbSSean Callanan const bool inlines_ok = true; 440c2ff9318SGreg Clayton module_sp->FindFunctions (ConstString(name), 441b6d70ebcSSean Callanan NULL, 442fe356d35SGreg Clayton name_type_mask, 443fe356d35SGreg Clayton symbols_ok, 4449df05fbbSSean Callanan inlines_ok, 445fe356d35SGreg Clayton append, 4465569e64eSGreg Clayton *sb_sc_list); 447fe356d35SGreg Clayton } 4485569e64eSGreg Clayton return sb_sc_list; 449fe356d35SGreg Clayton } 450fe356d35SGreg Clayton 451dea8cb4fSGreg Clayton 452dea8cb4fSGreg Clayton SBValueList 453dea8cb4fSGreg Clayton SBModule::FindGlobalVariables (SBTarget &target, const char *name, uint32_t max_matches) 454dea8cb4fSGreg Clayton { 455dea8cb4fSGreg Clayton SBValueList sb_value_list; 456c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 457c2ff9318SGreg Clayton if (name && module_sp) 458dea8cb4fSGreg Clayton { 459dea8cb4fSGreg Clayton VariableList variable_list; 460c2ff9318SGreg Clayton const uint32_t match_count = module_sp->FindGlobalVariables (ConstString (name), 461b6d70ebcSSean Callanan NULL, 462dea8cb4fSGreg Clayton false, 463dea8cb4fSGreg Clayton max_matches, 464dea8cb4fSGreg Clayton variable_list); 465dea8cb4fSGreg Clayton 466dea8cb4fSGreg Clayton if (match_count > 0) 467dea8cb4fSGreg Clayton { 468dea8cb4fSGreg Clayton ValueObjectList &value_object_list = sb_value_list.ref(); 469dea8cb4fSGreg Clayton for (uint32_t i=0; i<match_count; ++i) 470dea8cb4fSGreg Clayton { 471dea8cb4fSGreg Clayton lldb::ValueObjectSP valobj_sp; 472b9556accSGreg Clayton TargetSP target_sp (target.GetSP()); 473b9556accSGreg Clayton valobj_sp = ValueObjectVariable::Create (target_sp.get(), variable_list.GetVariableAtIndex(i)); 474dea8cb4fSGreg Clayton if (valobj_sp) 475dea8cb4fSGreg Clayton value_object_list.Append(valobj_sp); 476dea8cb4fSGreg Clayton } 477dea8cb4fSGreg Clayton } 478dea8cb4fSGreg Clayton } 479dea8cb4fSGreg Clayton 480dea8cb4fSGreg Clayton return sb_value_list; 481dea8cb4fSGreg Clayton } 4826f3533fbSEnrico Granata 4836f3533fbSEnrico Granata lldb::SBType 4846f3533fbSEnrico Granata SBModule::FindFirstType (const char *name_cstr) 4856f3533fbSEnrico Granata { 486fe42ac4dSGreg Clayton SBType sb_type; 487c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 488c2ff9318SGreg Clayton if (name_cstr && module_sp) 489fe42ac4dSGreg Clayton { 4906f3533fbSEnrico Granata SymbolContext sc; 4916f3533fbSEnrico Granata TypeList type_list; 4926f3533fbSEnrico Granata uint32_t num_matches = 0; 49384db9105SGreg Clayton const bool exact_match = false; 4946f3533fbSEnrico Granata ConstString name(name_cstr); 4956f3533fbSEnrico Granata 496c2ff9318SGreg Clayton num_matches = module_sp->FindTypes (sc, 4976f3533fbSEnrico Granata name, 49884db9105SGreg Clayton exact_match, 4996f3533fbSEnrico Granata 1, 5006f3533fbSEnrico Granata type_list); 5016f3533fbSEnrico Granata 5026f3533fbSEnrico Granata if (num_matches) 503fe42ac4dSGreg Clayton sb_type = lldb::SBType(type_list.GetTypeAtIndex(0)); 5046f3533fbSEnrico Granata } 505fe42ac4dSGreg Clayton return sb_type; 5066f3533fbSEnrico Granata } 5076f3533fbSEnrico Granata 5086f3533fbSEnrico Granata lldb::SBTypeList 5096f3533fbSEnrico Granata SBModule::FindTypes (const char *type) 5106f3533fbSEnrico Granata { 5116f3533fbSEnrico Granata 5126f3533fbSEnrico Granata SBTypeList retval; 5136f3533fbSEnrico Granata 514c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 515c2ff9318SGreg Clayton if (type && module_sp) 516fe42ac4dSGreg Clayton { 5176f3533fbSEnrico Granata SymbolContext sc; 5186f3533fbSEnrico Granata TypeList type_list; 51984db9105SGreg Clayton const bool exact_match = false; 5206f3533fbSEnrico Granata uint32_t num_matches = 0; 5216f3533fbSEnrico Granata ConstString name(type); 5226f3533fbSEnrico Granata 523c2ff9318SGreg Clayton num_matches = module_sp->FindTypes (sc, 5246f3533fbSEnrico Granata name, 52584db9105SGreg Clayton exact_match, 5266f3533fbSEnrico Granata UINT32_MAX, 5276f3533fbSEnrico Granata type_list); 5286f3533fbSEnrico Granata 5296f3533fbSEnrico Granata for (size_t idx = 0; idx < num_matches; idx++) 5306f3533fbSEnrico Granata { 531fe42ac4dSGreg Clayton TypeSP type_sp (type_list.GetTypeAtIndex(idx)); 532fe42ac4dSGreg Clayton if (type_sp) 533fe42ac4dSGreg Clayton retval.Append(SBType(type_sp)); 534fe42ac4dSGreg Clayton } 5356f3533fbSEnrico Granata } 5366f3533fbSEnrico Granata 5376f3533fbSEnrico Granata return retval; 5386f3533fbSEnrico Granata } 539cac9c5f9SGreg Clayton 540cac9c5f9SGreg Clayton 541cac9c5f9SGreg Clayton SBSection 542cac9c5f9SGreg Clayton SBModule::FindSection (const char *sect_name) 543cac9c5f9SGreg Clayton { 544cac9c5f9SGreg Clayton SBSection sb_section; 545cac9c5f9SGreg Clayton 546c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 547c2ff9318SGreg Clayton if (sect_name && module_sp) 548cac9c5f9SGreg Clayton { 549c2ff9318SGreg Clayton ObjectFile *objfile = module_sp->GetObjectFile(); 550cac9c5f9SGreg Clayton if (objfile) 551cac9c5f9SGreg Clayton { 552cac9c5f9SGreg Clayton SectionList *section_list = objfile->GetSectionList(); 553cac9c5f9SGreg Clayton if (section_list) 554cac9c5f9SGreg Clayton { 555cac9c5f9SGreg Clayton ConstString const_sect_name(sect_name); 556cac9c5f9SGreg Clayton SectionSP section_sp (section_list->FindSectionByName(const_sect_name)); 557cac9c5f9SGreg Clayton if (section_sp) 558cac9c5f9SGreg Clayton { 559e72dfb32SGreg Clayton sb_section.SetSP (section_sp); 560cac9c5f9SGreg Clayton } 561cac9c5f9SGreg Clayton } 562cac9c5f9SGreg Clayton } 563cac9c5f9SGreg Clayton } 564cac9c5f9SGreg Clayton return sb_section; 565cac9c5f9SGreg Clayton } 566cac9c5f9SGreg Clayton 56713d1950aSGreg Clayton lldb::ByteOrder 56813d1950aSGreg Clayton SBModule::GetByteOrder () 56913d1950aSGreg Clayton { 570c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 571c2ff9318SGreg Clayton if (module_sp) 572c2ff9318SGreg Clayton return module_sp->GetArchitecture().GetByteOrder(); 57313d1950aSGreg Clayton return eByteOrderInvalid; 57413d1950aSGreg Clayton } 57513d1950aSGreg Clayton 57613d1950aSGreg Clayton const char * 57713d1950aSGreg Clayton SBModule::GetTriple () 57813d1950aSGreg Clayton { 579c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 580c2ff9318SGreg Clayton if (module_sp) 58113d1950aSGreg Clayton { 582c2ff9318SGreg Clayton std::string triple (module_sp->GetArchitecture().GetTriple().str()); 58313d1950aSGreg Clayton // Unique the string so we don't run into ownership issues since 58413d1950aSGreg Clayton // the const strings put the string into the string pool once and 58513d1950aSGreg Clayton // the strings never comes out 58613d1950aSGreg Clayton ConstString const_triple (triple.c_str()); 58713d1950aSGreg Clayton return const_triple.GetCString(); 58813d1950aSGreg Clayton } 58913d1950aSGreg Clayton return NULL; 59013d1950aSGreg Clayton } 59113d1950aSGreg Clayton 59213d1950aSGreg Clayton uint32_t 59313d1950aSGreg Clayton SBModule::GetAddressByteSize() 59413d1950aSGreg Clayton { 595c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 596c2ff9318SGreg Clayton if (module_sp) 597c2ff9318SGreg Clayton return module_sp->GetArchitecture().GetAddressByteSize(); 59813d1950aSGreg Clayton return sizeof(void*); 59913d1950aSGreg Clayton } 60013d1950aSGreg Clayton 601c2ff9318SGreg Clayton 602c2ff9318SGreg Clayton uint32_t 603c2ff9318SGreg Clayton SBModule::GetVersion (uint32_t *versions, uint32_t num_versions) 604c2ff9318SGreg Clayton { 605c2ff9318SGreg Clayton ModuleSP module_sp (GetSP ()); 606c2ff9318SGreg Clayton if (module_sp) 6073467d80bSEnrico Granata return module_sp->GetVersion(versions, num_versions); 6083467d80bSEnrico Granata else 609c2ff9318SGreg Clayton { 610c2ff9318SGreg Clayton if (versions && num_versions) 611c2ff9318SGreg Clayton { 612c2ff9318SGreg Clayton for (uint32_t i=0; i<num_versions; ++i) 613c2ff9318SGreg Clayton versions[i] = UINT32_MAX; 614c2ff9318SGreg Clayton } 615c2ff9318SGreg Clayton return 0; 616c2ff9318SGreg Clayton } 6173467d80bSEnrico Granata } 618c2ff9318SGreg Clayton 619