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