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" 13226cce25SGreg Clayton #include "lldb/API/SBModuleSpec.h" 14c9660546SGreg Clayton #include "lldb/API/SBProcess.h" 15dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 16fe356d35SGreg Clayton #include "lldb/API/SBSymbolContextList.h" 17b9c1b51eSKate Stone #include "lldb/Core/Module.h" 181f746071SGreg Clayton #include "lldb/Core/Section.h" 19dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectList.h" 20dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectVariable.h" 211f746071SGreg Clayton #include "lldb/Symbol/ObjectFile.h" 22ae088e52SGreg Clayton #include "lldb/Symbol/SymbolFile.h" 236f3533fbSEnrico Granata #include "lldb/Symbol/SymbolVendor.h" 241f746071SGreg Clayton #include "lldb/Symbol/Symtab.h" 2556939cb3SGreg Clayton #include "lldb/Symbol/TypeSystem.h" 26dea8cb4fSGreg Clayton #include "lldb/Symbol/VariableList.h" 27dea8cb4fSGreg Clayton #include "lldb/Target/Target.h" 286f9e6901SZachary Turner #include "lldb/Utility/Log.h" 29bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h" 3030fdc8d8SChris Lattner 3130fdc8d8SChris Lattner using namespace lldb; 32ceb6b139SCaroline Tice using namespace lldb_private; 3330fdc8d8SChris Lattner 34b9c1b51eSKate Stone SBModule::SBModule() : m_opaque_sp() {} 3530fdc8d8SChris Lattner 36b9c1b51eSKate Stone SBModule::SBModule(const lldb::ModuleSP &module_sp) : m_opaque_sp(module_sp) {} 3730fdc8d8SChris Lattner 38b9c1b51eSKate Stone SBModule::SBModule(const SBModuleSpec &module_spec) : m_opaque_sp() { 39226cce25SGreg Clayton ModuleSP module_sp; 40*97206d57SZachary Turner Status error = ModuleList::GetSharedModule(*module_spec.m_opaque_ap, 41*97206d57SZachary Turner module_sp, NULL, NULL, NULL); 42226cce25SGreg Clayton if (module_sp) 43226cce25SGreg Clayton SetSP(module_sp); 44226cce25SGreg Clayton } 45226cce25SGreg Clayton 46b9c1b51eSKate Stone SBModule::SBModule(const SBModule &rhs) : m_opaque_sp(rhs.m_opaque_sp) {} 47efabb123SGreg Clayton 48b9c1b51eSKate Stone SBModule::SBModule(lldb::SBProcess &process, lldb::addr_t header_addr) 49b9c1b51eSKate Stone : m_opaque_sp() { 50c9660546SGreg Clayton ProcessSP process_sp(process.GetSP()); 51b9c1b51eSKate Stone if (process_sp) { 5239f7ee86SGreg Clayton m_opaque_sp = process_sp->ReadModuleFromMemory(FileSpec(), header_addr); 53b9c1b51eSKate Stone if (m_opaque_sp) { 5439f7ee86SGreg Clayton Target &target = process_sp->GetTarget(); 5539f7ee86SGreg Clayton bool changed = false; 56751caf65SGreg Clayton m_opaque_sp->SetLoadAddress(target, 0, true, changed); 5739f7ee86SGreg Clayton target.GetImages().Append(m_opaque_sp); 5839f7ee86SGreg Clayton } 59c859e2d5SGreg Clayton } 60c9660546SGreg Clayton } 61c9660546SGreg Clayton 62b9c1b51eSKate Stone const SBModule &SBModule::operator=(const SBModule &rhs) { 63efabb123SGreg Clayton if (this != &rhs) 64efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 65efabb123SGreg Clayton return *this; 66efabb123SGreg Clayton } 67efabb123SGreg Clayton 68b9c1b51eSKate Stone SBModule::~SBModule() {} 6930fdc8d8SChris Lattner 70b9c1b51eSKate Stone bool SBModule::IsValid() const { return m_opaque_sp.get() != NULL; } 7130fdc8d8SChris Lattner 72b9c1b51eSKate Stone void SBModule::Clear() { m_opaque_sp.reset(); } 735d3bca4eSJim Ingham 74b9c1b51eSKate Stone SBFileSpec SBModule::GetFileSpec() const { 755160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 76ceb6b139SCaroline Tice 7730fdc8d8SChris Lattner SBFileSpec file_spec; 78c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 79c2ff9318SGreg Clayton if (module_sp) 80c2ff9318SGreg Clayton file_spec.SetFileSpec(module_sp->GetFileSpec()); 81ceb6b139SCaroline Tice 82ceb6b139SCaroline Tice if (log) 83cfd1acedSGreg Clayton log->Printf("SBModule(%p)::GetFileSpec () => SBFileSpec(%p)", 84324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get()), 85324a1036SSaleem Abdulrasool static_cast<const void *>(file_spec.get())); 86ceb6b139SCaroline Tice 8730fdc8d8SChris Lattner return file_spec; 8830fdc8d8SChris Lattner } 8930fdc8d8SChris Lattner 90b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetPlatformFileSpec() const { 915160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 922289fa48SGreg Clayton 932289fa48SGreg Clayton SBFileSpec file_spec; 94c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 95c2ff9318SGreg Clayton if (module_sp) 96c2ff9318SGreg Clayton file_spec.SetFileSpec(module_sp->GetPlatformFileSpec()); 972289fa48SGreg Clayton 982289fa48SGreg Clayton if (log) 992289fa48SGreg Clayton log->Printf("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)", 100324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get()), 101324a1036SSaleem Abdulrasool static_cast<const void *>(file_spec.get())); 1022289fa48SGreg Clayton 1032289fa48SGreg Clayton return file_spec; 1042289fa48SGreg Clayton } 1052289fa48SGreg Clayton 106b9c1b51eSKate Stone bool SBModule::SetPlatformFileSpec(const lldb::SBFileSpec &platform_file) { 1072289fa48SGreg Clayton bool result = false; 1085160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1092289fa48SGreg Clayton 110c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 111b9c1b51eSKate Stone if (module_sp) { 112c2ff9318SGreg Clayton module_sp->SetPlatformFileSpec(*platform_file); 1132289fa48SGreg Clayton result = true; 1142289fa48SGreg Clayton } 1152289fa48SGreg Clayton 1162289fa48SGreg Clayton if (log) 117b5ad4ec7SGreg Clayton log->Printf("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s)) => %i", 118324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get()), 119324a1036SSaleem Abdulrasool static_cast<const void *>(platform_file.get()), 120324a1036SSaleem Abdulrasool platform_file->GetPath().c_str(), result); 1212289fa48SGreg Clayton return result; 1222289fa48SGreg Clayton } 1232289fa48SGreg Clayton 124b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetRemoteInstallFileSpec() { 125fbb76349SGreg Clayton SBFileSpec sb_file_spec; 126fbb76349SGreg Clayton ModuleSP module_sp(GetSP()); 127fbb76349SGreg Clayton if (module_sp) 128fbb76349SGreg Clayton sb_file_spec.SetFileSpec(module_sp->GetRemoteInstallFileSpec()); 129fbb76349SGreg Clayton return sb_file_spec; 130fbb76349SGreg Clayton } 131fbb76349SGreg Clayton 132b9c1b51eSKate Stone bool SBModule::SetRemoteInstallFileSpec(lldb::SBFileSpec &file) { 133fbb76349SGreg Clayton ModuleSP module_sp(GetSP()); 134b9c1b51eSKate Stone if (module_sp) { 135fbb76349SGreg Clayton module_sp->SetRemoteInstallFileSpec(file.ref()); 136fbb76349SGreg Clayton return true; 137fbb76349SGreg Clayton } 138fbb76349SGreg Clayton return false; 139fbb76349SGreg Clayton } 1402289fa48SGreg Clayton 141b9c1b51eSKate Stone const uint8_t *SBModule::GetUUIDBytes() const { 1425160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 143ceb6b139SCaroline Tice 1444838131bSGreg Clayton const uint8_t *uuid_bytes = NULL; 145c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 146c2ff9318SGreg Clayton if (module_sp) 147c2ff9318SGreg Clayton uuid_bytes = (const uint8_t *)module_sp->GetUUID().GetBytes(); 148ceb6b139SCaroline Tice 149b9c1b51eSKate Stone if (log) { 150b9c1b51eSKate Stone if (uuid_bytes) { 1514838131bSGreg Clayton StreamString s; 152c2ff9318SGreg Clayton module_sp->GetUUID().Dump(&s); 153324a1036SSaleem Abdulrasool log->Printf("SBModule(%p)::GetUUIDBytes () => %s", 154324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get()), s.GetData()); 155b9c1b51eSKate Stone } else 156324a1036SSaleem Abdulrasool log->Printf("SBModule(%p)::GetUUIDBytes () => NULL", 157324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get())); 1584838131bSGreg Clayton } 1594838131bSGreg Clayton return uuid_bytes; 16030fdc8d8SChris Lattner } 16130fdc8d8SChris Lattner 162b9c1b51eSKate Stone const char *SBModule::GetUUIDString() const { 1635160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 164df2963edSJohnny Chen 165f1be855aSGreg Clayton const char *uuid_cstr = NULL; 166c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 167b9c1b51eSKate Stone if (module_sp) { 168f1be855aSGreg Clayton // We are going to return a "const char *" value through the public 16958ef391fSBruce Mitchener // API, so we need to constify it so it gets added permanently the 170f1be855aSGreg Clayton // string pool and then we don't need to worry about the lifetime of the 171f1be855aSGreg Clayton // string as it will never go away once it has been put into the ConstString 172f1be855aSGreg Clayton // string pool 173f1be855aSGreg Clayton uuid_cstr = ConstString(module_sp->GetUUID().GetAsString()).GetCString(); 174f1be855aSGreg Clayton } 175f1be855aSGreg Clayton 176b9c1b51eSKate Stone if (uuid_cstr && uuid_cstr[0]) { 177f1be855aSGreg Clayton if (log) 178b9c1b51eSKate Stone log->Printf("SBModule(%p)::GetUUIDString () => %s", 179b9c1b51eSKate Stone static_cast<void *>(module_sp.get()), uuid_cstr); 180f1be855aSGreg Clayton return uuid_cstr; 181c16b4af0SJason Molenda } 182df2963edSJohnny Chen 183df2963edSJohnny Chen if (log) 184b9c1b51eSKate Stone log->Printf("SBModule(%p)::GetUUIDString () => NULL", 185b9c1b51eSKate Stone static_cast<void *>(module_sp.get())); 186f1be855aSGreg Clayton return NULL; 187df2963edSJohnny Chen } 188df2963edSJohnny Chen 189b9c1b51eSKate Stone bool SBModule::operator==(const SBModule &rhs) const { 1906611103cSGreg Clayton if (m_opaque_sp) 1916611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 19230fdc8d8SChris Lattner return false; 19330fdc8d8SChris Lattner } 19430fdc8d8SChris Lattner 195b9c1b51eSKate Stone bool SBModule::operator!=(const SBModule &rhs) const { 1966611103cSGreg Clayton if (m_opaque_sp) 1976611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 19830fdc8d8SChris Lattner return false; 19930fdc8d8SChris Lattner } 20030fdc8d8SChris Lattner 201b9c1b51eSKate Stone ModuleSP SBModule::GetSP() const { return m_opaque_sp; } 20230fdc8d8SChris Lattner 203b9c1b51eSKate Stone void SBModule::SetSP(const ModuleSP &module_sp) { m_opaque_sp = module_sp; } 20430fdc8d8SChris Lattner 205b9c1b51eSKate Stone SBAddress SBModule::ResolveFileAddress(lldb::addr_t vm_addr) { 206cac9c5f9SGreg Clayton lldb::SBAddress sb_addr; 207c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 208b9c1b51eSKate Stone if (module_sp) { 209cac9c5f9SGreg Clayton Address addr; 210c2ff9318SGreg Clayton if (module_sp->ResolveFileAddress(vm_addr, addr)) 211cac9c5f9SGreg Clayton sb_addr.ref() = addr; 212cac9c5f9SGreg Clayton } 213cac9c5f9SGreg Clayton return sb_addr; 21409960031SGreg Clayton } 21509960031SGreg Clayton 21609960031SGreg Clayton SBSymbolContext 217b9c1b51eSKate Stone SBModule::ResolveSymbolContextForAddress(const SBAddress &addr, 218b9c1b51eSKate Stone uint32_t resolve_scope) { 21909960031SGreg Clayton SBSymbolContext sb_sc; 220c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 221c2ff9318SGreg Clayton if (module_sp && addr.IsValid()) 222b9c1b51eSKate Stone module_sp->ResolveSymbolContextForAddress(addr.ref(), resolve_scope, 223b9c1b51eSKate Stone *sb_sc); 22409960031SGreg Clayton return sb_sc; 22509960031SGreg Clayton } 22609960031SGreg Clayton 227b9c1b51eSKate Stone bool SBModule::GetDescription(SBStream &description) { 228da7bc7d0SGreg Clayton Stream &strm = description.ref(); 229da7bc7d0SGreg Clayton 230c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 231b9c1b51eSKate Stone if (module_sp) { 232c2ff9318SGreg Clayton module_sp->GetDescription(&strm); 233b9c1b51eSKate Stone } else 234da7bc7d0SGreg Clayton strm.PutCString("No value"); 235dde9cff3SCaroline Tice 236dde9cff3SCaroline Tice return true; 237dde9cff3SCaroline Tice } 238bbdabce2SGreg Clayton 239b9c1b51eSKate Stone uint32_t SBModule::GetNumCompileUnits() { 240873a7a4bSJohnny Chen ModuleSP module_sp(GetSP()); 241b9c1b51eSKate Stone if (module_sp) { 242873a7a4bSJohnny Chen return module_sp->GetNumCompileUnits(); 243873a7a4bSJohnny Chen } 244873a7a4bSJohnny Chen return 0; 245873a7a4bSJohnny Chen } 246873a7a4bSJohnny Chen 247b9c1b51eSKate Stone SBCompileUnit SBModule::GetCompileUnitAtIndex(uint32_t index) { 248873a7a4bSJohnny Chen SBCompileUnit sb_cu; 249873a7a4bSJohnny Chen ModuleSP module_sp(GetSP()); 250b9c1b51eSKate Stone if (module_sp) { 251873a7a4bSJohnny Chen CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(index); 252873a7a4bSJohnny Chen sb_cu.reset(cu_sp.get()); 253873a7a4bSJohnny Chen } 254873a7a4bSJohnny Chen return sb_cu; 255873a7a4bSJohnny Chen } 256873a7a4bSJohnny Chen 257b9c1b51eSKate Stone static Symtab *GetUnifiedSymbolTable(const lldb::ModuleSP &module_sp) { 258b9c1b51eSKate Stone if (module_sp) { 259a7499c98SMichael Sartain SymbolVendor *symbols = module_sp->GetSymbolVendor(); 260a7499c98SMichael Sartain if (symbols) 261a7499c98SMichael Sartain return symbols->GetSymtab(); 262a7499c98SMichael Sartain } 263a7499c98SMichael Sartain return NULL; 264a7499c98SMichael Sartain } 265a7499c98SMichael Sartain 266b9c1b51eSKate Stone size_t SBModule::GetNumSymbols() { 267c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 268b9c1b51eSKate Stone if (module_sp) { 269a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 270bbdabce2SGreg Clayton if (symtab) 271bbdabce2SGreg Clayton return symtab->GetNumSymbols(); 272bbdabce2SGreg Clayton } 273bbdabce2SGreg Clayton return 0; 274bbdabce2SGreg Clayton } 275bbdabce2SGreg Clayton 276b9c1b51eSKate Stone SBSymbol SBModule::GetSymbolAtIndex(size_t idx) { 277bbdabce2SGreg Clayton SBSymbol sb_symbol; 278c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 279a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 280bbdabce2SGreg Clayton if (symtab) 281bbdabce2SGreg Clayton sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx)); 282bbdabce2SGreg Clayton return sb_symbol; 283bbdabce2SGreg Clayton } 284fe356d35SGreg Clayton 285b9c1b51eSKate Stone lldb::SBSymbol SBModule::FindSymbol(const char *name, 286b9c1b51eSKate Stone lldb::SymbolType symbol_type) { 287e14e1925SGreg Clayton SBSymbol sb_symbol; 288b9c1b51eSKate Stone if (name && name[0]) { 289e14e1925SGreg Clayton ModuleSP module_sp(GetSP()); 290a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 291e14e1925SGreg Clayton if (symtab) 292b9c1b51eSKate Stone sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType( 293b9c1b51eSKate Stone ConstString(name), symbol_type, Symtab::eDebugAny, 294b9c1b51eSKate Stone Symtab::eVisibilityAny)); 295e14e1925SGreg Clayton } 296e14e1925SGreg Clayton return sb_symbol; 297e14e1925SGreg Clayton } 298e14e1925SGreg Clayton 299b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindSymbols(const char *name, 300b9c1b51eSKate Stone lldb::SymbolType symbol_type) { 301e14e1925SGreg Clayton SBSymbolContextList sb_sc_list; 302b9c1b51eSKate Stone if (name && name[0]) { 303e14e1925SGreg Clayton ModuleSP module_sp(GetSP()); 304a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 305b9c1b51eSKate Stone if (symtab) { 306e14e1925SGreg Clayton std::vector<uint32_t> matching_symbol_indexes; 307b9c1b51eSKate Stone const size_t num_matches = symtab->FindAllSymbolsWithNameAndType( 308b9c1b51eSKate Stone ConstString(name), symbol_type, matching_symbol_indexes); 309b9c1b51eSKate Stone if (num_matches) { 310e14e1925SGreg Clayton SymbolContext sc; 311e14e1925SGreg Clayton sc.module_sp = module_sp; 312e14e1925SGreg Clayton SymbolContextList &sc_list = *sb_sc_list; 313b9c1b51eSKate Stone for (size_t i = 0; i < num_matches; ++i) { 314e14e1925SGreg Clayton sc.symbol = symtab->SymbolAtIndex(matching_symbol_indexes[i]); 315e14e1925SGreg Clayton if (sc.symbol) 316e14e1925SGreg Clayton sc_list.Append(sc); 317e14e1925SGreg Clayton } 318e14e1925SGreg Clayton } 319e14e1925SGreg Clayton } 320e14e1925SGreg Clayton } 321e14e1925SGreg Clayton return sb_sc_list; 322e14e1925SGreg Clayton } 323e14e1925SGreg Clayton 324b9c1b51eSKate Stone size_t SBModule::GetNumSections() { 325c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 326b9c1b51eSKate Stone if (module_sp) { 327a7499c98SMichael Sartain // Give the symbol vendor a chance to add to the unified section list. 328a7499c98SMichael Sartain module_sp->GetSymbolVendor(); 3293046e668SGreg Clayton SectionList *section_list = module_sp->GetSectionList(); 330cac9c5f9SGreg Clayton if (section_list) 331cac9c5f9SGreg Clayton return section_list->GetSize(); 332cac9c5f9SGreg Clayton } 333cac9c5f9SGreg Clayton return 0; 334cac9c5f9SGreg Clayton } 335cac9c5f9SGreg Clayton 336b9c1b51eSKate Stone SBSection SBModule::GetSectionAtIndex(size_t idx) { 337cac9c5f9SGreg Clayton SBSection sb_section; 338c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 339b9c1b51eSKate Stone if (module_sp) { 340a7499c98SMichael Sartain // Give the symbol vendor a chance to add to the unified section list. 341a7499c98SMichael Sartain module_sp->GetSymbolVendor(); 3423046e668SGreg Clayton SectionList *section_list = module_sp->GetSectionList(); 343cac9c5f9SGreg Clayton 344cac9c5f9SGreg Clayton if (section_list) 345e72dfb32SGreg Clayton sb_section.SetSP(section_list->GetSectionAtIndex(idx)); 346cac9c5f9SGreg Clayton } 347cac9c5f9SGreg Clayton return sb_section; 348cac9c5f9SGreg Clayton } 349cac9c5f9SGreg Clayton 350b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindFunctions(const char *name, 351b9c1b51eSKate Stone uint32_t name_type_mask) { 3525569e64eSGreg Clayton lldb::SBSymbolContextList sb_sc_list; 353c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 354b9c1b51eSKate Stone if (name && module_sp) { 3555569e64eSGreg Clayton const bool append = true; 356fe356d35SGreg Clayton const bool symbols_ok = true; 3579df05fbbSSean Callanan const bool inlines_ok = true; 358b9c1b51eSKate Stone module_sp->FindFunctions(ConstString(name), NULL, name_type_mask, 359b9c1b51eSKate Stone symbols_ok, inlines_ok, append, *sb_sc_list); 360fe356d35SGreg Clayton } 3615569e64eSGreg Clayton return sb_sc_list; 362fe356d35SGreg Clayton } 363fe356d35SGreg Clayton 364b9c1b51eSKate Stone SBValueList SBModule::FindGlobalVariables(SBTarget &target, const char *name, 365b9c1b51eSKate Stone uint32_t max_matches) { 366dea8cb4fSGreg Clayton SBValueList sb_value_list; 367c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 368b9c1b51eSKate Stone if (name && module_sp) { 369dea8cb4fSGreg Clayton VariableList variable_list; 370b9c1b51eSKate Stone const uint32_t match_count = module_sp->FindGlobalVariables( 371b9c1b51eSKate Stone ConstString(name), NULL, false, max_matches, variable_list); 372dea8cb4fSGreg Clayton 373b9c1b51eSKate Stone if (match_count > 0) { 374b9c1b51eSKate Stone for (uint32_t i = 0; i < match_count; ++i) { 375dea8cb4fSGreg Clayton lldb::ValueObjectSP valobj_sp; 376b9556accSGreg Clayton TargetSP target_sp(target.GetSP()); 377b9c1b51eSKate Stone valobj_sp = ValueObjectVariable::Create( 378b9c1b51eSKate Stone target_sp.get(), variable_list.GetVariableAtIndex(i)); 379dea8cb4fSGreg Clayton if (valobj_sp) 38085425d77SEnrico Granata sb_value_list.Append(SBValue(valobj_sp)); 381dea8cb4fSGreg Clayton } 382dea8cb4fSGreg Clayton } 383dea8cb4fSGreg Clayton } 384dea8cb4fSGreg Clayton 385dea8cb4fSGreg Clayton return sb_value_list; 386dea8cb4fSGreg Clayton } 3876f3533fbSEnrico Granata 388b9c1b51eSKate Stone lldb::SBValue SBModule::FindFirstGlobalVariable(lldb::SBTarget &target, 389b9c1b51eSKate Stone const char *name) { 390bcd80b47SEnrico Granata SBValueList sb_value_list(FindGlobalVariables(target, name, 1)); 391bcd80b47SEnrico Granata if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0) 392bcd80b47SEnrico Granata return sb_value_list.GetValueAtIndex(0); 393bcd80b47SEnrico Granata return SBValue(); 394bcd80b47SEnrico Granata } 395bcd80b47SEnrico Granata 396b9c1b51eSKate Stone lldb::SBType SBModule::FindFirstType(const char *name_cstr) { 397fe42ac4dSGreg Clayton SBType sb_type; 398c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 399b9c1b51eSKate Stone if (name_cstr && module_sp) { 4006f3533fbSEnrico Granata SymbolContext sc; 40184db9105SGreg Clayton const bool exact_match = false; 4026f3533fbSEnrico Granata ConstString name(name_cstr); 4036f3533fbSEnrico Granata 404b43165b7SGreg Clayton sb_type = SBType(module_sp->FindFirstType(sc, name, exact_match)); 4056f3533fbSEnrico Granata 406b9c1b51eSKate Stone if (!sb_type.IsValid()) { 407b9c1b51eSKate Stone TypeSystem *type_system = 408b9c1b51eSKate Stone module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 40956939cb3SGreg Clayton if (type_system) 41056939cb3SGreg Clayton sb_type = SBType(type_system->GetBuiltinTypeByName(name)); 41156939cb3SGreg Clayton } 4126f3533fbSEnrico Granata } 413fe42ac4dSGreg Clayton return sb_type; 4146f3533fbSEnrico Granata } 4156f3533fbSEnrico Granata 416b9c1b51eSKate Stone lldb::SBType SBModule::GetBasicType(lldb::BasicType type) { 417b43165b7SGreg Clayton ModuleSP module_sp(GetSP()); 418b9c1b51eSKate Stone if (module_sp) { 419b9c1b51eSKate Stone TypeSystem *type_system = 420b9c1b51eSKate Stone module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 42156939cb3SGreg Clayton if (type_system) 42256939cb3SGreg Clayton return SBType(type_system->GetBasicTypeFromAST(type)); 42356939cb3SGreg Clayton } 424b43165b7SGreg Clayton return SBType(); 425b43165b7SGreg Clayton } 426b43165b7SGreg Clayton 427b9c1b51eSKate Stone lldb::SBTypeList SBModule::FindTypes(const char *type) { 4286f3533fbSEnrico Granata SBTypeList retval; 4296f3533fbSEnrico Granata 430c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 431b9c1b51eSKate Stone if (type && module_sp) { 4326f3533fbSEnrico Granata SymbolContext sc; 4336f3533fbSEnrico Granata TypeList type_list; 43484db9105SGreg Clayton const bool exact_match = false; 4356f3533fbSEnrico Granata ConstString name(type); 436ae088e52SGreg Clayton llvm::DenseSet<SymbolFile *> searched_symbol_files; 437b9c1b51eSKate Stone const uint32_t num_matches = module_sp->FindTypes( 438b9c1b51eSKate Stone sc, name, exact_match, UINT32_MAX, searched_symbol_files, type_list); 4396f3533fbSEnrico Granata 440b9c1b51eSKate Stone if (num_matches > 0) { 441b9c1b51eSKate Stone for (size_t idx = 0; idx < num_matches; idx++) { 442fe42ac4dSGreg Clayton TypeSP type_sp(type_list.GetTypeAtIndex(idx)); 443fe42ac4dSGreg Clayton if (type_sp) 444fe42ac4dSGreg Clayton retval.Append(SBType(type_sp)); 445fe42ac4dSGreg Clayton } 446b9c1b51eSKate Stone } else { 447b9c1b51eSKate Stone TypeSystem *type_system = 448b9c1b51eSKate Stone module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 449b9c1b51eSKate Stone if (type_system) { 45056939cb3SGreg Clayton CompilerType compiler_type = type_system->GetBuiltinTypeByName(name); 45156939cb3SGreg Clayton if (compiler_type) 45256939cb3SGreg Clayton retval.Append(SBType(compiler_type)); 45356939cb3SGreg Clayton } 454b43165b7SGreg Clayton } 455b43165b7SGreg Clayton } 4566f3533fbSEnrico Granata 4576f3533fbSEnrico Granata return retval; 4586f3533fbSEnrico Granata } 459cac9c5f9SGreg Clayton 460b9c1b51eSKate Stone lldb::SBType SBModule::GetTypeByID(lldb::user_id_t uid) { 4611f4db7daSGreg Clayton ModuleSP module_sp(GetSP()); 462b9c1b51eSKate Stone if (module_sp) { 4631f4db7daSGreg Clayton SymbolVendor *vendor = module_sp->GetSymbolVendor(); 464b9c1b51eSKate Stone if (vendor) { 4651f4db7daSGreg Clayton Type *type_ptr = vendor->ResolveTypeUID(uid); 4661f4db7daSGreg Clayton if (type_ptr) 4671f4db7daSGreg Clayton return SBType(type_ptr->shared_from_this()); 4681f4db7daSGreg Clayton } 4691f4db7daSGreg Clayton } 4701f4db7daSGreg Clayton return SBType(); 4711f4db7daSGreg Clayton } 4721f4db7daSGreg Clayton 473b9c1b51eSKate Stone lldb::SBTypeList SBModule::GetTypes(uint32_t type_mask) { 474f02500c7SGreg Clayton SBTypeList sb_type_list; 475f02500c7SGreg Clayton 476f02500c7SGreg Clayton ModuleSP module_sp(GetSP()); 477b9c1b51eSKate Stone if (module_sp) { 478f02500c7SGreg Clayton SymbolVendor *vendor = module_sp->GetSymbolVendor(); 479b9c1b51eSKate Stone if (vendor) { 480f02500c7SGreg Clayton TypeList type_list; 481f02500c7SGreg Clayton vendor->GetTypes(NULL, type_mask, type_list); 482f02500c7SGreg Clayton sb_type_list.m_opaque_ap->Append(type_list); 483f02500c7SGreg Clayton } 484f02500c7SGreg Clayton } 485f02500c7SGreg Clayton return sb_type_list; 486f02500c7SGreg Clayton } 487cac9c5f9SGreg Clayton 488b9c1b51eSKate Stone SBSection SBModule::FindSection(const char *sect_name) { 489cac9c5f9SGreg Clayton SBSection sb_section; 490cac9c5f9SGreg Clayton 491c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 492b9c1b51eSKate Stone if (sect_name && module_sp) { 493a7499c98SMichael Sartain // Give the symbol vendor a chance to add to the unified section list. 494a7499c98SMichael Sartain module_sp->GetSymbolVendor(); 4953046e668SGreg Clayton SectionList *section_list = module_sp->GetSectionList(); 496b9c1b51eSKate Stone if (section_list) { 497cac9c5f9SGreg Clayton ConstString const_sect_name(sect_name); 498cac9c5f9SGreg Clayton SectionSP section_sp(section_list->FindSectionByName(const_sect_name)); 499b9c1b51eSKate Stone if (section_sp) { 500e72dfb32SGreg Clayton sb_section.SetSP(section_sp); 501cac9c5f9SGreg Clayton } 502cac9c5f9SGreg Clayton } 503cac9c5f9SGreg Clayton } 504cac9c5f9SGreg Clayton return sb_section; 505cac9c5f9SGreg Clayton } 506cac9c5f9SGreg Clayton 507b9c1b51eSKate Stone lldb::ByteOrder SBModule::GetByteOrder() { 508c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 509c2ff9318SGreg Clayton if (module_sp) 510c2ff9318SGreg Clayton return module_sp->GetArchitecture().GetByteOrder(); 51113d1950aSGreg Clayton return eByteOrderInvalid; 51213d1950aSGreg Clayton } 51313d1950aSGreg Clayton 514b9c1b51eSKate Stone const char *SBModule::GetTriple() { 515c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 516b9c1b51eSKate Stone if (module_sp) { 517c2ff9318SGreg Clayton std::string triple(module_sp->GetArchitecture().GetTriple().str()); 51813d1950aSGreg Clayton // Unique the string so we don't run into ownership issues since 51913d1950aSGreg Clayton // the const strings put the string into the string pool once and 52013d1950aSGreg Clayton // the strings never comes out 52113d1950aSGreg Clayton ConstString const_triple(triple.c_str()); 52213d1950aSGreg Clayton return const_triple.GetCString(); 52313d1950aSGreg Clayton } 52413d1950aSGreg Clayton return NULL; 52513d1950aSGreg Clayton } 52613d1950aSGreg Clayton 527b9c1b51eSKate Stone uint32_t SBModule::GetAddressByteSize() { 528c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 529c2ff9318SGreg Clayton if (module_sp) 530c2ff9318SGreg Clayton return module_sp->GetArchitecture().GetAddressByteSize(); 53113d1950aSGreg Clayton return sizeof(void *); 53213d1950aSGreg Clayton } 53313d1950aSGreg Clayton 534b9c1b51eSKate Stone uint32_t SBModule::GetVersion(uint32_t *versions, uint32_t num_versions) { 535c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 536c2ff9318SGreg Clayton if (module_sp) 5373467d80bSEnrico Granata return module_sp->GetVersion(versions, num_versions); 538b9c1b51eSKate Stone else { 539b9c1b51eSKate Stone if (versions && num_versions) { 540c2ff9318SGreg Clayton for (uint32_t i = 0; i < num_versions; ++i) 541c2ff9318SGreg Clayton versions[i] = UINT32_MAX; 542c2ff9318SGreg Clayton } 543c2ff9318SGreg Clayton return 0; 544c2ff9318SGreg Clayton } 5453467d80bSEnrico Granata } 546c2ff9318SGreg Clayton 547b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetSymbolFileSpec() const { 548eb2c19a5SIlia K lldb::SBFileSpec sb_file_spec; 549eb2c19a5SIlia K ModuleSP module_sp(GetSP()); 550b9c1b51eSKate Stone if (module_sp) { 551eb2c19a5SIlia K SymbolVendor *symbol_vendor_ptr = module_sp->GetSymbolVendor(); 552eb2c19a5SIlia K if (symbol_vendor_ptr) 553eb2c19a5SIlia K sb_file_spec.SetFileSpec(symbol_vendor_ptr->GetMainFileSpec()); 554eb2c19a5SIlia K } 555eb2c19a5SIlia K return sb_file_spec; 556eb2c19a5SIlia K } 557eb2c19a5SIlia K 558b9c1b51eSKate Stone lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const { 559eb2c19a5SIlia K lldb::SBAddress sb_addr; 560eb2c19a5SIlia K ModuleSP module_sp(GetSP()); 561b9c1b51eSKate Stone if (module_sp) { 562eb2c19a5SIlia K ObjectFile *objfile_ptr = module_sp->GetObjectFile(); 563eb2c19a5SIlia K if (objfile_ptr) 564eb2c19a5SIlia K sb_addr.ref() = objfile_ptr->GetHeaderAddress(); 565eb2c19a5SIlia K } 566eb2c19a5SIlia K return sb_addr; 567eb2c19a5SIlia K } 568