180814287SRaphael Isemann //===-- SBModule.cpp ------------------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
930fdc8d8SChris Lattner #include "lldb/API/SBModule.h"
10d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.h"
1109960031SGreg Clayton #include "lldb/API/SBAddress.h"
1209960031SGreg Clayton #include "lldb/API/SBFileSpec.h"
13226cce25SGreg Clayton #include "lldb/API/SBModuleSpec.h"
14c9660546SGreg Clayton #include "lldb/API/SBProcess.h"
15dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
16fe356d35SGreg Clayton #include "lldb/API/SBSymbolContextList.h"
17b9c1b51eSKate Stone #include "lldb/Core/Module.h"
181f746071SGreg Clayton #include "lldb/Core/Section.h"
19dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectList.h"
20dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectVariable.h"
211f746071SGreg Clayton #include "lldb/Symbol/ObjectFile.h"
22ae088e52SGreg Clayton #include "lldb/Symbol/SymbolFile.h"
231f746071SGreg Clayton #include "lldb/Symbol/Symtab.h"
2456939cb3SGreg Clayton #include "lldb/Symbol/TypeSystem.h"
25dea8cb4fSGreg Clayton #include "lldb/Symbol/VariableList.h"
26dea8cb4fSGreg Clayton #include "lldb/Target/Target.h"
27bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h"
2830fdc8d8SChris Lattner 
2930fdc8d8SChris Lattner using namespace lldb;
30ceb6b139SCaroline Tice using namespace lldb_private;
3130fdc8d8SChris Lattner 
32a3436f73SKazu Hirata SBModule::SBModule() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBModule); }
3330fdc8d8SChris Lattner 
34b9c1b51eSKate Stone SBModule::SBModule(const lldb::ModuleSP &module_sp) : m_opaque_sp(module_sp) {}
3530fdc8d8SChris Lattner 
36a3436f73SKazu Hirata SBModule::SBModule(const SBModuleSpec &module_spec) {
37baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBModule, (const lldb::SBModuleSpec &), module_spec);
38baf5664fSJonas Devlieghere 
39226cce25SGreg Clayton   ModuleSP module_sp;
40248a1305SKonrad Kleine   Status error = ModuleList::GetSharedModule(
41248a1305SKonrad Kleine       *module_spec.m_opaque_up, module_sp, nullptr, nullptr, nullptr);
42226cce25SGreg Clayton   if (module_sp)
43226cce25SGreg Clayton     SetSP(module_sp);
44226cce25SGreg Clayton }
45226cce25SGreg Clayton 
46baf5664fSJonas Devlieghere SBModule::SBModule(const SBModule &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
47baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBModule, (const lldb::SBModule &), rhs);
48baf5664fSJonas Devlieghere }
49efabb123SGreg Clayton 
50a3436f73SKazu Hirata SBModule::SBModule(lldb::SBProcess &process, lldb::addr_t header_addr) {
51baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBModule, (lldb::SBProcess &, lldb::addr_t), process,
52baf5664fSJonas Devlieghere                           header_addr);
53baf5664fSJonas Devlieghere 
54c9660546SGreg Clayton   ProcessSP process_sp(process.GetSP());
55b9c1b51eSKate Stone   if (process_sp) {
5639f7ee86SGreg Clayton     m_opaque_sp = process_sp->ReadModuleFromMemory(FileSpec(), header_addr);
57b9c1b51eSKate Stone     if (m_opaque_sp) {
5839f7ee86SGreg Clayton       Target &target = process_sp->GetTarget();
5939f7ee86SGreg Clayton       bool changed = false;
60751caf65SGreg Clayton       m_opaque_sp->SetLoadAddress(target, 0, true, changed);
6139f7ee86SGreg Clayton       target.GetImages().Append(m_opaque_sp);
6239f7ee86SGreg Clayton     }
63c859e2d5SGreg Clayton   }
64c9660546SGreg Clayton }
65c9660546SGreg Clayton 
66b9c1b51eSKate Stone const SBModule &SBModule::operator=(const SBModule &rhs) {
67e095e98aSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBModule &, SBModule, operator=,
68e095e98aSJonas Devlieghere                      (const lldb::SBModule &), rhs);
69baf5664fSJonas Devlieghere 
70efabb123SGreg Clayton   if (this != &rhs)
71efabb123SGreg Clayton     m_opaque_sp = rhs.m_opaque_sp;
72*d232abc3SJonas Devlieghere   return *this;
73efabb123SGreg Clayton }
74efabb123SGreg Clayton 
75866b7a65SJonas Devlieghere SBModule::~SBModule() = default;
7630fdc8d8SChris Lattner 
77baf5664fSJonas Devlieghere bool SBModule::IsValid() const {
78baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBModule, IsValid);
797f5237bcSPavel Labath   return this->operator bool();
807f5237bcSPavel Labath }
817f5237bcSPavel Labath SBModule::operator bool() const {
827f5237bcSPavel Labath   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBModule, operator bool);
8330fdc8d8SChris Lattner 
84248a1305SKonrad Kleine   return m_opaque_sp.get() != nullptr;
85baf5664fSJonas Devlieghere }
86baf5664fSJonas Devlieghere 
87baf5664fSJonas Devlieghere void SBModule::Clear() {
88baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBModule, Clear);
89baf5664fSJonas Devlieghere 
90baf5664fSJonas Devlieghere   m_opaque_sp.reset();
91baf5664fSJonas Devlieghere }
925d3bca4eSJim Ingham 
93b9c1b51eSKate Stone SBFileSpec SBModule::GetFileSpec() const {
94baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule, GetFileSpec);
95baf5664fSJonas Devlieghere 
9630fdc8d8SChris Lattner   SBFileSpec file_spec;
97c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
98c2ff9318SGreg Clayton   if (module_sp)
99c2ff9318SGreg Clayton     file_spec.SetFileSpec(module_sp->GetFileSpec());
100ceb6b139SCaroline Tice 
101*d232abc3SJonas Devlieghere   return file_spec;
10230fdc8d8SChris Lattner }
10330fdc8d8SChris Lattner 
104b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetPlatformFileSpec() const {
105baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule,
106baf5664fSJonas Devlieghere                                    GetPlatformFileSpec);
107baf5664fSJonas Devlieghere 
1082289fa48SGreg Clayton   SBFileSpec file_spec;
109c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
110c2ff9318SGreg Clayton   if (module_sp)
111c2ff9318SGreg Clayton     file_spec.SetFileSpec(module_sp->GetPlatformFileSpec());
1122289fa48SGreg Clayton 
113*d232abc3SJonas Devlieghere   return file_spec;
1142289fa48SGreg Clayton }
1152289fa48SGreg Clayton 
116b9c1b51eSKate Stone bool SBModule::SetPlatformFileSpec(const lldb::SBFileSpec &platform_file) {
117baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBModule, SetPlatformFileSpec,
118baf5664fSJonas Devlieghere                      (const lldb::SBFileSpec &), platform_file);
119baf5664fSJonas Devlieghere 
1202289fa48SGreg Clayton   bool result = false;
1212289fa48SGreg Clayton 
122c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
123b9c1b51eSKate Stone   if (module_sp) {
124c2ff9318SGreg Clayton     module_sp->SetPlatformFileSpec(*platform_file);
1252289fa48SGreg Clayton     result = true;
1262289fa48SGreg Clayton   }
1272289fa48SGreg Clayton 
1282289fa48SGreg Clayton   return result;
1292289fa48SGreg Clayton }
1302289fa48SGreg Clayton 
131b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetRemoteInstallFileSpec() {
132baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBFileSpec, SBModule,
133baf5664fSJonas Devlieghere                              GetRemoteInstallFileSpec);
134baf5664fSJonas Devlieghere 
135fbb76349SGreg Clayton   SBFileSpec sb_file_spec;
136fbb76349SGreg Clayton   ModuleSP module_sp(GetSP());
137fbb76349SGreg Clayton   if (module_sp)
138fbb76349SGreg Clayton     sb_file_spec.SetFileSpec(module_sp->GetRemoteInstallFileSpec());
139*d232abc3SJonas Devlieghere   return sb_file_spec;
140fbb76349SGreg Clayton }
141fbb76349SGreg Clayton 
142b9c1b51eSKate Stone bool SBModule::SetRemoteInstallFileSpec(lldb::SBFileSpec &file) {
143baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBModule, SetRemoteInstallFileSpec,
144baf5664fSJonas Devlieghere                      (lldb::SBFileSpec &), file);
145baf5664fSJonas Devlieghere 
146fbb76349SGreg Clayton   ModuleSP module_sp(GetSP());
147b9c1b51eSKate Stone   if (module_sp) {
148fbb76349SGreg Clayton     module_sp->SetRemoteInstallFileSpec(file.ref());
149fbb76349SGreg Clayton     return true;
150fbb76349SGreg Clayton   }
151fbb76349SGreg Clayton   return false;
152fbb76349SGreg Clayton }
1532289fa48SGreg Clayton 
154b9c1b51eSKate Stone const uint8_t *SBModule::GetUUIDBytes() const {
155baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const uint8_t *, SBModule, GetUUIDBytes);
156baf5664fSJonas Devlieghere 
157248a1305SKonrad Kleine   const uint8_t *uuid_bytes = nullptr;
158c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
159c2ff9318SGreg Clayton   if (module_sp)
160470b286eSPavel Labath     uuid_bytes = module_sp->GetUUID().GetBytes().data();
161ceb6b139SCaroline Tice 
1624838131bSGreg Clayton   return uuid_bytes;
16330fdc8d8SChris Lattner }
16430fdc8d8SChris Lattner 
165b9c1b51eSKate Stone const char *SBModule::GetUUIDString() const {
166baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBModule, GetUUIDString);
167baf5664fSJonas Devlieghere 
168248a1305SKonrad Kleine   const char *uuid_cstr = nullptr;
169c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
170b9c1b51eSKate Stone   if (module_sp) {
17105097246SAdrian Prantl     // We are going to return a "const char *" value through the public API, so
17205097246SAdrian Prantl     // we need to constify it so it gets added permanently the string pool and
17305097246SAdrian Prantl     // then we don't need to worry about the lifetime of the string as it will
17405097246SAdrian Prantl     // never go away once it has been put into the ConstString string pool
175f1be855aSGreg Clayton     uuid_cstr = ConstString(module_sp->GetUUID().GetAsString()).GetCString();
176f1be855aSGreg Clayton   }
177f1be855aSGreg Clayton 
178b9c1b51eSKate Stone   if (uuid_cstr && uuid_cstr[0]) {
179f1be855aSGreg Clayton     return uuid_cstr;
180c16b4af0SJason Molenda   }
181df2963edSJohnny Chen 
182248a1305SKonrad Kleine   return nullptr;
183df2963edSJohnny Chen }
184df2963edSJohnny Chen 
185b9c1b51eSKate Stone bool SBModule::operator==(const SBModule &rhs) const {
186baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBModule, operator==, (const lldb::SBModule &),
187baf5664fSJonas Devlieghere                            rhs);
188baf5664fSJonas Devlieghere 
1896611103cSGreg Clayton   if (m_opaque_sp)
1906611103cSGreg Clayton     return m_opaque_sp.get() == rhs.m_opaque_sp.get();
19130fdc8d8SChris Lattner   return false;
19230fdc8d8SChris Lattner }
19330fdc8d8SChris Lattner 
194b9c1b51eSKate Stone bool SBModule::operator!=(const SBModule &rhs) const {
195baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBModule, operator!=, (const lldb::SBModule &),
196baf5664fSJonas Devlieghere                            rhs);
197baf5664fSJonas Devlieghere 
1986611103cSGreg Clayton   if (m_opaque_sp)
1996611103cSGreg Clayton     return m_opaque_sp.get() != rhs.m_opaque_sp.get();
20030fdc8d8SChris Lattner   return false;
20130fdc8d8SChris Lattner }
20230fdc8d8SChris Lattner 
203b9c1b51eSKate Stone ModuleSP SBModule::GetSP() const { return m_opaque_sp; }
20430fdc8d8SChris Lattner 
205b9c1b51eSKate Stone void SBModule::SetSP(const ModuleSP &module_sp) { m_opaque_sp = module_sp; }
20630fdc8d8SChris Lattner 
207b9c1b51eSKate Stone SBAddress SBModule::ResolveFileAddress(lldb::addr_t vm_addr) {
208baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBAddress, SBModule, ResolveFileAddress,
209baf5664fSJonas Devlieghere                      (lldb::addr_t), vm_addr);
210baf5664fSJonas Devlieghere 
211cac9c5f9SGreg Clayton   lldb::SBAddress sb_addr;
212c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
213b9c1b51eSKate Stone   if (module_sp) {
214cac9c5f9SGreg Clayton     Address addr;
215c2ff9318SGreg Clayton     if (module_sp->ResolveFileAddress(vm_addr, addr))
216cac9c5f9SGreg Clayton       sb_addr.ref() = addr;
217cac9c5f9SGreg Clayton   }
218*d232abc3SJonas Devlieghere   return sb_addr;
21909960031SGreg Clayton }
22009960031SGreg Clayton 
22109960031SGreg Clayton SBSymbolContext
222b9c1b51eSKate Stone SBModule::ResolveSymbolContextForAddress(const SBAddress &addr,
223b9c1b51eSKate Stone                                          uint32_t resolve_scope) {
224baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbolContext, SBModule,
225baf5664fSJonas Devlieghere                      ResolveSymbolContextForAddress,
226baf5664fSJonas Devlieghere                      (const lldb::SBAddress &, uint32_t), addr, resolve_scope);
227baf5664fSJonas Devlieghere 
22809960031SGreg Clayton   SBSymbolContext sb_sc;
229c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
230991e4453SZachary Turner   SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
231c2ff9318SGreg Clayton   if (module_sp && addr.IsValid())
232991e4453SZachary Turner     module_sp->ResolveSymbolContextForAddress(addr.ref(), scope, *sb_sc);
233*d232abc3SJonas Devlieghere   return sb_sc;
23409960031SGreg Clayton }
23509960031SGreg Clayton 
236b9c1b51eSKate Stone bool SBModule::GetDescription(SBStream &description) {
237baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBModule, GetDescription, (lldb::SBStream &),
238baf5664fSJonas Devlieghere                      description);
239baf5664fSJonas Devlieghere 
240da7bc7d0SGreg Clayton   Stream &strm = description.ref();
241da7bc7d0SGreg Clayton 
242c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
243b9c1b51eSKate Stone   if (module_sp) {
244c4c464f8SRaphael Isemann     module_sp->GetDescription(strm.AsRawOstream());
245b9c1b51eSKate Stone   } else
246da7bc7d0SGreg Clayton     strm.PutCString("No value");
247dde9cff3SCaroline Tice 
248dde9cff3SCaroline Tice   return true;
249dde9cff3SCaroline Tice }
250bbdabce2SGreg Clayton 
251b9c1b51eSKate Stone uint32_t SBModule::GetNumCompileUnits() {
252baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBModule, GetNumCompileUnits);
253baf5664fSJonas Devlieghere 
254873a7a4bSJohnny Chen   ModuleSP module_sp(GetSP());
255b9c1b51eSKate Stone   if (module_sp) {
256873a7a4bSJohnny Chen     return module_sp->GetNumCompileUnits();
257873a7a4bSJohnny Chen   }
258873a7a4bSJohnny Chen   return 0;
259873a7a4bSJohnny Chen }
260873a7a4bSJohnny Chen 
261b9c1b51eSKate Stone SBCompileUnit SBModule::GetCompileUnitAtIndex(uint32_t index) {
262baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBCompileUnit, SBModule, GetCompileUnitAtIndex,
263baf5664fSJonas Devlieghere                      (uint32_t), index);
264baf5664fSJonas Devlieghere 
265873a7a4bSJohnny Chen   SBCompileUnit sb_cu;
266873a7a4bSJohnny Chen   ModuleSP module_sp(GetSP());
267b9c1b51eSKate Stone   if (module_sp) {
268873a7a4bSJohnny Chen     CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(index);
269873a7a4bSJohnny Chen     sb_cu.reset(cu_sp.get());
270873a7a4bSJohnny Chen   }
271*d232abc3SJonas Devlieghere   return sb_cu;
272873a7a4bSJohnny Chen }
273873a7a4bSJohnny Chen 
274baf5664fSJonas Devlieghere SBSymbolContextList SBModule::FindCompileUnits(const SBFileSpec &sb_file_spec) {
275baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindCompileUnits,
276baf5664fSJonas Devlieghere                      (const lldb::SBFileSpec &), sb_file_spec);
277baf5664fSJonas Devlieghere 
278da0c081fSAlexander Polyakov   SBSymbolContextList sb_sc_list;
279da0c081fSAlexander Polyakov   const ModuleSP module_sp(GetSP());
280da0c081fSAlexander Polyakov   if (sb_file_spec.IsValid() && module_sp) {
2811ad655e2SAdrian Prantl     module_sp->FindCompileUnits(*sb_file_spec, *sb_sc_list);
282da0c081fSAlexander Polyakov   }
283*d232abc3SJonas Devlieghere   return sb_sc_list;
284da0c081fSAlexander Polyakov }
285da0c081fSAlexander Polyakov 
286b9c1b51eSKate Stone static Symtab *GetUnifiedSymbolTable(const lldb::ModuleSP &module_sp) {
287d5d47a35SPavel Labath   if (module_sp)
288d5d47a35SPavel Labath     return module_sp->GetSymtab();
289248a1305SKonrad Kleine   return nullptr;
290a7499c98SMichael Sartain }
291a7499c98SMichael Sartain 
292b9c1b51eSKate Stone size_t SBModule::GetNumSymbols() {
293baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(size_t, SBModule, GetNumSymbols);
294baf5664fSJonas Devlieghere 
295c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
296d5d47a35SPavel Labath   if (Symtab *symtab = GetUnifiedSymbolTable(module_sp))
297bbdabce2SGreg Clayton     return symtab->GetNumSymbols();
298bbdabce2SGreg Clayton   return 0;
299bbdabce2SGreg Clayton }
300bbdabce2SGreg Clayton 
301b9c1b51eSKate Stone SBSymbol SBModule::GetSymbolAtIndex(size_t idx) {
302baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbol, SBModule, GetSymbolAtIndex, (size_t), idx);
303baf5664fSJonas Devlieghere 
304bbdabce2SGreg Clayton   SBSymbol sb_symbol;
305c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
306a7499c98SMichael Sartain   Symtab *symtab = GetUnifiedSymbolTable(module_sp);
307bbdabce2SGreg Clayton   if (symtab)
308bbdabce2SGreg Clayton     sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx));
309*d232abc3SJonas Devlieghere   return sb_symbol;
310bbdabce2SGreg Clayton }
311fe356d35SGreg Clayton 
312b9c1b51eSKate Stone lldb::SBSymbol SBModule::FindSymbol(const char *name,
313b9c1b51eSKate Stone                                     lldb::SymbolType symbol_type) {
314baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbol, SBModule, FindSymbol,
315baf5664fSJonas Devlieghere                      (const char *, lldb::SymbolType), name, symbol_type);
316baf5664fSJonas Devlieghere 
317e14e1925SGreg Clayton   SBSymbol sb_symbol;
318b9c1b51eSKate Stone   if (name && name[0]) {
319e14e1925SGreg Clayton     ModuleSP module_sp(GetSP());
320a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
321e14e1925SGreg Clayton     if (symtab)
322b9c1b51eSKate Stone       sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType(
323b9c1b51eSKate Stone           ConstString(name), symbol_type, Symtab::eDebugAny,
324b9c1b51eSKate Stone           Symtab::eVisibilityAny));
325e14e1925SGreg Clayton   }
326*d232abc3SJonas Devlieghere   return sb_symbol;
327e14e1925SGreg Clayton }
328e14e1925SGreg Clayton 
329b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindSymbols(const char *name,
330b9c1b51eSKate Stone                                                 lldb::SymbolType symbol_type) {
331baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindSymbols,
332baf5664fSJonas Devlieghere                      (const char *, lldb::SymbolType), name, symbol_type);
333baf5664fSJonas Devlieghere 
334e14e1925SGreg Clayton   SBSymbolContextList sb_sc_list;
335b9c1b51eSKate Stone   if (name && name[0]) {
336e14e1925SGreg Clayton     ModuleSP module_sp(GetSP());
337a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
338b9c1b51eSKate Stone     if (symtab) {
339e14e1925SGreg Clayton       std::vector<uint32_t> matching_symbol_indexes;
3401ad655e2SAdrian Prantl       symtab->FindAllSymbolsWithNameAndType(ConstString(name), symbol_type,
3411ad655e2SAdrian Prantl                                             matching_symbol_indexes);
3421ad655e2SAdrian Prantl       const size_t num_matches = matching_symbol_indexes.size();
343b9c1b51eSKate Stone       if (num_matches) {
344e14e1925SGreg Clayton         SymbolContext sc;
345e14e1925SGreg Clayton         sc.module_sp = module_sp;
346e14e1925SGreg Clayton         SymbolContextList &sc_list = *sb_sc_list;
347b9c1b51eSKate Stone         for (size_t i = 0; i < num_matches; ++i) {
348e14e1925SGreg Clayton           sc.symbol = symtab->SymbolAtIndex(matching_symbol_indexes[i]);
349e14e1925SGreg Clayton           if (sc.symbol)
350e14e1925SGreg Clayton             sc_list.Append(sc);
351e14e1925SGreg Clayton         }
352e14e1925SGreg Clayton       }
353e14e1925SGreg Clayton     }
354e14e1925SGreg Clayton   }
355*d232abc3SJonas Devlieghere   return sb_sc_list;
356e14e1925SGreg Clayton }
357e14e1925SGreg Clayton 
358b9c1b51eSKate Stone size_t SBModule::GetNumSections() {
359baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(size_t, SBModule, GetNumSections);
360baf5664fSJonas Devlieghere 
361c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
362b9c1b51eSKate Stone   if (module_sp) {
363a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
364465eae36SPavel Labath     module_sp->GetSymbolFile();
3653046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
366cac9c5f9SGreg Clayton     if (section_list)
367cac9c5f9SGreg Clayton       return section_list->GetSize();
368cac9c5f9SGreg Clayton   }
369cac9c5f9SGreg Clayton   return 0;
370cac9c5f9SGreg Clayton }
371cac9c5f9SGreg Clayton 
372b9c1b51eSKate Stone SBSection SBModule::GetSectionAtIndex(size_t idx) {
373baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSection, SBModule, GetSectionAtIndex, (size_t),
374baf5664fSJonas Devlieghere                      idx);
375baf5664fSJonas Devlieghere 
376cac9c5f9SGreg Clayton   SBSection sb_section;
377c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
378b9c1b51eSKate Stone   if (module_sp) {
379a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
380465eae36SPavel Labath     module_sp->GetSymbolFile();
3813046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
382cac9c5f9SGreg Clayton 
383cac9c5f9SGreg Clayton     if (section_list)
384e72dfb32SGreg Clayton       sb_section.SetSP(section_list->GetSectionAtIndex(idx));
385cac9c5f9SGreg Clayton   }
386*d232abc3SJonas Devlieghere   return sb_section;
387cac9c5f9SGreg Clayton }
388cac9c5f9SGreg Clayton 
389b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindFunctions(const char *name,
390b9c1b51eSKate Stone                                                   uint32_t name_type_mask) {
391baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindFunctions,
392baf5664fSJonas Devlieghere                      (const char *, uint32_t), name, name_type_mask);
393baf5664fSJonas Devlieghere 
3945569e64eSGreg Clayton   lldb::SBSymbolContextList sb_sc_list;
395c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
396b9c1b51eSKate Stone   if (name && module_sp) {
397c020be17SJonas Devlieghere 
398c020be17SJonas Devlieghere     ModuleFunctionSearchOptions function_options;
399c020be17SJonas Devlieghere     function_options.include_symbols = true;
400c020be17SJonas Devlieghere     function_options.include_inlines = true;
401117b1fa1SZachary Turner     FunctionNameType type = static_cast<FunctionNameType>(name_type_mask);
402f9568a95SRaphael Isemann     module_sp->FindFunctions(ConstString(name), CompilerDeclContext(), type,
403c020be17SJonas Devlieghere                              function_options, *sb_sc_list);
404fe356d35SGreg Clayton   }
405*d232abc3SJonas Devlieghere   return sb_sc_list;
406fe356d35SGreg Clayton }
407fe356d35SGreg Clayton 
408b9c1b51eSKate Stone SBValueList SBModule::FindGlobalVariables(SBTarget &target, const char *name,
409b9c1b51eSKate Stone                                           uint32_t max_matches) {
410baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBModule, FindGlobalVariables,
411baf5664fSJonas Devlieghere                      (lldb::SBTarget &, const char *, uint32_t), target, name,
412baf5664fSJonas Devlieghere                      max_matches);
413baf5664fSJonas Devlieghere 
414dea8cb4fSGreg Clayton   SBValueList sb_value_list;
415c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
416b9c1b51eSKate Stone   if (name && module_sp) {
417dea8cb4fSGreg Clayton     VariableList variable_list;
418f9568a95SRaphael Isemann     module_sp->FindGlobalVariables(ConstString(name), CompilerDeclContext(),
419f9568a95SRaphael Isemann                                    max_matches, variable_list);
420d1782133SRaphael Isemann     for (const VariableSP &var_sp : variable_list) {
421dea8cb4fSGreg Clayton       lldb::ValueObjectSP valobj_sp;
422b9556accSGreg Clayton       TargetSP target_sp(target.GetSP());
423d1782133SRaphael Isemann       valobj_sp = ValueObjectVariable::Create(target_sp.get(), var_sp);
424dea8cb4fSGreg Clayton       if (valobj_sp)
42585425d77SEnrico Granata         sb_value_list.Append(SBValue(valobj_sp));
426dea8cb4fSGreg Clayton     }
427dea8cb4fSGreg Clayton   }
428dea8cb4fSGreg Clayton 
429*d232abc3SJonas Devlieghere   return sb_value_list;
430dea8cb4fSGreg Clayton }
4316f3533fbSEnrico Granata 
432b9c1b51eSKate Stone lldb::SBValue SBModule::FindFirstGlobalVariable(lldb::SBTarget &target,
433b9c1b51eSKate Stone                                                 const char *name) {
434baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBModule, FindFirstGlobalVariable,
435baf5664fSJonas Devlieghere                      (lldb::SBTarget &, const char *), target, name);
436baf5664fSJonas Devlieghere 
437bcd80b47SEnrico Granata   SBValueList sb_value_list(FindGlobalVariables(target, name, 1));
438bcd80b47SEnrico Granata   if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0)
439*d232abc3SJonas Devlieghere     return sb_value_list.GetValueAtIndex(0);
440*d232abc3SJonas Devlieghere   return SBValue();
441bcd80b47SEnrico Granata }
442bcd80b47SEnrico Granata 
443b9c1b51eSKate Stone lldb::SBType SBModule::FindFirstType(const char *name_cstr) {
444baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBType, SBModule, FindFirstType, (const char *),
445baf5664fSJonas Devlieghere                      name_cstr);
446baf5664fSJonas Devlieghere 
447fe42ac4dSGreg Clayton   SBType sb_type;
448c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
449b9c1b51eSKate Stone   if (name_cstr && module_sp) {
4506f3533fbSEnrico Granata     SymbolContext sc;
45184db9105SGreg Clayton     const bool exact_match = false;
4526f3533fbSEnrico Granata     ConstString name(name_cstr);
4536f3533fbSEnrico Granata 
454b43165b7SGreg Clayton     sb_type = SBType(module_sp->FindFirstType(sc, name, exact_match));
4556f3533fbSEnrico Granata 
456b9c1b51eSKate Stone     if (!sb_type.IsValid()) {
4570e252e38SAlex Langford       auto type_system_or_err =
458b9c1b51eSKate Stone           module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
4590e252e38SAlex Langford       if (auto err = type_system_or_err.takeError()) {
4600e252e38SAlex Langford         llvm::consumeError(std::move(err));
461*d232abc3SJonas Devlieghere         return SBType();
4620e252e38SAlex Langford       }
4630e252e38SAlex Langford       sb_type = SBType(type_system_or_err->GetBuiltinTypeByName(name));
46456939cb3SGreg Clayton     }
4656f3533fbSEnrico Granata   }
466*d232abc3SJonas Devlieghere   return sb_type;
4676f3533fbSEnrico Granata }
4686f3533fbSEnrico Granata 
469b9c1b51eSKate Stone lldb::SBType SBModule::GetBasicType(lldb::BasicType type) {
470baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBType, SBModule, GetBasicType, (lldb::BasicType),
471baf5664fSJonas Devlieghere                      type);
472baf5664fSJonas Devlieghere 
473b43165b7SGreg Clayton   ModuleSP module_sp(GetSP());
474b9c1b51eSKate Stone   if (module_sp) {
4750e252e38SAlex Langford     auto type_system_or_err =
476b9c1b51eSKate Stone         module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
4770e252e38SAlex Langford     if (auto err = type_system_or_err.takeError()) {
4780e252e38SAlex Langford       llvm::consumeError(std::move(err));
4790e252e38SAlex Langford     } else {
480*d232abc3SJonas Devlieghere       return SBType(type_system_or_err->GetBasicTypeFromAST(type));
4810e252e38SAlex Langford     }
48256939cb3SGreg Clayton   }
483*d232abc3SJonas Devlieghere   return SBType();
484b43165b7SGreg Clayton }
485b43165b7SGreg Clayton 
486b9c1b51eSKate Stone lldb::SBTypeList SBModule::FindTypes(const char *type) {
487baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeList, SBModule, FindTypes, (const char *),
488baf5664fSJonas Devlieghere                      type);
489baf5664fSJonas Devlieghere 
4906f3533fbSEnrico Granata   SBTypeList retval;
4916f3533fbSEnrico Granata 
492c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
493b9c1b51eSKate Stone   if (type && module_sp) {
4946f3533fbSEnrico Granata     TypeList type_list;
49584db9105SGreg Clayton     const bool exact_match = false;
4966f3533fbSEnrico Granata     ConstString name(type);
497ae088e52SGreg Clayton     llvm::DenseSet<SymbolFile *> searched_symbol_files;
498bf9d84c0SAdrian Prantl     module_sp->FindTypes(name, exact_match, UINT32_MAX, searched_symbol_files,
499bf9d84c0SAdrian Prantl                          type_list);
5006f3533fbSEnrico Granata 
501bf9d84c0SAdrian Prantl     if (type_list.Empty()) {
5020e252e38SAlex Langford       auto type_system_or_err =
503b9c1b51eSKate Stone           module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
5040e252e38SAlex Langford       if (auto err = type_system_or_err.takeError()) {
5050e252e38SAlex Langford         llvm::consumeError(std::move(err));
5060e252e38SAlex Langford       } else {
5070e252e38SAlex Langford         CompilerType compiler_type =
5080e252e38SAlex Langford             type_system_or_err->GetBuiltinTypeByName(name);
50956939cb3SGreg Clayton         if (compiler_type)
51056939cb3SGreg Clayton           retval.Append(SBType(compiler_type));
51156939cb3SGreg Clayton       }
512bf9d84c0SAdrian Prantl     } else {
513bf9d84c0SAdrian Prantl       for (size_t idx = 0; idx < type_list.GetSize(); idx++) {
514bf9d84c0SAdrian Prantl         TypeSP type_sp(type_list.GetTypeAtIndex(idx));
515bf9d84c0SAdrian Prantl         if (type_sp)
516bf9d84c0SAdrian Prantl           retval.Append(SBType(type_sp));
517b43165b7SGreg Clayton       }
518b43165b7SGreg Clayton     }
519bf9d84c0SAdrian Prantl   }
520*d232abc3SJonas Devlieghere   return retval;
5216f3533fbSEnrico Granata }
522cac9c5f9SGreg Clayton 
523b9c1b51eSKate Stone lldb::SBType SBModule::GetTypeByID(lldb::user_id_t uid) {
524baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBType, SBModule, GetTypeByID, (lldb::user_id_t),
525baf5664fSJonas Devlieghere                      uid);
526baf5664fSJonas Devlieghere 
5271f4db7daSGreg Clayton   ModuleSP module_sp(GetSP());
528b9c1b51eSKate Stone   if (module_sp) {
529465eae36SPavel Labath     if (SymbolFile *symfile = module_sp->GetSymbolFile()) {
530465eae36SPavel Labath       Type *type_ptr = symfile->ResolveTypeUID(uid);
5311f4db7daSGreg Clayton       if (type_ptr)
532*d232abc3SJonas Devlieghere         return SBType(type_ptr->shared_from_this());
5331f4db7daSGreg Clayton     }
5341f4db7daSGreg Clayton   }
535*d232abc3SJonas Devlieghere   return SBType();
5361f4db7daSGreg Clayton }
5371f4db7daSGreg Clayton 
538b9c1b51eSKate Stone lldb::SBTypeList SBModule::GetTypes(uint32_t type_mask) {
539baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeList, SBModule, GetTypes, (uint32_t),
540baf5664fSJonas Devlieghere                      type_mask);
541baf5664fSJonas Devlieghere 
542f02500c7SGreg Clayton   SBTypeList sb_type_list;
543f02500c7SGreg Clayton 
544f02500c7SGreg Clayton   ModuleSP module_sp(GetSP());
545117b1fa1SZachary Turner   if (!module_sp)
546*d232abc3SJonas Devlieghere     return sb_type_list;
547465eae36SPavel Labath   SymbolFile *symfile = module_sp->GetSymbolFile();
548465eae36SPavel Labath   if (!symfile)
549*d232abc3SJonas Devlieghere     return sb_type_list;
550117b1fa1SZachary Turner 
551117b1fa1SZachary Turner   TypeClass type_class = static_cast<TypeClass>(type_mask);
552f02500c7SGreg Clayton   TypeList type_list;
553465eae36SPavel Labath   symfile->GetTypes(nullptr, type_class, type_list);
554d5b44036SJonas Devlieghere   sb_type_list.m_opaque_up->Append(type_list);
555*d232abc3SJonas Devlieghere   return sb_type_list;
556f02500c7SGreg Clayton }
557cac9c5f9SGreg Clayton 
558b9c1b51eSKate Stone SBSection SBModule::FindSection(const char *sect_name) {
559baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSection, SBModule, FindSection, (const char *),
560baf5664fSJonas Devlieghere                      sect_name);
561baf5664fSJonas Devlieghere 
562cac9c5f9SGreg Clayton   SBSection sb_section;
563cac9c5f9SGreg Clayton 
564c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
565b9c1b51eSKate Stone   if (sect_name && module_sp) {
566a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
567465eae36SPavel Labath     module_sp->GetSymbolFile();
5683046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
569b9c1b51eSKate Stone     if (section_list) {
570cac9c5f9SGreg Clayton       ConstString const_sect_name(sect_name);
571cac9c5f9SGreg Clayton       SectionSP section_sp(section_list->FindSectionByName(const_sect_name));
572b9c1b51eSKate Stone       if (section_sp) {
573e72dfb32SGreg Clayton         sb_section.SetSP(section_sp);
574cac9c5f9SGreg Clayton       }
575cac9c5f9SGreg Clayton     }
576cac9c5f9SGreg Clayton   }
577*d232abc3SJonas Devlieghere   return sb_section;
578cac9c5f9SGreg Clayton }
579cac9c5f9SGreg Clayton 
580b9c1b51eSKate Stone lldb::ByteOrder SBModule::GetByteOrder() {
581baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::ByteOrder, SBModule, GetByteOrder);
582baf5664fSJonas Devlieghere 
583c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
584c2ff9318SGreg Clayton   if (module_sp)
585c2ff9318SGreg Clayton     return module_sp->GetArchitecture().GetByteOrder();
58613d1950aSGreg Clayton   return eByteOrderInvalid;
58713d1950aSGreg Clayton }
58813d1950aSGreg Clayton 
589b9c1b51eSKate Stone const char *SBModule::GetTriple() {
590baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBModule, GetTriple);
591baf5664fSJonas Devlieghere 
592c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
593b9c1b51eSKate Stone   if (module_sp) {
594c2ff9318SGreg Clayton     std::string triple(module_sp->GetArchitecture().GetTriple().str());
59505097246SAdrian Prantl     // Unique the string so we don't run into ownership issues since the const
59605097246SAdrian Prantl     // strings put the string into the string pool once and the strings never
59705097246SAdrian Prantl     // comes out
59813d1950aSGreg Clayton     ConstString const_triple(triple.c_str());
59913d1950aSGreg Clayton     return const_triple.GetCString();
60013d1950aSGreg Clayton   }
601248a1305SKonrad Kleine   return nullptr;
60213d1950aSGreg Clayton }
60313d1950aSGreg Clayton 
604b9c1b51eSKate Stone uint32_t SBModule::GetAddressByteSize() {
605baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBModule, GetAddressByteSize);
606baf5664fSJonas Devlieghere 
607c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
608c2ff9318SGreg Clayton   if (module_sp)
609c2ff9318SGreg Clayton     return module_sp->GetArchitecture().GetAddressByteSize();
61013d1950aSGreg Clayton   return sizeof(void *);
61113d1950aSGreg Clayton }
61213d1950aSGreg Clayton 
613b9c1b51eSKate Stone uint32_t SBModule::GetVersion(uint32_t *versions, uint32_t num_versions) {
614baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(uint32_t, SBModule, GetVersion, (uint32_t *, uint32_t),
615baf5664fSJonas Devlieghere                      versions, num_versions);
616baf5664fSJonas Devlieghere 
6172272c481SPavel Labath   llvm::VersionTuple version;
6182272c481SPavel Labath   if (ModuleSP module_sp = GetSP())
6192272c481SPavel Labath     version = module_sp->GetVersion();
6202272c481SPavel Labath   uint32_t result = 0;
6212272c481SPavel Labath   if (!version.empty())
6222272c481SPavel Labath     ++result;
6232272c481SPavel Labath   if (version.getMinor())
6242272c481SPavel Labath     ++result;
6252272c481SPavel Labath   if (version.getSubminor())
6262272c481SPavel Labath     ++result;
6272272c481SPavel Labath 
6282272c481SPavel Labath   if (!versions)
6292272c481SPavel Labath     return result;
6302272c481SPavel Labath 
6312272c481SPavel Labath   if (num_versions > 0)
6322272c481SPavel Labath     versions[0] = version.empty() ? UINT32_MAX : version.getMajor();
6332272c481SPavel Labath   if (num_versions > 1)
6342272c481SPavel Labath     versions[1] = version.getMinor().getValueOr(UINT32_MAX);
6352272c481SPavel Labath   if (num_versions > 2)
6362272c481SPavel Labath     versions[2] = version.getSubminor().getValueOr(UINT32_MAX);
6372272c481SPavel Labath   for (uint32_t i = 3; i < num_versions; ++i)
638c2ff9318SGreg Clayton     versions[i] = UINT32_MAX;
6392272c481SPavel Labath   return result;
6403467d80bSEnrico Granata }
641c2ff9318SGreg Clayton 
642b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetSymbolFileSpec() const {
643baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule,
644baf5664fSJonas Devlieghere                                    GetSymbolFileSpec);
645baf5664fSJonas Devlieghere 
646eb2c19a5SIlia K   lldb::SBFileSpec sb_file_spec;
647eb2c19a5SIlia K   ModuleSP module_sp(GetSP());
648b9c1b51eSKate Stone   if (module_sp) {
649465eae36SPavel Labath     if (SymbolFile *symfile = module_sp->GetSymbolFile())
650465eae36SPavel Labath       sb_file_spec.SetFileSpec(symfile->GetObjectFile()->GetFileSpec());
651eb2c19a5SIlia K   }
652*d232abc3SJonas Devlieghere   return sb_file_spec;
653eb2c19a5SIlia K }
654eb2c19a5SIlia K 
655b9c1b51eSKate Stone lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const {
656baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBModule,
657baf5664fSJonas Devlieghere                                    GetObjectFileHeaderAddress);
658baf5664fSJonas Devlieghere 
659eb2c19a5SIlia K   lldb::SBAddress sb_addr;
660eb2c19a5SIlia K   ModuleSP module_sp(GetSP());
661b9c1b51eSKate Stone   if (module_sp) {
662eb2c19a5SIlia K     ObjectFile *objfile_ptr = module_sp->GetObjectFile();
663eb2c19a5SIlia K     if (objfile_ptr)
664d1e3fe21SPavel Labath       sb_addr.ref() = objfile_ptr->GetBaseAddress();
665eb2c19a5SIlia K   }
666*d232abc3SJonas Devlieghere   return sb_addr;
667eb2c19a5SIlia K }
6689b087d2cSAleksandr Urakov 
6699b087d2cSAleksandr Urakov lldb::SBAddress SBModule::GetObjectFileEntryPointAddress() const {
670baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBModule,
671baf5664fSJonas Devlieghere                                    GetObjectFileEntryPointAddress);
672baf5664fSJonas Devlieghere 
6739b087d2cSAleksandr Urakov   lldb::SBAddress sb_addr;
6749b087d2cSAleksandr Urakov   ModuleSP module_sp(GetSP());
6759b087d2cSAleksandr Urakov   if (module_sp) {
6769b087d2cSAleksandr Urakov     ObjectFile *objfile_ptr = module_sp->GetObjectFile();
6779b087d2cSAleksandr Urakov     if (objfile_ptr)
6789b087d2cSAleksandr Urakov       sb_addr.ref() = objfile_ptr->GetEntryPointAddress();
6799b087d2cSAleksandr Urakov   }
680*d232abc3SJonas Devlieghere   return sb_addr;
6819b087d2cSAleksandr Urakov }
682ae211eceSMichal Gorny 
683da601ea7SJonas Devlieghere uint32_t SBModule::GetNumberAllocatedModules() {
684da601ea7SJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(uint32_t, SBModule,
685da601ea7SJonas Devlieghere                                     GetNumberAllocatedModules);
686da601ea7SJonas Devlieghere 
687da601ea7SJonas Devlieghere   return Module::GetNumberAllocatedModules();
688da601ea7SJonas Devlieghere }
689da601ea7SJonas Devlieghere 
690c2f9454aSRaphael Isemann void SBModule::GarbageCollectAllocatedModules() {
691c2f9454aSRaphael Isemann   LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBModule,
692c2f9454aSRaphael Isemann                                     GarbageCollectAllocatedModules);
693e095e98aSJonas Devlieghere 
694c2f9454aSRaphael Isemann   const bool mandatory = false;
695c2f9454aSRaphael Isemann   ModuleList::RemoveOrphanSharedModules(mandatory);
696c2f9454aSRaphael Isemann }
697