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" 18dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectList.h" 19dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectVariable.h" 206f3533fbSEnrico Granata #include "lldb/Symbol/SymbolVendor.h" 21dea8cb4fSGreg Clayton #include "lldb/Symbol/VariableList.h" 22dea8cb4fSGreg Clayton #include "lldb/Target/Target.h" 2330fdc8d8SChris Lattner 2430fdc8d8SChris Lattner using namespace lldb; 25ceb6b139SCaroline Tice using namespace lldb_private; 2630fdc8d8SChris Lattner 2730fdc8d8SChris Lattner 2830fdc8d8SChris Lattner SBModule::SBModule () : 296611103cSGreg Clayton m_opaque_sp () 3030fdc8d8SChris Lattner { 3130fdc8d8SChris Lattner } 3230fdc8d8SChris Lattner 3330fdc8d8SChris Lattner SBModule::SBModule (const lldb::ModuleSP& module_sp) : 346611103cSGreg Clayton m_opaque_sp (module_sp) 3530fdc8d8SChris Lattner { 3630fdc8d8SChris Lattner } 3730fdc8d8SChris Lattner 38efabb123SGreg Clayton SBModule::SBModule(const SBModule &rhs) : 39efabb123SGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 40efabb123SGreg Clayton { 41efabb123SGreg Clayton } 42efabb123SGreg Clayton 43efabb123SGreg Clayton const SBModule & 44efabb123SGreg Clayton SBModule::operator = (const SBModule &rhs) 45efabb123SGreg Clayton { 46efabb123SGreg Clayton if (this != &rhs) 47efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 48efabb123SGreg Clayton return *this; 49efabb123SGreg Clayton } 50efabb123SGreg Clayton 5130fdc8d8SChris Lattner SBModule::~SBModule () 5230fdc8d8SChris Lattner { 5330fdc8d8SChris Lattner } 5430fdc8d8SChris Lattner 5530fdc8d8SChris Lattner bool 5630fdc8d8SChris Lattner SBModule::IsValid () const 5730fdc8d8SChris Lattner { 586611103cSGreg Clayton return m_opaque_sp.get() != NULL; 5930fdc8d8SChris Lattner } 6030fdc8d8SChris Lattner 6130fdc8d8SChris Lattner SBFileSpec 6230fdc8d8SChris Lattner SBModule::GetFileSpec () const 6330fdc8d8SChris Lattner { 642d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 65ceb6b139SCaroline Tice 6630fdc8d8SChris Lattner SBFileSpec file_spec; 676611103cSGreg Clayton if (m_opaque_sp) 686611103cSGreg Clayton file_spec.SetFileSpec(m_opaque_sp->GetFileSpec()); 69ceb6b139SCaroline Tice 70ceb6b139SCaroline Tice if (log) 71ceb6b139SCaroline Tice { 72cfd1acedSGreg Clayton log->Printf ("SBModule(%p)::GetFileSpec () => SBFileSpec(%p)", 73cfd1acedSGreg Clayton m_opaque_sp.get(), file_spec.get()); 74ceb6b139SCaroline Tice } 75ceb6b139SCaroline Tice 7630fdc8d8SChris Lattner return file_spec; 7730fdc8d8SChris Lattner } 7830fdc8d8SChris Lattner 792289fa48SGreg Clayton lldb::SBFileSpec 802289fa48SGreg Clayton SBModule::GetPlatformFileSpec () const 812289fa48SGreg Clayton { 822289fa48SGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 832289fa48SGreg Clayton 842289fa48SGreg Clayton SBFileSpec file_spec; 852289fa48SGreg Clayton if (m_opaque_sp) 862289fa48SGreg Clayton file_spec.SetFileSpec(m_opaque_sp->GetPlatformFileSpec()); 872289fa48SGreg Clayton 882289fa48SGreg Clayton if (log) 892289fa48SGreg Clayton { 902289fa48SGreg Clayton log->Printf ("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)", 912289fa48SGreg Clayton m_opaque_sp.get(), file_spec.get()); 922289fa48SGreg Clayton } 932289fa48SGreg Clayton 942289fa48SGreg Clayton return file_spec; 952289fa48SGreg Clayton 962289fa48SGreg Clayton } 972289fa48SGreg Clayton 982289fa48SGreg Clayton bool 992289fa48SGreg Clayton SBModule::SetPlatformFileSpec (const lldb::SBFileSpec &platform_file) 1002289fa48SGreg Clayton { 1012289fa48SGreg Clayton bool result = false; 1022289fa48SGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1032289fa48SGreg Clayton 1042289fa48SGreg Clayton if (m_opaque_sp) 1052289fa48SGreg Clayton { 1062289fa48SGreg Clayton m_opaque_sp->SetPlatformFileSpec(*platform_file); 1072289fa48SGreg Clayton result = true; 1082289fa48SGreg Clayton } 1092289fa48SGreg Clayton 1102289fa48SGreg Clayton if (log) 1112289fa48SGreg Clayton { 1122289fa48SGreg Clayton log->Printf ("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s%s%s)) => %i", 1132289fa48SGreg Clayton m_opaque_sp.get(), 1142289fa48SGreg Clayton platform_file.get(), 1152289fa48SGreg Clayton platform_file->GetDirectory().GetCString(), 1162289fa48SGreg Clayton platform_file->GetDirectory() ? "/" : "", 1172289fa48SGreg Clayton platform_file->GetFilename().GetCString(), 1182289fa48SGreg Clayton result); 1192289fa48SGreg Clayton } 1202289fa48SGreg Clayton return result; 1212289fa48SGreg Clayton } 1222289fa48SGreg Clayton 1232289fa48SGreg Clayton 1242289fa48SGreg Clayton 12530fdc8d8SChris Lattner const uint8_t * 12630fdc8d8SChris Lattner SBModule::GetUUIDBytes () const 12730fdc8d8SChris Lattner { 1282d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 129ceb6b139SCaroline Tice 1304838131bSGreg Clayton const uint8_t *uuid_bytes = NULL; 1316611103cSGreg Clayton if (m_opaque_sp) 1324838131bSGreg Clayton uuid_bytes = (const uint8_t *)m_opaque_sp->GetUUID().GetBytes(); 133ceb6b139SCaroline Tice 134ceb6b139SCaroline Tice if (log) 1354838131bSGreg Clayton { 1364838131bSGreg Clayton if (uuid_bytes) 1374838131bSGreg Clayton { 1384838131bSGreg Clayton StreamString s; 1394838131bSGreg Clayton m_opaque_sp->GetUUID().Dump (&s); 1404838131bSGreg Clayton log->Printf ("SBModule(%p)::GetUUIDBytes () => %s", m_opaque_sp.get(), s.GetData()); 1414838131bSGreg Clayton } 1424838131bSGreg Clayton else 1434838131bSGreg Clayton log->Printf ("SBModule(%p)::GetUUIDBytes () => NULL", m_opaque_sp.get()); 1444838131bSGreg Clayton } 1454838131bSGreg Clayton return uuid_bytes; 14630fdc8d8SChris Lattner } 14730fdc8d8SChris Lattner 14830fdc8d8SChris Lattner 149df2963edSJohnny Chen const char * 150df2963edSJohnny Chen SBModule::GetUUIDString () const 151df2963edSJohnny Chen { 152df2963edSJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 153df2963edSJohnny Chen 154df2963edSJohnny Chen static char uuid_string[80]; 155df2963edSJohnny Chen const char * uuid_c_string = NULL; 156df2963edSJohnny Chen if (m_opaque_sp) 157df2963edSJohnny Chen uuid_c_string = (const char *)m_opaque_sp->GetUUID().GetAsCString(uuid_string, sizeof(uuid_string)); 158df2963edSJohnny Chen 159df2963edSJohnny Chen if (log) 160df2963edSJohnny Chen { 161df2963edSJohnny Chen if (uuid_c_string) 162df2963edSJohnny Chen { 163df2963edSJohnny Chen StreamString s; 164df2963edSJohnny Chen m_opaque_sp->GetUUID().Dump (&s); 165df2963edSJohnny Chen log->Printf ("SBModule(%p)::GetUUIDString () => %s", m_opaque_sp.get(), s.GetData()); 166df2963edSJohnny Chen } 167df2963edSJohnny Chen else 168df2963edSJohnny Chen log->Printf ("SBModule(%p)::GetUUIDString () => NULL", m_opaque_sp.get()); 169df2963edSJohnny Chen } 170df2963edSJohnny Chen return uuid_c_string; 171df2963edSJohnny Chen } 172df2963edSJohnny Chen 173df2963edSJohnny Chen 17430fdc8d8SChris Lattner bool 17530fdc8d8SChris Lattner SBModule::operator == (const SBModule &rhs) const 17630fdc8d8SChris Lattner { 1776611103cSGreg Clayton if (m_opaque_sp) 1786611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 17930fdc8d8SChris Lattner return false; 18030fdc8d8SChris Lattner } 18130fdc8d8SChris Lattner 18230fdc8d8SChris Lattner bool 18330fdc8d8SChris Lattner SBModule::operator != (const SBModule &rhs) const 18430fdc8d8SChris Lattner { 1856611103cSGreg Clayton if (m_opaque_sp) 1866611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 18730fdc8d8SChris Lattner return false; 18830fdc8d8SChris Lattner } 18930fdc8d8SChris Lattner 19030fdc8d8SChris Lattner lldb::ModuleSP & 19130fdc8d8SChris Lattner SBModule::operator *() 19230fdc8d8SChris Lattner { 1936611103cSGreg Clayton return m_opaque_sp; 19430fdc8d8SChris Lattner } 19530fdc8d8SChris Lattner 19630fdc8d8SChris Lattner lldb_private::Module * 19730fdc8d8SChris Lattner SBModule::operator ->() 19830fdc8d8SChris Lattner { 1996611103cSGreg Clayton return m_opaque_sp.get(); 20030fdc8d8SChris Lattner } 20130fdc8d8SChris Lattner 20230fdc8d8SChris Lattner const lldb_private::Module * 20330fdc8d8SChris Lattner SBModule::operator ->() const 20430fdc8d8SChris Lattner { 2056611103cSGreg Clayton return m_opaque_sp.get(); 20630fdc8d8SChris Lattner } 20730fdc8d8SChris Lattner 20830fdc8d8SChris Lattner lldb_private::Module * 20930fdc8d8SChris Lattner SBModule::get() 21030fdc8d8SChris Lattner { 2116611103cSGreg Clayton return m_opaque_sp.get(); 21230fdc8d8SChris Lattner } 21330fdc8d8SChris Lattner 21430fdc8d8SChris Lattner const lldb_private::Module * 21530fdc8d8SChris Lattner SBModule::get() const 21630fdc8d8SChris Lattner { 2176611103cSGreg Clayton return m_opaque_sp.get(); 21830fdc8d8SChris Lattner } 21930fdc8d8SChris Lattner 220cac9c5f9SGreg Clayton const lldb::ModuleSP & 221cac9c5f9SGreg Clayton SBModule::get_sp() const 222cac9c5f9SGreg Clayton { 223cac9c5f9SGreg Clayton return m_opaque_sp; 224cac9c5f9SGreg Clayton } 22530fdc8d8SChris Lattner 22630fdc8d8SChris Lattner void 22730fdc8d8SChris Lattner SBModule::SetModule (const lldb::ModuleSP& module_sp) 22830fdc8d8SChris Lattner { 2296611103cSGreg Clayton m_opaque_sp = module_sp; 23030fdc8d8SChris Lattner } 23130fdc8d8SChris Lattner 23209960031SGreg Clayton 233cac9c5f9SGreg Clayton SBAddress 234cac9c5f9SGreg Clayton SBModule::ResolveFileAddress (lldb::addr_t vm_addr) 23509960031SGreg Clayton { 236cac9c5f9SGreg Clayton lldb::SBAddress sb_addr; 237cac9c5f9SGreg Clayton if (m_opaque_sp) 238cac9c5f9SGreg Clayton { 239cac9c5f9SGreg Clayton Address addr; 240cac9c5f9SGreg Clayton if (m_opaque_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; 25009960031SGreg Clayton if (m_opaque_sp && addr.IsValid()) 25100e6fbfeSGreg Clayton m_opaque_sp->ResolveSymbolContextForAddress (addr.ref(), resolve_scope, *sb_sc); 25209960031SGreg Clayton return sb_sc; 25309960031SGreg Clayton } 25409960031SGreg Clayton 255dde9cff3SCaroline Tice bool 256dde9cff3SCaroline Tice SBModule::GetDescription (SBStream &description) 257dde9cff3SCaroline Tice { 258da7bc7d0SGreg Clayton Stream &strm = description.ref(); 259da7bc7d0SGreg Clayton 260dde9cff3SCaroline Tice if (m_opaque_sp) 261dde9cff3SCaroline Tice { 262da7bc7d0SGreg Clayton m_opaque_sp->GetDescription (&strm); 263dde9cff3SCaroline Tice } 264dde9cff3SCaroline Tice else 265da7bc7d0SGreg Clayton strm.PutCString ("No value"); 266dde9cff3SCaroline Tice 267dde9cff3SCaroline Tice return true; 268dde9cff3SCaroline Tice } 269bbdabce2SGreg Clayton 270bbdabce2SGreg Clayton size_t 271bbdabce2SGreg Clayton SBModule::GetNumSymbols () 272bbdabce2SGreg Clayton { 273bbdabce2SGreg Clayton if (m_opaque_sp) 274bbdabce2SGreg Clayton { 275bbdabce2SGreg Clayton ObjectFile *obj_file = m_opaque_sp->GetObjectFile(); 276bbdabce2SGreg Clayton if (obj_file) 277bbdabce2SGreg Clayton { 278bbdabce2SGreg Clayton Symtab *symtab = obj_file->GetSymtab(); 279bbdabce2SGreg Clayton if (symtab) 280bbdabce2SGreg Clayton return symtab->GetNumSymbols(); 281bbdabce2SGreg Clayton } 282bbdabce2SGreg Clayton } 283bbdabce2SGreg Clayton return 0; 284bbdabce2SGreg Clayton } 285bbdabce2SGreg Clayton 286bbdabce2SGreg Clayton SBSymbol 287bbdabce2SGreg Clayton SBModule::GetSymbolAtIndex (size_t idx) 288bbdabce2SGreg Clayton { 289bbdabce2SGreg Clayton SBSymbol sb_symbol; 290bbdabce2SGreg Clayton if (m_opaque_sp) 291bbdabce2SGreg Clayton { 292bbdabce2SGreg Clayton ObjectFile *obj_file = m_opaque_sp->GetObjectFile(); 293bbdabce2SGreg Clayton if (obj_file) 294bbdabce2SGreg Clayton { 295bbdabce2SGreg Clayton Symtab *symtab = obj_file->GetSymtab(); 296bbdabce2SGreg Clayton if (symtab) 297bbdabce2SGreg Clayton sb_symbol.SetSymbol(symtab->SymbolAtIndex (idx)); 298bbdabce2SGreg Clayton } 299bbdabce2SGreg Clayton } 300bbdabce2SGreg Clayton return sb_symbol; 301bbdabce2SGreg Clayton } 302fe356d35SGreg Clayton 303cac9c5f9SGreg Clayton size_t 304cac9c5f9SGreg Clayton SBModule::GetNumSections () 305cac9c5f9SGreg Clayton { 306cac9c5f9SGreg Clayton if (m_opaque_sp) 307cac9c5f9SGreg Clayton { 308cac9c5f9SGreg Clayton ObjectFile *obj_file = m_opaque_sp->GetObjectFile(); 309cac9c5f9SGreg Clayton if (obj_file) 310cac9c5f9SGreg Clayton { 311cac9c5f9SGreg Clayton SectionList *section_list = obj_file->GetSectionList (); 312cac9c5f9SGreg Clayton if (section_list) 313cac9c5f9SGreg Clayton return section_list->GetSize(); 314cac9c5f9SGreg Clayton } 315cac9c5f9SGreg Clayton } 316cac9c5f9SGreg Clayton return 0; 317cac9c5f9SGreg Clayton } 318cac9c5f9SGreg Clayton 319cac9c5f9SGreg Clayton SBSection 320cac9c5f9SGreg Clayton SBModule::GetSectionAtIndex (size_t idx) 321cac9c5f9SGreg Clayton { 322cac9c5f9SGreg Clayton SBSection sb_section; 323cac9c5f9SGreg Clayton if (m_opaque_sp) 324cac9c5f9SGreg Clayton { 325cac9c5f9SGreg Clayton ObjectFile *obj_file = m_opaque_sp->GetObjectFile(); 326cac9c5f9SGreg Clayton if (obj_file) 327cac9c5f9SGreg Clayton { 328cac9c5f9SGreg Clayton SectionList *section_list = obj_file->GetSectionList (); 329cac9c5f9SGreg Clayton 330cac9c5f9SGreg Clayton if (section_list) 331cac9c5f9SGreg Clayton sb_section.SetSection(section_list->GetSectionAtIndex (idx).get()); 332cac9c5f9SGreg Clayton } 333cac9c5f9SGreg Clayton } 334cac9c5f9SGreg Clayton return sb_section; 335cac9c5f9SGreg Clayton } 336cac9c5f9SGreg Clayton 337fe356d35SGreg Clayton uint32_t 338fe356d35SGreg Clayton SBModule::FindFunctions (const char *name, 339fe356d35SGreg Clayton uint32_t name_type_mask, 340fe356d35SGreg Clayton bool append, 341fe356d35SGreg Clayton lldb::SBSymbolContextList& sc_list) 342fe356d35SGreg Clayton { 343fe356d35SGreg Clayton if (!append) 344fe356d35SGreg Clayton sc_list.Clear(); 345*4efffd9aSJohnny Chen if (name && m_opaque_sp) 346fe356d35SGreg Clayton { 347fe356d35SGreg Clayton const bool symbols_ok = true; 348fe356d35SGreg Clayton return m_opaque_sp->FindFunctions (ConstString(name), 349b6d70ebcSSean Callanan NULL, 350fe356d35SGreg Clayton name_type_mask, 351fe356d35SGreg Clayton symbols_ok, 352fe356d35SGreg Clayton append, 353fe356d35SGreg Clayton *sc_list); 354fe356d35SGreg Clayton } 355fe356d35SGreg Clayton return 0; 356fe356d35SGreg Clayton } 357fe356d35SGreg Clayton 358dea8cb4fSGreg Clayton 359dea8cb4fSGreg Clayton SBValueList 360dea8cb4fSGreg Clayton SBModule::FindGlobalVariables (SBTarget &target, const char *name, uint32_t max_matches) 361dea8cb4fSGreg Clayton { 362dea8cb4fSGreg Clayton SBValueList sb_value_list; 363*4efffd9aSJohnny Chen if (name && m_opaque_sp) 364dea8cb4fSGreg Clayton { 365dea8cb4fSGreg Clayton VariableList variable_list; 366dea8cb4fSGreg Clayton const uint32_t match_count = m_opaque_sp->FindGlobalVariables (ConstString (name), 367b6d70ebcSSean Callanan NULL, 368dea8cb4fSGreg Clayton false, 369dea8cb4fSGreg Clayton max_matches, 370dea8cb4fSGreg Clayton variable_list); 371dea8cb4fSGreg Clayton 372dea8cb4fSGreg Clayton if (match_count > 0) 373dea8cb4fSGreg Clayton { 374dea8cb4fSGreg Clayton ValueObjectList &value_object_list = sb_value_list.ref(); 375dea8cb4fSGreg Clayton for (uint32_t i=0; i<match_count; ++i) 376dea8cb4fSGreg Clayton { 377dea8cb4fSGreg Clayton lldb::ValueObjectSP valobj_sp; 378dea8cb4fSGreg Clayton if (target.IsValid()) 379dea8cb4fSGreg Clayton valobj_sp = ValueObjectVariable::Create (target.get(), variable_list.GetVariableAtIndex(i)); 380dea8cb4fSGreg Clayton else 381dea8cb4fSGreg Clayton valobj_sp = ValueObjectVariable::Create (NULL, variable_list.GetVariableAtIndex(i)); 382dea8cb4fSGreg Clayton if (valobj_sp) 383dea8cb4fSGreg Clayton value_object_list.Append(valobj_sp); 384dea8cb4fSGreg Clayton } 385dea8cb4fSGreg Clayton } 386dea8cb4fSGreg Clayton } 387dea8cb4fSGreg Clayton 388dea8cb4fSGreg Clayton return sb_value_list; 389dea8cb4fSGreg Clayton } 3906f3533fbSEnrico Granata 3916f3533fbSEnrico Granata lldb::SBType 3926f3533fbSEnrico Granata SBModule::FindFirstType (const char *name_cstr) 3936f3533fbSEnrico Granata { 394fe42ac4dSGreg Clayton SBType sb_type; 395*4efffd9aSJohnny Chen if (name_cstr && IsValid()) 396fe42ac4dSGreg Clayton { 3976f3533fbSEnrico Granata SymbolContext sc; 3986f3533fbSEnrico Granata TypeList type_list; 3996f3533fbSEnrico Granata uint32_t num_matches = 0; 4006f3533fbSEnrico Granata ConstString name(name_cstr); 4016f3533fbSEnrico Granata 4026f3533fbSEnrico Granata num_matches = m_opaque_sp->FindTypes(sc, 4036f3533fbSEnrico Granata name, 404b6d70ebcSSean Callanan NULL, 4056f3533fbSEnrico Granata false, 4066f3533fbSEnrico Granata 1, 4076f3533fbSEnrico Granata type_list); 4086f3533fbSEnrico Granata 4096f3533fbSEnrico Granata if (num_matches) 410fe42ac4dSGreg Clayton sb_type = lldb::SBType(type_list.GetTypeAtIndex(0)); 4116f3533fbSEnrico Granata } 412fe42ac4dSGreg Clayton return sb_type; 4136f3533fbSEnrico Granata } 4146f3533fbSEnrico Granata 4156f3533fbSEnrico Granata lldb::SBTypeList 4166f3533fbSEnrico Granata SBModule::FindTypes (const char *type) 4176f3533fbSEnrico Granata { 4186f3533fbSEnrico Granata 4196f3533fbSEnrico Granata SBTypeList retval; 4206f3533fbSEnrico Granata 421*4efffd9aSJohnny Chen if (type && IsValid()) 422fe42ac4dSGreg Clayton { 4236f3533fbSEnrico Granata SymbolContext sc; 4246f3533fbSEnrico Granata TypeList type_list; 4256f3533fbSEnrico Granata uint32_t num_matches = 0; 4266f3533fbSEnrico Granata ConstString name(type); 4276f3533fbSEnrico Granata 4286f3533fbSEnrico Granata num_matches = m_opaque_sp->FindTypes(sc, 4296f3533fbSEnrico Granata name, 430b6d70ebcSSean Callanan NULL, 4316f3533fbSEnrico Granata false, 4326f3533fbSEnrico Granata UINT32_MAX, 4336f3533fbSEnrico Granata type_list); 4346f3533fbSEnrico Granata 4356f3533fbSEnrico Granata for (size_t idx = 0; idx < num_matches; idx++) 4366f3533fbSEnrico Granata { 437fe42ac4dSGreg Clayton TypeSP type_sp (type_list.GetTypeAtIndex(idx)); 438fe42ac4dSGreg Clayton if (type_sp) 439fe42ac4dSGreg Clayton retval.Append(SBType(type_sp)); 440fe42ac4dSGreg Clayton } 4416f3533fbSEnrico Granata } 4426f3533fbSEnrico Granata 4436f3533fbSEnrico Granata return retval; 4446f3533fbSEnrico Granata } 445cac9c5f9SGreg Clayton 446cac9c5f9SGreg Clayton 447cac9c5f9SGreg Clayton SBSection 448cac9c5f9SGreg Clayton SBModule::FindSection (const char *sect_name) 449cac9c5f9SGreg Clayton { 450cac9c5f9SGreg Clayton SBSection sb_section; 451cac9c5f9SGreg Clayton 452*4efffd9aSJohnny Chen if (sect_name && IsValid()) 453cac9c5f9SGreg Clayton { 454cac9c5f9SGreg Clayton ObjectFile *objfile = m_opaque_sp->GetObjectFile(); 455cac9c5f9SGreg Clayton if (objfile) 456cac9c5f9SGreg Clayton { 457cac9c5f9SGreg Clayton SectionList *section_list = objfile->GetSectionList(); 458cac9c5f9SGreg Clayton if (section_list) 459cac9c5f9SGreg Clayton { 460cac9c5f9SGreg Clayton ConstString const_sect_name(sect_name); 461cac9c5f9SGreg Clayton SectionSP section_sp (section_list->FindSectionByName(const_sect_name)); 462cac9c5f9SGreg Clayton if (section_sp) 463cac9c5f9SGreg Clayton { 464cac9c5f9SGreg Clayton sb_section.SetSection(section_sp.get()); 465cac9c5f9SGreg Clayton } 466cac9c5f9SGreg Clayton } 467cac9c5f9SGreg Clayton } 468cac9c5f9SGreg Clayton } 469cac9c5f9SGreg Clayton return sb_section; 470cac9c5f9SGreg Clayton } 471cac9c5f9SGreg Clayton 472