15ffd83dbSDimitry Andric //===-- SBModule.cpp ------------------------------------------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "lldb/API/SBModule.h" 100b57cec5SDimitry Andric #include "lldb/API/SBAddress.h" 110b57cec5SDimitry Andric #include "lldb/API/SBFileSpec.h" 120b57cec5SDimitry Andric #include "lldb/API/SBModuleSpec.h" 130b57cec5SDimitry Andric #include "lldb/API/SBProcess.h" 140b57cec5SDimitry Andric #include "lldb/API/SBStream.h" 150b57cec5SDimitry Andric #include "lldb/API/SBSymbolContextList.h" 160b57cec5SDimitry Andric #include "lldb/Core/Module.h" 170b57cec5SDimitry Andric #include "lldb/Core/Section.h" 180b57cec5SDimitry Andric #include "lldb/Core/ValueObjectList.h" 190b57cec5SDimitry Andric #include "lldb/Core/ValueObjectVariable.h" 200b57cec5SDimitry Andric #include "lldb/Symbol/ObjectFile.h" 210b57cec5SDimitry Andric #include "lldb/Symbol/SymbolFile.h" 220b57cec5SDimitry Andric #include "lldb/Symbol/Symtab.h" 230b57cec5SDimitry Andric #include "lldb/Symbol/TypeSystem.h" 240b57cec5SDimitry Andric #include "lldb/Symbol/VariableList.h" 250b57cec5SDimitry Andric #include "lldb/Target/Target.h" 2604eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h" 270b57cec5SDimitry Andric #include "lldb/Utility/StreamString.h" 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric using namespace lldb; 300b57cec5SDimitry Andric using namespace lldb_private; 310b57cec5SDimitry Andric 3204eeddc0SDimitry Andric SBModule::SBModule() { LLDB_INSTRUMENT_VA(this); } 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric SBModule::SBModule(const lldb::ModuleSP &module_sp) : m_opaque_sp(module_sp) {} 350b57cec5SDimitry Andric 3604eeddc0SDimitry Andric SBModule::SBModule(const SBModuleSpec &module_spec) { 3704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, module_spec); 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric ModuleSP module_sp; 400b57cec5SDimitry Andric Status error = ModuleList::GetSharedModule( 410b57cec5SDimitry Andric *module_spec.m_opaque_up, module_sp, nullptr, nullptr, nullptr); 420b57cec5SDimitry Andric if (module_sp) 430b57cec5SDimitry Andric SetSP(module_sp); 440b57cec5SDimitry Andric } 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric SBModule::SBModule(const SBModule &rhs) : m_opaque_sp(rhs.m_opaque_sp) { 4704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs); 480b57cec5SDimitry Andric } 490b57cec5SDimitry Andric 5004eeddc0SDimitry Andric SBModule::SBModule(lldb::SBProcess &process, lldb::addr_t header_addr) { 5104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, process, header_addr); 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric ProcessSP process_sp(process.GetSP()); 540b57cec5SDimitry Andric if (process_sp) { 550b57cec5SDimitry Andric m_opaque_sp = process_sp->ReadModuleFromMemory(FileSpec(), header_addr); 560b57cec5SDimitry Andric if (m_opaque_sp) { 570b57cec5SDimitry Andric Target &target = process_sp->GetTarget(); 580b57cec5SDimitry Andric bool changed = false; 590b57cec5SDimitry Andric m_opaque_sp->SetLoadAddress(target, 0, true, changed); 600b57cec5SDimitry Andric target.GetImages().Append(m_opaque_sp); 610b57cec5SDimitry Andric } 620b57cec5SDimitry Andric } 630b57cec5SDimitry Andric } 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric const SBModule &SBModule::operator=(const SBModule &rhs) { 6604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs); 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric if (this != &rhs) 690b57cec5SDimitry Andric m_opaque_sp = rhs.m_opaque_sp; 7004eeddc0SDimitry Andric return *this; 710b57cec5SDimitry Andric } 720b57cec5SDimitry Andric 735ffd83dbSDimitry Andric SBModule::~SBModule() = default; 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric bool SBModule::IsValid() const { 7604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 770b57cec5SDimitry Andric return this->operator bool(); 780b57cec5SDimitry Andric } 790b57cec5SDimitry Andric SBModule::operator bool() const { 8004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric return m_opaque_sp.get() != nullptr; 830b57cec5SDimitry Andric } 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric void SBModule::Clear() { 8604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric m_opaque_sp.reset(); 890b57cec5SDimitry Andric } 900b57cec5SDimitry Andric 9104eeddc0SDimitry Andric bool SBModule::IsFileBacked() const { 9204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 9304eeddc0SDimitry Andric 9404eeddc0SDimitry Andric ModuleSP module_sp(GetSP()); 9504eeddc0SDimitry Andric if (!module_sp) 9604eeddc0SDimitry Andric return false; 9704eeddc0SDimitry Andric 9804eeddc0SDimitry Andric ObjectFile *obj_file = module_sp->GetObjectFile(); 9904eeddc0SDimitry Andric if (!obj_file) 10004eeddc0SDimitry Andric return false; 10104eeddc0SDimitry Andric 10204eeddc0SDimitry Andric return !obj_file->IsInMemory(); 10304eeddc0SDimitry Andric } 10404eeddc0SDimitry Andric 1050b57cec5SDimitry Andric SBFileSpec SBModule::GetFileSpec() const { 10604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 1070b57cec5SDimitry Andric 1080b57cec5SDimitry Andric SBFileSpec file_spec; 1090b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 1100b57cec5SDimitry Andric if (module_sp) 1110b57cec5SDimitry Andric file_spec.SetFileSpec(module_sp->GetFileSpec()); 1120b57cec5SDimitry Andric 11304eeddc0SDimitry Andric return file_spec; 1140b57cec5SDimitry Andric } 1150b57cec5SDimitry Andric 1160b57cec5SDimitry Andric lldb::SBFileSpec SBModule::GetPlatformFileSpec() const { 11704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andric SBFileSpec file_spec; 1200b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 1210b57cec5SDimitry Andric if (module_sp) 1220b57cec5SDimitry Andric file_spec.SetFileSpec(module_sp->GetPlatformFileSpec()); 1230b57cec5SDimitry Andric 12404eeddc0SDimitry Andric return file_spec; 1250b57cec5SDimitry Andric } 1260b57cec5SDimitry Andric 1270b57cec5SDimitry Andric bool SBModule::SetPlatformFileSpec(const lldb::SBFileSpec &platform_file) { 12804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, platform_file); 1290b57cec5SDimitry Andric 1300b57cec5SDimitry Andric bool result = false; 1310b57cec5SDimitry Andric 1320b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 1330b57cec5SDimitry Andric if (module_sp) { 1340b57cec5SDimitry Andric module_sp->SetPlatformFileSpec(*platform_file); 1350b57cec5SDimitry Andric result = true; 1360b57cec5SDimitry Andric } 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric return result; 1390b57cec5SDimitry Andric } 1400b57cec5SDimitry Andric 1410b57cec5SDimitry Andric lldb::SBFileSpec SBModule::GetRemoteInstallFileSpec() { 14204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 1430b57cec5SDimitry Andric 1440b57cec5SDimitry Andric SBFileSpec sb_file_spec; 1450b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 1460b57cec5SDimitry Andric if (module_sp) 1470b57cec5SDimitry Andric sb_file_spec.SetFileSpec(module_sp->GetRemoteInstallFileSpec()); 14804eeddc0SDimitry Andric return sb_file_spec; 1490b57cec5SDimitry Andric } 1500b57cec5SDimitry Andric 1510b57cec5SDimitry Andric bool SBModule::SetRemoteInstallFileSpec(lldb::SBFileSpec &file) { 15204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, file); 1530b57cec5SDimitry Andric 1540b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 1550b57cec5SDimitry Andric if (module_sp) { 1560b57cec5SDimitry Andric module_sp->SetRemoteInstallFileSpec(file.ref()); 1570b57cec5SDimitry Andric return true; 1580b57cec5SDimitry Andric } 1590b57cec5SDimitry Andric return false; 1600b57cec5SDimitry Andric } 1610b57cec5SDimitry Andric 1620b57cec5SDimitry Andric const uint8_t *SBModule::GetUUIDBytes() const { 16304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 1640b57cec5SDimitry Andric 1650b57cec5SDimitry Andric const uint8_t *uuid_bytes = nullptr; 1660b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 1670b57cec5SDimitry Andric if (module_sp) 1680b57cec5SDimitry Andric uuid_bytes = module_sp->GetUUID().GetBytes().data(); 1690b57cec5SDimitry Andric 1700b57cec5SDimitry Andric return uuid_bytes; 1710b57cec5SDimitry Andric } 1720b57cec5SDimitry Andric 1730b57cec5SDimitry Andric const char *SBModule::GetUUIDString() const { 17404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 1750b57cec5SDimitry Andric 1760b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 177*fe013be4SDimitry Andric if (!module_sp) 178*fe013be4SDimitry Andric return nullptr; 179*fe013be4SDimitry Andric 1800b57cec5SDimitry Andric // We are going to return a "const char *" value through the public API, so 1810b57cec5SDimitry Andric // we need to constify it so it gets added permanently the string pool and 1820b57cec5SDimitry Andric // then we don't need to worry about the lifetime of the string as it will 1830b57cec5SDimitry Andric // never go away once it has been put into the ConstString string pool 184*fe013be4SDimitry Andric const char *uuid_cstr = 185*fe013be4SDimitry Andric ConstString(module_sp->GetUUID().GetAsString()).GetCString(); 186*fe013be4SDimitry Andric // Note: SBModule::GetUUIDString's expected behavior is to return nullptr if 187*fe013be4SDimitry Andric // the string we get is empty, so we must perform this check before returning. 188*fe013be4SDimitry Andric if (uuid_cstr && uuid_cstr[0]) 1890b57cec5SDimitry Andric return uuid_cstr; 1900b57cec5SDimitry Andric return nullptr; 1910b57cec5SDimitry Andric } 1920b57cec5SDimitry Andric 1930b57cec5SDimitry Andric bool SBModule::operator==(const SBModule &rhs) const { 19404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs); 1950b57cec5SDimitry Andric 1960b57cec5SDimitry Andric if (m_opaque_sp) 1970b57cec5SDimitry Andric return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 1980b57cec5SDimitry Andric return false; 1990b57cec5SDimitry Andric } 2000b57cec5SDimitry Andric 2010b57cec5SDimitry Andric bool SBModule::operator!=(const SBModule &rhs) const { 20204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs); 2030b57cec5SDimitry Andric 2040b57cec5SDimitry Andric if (m_opaque_sp) 2050b57cec5SDimitry Andric return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 2060b57cec5SDimitry Andric return false; 2070b57cec5SDimitry Andric } 2080b57cec5SDimitry Andric 2090b57cec5SDimitry Andric ModuleSP SBModule::GetSP() const { return m_opaque_sp; } 2100b57cec5SDimitry Andric 2110b57cec5SDimitry Andric void SBModule::SetSP(const ModuleSP &module_sp) { m_opaque_sp = module_sp; } 2120b57cec5SDimitry Andric 2130b57cec5SDimitry Andric SBAddress SBModule::ResolveFileAddress(lldb::addr_t vm_addr) { 21404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, vm_addr); 2150b57cec5SDimitry Andric 2160b57cec5SDimitry Andric lldb::SBAddress sb_addr; 2170b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 2180b57cec5SDimitry Andric if (module_sp) { 2190b57cec5SDimitry Andric Address addr; 2200b57cec5SDimitry Andric if (module_sp->ResolveFileAddress(vm_addr, addr)) 2210b57cec5SDimitry Andric sb_addr.ref() = addr; 2220b57cec5SDimitry Andric } 22304eeddc0SDimitry Andric return sb_addr; 2240b57cec5SDimitry Andric } 2250b57cec5SDimitry Andric 2260b57cec5SDimitry Andric SBSymbolContext 2270b57cec5SDimitry Andric SBModule::ResolveSymbolContextForAddress(const SBAddress &addr, 2280b57cec5SDimitry Andric uint32_t resolve_scope) { 22904eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, addr, resolve_scope); 2300b57cec5SDimitry Andric 2310b57cec5SDimitry Andric SBSymbolContext sb_sc; 2320b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 2330b57cec5SDimitry Andric SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 2340b57cec5SDimitry Andric if (module_sp && addr.IsValid()) 2350b57cec5SDimitry Andric module_sp->ResolveSymbolContextForAddress(addr.ref(), scope, *sb_sc); 23604eeddc0SDimitry Andric return sb_sc; 2370b57cec5SDimitry Andric } 2380b57cec5SDimitry Andric 2390b57cec5SDimitry Andric bool SBModule::GetDescription(SBStream &description) { 24004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, description); 2410b57cec5SDimitry Andric 2420b57cec5SDimitry Andric Stream &strm = description.ref(); 2430b57cec5SDimitry Andric 2440b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 2450b57cec5SDimitry Andric if (module_sp) { 246480093f4SDimitry Andric module_sp->GetDescription(strm.AsRawOstream()); 2470b57cec5SDimitry Andric } else 2480b57cec5SDimitry Andric strm.PutCString("No value"); 2490b57cec5SDimitry Andric 2500b57cec5SDimitry Andric return true; 2510b57cec5SDimitry Andric } 2520b57cec5SDimitry Andric 2530b57cec5SDimitry Andric uint32_t SBModule::GetNumCompileUnits() { 25404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 2570b57cec5SDimitry Andric if (module_sp) { 2580b57cec5SDimitry Andric return module_sp->GetNumCompileUnits(); 2590b57cec5SDimitry Andric } 2600b57cec5SDimitry Andric return 0; 2610b57cec5SDimitry Andric } 2620b57cec5SDimitry Andric 2630b57cec5SDimitry Andric SBCompileUnit SBModule::GetCompileUnitAtIndex(uint32_t index) { 26404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, index); 2650b57cec5SDimitry Andric 2660b57cec5SDimitry Andric SBCompileUnit sb_cu; 2670b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 2680b57cec5SDimitry Andric if (module_sp) { 2690b57cec5SDimitry Andric CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(index); 2700b57cec5SDimitry Andric sb_cu.reset(cu_sp.get()); 2710b57cec5SDimitry Andric } 27204eeddc0SDimitry Andric return sb_cu; 2730b57cec5SDimitry Andric } 2740b57cec5SDimitry Andric 2750b57cec5SDimitry Andric SBSymbolContextList SBModule::FindCompileUnits(const SBFileSpec &sb_file_spec) { 27604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sb_file_spec); 2770b57cec5SDimitry Andric 2780b57cec5SDimitry Andric SBSymbolContextList sb_sc_list; 2790b57cec5SDimitry Andric const ModuleSP module_sp(GetSP()); 2800b57cec5SDimitry Andric if (sb_file_spec.IsValid() && module_sp) { 2819dba64beSDimitry Andric module_sp->FindCompileUnits(*sb_file_spec, *sb_sc_list); 2820b57cec5SDimitry Andric } 28304eeddc0SDimitry Andric return sb_sc_list; 2840b57cec5SDimitry Andric } 2850b57cec5SDimitry Andric 2860b57cec5SDimitry Andric static Symtab *GetUnifiedSymbolTable(const lldb::ModuleSP &module_sp) { 2879dba64beSDimitry Andric if (module_sp) 2889dba64beSDimitry Andric return module_sp->GetSymtab(); 2890b57cec5SDimitry Andric return nullptr; 2900b57cec5SDimitry Andric } 2910b57cec5SDimitry Andric 2920b57cec5SDimitry Andric size_t SBModule::GetNumSymbols() { 29304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 2940b57cec5SDimitry Andric 2950b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 2969dba64beSDimitry Andric if (Symtab *symtab = GetUnifiedSymbolTable(module_sp)) 2970b57cec5SDimitry Andric return symtab->GetNumSymbols(); 2980b57cec5SDimitry Andric return 0; 2990b57cec5SDimitry Andric } 3000b57cec5SDimitry Andric 3010b57cec5SDimitry Andric SBSymbol SBModule::GetSymbolAtIndex(size_t idx) { 30204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, idx); 3030b57cec5SDimitry Andric 3040b57cec5SDimitry Andric SBSymbol sb_symbol; 3050b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 3060b57cec5SDimitry Andric Symtab *symtab = GetUnifiedSymbolTable(module_sp); 3070b57cec5SDimitry Andric if (symtab) 3080b57cec5SDimitry Andric sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx)); 30904eeddc0SDimitry Andric return sb_symbol; 3100b57cec5SDimitry Andric } 3110b57cec5SDimitry Andric 3120b57cec5SDimitry Andric lldb::SBSymbol SBModule::FindSymbol(const char *name, 3130b57cec5SDimitry Andric lldb::SymbolType symbol_type) { 31404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, name, symbol_type); 3150b57cec5SDimitry Andric 3160b57cec5SDimitry Andric SBSymbol sb_symbol; 3170b57cec5SDimitry Andric if (name && name[0]) { 3180b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 3190b57cec5SDimitry Andric Symtab *symtab = GetUnifiedSymbolTable(module_sp); 3200b57cec5SDimitry Andric if (symtab) 3210b57cec5SDimitry Andric sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType( 3220b57cec5SDimitry Andric ConstString(name), symbol_type, Symtab::eDebugAny, 3230b57cec5SDimitry Andric Symtab::eVisibilityAny)); 3240b57cec5SDimitry Andric } 32504eeddc0SDimitry Andric return sb_symbol; 3260b57cec5SDimitry Andric } 3270b57cec5SDimitry Andric 3280b57cec5SDimitry Andric lldb::SBSymbolContextList SBModule::FindSymbols(const char *name, 3290b57cec5SDimitry Andric lldb::SymbolType symbol_type) { 33004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, name, symbol_type); 3310b57cec5SDimitry Andric 3320b57cec5SDimitry Andric SBSymbolContextList sb_sc_list; 3330b57cec5SDimitry Andric if (name && name[0]) { 3340b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 3350b57cec5SDimitry Andric Symtab *symtab = GetUnifiedSymbolTable(module_sp); 3360b57cec5SDimitry Andric if (symtab) { 3370b57cec5SDimitry Andric std::vector<uint32_t> matching_symbol_indexes; 3389dba64beSDimitry Andric symtab->FindAllSymbolsWithNameAndType(ConstString(name), symbol_type, 3399dba64beSDimitry Andric matching_symbol_indexes); 3409dba64beSDimitry Andric const size_t num_matches = matching_symbol_indexes.size(); 3410b57cec5SDimitry Andric if (num_matches) { 3420b57cec5SDimitry Andric SymbolContext sc; 3430b57cec5SDimitry Andric sc.module_sp = module_sp; 3440b57cec5SDimitry Andric SymbolContextList &sc_list = *sb_sc_list; 3450b57cec5SDimitry Andric for (size_t i = 0; i < num_matches; ++i) { 3460b57cec5SDimitry Andric sc.symbol = symtab->SymbolAtIndex(matching_symbol_indexes[i]); 3470b57cec5SDimitry Andric if (sc.symbol) 3480b57cec5SDimitry Andric sc_list.Append(sc); 3490b57cec5SDimitry Andric } 3500b57cec5SDimitry Andric } 3510b57cec5SDimitry Andric } 3520b57cec5SDimitry Andric } 35304eeddc0SDimitry Andric return sb_sc_list; 3540b57cec5SDimitry Andric } 3550b57cec5SDimitry Andric 3560b57cec5SDimitry Andric size_t SBModule::GetNumSections() { 35704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 3580b57cec5SDimitry Andric 3590b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 3600b57cec5SDimitry Andric if (module_sp) { 3610b57cec5SDimitry Andric // Give the symbol vendor a chance to add to the unified section list. 3629dba64beSDimitry Andric module_sp->GetSymbolFile(); 3630b57cec5SDimitry Andric SectionList *section_list = module_sp->GetSectionList(); 3640b57cec5SDimitry Andric if (section_list) 3650b57cec5SDimitry Andric return section_list->GetSize(); 3660b57cec5SDimitry Andric } 3670b57cec5SDimitry Andric return 0; 3680b57cec5SDimitry Andric } 3690b57cec5SDimitry Andric 3700b57cec5SDimitry Andric SBSection SBModule::GetSectionAtIndex(size_t idx) { 37104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, idx); 3720b57cec5SDimitry Andric 3730b57cec5SDimitry Andric SBSection sb_section; 3740b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 3750b57cec5SDimitry Andric if (module_sp) { 3760b57cec5SDimitry Andric // Give the symbol vendor a chance to add to the unified section list. 3779dba64beSDimitry Andric module_sp->GetSymbolFile(); 3780b57cec5SDimitry Andric SectionList *section_list = module_sp->GetSectionList(); 3790b57cec5SDimitry Andric 3800b57cec5SDimitry Andric if (section_list) 3810b57cec5SDimitry Andric sb_section.SetSP(section_list->GetSectionAtIndex(idx)); 3820b57cec5SDimitry Andric } 38304eeddc0SDimitry Andric return sb_section; 3840b57cec5SDimitry Andric } 3850b57cec5SDimitry Andric 3860b57cec5SDimitry Andric lldb::SBSymbolContextList SBModule::FindFunctions(const char *name, 3870b57cec5SDimitry Andric uint32_t name_type_mask) { 38804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, name, name_type_mask); 3890b57cec5SDimitry Andric 3900b57cec5SDimitry Andric lldb::SBSymbolContextList sb_sc_list; 3910b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 3920b57cec5SDimitry Andric if (name && module_sp) { 393349cc55cSDimitry Andric 394349cc55cSDimitry Andric ModuleFunctionSearchOptions function_options; 395349cc55cSDimitry Andric function_options.include_symbols = true; 396349cc55cSDimitry Andric function_options.include_inlines = true; 3970b57cec5SDimitry Andric FunctionNameType type = static_cast<FunctionNameType>(name_type_mask); 3985ffd83dbSDimitry Andric module_sp->FindFunctions(ConstString(name), CompilerDeclContext(), type, 399349cc55cSDimitry Andric function_options, *sb_sc_list); 4000b57cec5SDimitry Andric } 40104eeddc0SDimitry Andric return sb_sc_list; 4020b57cec5SDimitry Andric } 4030b57cec5SDimitry Andric 4040b57cec5SDimitry Andric SBValueList SBModule::FindGlobalVariables(SBTarget &target, const char *name, 4050b57cec5SDimitry Andric uint32_t max_matches) { 40604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, target, name, max_matches); 4070b57cec5SDimitry Andric 4080b57cec5SDimitry Andric SBValueList sb_value_list; 4090b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 4100b57cec5SDimitry Andric if (name && module_sp) { 4110b57cec5SDimitry Andric VariableList variable_list; 4125ffd83dbSDimitry Andric module_sp->FindGlobalVariables(ConstString(name), CompilerDeclContext(), 4135ffd83dbSDimitry Andric max_matches, variable_list); 414480093f4SDimitry Andric for (const VariableSP &var_sp : variable_list) { 4150b57cec5SDimitry Andric lldb::ValueObjectSP valobj_sp; 4160b57cec5SDimitry Andric TargetSP target_sp(target.GetSP()); 417480093f4SDimitry Andric valobj_sp = ValueObjectVariable::Create(target_sp.get(), var_sp); 4180b57cec5SDimitry Andric if (valobj_sp) 4190b57cec5SDimitry Andric sb_value_list.Append(SBValue(valobj_sp)); 4200b57cec5SDimitry Andric } 4210b57cec5SDimitry Andric } 4220b57cec5SDimitry Andric 42304eeddc0SDimitry Andric return sb_value_list; 4240b57cec5SDimitry Andric } 4250b57cec5SDimitry Andric 4260b57cec5SDimitry Andric lldb::SBValue SBModule::FindFirstGlobalVariable(lldb::SBTarget &target, 4270b57cec5SDimitry Andric const char *name) { 42804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, target, name); 4290b57cec5SDimitry Andric 4300b57cec5SDimitry Andric SBValueList sb_value_list(FindGlobalVariables(target, name, 1)); 4310b57cec5SDimitry Andric if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0) 43204eeddc0SDimitry Andric return sb_value_list.GetValueAtIndex(0); 43304eeddc0SDimitry Andric return SBValue(); 4340b57cec5SDimitry Andric } 4350b57cec5SDimitry Andric 4360b57cec5SDimitry Andric lldb::SBType SBModule::FindFirstType(const char *name_cstr) { 43704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, name_cstr); 4380b57cec5SDimitry Andric 4390b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 440bdd1243dSDimitry Andric if (!name_cstr || !module_sp) 441bdd1243dSDimitry Andric return {}; 4420b57cec5SDimitry Andric SymbolContext sc; 4430b57cec5SDimitry Andric const bool exact_match = false; 4440b57cec5SDimitry Andric ConstString name(name_cstr); 4450b57cec5SDimitry Andric 446bdd1243dSDimitry Andric SBType sb_type = SBType(module_sp->FindFirstType(sc, name, exact_match)); 4470b57cec5SDimitry Andric 448bdd1243dSDimitry Andric if (sb_type.IsValid()) 449bdd1243dSDimitry Andric return sb_type; 450bdd1243dSDimitry Andric 451bdd1243dSDimitry Andric auto type_system_or_err = module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 4529dba64beSDimitry Andric if (auto err = type_system_or_err.takeError()) { 4539dba64beSDimitry Andric llvm::consumeError(std::move(err)); 454bdd1243dSDimitry Andric return {}; 4559dba64beSDimitry Andric } 456bdd1243dSDimitry Andric 457bdd1243dSDimitry Andric if (auto ts = *type_system_or_err) 458bdd1243dSDimitry Andric return SBType(ts->GetBuiltinTypeByName(name)); 459bdd1243dSDimitry Andric 460bdd1243dSDimitry Andric return {}; 4610b57cec5SDimitry Andric } 4620b57cec5SDimitry Andric 4630b57cec5SDimitry Andric lldb::SBType SBModule::GetBasicType(lldb::BasicType type) { 46404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, type); 4650b57cec5SDimitry Andric 4660b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 4670b57cec5SDimitry Andric if (module_sp) { 4689dba64beSDimitry Andric auto type_system_or_err = 4690b57cec5SDimitry Andric module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 4709dba64beSDimitry Andric if (auto err = type_system_or_err.takeError()) { 4719dba64beSDimitry Andric llvm::consumeError(std::move(err)); 4729dba64beSDimitry Andric } else { 473bdd1243dSDimitry Andric if (auto ts = *type_system_or_err) 474bdd1243dSDimitry Andric return SBType(ts->GetBasicTypeFromAST(type)); 4759dba64beSDimitry Andric } 4760b57cec5SDimitry Andric } 47704eeddc0SDimitry Andric return SBType(); 4780b57cec5SDimitry Andric } 4790b57cec5SDimitry Andric 4800b57cec5SDimitry Andric lldb::SBTypeList SBModule::FindTypes(const char *type) { 48104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, type); 4820b57cec5SDimitry Andric 4830b57cec5SDimitry Andric SBTypeList retval; 4840b57cec5SDimitry Andric 4850b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 4860b57cec5SDimitry Andric if (type && module_sp) { 4870b57cec5SDimitry Andric TypeList type_list; 4880b57cec5SDimitry Andric const bool exact_match = false; 4890b57cec5SDimitry Andric ConstString name(type); 4900b57cec5SDimitry Andric llvm::DenseSet<SymbolFile *> searched_symbol_files; 4919dba64beSDimitry Andric module_sp->FindTypes(name, exact_match, UINT32_MAX, searched_symbol_files, 4929dba64beSDimitry Andric type_list); 4930b57cec5SDimitry Andric 4949dba64beSDimitry Andric if (type_list.Empty()) { 4959dba64beSDimitry Andric auto type_system_or_err = 4969dba64beSDimitry Andric module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 4979dba64beSDimitry Andric if (auto err = type_system_or_err.takeError()) { 4989dba64beSDimitry Andric llvm::consumeError(std::move(err)); 4999dba64beSDimitry Andric } else { 500bdd1243dSDimitry Andric if (auto ts = *type_system_or_err) 501bdd1243dSDimitry Andric if (CompilerType compiler_type = ts->GetBuiltinTypeByName(name)) 5029dba64beSDimitry Andric retval.Append(SBType(compiler_type)); 5039dba64beSDimitry Andric } 5049dba64beSDimitry Andric } else { 5059dba64beSDimitry Andric for (size_t idx = 0; idx < type_list.GetSize(); idx++) { 5060b57cec5SDimitry Andric TypeSP type_sp(type_list.GetTypeAtIndex(idx)); 5070b57cec5SDimitry Andric if (type_sp) 5080b57cec5SDimitry Andric retval.Append(SBType(type_sp)); 5090b57cec5SDimitry Andric } 5100b57cec5SDimitry Andric } 5110b57cec5SDimitry Andric } 51204eeddc0SDimitry Andric return retval; 5130b57cec5SDimitry Andric } 5140b57cec5SDimitry Andric 5150b57cec5SDimitry Andric lldb::SBType SBModule::GetTypeByID(lldb::user_id_t uid) { 51604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, uid); 5170b57cec5SDimitry Andric 5180b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 5190b57cec5SDimitry Andric if (module_sp) { 5209dba64beSDimitry Andric if (SymbolFile *symfile = module_sp->GetSymbolFile()) { 5219dba64beSDimitry Andric Type *type_ptr = symfile->ResolveTypeUID(uid); 5220b57cec5SDimitry Andric if (type_ptr) 52304eeddc0SDimitry Andric return SBType(type_ptr->shared_from_this()); 5240b57cec5SDimitry Andric } 5250b57cec5SDimitry Andric } 52604eeddc0SDimitry Andric return SBType(); 5270b57cec5SDimitry Andric } 5280b57cec5SDimitry Andric 5290b57cec5SDimitry Andric lldb::SBTypeList SBModule::GetTypes(uint32_t type_mask) { 53004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, type_mask); 5310b57cec5SDimitry Andric 5320b57cec5SDimitry Andric SBTypeList sb_type_list; 5330b57cec5SDimitry Andric 5340b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 5350b57cec5SDimitry Andric if (!module_sp) 53604eeddc0SDimitry Andric return sb_type_list; 5379dba64beSDimitry Andric SymbolFile *symfile = module_sp->GetSymbolFile(); 5389dba64beSDimitry Andric if (!symfile) 53904eeddc0SDimitry Andric return sb_type_list; 5400b57cec5SDimitry Andric 5410b57cec5SDimitry Andric TypeClass type_class = static_cast<TypeClass>(type_mask); 5420b57cec5SDimitry Andric TypeList type_list; 5439dba64beSDimitry Andric symfile->GetTypes(nullptr, type_class, type_list); 5440b57cec5SDimitry Andric sb_type_list.m_opaque_up->Append(type_list); 54504eeddc0SDimitry Andric return sb_type_list; 5460b57cec5SDimitry Andric } 5470b57cec5SDimitry Andric 5480b57cec5SDimitry Andric SBSection SBModule::FindSection(const char *sect_name) { 54904eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sect_name); 5500b57cec5SDimitry Andric 5510b57cec5SDimitry Andric SBSection sb_section; 5520b57cec5SDimitry Andric 5530b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 5540b57cec5SDimitry Andric if (sect_name && module_sp) { 5550b57cec5SDimitry Andric // Give the symbol vendor a chance to add to the unified section list. 5569dba64beSDimitry Andric module_sp->GetSymbolFile(); 5570b57cec5SDimitry Andric SectionList *section_list = module_sp->GetSectionList(); 5580b57cec5SDimitry Andric if (section_list) { 5590b57cec5SDimitry Andric ConstString const_sect_name(sect_name); 5600b57cec5SDimitry Andric SectionSP section_sp(section_list->FindSectionByName(const_sect_name)); 5610b57cec5SDimitry Andric if (section_sp) { 5620b57cec5SDimitry Andric sb_section.SetSP(section_sp); 5630b57cec5SDimitry Andric } 5640b57cec5SDimitry Andric } 5650b57cec5SDimitry Andric } 56604eeddc0SDimitry Andric return sb_section; 5670b57cec5SDimitry Andric } 5680b57cec5SDimitry Andric 5690b57cec5SDimitry Andric lldb::ByteOrder SBModule::GetByteOrder() { 57004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 5710b57cec5SDimitry Andric 5720b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 5730b57cec5SDimitry Andric if (module_sp) 5740b57cec5SDimitry Andric return module_sp->GetArchitecture().GetByteOrder(); 5750b57cec5SDimitry Andric return eByteOrderInvalid; 5760b57cec5SDimitry Andric } 5770b57cec5SDimitry Andric 5780b57cec5SDimitry Andric const char *SBModule::GetTriple() { 57904eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 5800b57cec5SDimitry Andric 5810b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 582*fe013be4SDimitry Andric if (!module_sp) 583*fe013be4SDimitry Andric return nullptr; 584*fe013be4SDimitry Andric 5850b57cec5SDimitry Andric std::string triple(module_sp->GetArchitecture().GetTriple().str()); 5860b57cec5SDimitry Andric // Unique the string so we don't run into ownership issues since the const 5870b57cec5SDimitry Andric // strings put the string into the string pool once and the strings never 5880b57cec5SDimitry Andric // comes out 5890b57cec5SDimitry Andric ConstString const_triple(triple.c_str()); 5900b57cec5SDimitry Andric return const_triple.GetCString(); 5910b57cec5SDimitry Andric } 5920b57cec5SDimitry Andric 5930b57cec5SDimitry Andric uint32_t SBModule::GetAddressByteSize() { 59404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 5950b57cec5SDimitry Andric 5960b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 5970b57cec5SDimitry Andric if (module_sp) 5980b57cec5SDimitry Andric return module_sp->GetArchitecture().GetAddressByteSize(); 5990b57cec5SDimitry Andric return sizeof(void *); 6000b57cec5SDimitry Andric } 6010b57cec5SDimitry Andric 6020b57cec5SDimitry Andric uint32_t SBModule::GetVersion(uint32_t *versions, uint32_t num_versions) { 60304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, versions, num_versions); 6040b57cec5SDimitry Andric 6050b57cec5SDimitry Andric llvm::VersionTuple version; 6060b57cec5SDimitry Andric if (ModuleSP module_sp = GetSP()) 6070b57cec5SDimitry Andric version = module_sp->GetVersion(); 6080b57cec5SDimitry Andric uint32_t result = 0; 6090b57cec5SDimitry Andric if (!version.empty()) 6100b57cec5SDimitry Andric ++result; 6110b57cec5SDimitry Andric if (version.getMinor()) 6120b57cec5SDimitry Andric ++result; 6130b57cec5SDimitry Andric if (version.getSubminor()) 6140b57cec5SDimitry Andric ++result; 6150b57cec5SDimitry Andric 6160b57cec5SDimitry Andric if (!versions) 6170b57cec5SDimitry Andric return result; 6180b57cec5SDimitry Andric 6190b57cec5SDimitry Andric if (num_versions > 0) 6200b57cec5SDimitry Andric versions[0] = version.empty() ? UINT32_MAX : version.getMajor(); 6210b57cec5SDimitry Andric if (num_versions > 1) 62281ad6265SDimitry Andric versions[1] = version.getMinor().value_or(UINT32_MAX); 6230b57cec5SDimitry Andric if (num_versions > 2) 62481ad6265SDimitry Andric versions[2] = version.getSubminor().value_or(UINT32_MAX); 6250b57cec5SDimitry Andric for (uint32_t i = 3; i < num_versions; ++i) 6260b57cec5SDimitry Andric versions[i] = UINT32_MAX; 6270b57cec5SDimitry Andric return result; 6280b57cec5SDimitry Andric } 6290b57cec5SDimitry Andric 6300b57cec5SDimitry Andric lldb::SBFileSpec SBModule::GetSymbolFileSpec() const { 63104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 6320b57cec5SDimitry Andric 6330b57cec5SDimitry Andric lldb::SBFileSpec sb_file_spec; 6340b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 6350b57cec5SDimitry Andric if (module_sp) { 6369dba64beSDimitry Andric if (SymbolFile *symfile = module_sp->GetSymbolFile()) 6379dba64beSDimitry Andric sb_file_spec.SetFileSpec(symfile->GetObjectFile()->GetFileSpec()); 6380b57cec5SDimitry Andric } 63904eeddc0SDimitry Andric return sb_file_spec; 6400b57cec5SDimitry Andric } 6410b57cec5SDimitry Andric 6420b57cec5SDimitry Andric lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const { 64304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 6440b57cec5SDimitry Andric 6450b57cec5SDimitry Andric lldb::SBAddress sb_addr; 6460b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 6470b57cec5SDimitry Andric if (module_sp) { 6480b57cec5SDimitry Andric ObjectFile *objfile_ptr = module_sp->GetObjectFile(); 6490b57cec5SDimitry Andric if (objfile_ptr) 6500b57cec5SDimitry Andric sb_addr.ref() = objfile_ptr->GetBaseAddress(); 6510b57cec5SDimitry Andric } 65204eeddc0SDimitry Andric return sb_addr; 6530b57cec5SDimitry Andric } 6540b57cec5SDimitry Andric 6550b57cec5SDimitry Andric lldb::SBAddress SBModule::GetObjectFileEntryPointAddress() const { 65604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 6570b57cec5SDimitry Andric 6580b57cec5SDimitry Andric lldb::SBAddress sb_addr; 6590b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 6600b57cec5SDimitry Andric if (module_sp) { 6610b57cec5SDimitry Andric ObjectFile *objfile_ptr = module_sp->GetObjectFile(); 6620b57cec5SDimitry Andric if (objfile_ptr) 6630b57cec5SDimitry Andric sb_addr.ref() = objfile_ptr->GetEntryPointAddress(); 6640b57cec5SDimitry Andric } 66504eeddc0SDimitry Andric return sb_addr; 6660b57cec5SDimitry Andric } 6670b57cec5SDimitry Andric 6685ffd83dbSDimitry Andric uint32_t SBModule::GetNumberAllocatedModules() { 66904eeddc0SDimitry Andric LLDB_INSTRUMENT(); 6705ffd83dbSDimitry Andric 6715ffd83dbSDimitry Andric return Module::GetNumberAllocatedModules(); 6725ffd83dbSDimitry Andric } 6735ffd83dbSDimitry Andric 674e8d8bef9SDimitry Andric void SBModule::GarbageCollectAllocatedModules() { 67504eeddc0SDimitry Andric LLDB_INSTRUMENT(); 676e8d8bef9SDimitry Andric 677e8d8bef9SDimitry Andric const bool mandatory = false; 678e8d8bef9SDimitry Andric ModuleList::RemoveOrphanSharedModules(mandatory); 679e8d8bef9SDimitry Andric } 680