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 "SBReproducerPrivate.h"
110b57cec5SDimitry Andric #include "lldb/API/SBAddress.h"
120b57cec5SDimitry Andric #include "lldb/API/SBFileSpec.h"
130b57cec5SDimitry Andric #include "lldb/API/SBModuleSpec.h"
140b57cec5SDimitry Andric #include "lldb/API/SBProcess.h"
150b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
160b57cec5SDimitry Andric #include "lldb/API/SBSymbolContextList.h"
170b57cec5SDimitry Andric #include "lldb/Core/Module.h"
180b57cec5SDimitry Andric #include "lldb/Core/Section.h"
190b57cec5SDimitry Andric #include "lldb/Core/ValueObjectList.h"
200b57cec5SDimitry Andric #include "lldb/Core/ValueObjectVariable.h"
210b57cec5SDimitry Andric #include "lldb/Symbol/ObjectFile.h"
220b57cec5SDimitry Andric #include "lldb/Symbol/SymbolFile.h"
230b57cec5SDimitry Andric #include "lldb/Symbol/Symtab.h"
240b57cec5SDimitry Andric #include "lldb/Symbol/TypeSystem.h"
250b57cec5SDimitry Andric #include "lldb/Symbol/VariableList.h"
260b57cec5SDimitry Andric #include "lldb/Target/Target.h"
270b57cec5SDimitry Andric #include "lldb/Utility/StreamString.h"
280b57cec5SDimitry Andric
290b57cec5SDimitry Andric using namespace lldb;
300b57cec5SDimitry Andric using namespace lldb_private;
310b57cec5SDimitry Andric
SBModule()320b57cec5SDimitry Andric SBModule::SBModule() : m_opaque_sp() {
330b57cec5SDimitry Andric LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBModule);
340b57cec5SDimitry Andric }
350b57cec5SDimitry Andric
SBModule(const lldb::ModuleSP & module_sp)360b57cec5SDimitry Andric SBModule::SBModule(const lldb::ModuleSP &module_sp) : m_opaque_sp(module_sp) {}
370b57cec5SDimitry Andric
SBModule(const SBModuleSpec & module_spec)380b57cec5SDimitry Andric SBModule::SBModule(const SBModuleSpec &module_spec) : m_opaque_sp() {
390b57cec5SDimitry Andric LLDB_RECORD_CONSTRUCTOR(SBModule, (const lldb::SBModuleSpec &), module_spec);
400b57cec5SDimitry Andric
410b57cec5SDimitry Andric ModuleSP module_sp;
420b57cec5SDimitry Andric Status error = ModuleList::GetSharedModule(
430b57cec5SDimitry Andric *module_spec.m_opaque_up, module_sp, nullptr, nullptr, nullptr);
440b57cec5SDimitry Andric if (module_sp)
450b57cec5SDimitry Andric SetSP(module_sp);
460b57cec5SDimitry Andric }
470b57cec5SDimitry Andric
SBModule(const SBModule & rhs)480b57cec5SDimitry Andric SBModule::SBModule(const SBModule &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
490b57cec5SDimitry Andric LLDB_RECORD_CONSTRUCTOR(SBModule, (const lldb::SBModule &), rhs);
500b57cec5SDimitry Andric }
510b57cec5SDimitry Andric
SBModule(lldb::SBProcess & process,lldb::addr_t header_addr)520b57cec5SDimitry Andric SBModule::SBModule(lldb::SBProcess &process, lldb::addr_t header_addr)
530b57cec5SDimitry Andric : m_opaque_sp() {
540b57cec5SDimitry Andric LLDB_RECORD_CONSTRUCTOR(SBModule, (lldb::SBProcess &, lldb::addr_t), process,
550b57cec5SDimitry Andric header_addr);
560b57cec5SDimitry Andric
570b57cec5SDimitry Andric ProcessSP process_sp(process.GetSP());
580b57cec5SDimitry Andric if (process_sp) {
590b57cec5SDimitry Andric m_opaque_sp = process_sp->ReadModuleFromMemory(FileSpec(), header_addr);
600b57cec5SDimitry Andric if (m_opaque_sp) {
610b57cec5SDimitry Andric Target &target = process_sp->GetTarget();
620b57cec5SDimitry Andric bool changed = false;
630b57cec5SDimitry Andric m_opaque_sp->SetLoadAddress(target, 0, true, changed);
640b57cec5SDimitry Andric target.GetImages().Append(m_opaque_sp);
650b57cec5SDimitry Andric }
660b57cec5SDimitry Andric }
670b57cec5SDimitry Andric }
680b57cec5SDimitry Andric
operator =(const SBModule & rhs)690b57cec5SDimitry Andric const SBModule &SBModule::operator=(const SBModule &rhs) {
70*af732203SDimitry Andric LLDB_RECORD_METHOD(const lldb::SBModule &, SBModule, operator=,
71*af732203SDimitry Andric (const lldb::SBModule &), rhs);
720b57cec5SDimitry Andric
730b57cec5SDimitry Andric if (this != &rhs)
740b57cec5SDimitry Andric m_opaque_sp = rhs.m_opaque_sp;
750b57cec5SDimitry Andric return LLDB_RECORD_RESULT(*this);
760b57cec5SDimitry Andric }
770b57cec5SDimitry Andric
785ffd83dbSDimitry Andric SBModule::~SBModule() = default;
790b57cec5SDimitry Andric
IsValid() const800b57cec5SDimitry Andric bool SBModule::IsValid() const {
810b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBModule, IsValid);
820b57cec5SDimitry Andric return this->operator bool();
830b57cec5SDimitry Andric }
operator bool() const840b57cec5SDimitry Andric SBModule::operator bool() const {
850b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBModule, operator bool);
860b57cec5SDimitry Andric
870b57cec5SDimitry Andric return m_opaque_sp.get() != nullptr;
880b57cec5SDimitry Andric }
890b57cec5SDimitry Andric
Clear()900b57cec5SDimitry Andric void SBModule::Clear() {
910b57cec5SDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(void, SBModule, Clear);
920b57cec5SDimitry Andric
930b57cec5SDimitry Andric m_opaque_sp.reset();
940b57cec5SDimitry Andric }
950b57cec5SDimitry Andric
GetFileSpec() const960b57cec5SDimitry Andric SBFileSpec SBModule::GetFileSpec() const {
970b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule, GetFileSpec);
980b57cec5SDimitry Andric
990b57cec5SDimitry Andric SBFileSpec file_spec;
1000b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
1010b57cec5SDimitry Andric if (module_sp)
1020b57cec5SDimitry Andric file_spec.SetFileSpec(module_sp->GetFileSpec());
1030b57cec5SDimitry Andric
1040b57cec5SDimitry Andric return LLDB_RECORD_RESULT(file_spec);
1050b57cec5SDimitry Andric }
1060b57cec5SDimitry Andric
GetPlatformFileSpec() const1070b57cec5SDimitry Andric lldb::SBFileSpec SBModule::GetPlatformFileSpec() const {
1080b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule,
1090b57cec5SDimitry Andric GetPlatformFileSpec);
1100b57cec5SDimitry Andric
1110b57cec5SDimitry Andric SBFileSpec file_spec;
1120b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
1130b57cec5SDimitry Andric if (module_sp)
1140b57cec5SDimitry Andric file_spec.SetFileSpec(module_sp->GetPlatformFileSpec());
1150b57cec5SDimitry Andric
1160b57cec5SDimitry Andric return LLDB_RECORD_RESULT(file_spec);
1170b57cec5SDimitry Andric }
1180b57cec5SDimitry Andric
SetPlatformFileSpec(const lldb::SBFileSpec & platform_file)1190b57cec5SDimitry Andric bool SBModule::SetPlatformFileSpec(const lldb::SBFileSpec &platform_file) {
1200b57cec5SDimitry Andric LLDB_RECORD_METHOD(bool, SBModule, SetPlatformFileSpec,
1210b57cec5SDimitry Andric (const lldb::SBFileSpec &), platform_file);
1220b57cec5SDimitry Andric
1230b57cec5SDimitry Andric bool result = false;
1240b57cec5SDimitry Andric
1250b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
1260b57cec5SDimitry Andric if (module_sp) {
1270b57cec5SDimitry Andric module_sp->SetPlatformFileSpec(*platform_file);
1280b57cec5SDimitry Andric result = true;
1290b57cec5SDimitry Andric }
1300b57cec5SDimitry Andric
1310b57cec5SDimitry Andric return result;
1320b57cec5SDimitry Andric }
1330b57cec5SDimitry Andric
GetRemoteInstallFileSpec()1340b57cec5SDimitry Andric lldb::SBFileSpec SBModule::GetRemoteInstallFileSpec() {
1350b57cec5SDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(lldb::SBFileSpec, SBModule,
1360b57cec5SDimitry Andric GetRemoteInstallFileSpec);
1370b57cec5SDimitry Andric
1380b57cec5SDimitry Andric SBFileSpec sb_file_spec;
1390b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
1400b57cec5SDimitry Andric if (module_sp)
1410b57cec5SDimitry Andric sb_file_spec.SetFileSpec(module_sp->GetRemoteInstallFileSpec());
1420b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_file_spec);
1430b57cec5SDimitry Andric }
1440b57cec5SDimitry Andric
SetRemoteInstallFileSpec(lldb::SBFileSpec & file)1450b57cec5SDimitry Andric bool SBModule::SetRemoteInstallFileSpec(lldb::SBFileSpec &file) {
1460b57cec5SDimitry Andric LLDB_RECORD_METHOD(bool, SBModule, SetRemoteInstallFileSpec,
1470b57cec5SDimitry Andric (lldb::SBFileSpec &), file);
1480b57cec5SDimitry Andric
1490b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
1500b57cec5SDimitry Andric if (module_sp) {
1510b57cec5SDimitry Andric module_sp->SetRemoteInstallFileSpec(file.ref());
1520b57cec5SDimitry Andric return true;
1530b57cec5SDimitry Andric }
1540b57cec5SDimitry Andric return false;
1550b57cec5SDimitry Andric }
1560b57cec5SDimitry Andric
GetUUIDBytes() const1570b57cec5SDimitry Andric const uint8_t *SBModule::GetUUIDBytes() const {
1580b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(const uint8_t *, SBModule, GetUUIDBytes);
1590b57cec5SDimitry Andric
1600b57cec5SDimitry Andric const uint8_t *uuid_bytes = nullptr;
1610b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
1620b57cec5SDimitry Andric if (module_sp)
1630b57cec5SDimitry Andric uuid_bytes = module_sp->GetUUID().GetBytes().data();
1640b57cec5SDimitry Andric
1650b57cec5SDimitry Andric return uuid_bytes;
1660b57cec5SDimitry Andric }
1670b57cec5SDimitry Andric
GetUUIDString() const1680b57cec5SDimitry Andric const char *SBModule::GetUUIDString() const {
1690b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBModule, GetUUIDString);
1700b57cec5SDimitry Andric
1710b57cec5SDimitry Andric const char *uuid_cstr = nullptr;
1720b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
1730b57cec5SDimitry Andric if (module_sp) {
1740b57cec5SDimitry Andric // We are going to return a "const char *" value through the public API, so
1750b57cec5SDimitry Andric // we need to constify it so it gets added permanently the string pool and
1760b57cec5SDimitry Andric // then we don't need to worry about the lifetime of the string as it will
1770b57cec5SDimitry Andric // never go away once it has been put into the ConstString string pool
1780b57cec5SDimitry Andric uuid_cstr = ConstString(module_sp->GetUUID().GetAsString()).GetCString();
1790b57cec5SDimitry Andric }
1800b57cec5SDimitry Andric
1810b57cec5SDimitry Andric if (uuid_cstr && uuid_cstr[0]) {
1820b57cec5SDimitry Andric return uuid_cstr;
1830b57cec5SDimitry Andric }
1840b57cec5SDimitry Andric
1850b57cec5SDimitry Andric return nullptr;
1860b57cec5SDimitry Andric }
1870b57cec5SDimitry Andric
operator ==(const SBModule & rhs) const1880b57cec5SDimitry Andric bool SBModule::operator==(const SBModule &rhs) const {
1890b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST(bool, SBModule, operator==, (const lldb::SBModule &),
1900b57cec5SDimitry Andric rhs);
1910b57cec5SDimitry Andric
1920b57cec5SDimitry Andric if (m_opaque_sp)
1930b57cec5SDimitry Andric return m_opaque_sp.get() == rhs.m_opaque_sp.get();
1940b57cec5SDimitry Andric return false;
1950b57cec5SDimitry Andric }
1960b57cec5SDimitry Andric
operator !=(const SBModule & rhs) const1970b57cec5SDimitry Andric bool SBModule::operator!=(const SBModule &rhs) const {
1980b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST(bool, SBModule, operator!=, (const lldb::SBModule &),
1990b57cec5SDimitry Andric rhs);
2000b57cec5SDimitry Andric
2010b57cec5SDimitry Andric if (m_opaque_sp)
2020b57cec5SDimitry Andric return m_opaque_sp.get() != rhs.m_opaque_sp.get();
2030b57cec5SDimitry Andric return false;
2040b57cec5SDimitry Andric }
2050b57cec5SDimitry Andric
GetSP() const2060b57cec5SDimitry Andric ModuleSP SBModule::GetSP() const { return m_opaque_sp; }
2070b57cec5SDimitry Andric
SetSP(const ModuleSP & module_sp)2080b57cec5SDimitry Andric void SBModule::SetSP(const ModuleSP &module_sp) { m_opaque_sp = module_sp; }
2090b57cec5SDimitry Andric
ResolveFileAddress(lldb::addr_t vm_addr)2100b57cec5SDimitry Andric SBAddress SBModule::ResolveFileAddress(lldb::addr_t vm_addr) {
2110b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBAddress, SBModule, ResolveFileAddress,
2120b57cec5SDimitry Andric (lldb::addr_t), vm_addr);
2130b57cec5SDimitry Andric
2140b57cec5SDimitry Andric lldb::SBAddress sb_addr;
2150b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
2160b57cec5SDimitry Andric if (module_sp) {
2170b57cec5SDimitry Andric Address addr;
2180b57cec5SDimitry Andric if (module_sp->ResolveFileAddress(vm_addr, addr))
2190b57cec5SDimitry Andric sb_addr.ref() = addr;
2200b57cec5SDimitry Andric }
2210b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_addr);
2220b57cec5SDimitry Andric }
2230b57cec5SDimitry Andric
2240b57cec5SDimitry Andric SBSymbolContext
ResolveSymbolContextForAddress(const SBAddress & addr,uint32_t resolve_scope)2250b57cec5SDimitry Andric SBModule::ResolveSymbolContextForAddress(const SBAddress &addr,
2260b57cec5SDimitry Andric uint32_t resolve_scope) {
2270b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBSymbolContext, SBModule,
2280b57cec5SDimitry Andric ResolveSymbolContextForAddress,
2290b57cec5SDimitry Andric (const lldb::SBAddress &, uint32_t), 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);
2360b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_sc);
2370b57cec5SDimitry Andric }
2380b57cec5SDimitry Andric
GetDescription(SBStream & description)2390b57cec5SDimitry Andric bool SBModule::GetDescription(SBStream &description) {
2400b57cec5SDimitry Andric LLDB_RECORD_METHOD(bool, SBModule, GetDescription, (lldb::SBStream &),
2410b57cec5SDimitry Andric description);
2420b57cec5SDimitry Andric
2430b57cec5SDimitry Andric Stream &strm = description.ref();
2440b57cec5SDimitry Andric
2450b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
2460b57cec5SDimitry Andric if (module_sp) {
247480093f4SDimitry Andric module_sp->GetDescription(strm.AsRawOstream());
2480b57cec5SDimitry Andric } else
2490b57cec5SDimitry Andric strm.PutCString("No value");
2500b57cec5SDimitry Andric
2510b57cec5SDimitry Andric return true;
2520b57cec5SDimitry Andric }
2530b57cec5SDimitry Andric
GetNumCompileUnits()2540b57cec5SDimitry Andric uint32_t SBModule::GetNumCompileUnits() {
2550b57cec5SDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBModule, GetNumCompileUnits);
2560b57cec5SDimitry Andric
2570b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
2580b57cec5SDimitry Andric if (module_sp) {
2590b57cec5SDimitry Andric return module_sp->GetNumCompileUnits();
2600b57cec5SDimitry Andric }
2610b57cec5SDimitry Andric return 0;
2620b57cec5SDimitry Andric }
2630b57cec5SDimitry Andric
GetCompileUnitAtIndex(uint32_t index)2640b57cec5SDimitry Andric SBCompileUnit SBModule::GetCompileUnitAtIndex(uint32_t index) {
2650b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBCompileUnit, SBModule, GetCompileUnitAtIndex,
2660b57cec5SDimitry Andric (uint32_t), index);
2670b57cec5SDimitry Andric
2680b57cec5SDimitry Andric SBCompileUnit sb_cu;
2690b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
2700b57cec5SDimitry Andric if (module_sp) {
2710b57cec5SDimitry Andric CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(index);
2720b57cec5SDimitry Andric sb_cu.reset(cu_sp.get());
2730b57cec5SDimitry Andric }
2740b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_cu);
2750b57cec5SDimitry Andric }
2760b57cec5SDimitry Andric
FindCompileUnits(const SBFileSpec & sb_file_spec)2770b57cec5SDimitry Andric SBSymbolContextList SBModule::FindCompileUnits(const SBFileSpec &sb_file_spec) {
2780b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindCompileUnits,
2790b57cec5SDimitry Andric (const lldb::SBFileSpec &), sb_file_spec);
2800b57cec5SDimitry Andric
2810b57cec5SDimitry Andric SBSymbolContextList sb_sc_list;
2820b57cec5SDimitry Andric const ModuleSP module_sp(GetSP());
2830b57cec5SDimitry Andric if (sb_file_spec.IsValid() && module_sp) {
2849dba64beSDimitry Andric module_sp->FindCompileUnits(*sb_file_spec, *sb_sc_list);
2850b57cec5SDimitry Andric }
2860b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_sc_list);
2870b57cec5SDimitry Andric }
2880b57cec5SDimitry Andric
GetUnifiedSymbolTable(const lldb::ModuleSP & module_sp)2890b57cec5SDimitry Andric static Symtab *GetUnifiedSymbolTable(const lldb::ModuleSP &module_sp) {
2909dba64beSDimitry Andric if (module_sp)
2919dba64beSDimitry Andric return module_sp->GetSymtab();
2920b57cec5SDimitry Andric return nullptr;
2930b57cec5SDimitry Andric }
2940b57cec5SDimitry Andric
GetNumSymbols()2950b57cec5SDimitry Andric size_t SBModule::GetNumSymbols() {
2960b57cec5SDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(size_t, SBModule, GetNumSymbols);
2970b57cec5SDimitry Andric
2980b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
2999dba64beSDimitry Andric if (Symtab *symtab = GetUnifiedSymbolTable(module_sp))
3000b57cec5SDimitry Andric return symtab->GetNumSymbols();
3010b57cec5SDimitry Andric return 0;
3020b57cec5SDimitry Andric }
3030b57cec5SDimitry Andric
GetSymbolAtIndex(size_t idx)3040b57cec5SDimitry Andric SBSymbol SBModule::GetSymbolAtIndex(size_t idx) {
3050b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBSymbol, SBModule, GetSymbolAtIndex, (size_t), idx);
3060b57cec5SDimitry Andric
3070b57cec5SDimitry Andric SBSymbol sb_symbol;
3080b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
3090b57cec5SDimitry Andric Symtab *symtab = GetUnifiedSymbolTable(module_sp);
3100b57cec5SDimitry Andric if (symtab)
3110b57cec5SDimitry Andric sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx));
3120b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_symbol);
3130b57cec5SDimitry Andric }
3140b57cec5SDimitry Andric
FindSymbol(const char * name,lldb::SymbolType symbol_type)3150b57cec5SDimitry Andric lldb::SBSymbol SBModule::FindSymbol(const char *name,
3160b57cec5SDimitry Andric lldb::SymbolType symbol_type) {
3170b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBSymbol, SBModule, FindSymbol,
3180b57cec5SDimitry Andric (const char *, lldb::SymbolType), name, symbol_type);
3190b57cec5SDimitry Andric
3200b57cec5SDimitry Andric SBSymbol sb_symbol;
3210b57cec5SDimitry Andric if (name && name[0]) {
3220b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
3230b57cec5SDimitry Andric Symtab *symtab = GetUnifiedSymbolTable(module_sp);
3240b57cec5SDimitry Andric if (symtab)
3250b57cec5SDimitry Andric sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType(
3260b57cec5SDimitry Andric ConstString(name), symbol_type, Symtab::eDebugAny,
3270b57cec5SDimitry Andric Symtab::eVisibilityAny));
3280b57cec5SDimitry Andric }
3290b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_symbol);
3300b57cec5SDimitry Andric }
3310b57cec5SDimitry Andric
FindSymbols(const char * name,lldb::SymbolType symbol_type)3320b57cec5SDimitry Andric lldb::SBSymbolContextList SBModule::FindSymbols(const char *name,
3330b57cec5SDimitry Andric lldb::SymbolType symbol_type) {
3340b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindSymbols,
3350b57cec5SDimitry Andric (const char *, lldb::SymbolType), name, symbol_type);
3360b57cec5SDimitry Andric
3370b57cec5SDimitry Andric SBSymbolContextList sb_sc_list;
3380b57cec5SDimitry Andric if (name && name[0]) {
3390b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
3400b57cec5SDimitry Andric Symtab *symtab = GetUnifiedSymbolTable(module_sp);
3410b57cec5SDimitry Andric if (symtab) {
3420b57cec5SDimitry Andric std::vector<uint32_t> matching_symbol_indexes;
3439dba64beSDimitry Andric symtab->FindAllSymbolsWithNameAndType(ConstString(name), symbol_type,
3449dba64beSDimitry Andric matching_symbol_indexes);
3459dba64beSDimitry Andric const size_t num_matches = matching_symbol_indexes.size();
3460b57cec5SDimitry Andric if (num_matches) {
3470b57cec5SDimitry Andric SymbolContext sc;
3480b57cec5SDimitry Andric sc.module_sp = module_sp;
3490b57cec5SDimitry Andric SymbolContextList &sc_list = *sb_sc_list;
3500b57cec5SDimitry Andric for (size_t i = 0; i < num_matches; ++i) {
3510b57cec5SDimitry Andric sc.symbol = symtab->SymbolAtIndex(matching_symbol_indexes[i]);
3520b57cec5SDimitry Andric if (sc.symbol)
3530b57cec5SDimitry Andric sc_list.Append(sc);
3540b57cec5SDimitry Andric }
3550b57cec5SDimitry Andric }
3560b57cec5SDimitry Andric }
3570b57cec5SDimitry Andric }
3580b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_sc_list);
3590b57cec5SDimitry Andric }
3600b57cec5SDimitry Andric
GetNumSections()3610b57cec5SDimitry Andric size_t SBModule::GetNumSections() {
3620b57cec5SDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(size_t, SBModule, GetNumSections);
3630b57cec5SDimitry Andric
3640b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
3650b57cec5SDimitry Andric if (module_sp) {
3660b57cec5SDimitry Andric // Give the symbol vendor a chance to add to the unified section list.
3679dba64beSDimitry Andric module_sp->GetSymbolFile();
3680b57cec5SDimitry Andric SectionList *section_list = module_sp->GetSectionList();
3690b57cec5SDimitry Andric if (section_list)
3700b57cec5SDimitry Andric return section_list->GetSize();
3710b57cec5SDimitry Andric }
3720b57cec5SDimitry Andric return 0;
3730b57cec5SDimitry Andric }
3740b57cec5SDimitry Andric
GetSectionAtIndex(size_t idx)3750b57cec5SDimitry Andric SBSection SBModule::GetSectionAtIndex(size_t idx) {
3760b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBSection, SBModule, GetSectionAtIndex, (size_t),
3770b57cec5SDimitry Andric idx);
3780b57cec5SDimitry Andric
3790b57cec5SDimitry Andric SBSection sb_section;
3800b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
3810b57cec5SDimitry Andric if (module_sp) {
3820b57cec5SDimitry Andric // Give the symbol vendor a chance to add to the unified section list.
3839dba64beSDimitry Andric module_sp->GetSymbolFile();
3840b57cec5SDimitry Andric SectionList *section_list = module_sp->GetSectionList();
3850b57cec5SDimitry Andric
3860b57cec5SDimitry Andric if (section_list)
3870b57cec5SDimitry Andric sb_section.SetSP(section_list->GetSectionAtIndex(idx));
3880b57cec5SDimitry Andric }
3890b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_section);
3900b57cec5SDimitry Andric }
3910b57cec5SDimitry Andric
FindFunctions(const char * name,uint32_t name_type_mask)3920b57cec5SDimitry Andric lldb::SBSymbolContextList SBModule::FindFunctions(const char *name,
3930b57cec5SDimitry Andric uint32_t name_type_mask) {
3940b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindFunctions,
3950b57cec5SDimitry Andric (const char *, uint32_t), name, name_type_mask);
3960b57cec5SDimitry Andric
3970b57cec5SDimitry Andric lldb::SBSymbolContextList sb_sc_list;
3980b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
3990b57cec5SDimitry Andric if (name && module_sp) {
4000b57cec5SDimitry Andric const bool symbols_ok = true;
4010b57cec5SDimitry Andric const bool inlines_ok = true;
4020b57cec5SDimitry Andric FunctionNameType type = static_cast<FunctionNameType>(name_type_mask);
4035ffd83dbSDimitry Andric module_sp->FindFunctions(ConstString(name), CompilerDeclContext(), type,
4045ffd83dbSDimitry Andric symbols_ok, inlines_ok, *sb_sc_list);
4050b57cec5SDimitry Andric }
4060b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_sc_list);
4070b57cec5SDimitry Andric }
4080b57cec5SDimitry Andric
FindGlobalVariables(SBTarget & target,const char * name,uint32_t max_matches)4090b57cec5SDimitry Andric SBValueList SBModule::FindGlobalVariables(SBTarget &target, const char *name,
4100b57cec5SDimitry Andric uint32_t max_matches) {
4110b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBValueList, SBModule, FindGlobalVariables,
4120b57cec5SDimitry Andric (lldb::SBTarget &, const char *, uint32_t), target, name,
4130b57cec5SDimitry Andric max_matches);
4140b57cec5SDimitry Andric
4150b57cec5SDimitry Andric SBValueList sb_value_list;
4160b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
4170b57cec5SDimitry Andric if (name && module_sp) {
4180b57cec5SDimitry Andric VariableList variable_list;
4195ffd83dbSDimitry Andric module_sp->FindGlobalVariables(ConstString(name), CompilerDeclContext(),
4205ffd83dbSDimitry Andric max_matches, variable_list);
421480093f4SDimitry Andric for (const VariableSP &var_sp : variable_list) {
4220b57cec5SDimitry Andric lldb::ValueObjectSP valobj_sp;
4230b57cec5SDimitry Andric TargetSP target_sp(target.GetSP());
424480093f4SDimitry Andric valobj_sp = ValueObjectVariable::Create(target_sp.get(), var_sp);
4250b57cec5SDimitry Andric if (valobj_sp)
4260b57cec5SDimitry Andric sb_value_list.Append(SBValue(valobj_sp));
4270b57cec5SDimitry Andric }
4280b57cec5SDimitry Andric }
4290b57cec5SDimitry Andric
4300b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_value_list);
4310b57cec5SDimitry Andric }
4320b57cec5SDimitry Andric
FindFirstGlobalVariable(lldb::SBTarget & target,const char * name)4330b57cec5SDimitry Andric lldb::SBValue SBModule::FindFirstGlobalVariable(lldb::SBTarget &target,
4340b57cec5SDimitry Andric const char *name) {
4350b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBValue, SBModule, FindFirstGlobalVariable,
4360b57cec5SDimitry Andric (lldb::SBTarget &, const char *), target, name);
4370b57cec5SDimitry Andric
4380b57cec5SDimitry Andric SBValueList sb_value_list(FindGlobalVariables(target, name, 1));
4390b57cec5SDimitry Andric if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0)
4400b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_value_list.GetValueAtIndex(0));
4410b57cec5SDimitry Andric return LLDB_RECORD_RESULT(SBValue());
4420b57cec5SDimitry Andric }
4430b57cec5SDimitry Andric
FindFirstType(const char * name_cstr)4440b57cec5SDimitry Andric lldb::SBType SBModule::FindFirstType(const char *name_cstr) {
4450b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBType, SBModule, FindFirstType, (const char *),
4460b57cec5SDimitry Andric name_cstr);
4470b57cec5SDimitry Andric
4480b57cec5SDimitry Andric SBType sb_type;
4490b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
4500b57cec5SDimitry Andric if (name_cstr && module_sp) {
4510b57cec5SDimitry Andric SymbolContext sc;
4520b57cec5SDimitry Andric const bool exact_match = false;
4530b57cec5SDimitry Andric ConstString name(name_cstr);
4540b57cec5SDimitry Andric
4550b57cec5SDimitry Andric sb_type = SBType(module_sp->FindFirstType(sc, name, exact_match));
4560b57cec5SDimitry Andric
4570b57cec5SDimitry Andric if (!sb_type.IsValid()) {
4589dba64beSDimitry Andric auto type_system_or_err =
4590b57cec5SDimitry Andric module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
4609dba64beSDimitry Andric if (auto err = type_system_or_err.takeError()) {
4619dba64beSDimitry Andric llvm::consumeError(std::move(err));
4629dba64beSDimitry Andric return LLDB_RECORD_RESULT(SBType());
4639dba64beSDimitry Andric }
4649dba64beSDimitry Andric sb_type = SBType(type_system_or_err->GetBuiltinTypeByName(name));
4650b57cec5SDimitry Andric }
4660b57cec5SDimitry Andric }
4670b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_type);
4680b57cec5SDimitry Andric }
4690b57cec5SDimitry Andric
GetBasicType(lldb::BasicType type)4700b57cec5SDimitry Andric lldb::SBType SBModule::GetBasicType(lldb::BasicType type) {
4710b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBType, SBModule, GetBasicType, (lldb::BasicType),
4720b57cec5SDimitry Andric type);
4730b57cec5SDimitry Andric
4740b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
4750b57cec5SDimitry Andric if (module_sp) {
4769dba64beSDimitry Andric auto type_system_or_err =
4770b57cec5SDimitry Andric module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
4789dba64beSDimitry Andric if (auto err = type_system_or_err.takeError()) {
4799dba64beSDimitry Andric llvm::consumeError(std::move(err));
4809dba64beSDimitry Andric } else {
4819dba64beSDimitry Andric return LLDB_RECORD_RESULT(
4829dba64beSDimitry Andric SBType(type_system_or_err->GetBasicTypeFromAST(type)));
4839dba64beSDimitry Andric }
4840b57cec5SDimitry Andric }
4850b57cec5SDimitry Andric return LLDB_RECORD_RESULT(SBType());
4860b57cec5SDimitry Andric }
4870b57cec5SDimitry Andric
FindTypes(const char * type)4880b57cec5SDimitry Andric lldb::SBTypeList SBModule::FindTypes(const char *type) {
4890b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBTypeList, SBModule, FindTypes, (const char *),
4900b57cec5SDimitry Andric type);
4910b57cec5SDimitry Andric
4920b57cec5SDimitry Andric SBTypeList retval;
4930b57cec5SDimitry Andric
4940b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
4950b57cec5SDimitry Andric if (type && module_sp) {
4960b57cec5SDimitry Andric TypeList type_list;
4970b57cec5SDimitry Andric const bool exact_match = false;
4980b57cec5SDimitry Andric ConstString name(type);
4990b57cec5SDimitry Andric llvm::DenseSet<SymbolFile *> searched_symbol_files;
5009dba64beSDimitry Andric module_sp->FindTypes(name, exact_match, UINT32_MAX, searched_symbol_files,
5019dba64beSDimitry Andric type_list);
5020b57cec5SDimitry Andric
5039dba64beSDimitry Andric if (type_list.Empty()) {
5049dba64beSDimitry Andric auto type_system_or_err =
5059dba64beSDimitry Andric module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
5069dba64beSDimitry Andric if (auto err = type_system_or_err.takeError()) {
5079dba64beSDimitry Andric llvm::consumeError(std::move(err));
5089dba64beSDimitry Andric } else {
5099dba64beSDimitry Andric CompilerType compiler_type =
5109dba64beSDimitry Andric type_system_or_err->GetBuiltinTypeByName(name);
5119dba64beSDimitry Andric if (compiler_type)
5129dba64beSDimitry Andric retval.Append(SBType(compiler_type));
5139dba64beSDimitry Andric }
5149dba64beSDimitry Andric } else {
5159dba64beSDimitry Andric for (size_t idx = 0; idx < type_list.GetSize(); idx++) {
5160b57cec5SDimitry Andric TypeSP type_sp(type_list.GetTypeAtIndex(idx));
5170b57cec5SDimitry Andric if (type_sp)
5180b57cec5SDimitry Andric retval.Append(SBType(type_sp));
5190b57cec5SDimitry Andric }
5200b57cec5SDimitry Andric }
5210b57cec5SDimitry Andric }
5220b57cec5SDimitry Andric return LLDB_RECORD_RESULT(retval);
5230b57cec5SDimitry Andric }
5240b57cec5SDimitry Andric
GetTypeByID(lldb::user_id_t uid)5250b57cec5SDimitry Andric lldb::SBType SBModule::GetTypeByID(lldb::user_id_t uid) {
5260b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBType, SBModule, GetTypeByID, (lldb::user_id_t),
5270b57cec5SDimitry Andric uid);
5280b57cec5SDimitry Andric
5290b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
5300b57cec5SDimitry Andric if (module_sp) {
5319dba64beSDimitry Andric if (SymbolFile *symfile = module_sp->GetSymbolFile()) {
5329dba64beSDimitry Andric Type *type_ptr = symfile->ResolveTypeUID(uid);
5330b57cec5SDimitry Andric if (type_ptr)
5340b57cec5SDimitry Andric return LLDB_RECORD_RESULT(SBType(type_ptr->shared_from_this()));
5350b57cec5SDimitry Andric }
5360b57cec5SDimitry Andric }
5370b57cec5SDimitry Andric return LLDB_RECORD_RESULT(SBType());
5380b57cec5SDimitry Andric }
5390b57cec5SDimitry Andric
GetTypes(uint32_t type_mask)5400b57cec5SDimitry Andric lldb::SBTypeList SBModule::GetTypes(uint32_t type_mask) {
5410b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBTypeList, SBModule, GetTypes, (uint32_t),
5420b57cec5SDimitry Andric type_mask);
5430b57cec5SDimitry Andric
5440b57cec5SDimitry Andric SBTypeList sb_type_list;
5450b57cec5SDimitry Andric
5460b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
5470b57cec5SDimitry Andric if (!module_sp)
5480b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_type_list);
5499dba64beSDimitry Andric SymbolFile *symfile = module_sp->GetSymbolFile();
5509dba64beSDimitry Andric if (!symfile)
5510b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_type_list);
5520b57cec5SDimitry Andric
5530b57cec5SDimitry Andric TypeClass type_class = static_cast<TypeClass>(type_mask);
5540b57cec5SDimitry Andric TypeList type_list;
5559dba64beSDimitry Andric symfile->GetTypes(nullptr, type_class, type_list);
5560b57cec5SDimitry Andric sb_type_list.m_opaque_up->Append(type_list);
5570b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_type_list);
5580b57cec5SDimitry Andric }
5590b57cec5SDimitry Andric
FindSection(const char * sect_name)5600b57cec5SDimitry Andric SBSection SBModule::FindSection(const char *sect_name) {
5610b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBSection, SBModule, FindSection, (const char *),
5620b57cec5SDimitry Andric sect_name);
5630b57cec5SDimitry Andric
5640b57cec5SDimitry Andric SBSection sb_section;
5650b57cec5SDimitry Andric
5660b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
5670b57cec5SDimitry Andric if (sect_name && module_sp) {
5680b57cec5SDimitry Andric // Give the symbol vendor a chance to add to the unified section list.
5699dba64beSDimitry Andric module_sp->GetSymbolFile();
5700b57cec5SDimitry Andric SectionList *section_list = module_sp->GetSectionList();
5710b57cec5SDimitry Andric if (section_list) {
5720b57cec5SDimitry Andric ConstString const_sect_name(sect_name);
5730b57cec5SDimitry Andric SectionSP section_sp(section_list->FindSectionByName(const_sect_name));
5740b57cec5SDimitry Andric if (section_sp) {
5750b57cec5SDimitry Andric sb_section.SetSP(section_sp);
5760b57cec5SDimitry Andric }
5770b57cec5SDimitry Andric }
5780b57cec5SDimitry Andric }
5790b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_section);
5800b57cec5SDimitry Andric }
5810b57cec5SDimitry Andric
GetByteOrder()5820b57cec5SDimitry Andric lldb::ByteOrder SBModule::GetByteOrder() {
5830b57cec5SDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(lldb::ByteOrder, SBModule, GetByteOrder);
5840b57cec5SDimitry Andric
5850b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
5860b57cec5SDimitry Andric if (module_sp)
5870b57cec5SDimitry Andric return module_sp->GetArchitecture().GetByteOrder();
5880b57cec5SDimitry Andric return eByteOrderInvalid;
5890b57cec5SDimitry Andric }
5900b57cec5SDimitry Andric
GetTriple()5910b57cec5SDimitry Andric const char *SBModule::GetTriple() {
5920b57cec5SDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(const char *, SBModule, GetTriple);
5930b57cec5SDimitry Andric
5940b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
5950b57cec5SDimitry Andric if (module_sp) {
5960b57cec5SDimitry Andric std::string triple(module_sp->GetArchitecture().GetTriple().str());
5970b57cec5SDimitry Andric // Unique the string so we don't run into ownership issues since the const
5980b57cec5SDimitry Andric // strings put the string into the string pool once and the strings never
5990b57cec5SDimitry Andric // comes out
6000b57cec5SDimitry Andric ConstString const_triple(triple.c_str());
6010b57cec5SDimitry Andric return const_triple.GetCString();
6020b57cec5SDimitry Andric }
6030b57cec5SDimitry Andric return nullptr;
6040b57cec5SDimitry Andric }
6050b57cec5SDimitry Andric
GetAddressByteSize()6060b57cec5SDimitry Andric uint32_t SBModule::GetAddressByteSize() {
6070b57cec5SDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBModule, GetAddressByteSize);
6080b57cec5SDimitry Andric
6090b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
6100b57cec5SDimitry Andric if (module_sp)
6110b57cec5SDimitry Andric return module_sp->GetArchitecture().GetAddressByteSize();
6120b57cec5SDimitry Andric return sizeof(void *);
6130b57cec5SDimitry Andric }
6140b57cec5SDimitry Andric
GetVersion(uint32_t * versions,uint32_t num_versions)6150b57cec5SDimitry Andric uint32_t SBModule::GetVersion(uint32_t *versions, uint32_t num_versions) {
6160b57cec5SDimitry Andric LLDB_RECORD_METHOD(uint32_t, SBModule, GetVersion, (uint32_t *, uint32_t),
6170b57cec5SDimitry Andric versions, num_versions);
6180b57cec5SDimitry Andric
6190b57cec5SDimitry Andric llvm::VersionTuple version;
6200b57cec5SDimitry Andric if (ModuleSP module_sp = GetSP())
6210b57cec5SDimitry Andric version = module_sp->GetVersion();
6220b57cec5SDimitry Andric uint32_t result = 0;
6230b57cec5SDimitry Andric if (!version.empty())
6240b57cec5SDimitry Andric ++result;
6250b57cec5SDimitry Andric if (version.getMinor())
6260b57cec5SDimitry Andric ++result;
6270b57cec5SDimitry Andric if (version.getSubminor())
6280b57cec5SDimitry Andric ++result;
6290b57cec5SDimitry Andric
6300b57cec5SDimitry Andric if (!versions)
6310b57cec5SDimitry Andric return result;
6320b57cec5SDimitry Andric
6330b57cec5SDimitry Andric if (num_versions > 0)
6340b57cec5SDimitry Andric versions[0] = version.empty() ? UINT32_MAX : version.getMajor();
6350b57cec5SDimitry Andric if (num_versions > 1)
6360b57cec5SDimitry Andric versions[1] = version.getMinor().getValueOr(UINT32_MAX);
6370b57cec5SDimitry Andric if (num_versions > 2)
6380b57cec5SDimitry Andric versions[2] = version.getSubminor().getValueOr(UINT32_MAX);
6390b57cec5SDimitry Andric for (uint32_t i = 3; i < num_versions; ++i)
6400b57cec5SDimitry Andric versions[i] = UINT32_MAX;
6410b57cec5SDimitry Andric return result;
6420b57cec5SDimitry Andric }
6430b57cec5SDimitry Andric
GetSymbolFileSpec() const6440b57cec5SDimitry Andric lldb::SBFileSpec SBModule::GetSymbolFileSpec() const {
6450b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule,
6460b57cec5SDimitry Andric GetSymbolFileSpec);
6470b57cec5SDimitry Andric
6480b57cec5SDimitry Andric lldb::SBFileSpec sb_file_spec;
6490b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
6500b57cec5SDimitry Andric if (module_sp) {
6519dba64beSDimitry Andric if (SymbolFile *symfile = module_sp->GetSymbolFile())
6529dba64beSDimitry Andric sb_file_spec.SetFileSpec(symfile->GetObjectFile()->GetFileSpec());
6530b57cec5SDimitry Andric }
6540b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_file_spec);
6550b57cec5SDimitry Andric }
6560b57cec5SDimitry Andric
GetObjectFileHeaderAddress() const6570b57cec5SDimitry Andric lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const {
6580b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBModule,
6590b57cec5SDimitry Andric GetObjectFileHeaderAddress);
6600b57cec5SDimitry Andric
6610b57cec5SDimitry Andric lldb::SBAddress sb_addr;
6620b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
6630b57cec5SDimitry Andric if (module_sp) {
6640b57cec5SDimitry Andric ObjectFile *objfile_ptr = module_sp->GetObjectFile();
6650b57cec5SDimitry Andric if (objfile_ptr)
6660b57cec5SDimitry Andric sb_addr.ref() = objfile_ptr->GetBaseAddress();
6670b57cec5SDimitry Andric }
6680b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_addr);
6690b57cec5SDimitry Andric }
6700b57cec5SDimitry Andric
GetObjectFileEntryPointAddress() const6710b57cec5SDimitry Andric lldb::SBAddress SBModule::GetObjectFileEntryPointAddress() const {
6720b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBModule,
6730b57cec5SDimitry Andric GetObjectFileEntryPointAddress);
6740b57cec5SDimitry Andric
6750b57cec5SDimitry Andric lldb::SBAddress sb_addr;
6760b57cec5SDimitry Andric ModuleSP module_sp(GetSP());
6770b57cec5SDimitry Andric if (module_sp) {
6780b57cec5SDimitry Andric ObjectFile *objfile_ptr = module_sp->GetObjectFile();
6790b57cec5SDimitry Andric if (objfile_ptr)
6800b57cec5SDimitry Andric sb_addr.ref() = objfile_ptr->GetEntryPointAddress();
6810b57cec5SDimitry Andric }
6820b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_addr);
6830b57cec5SDimitry Andric }
6840b57cec5SDimitry Andric
GetNumberAllocatedModules()6855ffd83dbSDimitry Andric uint32_t SBModule::GetNumberAllocatedModules() {
6865ffd83dbSDimitry Andric LLDB_RECORD_STATIC_METHOD_NO_ARGS(uint32_t, SBModule,
6875ffd83dbSDimitry Andric GetNumberAllocatedModules);
6885ffd83dbSDimitry Andric
6895ffd83dbSDimitry Andric return Module::GetNumberAllocatedModules();
6905ffd83dbSDimitry Andric }
6915ffd83dbSDimitry Andric
GarbageCollectAllocatedModules()692*af732203SDimitry Andric void SBModule::GarbageCollectAllocatedModules() {
693*af732203SDimitry Andric LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBModule,
694*af732203SDimitry Andric GarbageCollectAllocatedModules);
695*af732203SDimitry Andric
696*af732203SDimitry Andric const bool mandatory = false;
697*af732203SDimitry Andric ModuleList::RemoveOrphanSharedModules(mandatory);
698*af732203SDimitry Andric }
699*af732203SDimitry Andric
7000b57cec5SDimitry Andric namespace lldb_private {
7010b57cec5SDimitry Andric namespace repro {
7020b57cec5SDimitry Andric
RegisterMethods(Registry & R)703*af732203SDimitry Andric template <> void RegisterMethods<SBModule>(Registry &R) {
7040b57cec5SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBModule, ());
7050b57cec5SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBModule, (const lldb::SBModuleSpec &));
7060b57cec5SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBModule, (const lldb::SBModule &));
7070b57cec5SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBModule, (lldb::SBProcess &, lldb::addr_t));
708*af732203SDimitry Andric LLDB_REGISTER_METHOD(const lldb::SBModule &, SBModule, operator=,
709*af732203SDimitry Andric (const lldb::SBModule &));
7100b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBModule, IsValid, ());
7110b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBModule, operator bool, ());
7120b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBModule, Clear, ());
7130b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBModule, GetFileSpec, ());
7140b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBModule, GetPlatformFileSpec,
7150b57cec5SDimitry Andric ());
7160b57cec5SDimitry Andric LLDB_REGISTER_METHOD(bool, SBModule, SetPlatformFileSpec,
7170b57cec5SDimitry Andric (const lldb::SBFileSpec &));
7180b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBFileSpec, SBModule, GetRemoteInstallFileSpec,
7190b57cec5SDimitry Andric ());
7200b57cec5SDimitry Andric LLDB_REGISTER_METHOD(bool, SBModule, SetRemoteInstallFileSpec,
7210b57cec5SDimitry Andric (lldb::SBFileSpec &));
7220b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(const char *, SBModule, GetUUIDString, ());
723*af732203SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBModule, operator==,
724*af732203SDimitry Andric (const lldb::SBModule &));
725*af732203SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBModule, operator!=,
726*af732203SDimitry Andric (const lldb::SBModule &));
7270b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBAddress, SBModule, ResolveFileAddress,
7280b57cec5SDimitry Andric (lldb::addr_t));
7290b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBSymbolContext, SBModule,
7300b57cec5SDimitry Andric ResolveSymbolContextForAddress,
7310b57cec5SDimitry Andric (const lldb::SBAddress &, uint32_t));
7320b57cec5SDimitry Andric LLDB_REGISTER_METHOD(bool, SBModule, GetDescription, (lldb::SBStream &));
7330b57cec5SDimitry Andric LLDB_REGISTER_METHOD(uint32_t, SBModule, GetNumCompileUnits, ());
7340b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBCompileUnit, SBModule, GetCompileUnitAtIndex,
7350b57cec5SDimitry Andric (uint32_t));
7360b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBSymbolContextList, SBModule, FindCompileUnits,
7370b57cec5SDimitry Andric (const lldb::SBFileSpec &));
7380b57cec5SDimitry Andric LLDB_REGISTER_METHOD(size_t, SBModule, GetNumSymbols, ());
7390b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBSymbol, SBModule, GetSymbolAtIndex, (size_t));
7400b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBSymbol, SBModule, FindSymbol,
7410b57cec5SDimitry Andric (const char *, lldb::SymbolType));
7420b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBSymbolContextList, SBModule, FindSymbols,
7430b57cec5SDimitry Andric (const char *, lldb::SymbolType));
7440b57cec5SDimitry Andric LLDB_REGISTER_METHOD(size_t, SBModule, GetNumSections, ());
745*af732203SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBSection, SBModule, GetSectionAtIndex, (size_t));
7460b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBSymbolContextList, SBModule, FindFunctions,
7470b57cec5SDimitry Andric (const char *, uint32_t));
7480b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBValueList, SBModule, FindGlobalVariables,
7490b57cec5SDimitry Andric (lldb::SBTarget &, const char *, uint32_t));
7500b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBValue, SBModule, FindFirstGlobalVariable,
7510b57cec5SDimitry Andric (lldb::SBTarget &, const char *));
7520b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBType, SBModule, FindFirstType, (const char *));
753*af732203SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBType, SBModule, GetBasicType, (lldb::BasicType));
7540b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBTypeList, SBModule, FindTypes, (const char *));
755*af732203SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBType, SBModule, GetTypeByID, (lldb::user_id_t));
7560b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBTypeList, SBModule, GetTypes, (uint32_t));
757*af732203SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBSection, SBModule, FindSection, (const char *));
7580b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::ByteOrder, SBModule, GetByteOrder, ());
7590b57cec5SDimitry Andric LLDB_REGISTER_METHOD(const char *, SBModule, GetTriple, ());
7600b57cec5SDimitry Andric LLDB_REGISTER_METHOD(uint32_t, SBModule, GetAddressByteSize, ());
761*af732203SDimitry Andric LLDB_REGISTER_METHOD(uint32_t, SBModule, GetVersion, (uint32_t *, uint32_t));
762*af732203SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBModule, GetSymbolFileSpec, ());
7630b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBModule,
7640b57cec5SDimitry Andric GetObjectFileHeaderAddress, ());
7650b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBModule,
7660b57cec5SDimitry Andric GetObjectFileEntryPointAddress, ());
7675ffd83dbSDimitry Andric LLDB_REGISTER_STATIC_METHOD(uint32_t, SBModule, GetNumberAllocatedModules,
7685ffd83dbSDimitry Andric ());
769*af732203SDimitry Andric LLDB_REGISTER_STATIC_METHOD(void, SBModule, GarbageCollectAllocatedModules,
770*af732203SDimitry Andric ());
7710b57cec5SDimitry Andric }
7720b57cec5SDimitry Andric
773*af732203SDimitry Andric } // namespace repro
774*af732203SDimitry Andric } // namespace lldb_private
775