130fdc8d8SChris Lattner //===-- SBModule.cpp --------------------------------------------*- C++ -*-===//
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"
10baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h"
1109960031SGreg Clayton #include "lldb/API/SBAddress.h"
1209960031SGreg Clayton #include "lldb/API/SBFileSpec.h"
13226cce25SGreg Clayton #include "lldb/API/SBModuleSpec.h"
14c9660546SGreg Clayton #include "lldb/API/SBProcess.h"
15dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
16fe356d35SGreg Clayton #include "lldb/API/SBSymbolContextList.h"
17b9c1b51eSKate Stone #include "lldb/Core/Module.h"
181f746071SGreg Clayton #include "lldb/Core/Section.h"
19dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectList.h"
20dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectVariable.h"
211f746071SGreg Clayton #include "lldb/Symbol/ObjectFile.h"
22ae088e52SGreg Clayton #include "lldb/Symbol/SymbolFile.h"
236f3533fbSEnrico Granata #include "lldb/Symbol/SymbolVendor.h"
241f746071SGreg Clayton #include "lldb/Symbol/Symtab.h"
2556939cb3SGreg Clayton #include "lldb/Symbol/TypeSystem.h"
26dea8cb4fSGreg Clayton #include "lldb/Symbol/VariableList.h"
27dea8cb4fSGreg Clayton #include "lldb/Target/Target.h"
28bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h"
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner using namespace lldb;
31ceb6b139SCaroline Tice using namespace lldb_private;
3230fdc8d8SChris Lattner 
33baf5664fSJonas Devlieghere SBModule::SBModule() : m_opaque_sp() {
34baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBModule);
35baf5664fSJonas Devlieghere }
3630fdc8d8SChris Lattner 
37b9c1b51eSKate Stone SBModule::SBModule(const lldb::ModuleSP &module_sp) : m_opaque_sp(module_sp) {}
3830fdc8d8SChris Lattner 
39b9c1b51eSKate Stone SBModule::SBModule(const SBModuleSpec &module_spec) : m_opaque_sp() {
40baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBModule, (const lldb::SBModuleSpec &), module_spec);
41baf5664fSJonas Devlieghere 
42226cce25SGreg Clayton   ModuleSP module_sp;
43248a1305SKonrad Kleine   Status error = ModuleList::GetSharedModule(
44248a1305SKonrad Kleine       *module_spec.m_opaque_up, module_sp, nullptr, nullptr, nullptr);
45226cce25SGreg Clayton   if (module_sp)
46226cce25SGreg Clayton     SetSP(module_sp);
47226cce25SGreg Clayton }
48226cce25SGreg Clayton 
49baf5664fSJonas Devlieghere SBModule::SBModule(const SBModule &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
50baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBModule, (const lldb::SBModule &), rhs);
51baf5664fSJonas Devlieghere }
52efabb123SGreg Clayton 
53b9c1b51eSKate Stone SBModule::SBModule(lldb::SBProcess &process, lldb::addr_t header_addr)
54b9c1b51eSKate Stone     : m_opaque_sp() {
55baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBModule, (lldb::SBProcess &, lldb::addr_t), process,
56baf5664fSJonas Devlieghere                           header_addr);
57baf5664fSJonas Devlieghere 
58c9660546SGreg Clayton   ProcessSP process_sp(process.GetSP());
59b9c1b51eSKate Stone   if (process_sp) {
6039f7ee86SGreg Clayton     m_opaque_sp = process_sp->ReadModuleFromMemory(FileSpec(), header_addr);
61b9c1b51eSKate Stone     if (m_opaque_sp) {
6239f7ee86SGreg Clayton       Target &target = process_sp->GetTarget();
6339f7ee86SGreg Clayton       bool changed = false;
64751caf65SGreg Clayton       m_opaque_sp->SetLoadAddress(target, 0, true, changed);
6539f7ee86SGreg Clayton       target.GetImages().Append(m_opaque_sp);
6639f7ee86SGreg Clayton     }
67c859e2d5SGreg Clayton   }
68c9660546SGreg Clayton }
69c9660546SGreg Clayton 
70b9c1b51eSKate Stone const SBModule &SBModule::operator=(const SBModule &rhs) {
71baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBModule &,
72baf5664fSJonas Devlieghere                      SBModule, operator=,(const lldb::SBModule &), rhs);
73baf5664fSJonas Devlieghere 
74efabb123SGreg Clayton   if (this != &rhs)
75efabb123SGreg Clayton     m_opaque_sp = rhs.m_opaque_sp;
76306809f2SJonas Devlieghere   return LLDB_RECORD_RESULT(*this);
77efabb123SGreg Clayton }
78efabb123SGreg Clayton 
79b9c1b51eSKate Stone SBModule::~SBModule() {}
8030fdc8d8SChris Lattner 
81baf5664fSJonas Devlieghere bool SBModule::IsValid() const {
82baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBModule, IsValid);
837f5237bcSPavel Labath   return this->operator bool();
847f5237bcSPavel Labath }
857f5237bcSPavel Labath SBModule::operator bool() const {
867f5237bcSPavel Labath   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBModule, operator bool);
8730fdc8d8SChris Lattner 
88248a1305SKonrad Kleine   return m_opaque_sp.get() != nullptr;
89baf5664fSJonas Devlieghere }
90baf5664fSJonas Devlieghere 
91baf5664fSJonas Devlieghere void SBModule::Clear() {
92baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBModule, Clear);
93baf5664fSJonas Devlieghere 
94baf5664fSJonas Devlieghere   m_opaque_sp.reset();
95baf5664fSJonas Devlieghere }
965d3bca4eSJim Ingham 
97b9c1b51eSKate Stone SBFileSpec SBModule::GetFileSpec() const {
98baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule, GetFileSpec);
99baf5664fSJonas Devlieghere 
10030fdc8d8SChris Lattner   SBFileSpec file_spec;
101c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
102c2ff9318SGreg Clayton   if (module_sp)
103c2ff9318SGreg Clayton     file_spec.SetFileSpec(module_sp->GetFileSpec());
104ceb6b139SCaroline Tice 
105baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(file_spec);
10630fdc8d8SChris Lattner }
10730fdc8d8SChris Lattner 
108b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetPlatformFileSpec() const {
109baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule,
110baf5664fSJonas Devlieghere                                    GetPlatformFileSpec);
111baf5664fSJonas Devlieghere 
1122289fa48SGreg Clayton 
1132289fa48SGreg Clayton   SBFileSpec file_spec;
114c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
115c2ff9318SGreg Clayton   if (module_sp)
116c2ff9318SGreg Clayton     file_spec.SetFileSpec(module_sp->GetPlatformFileSpec());
1172289fa48SGreg Clayton 
118baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(file_spec);
1192289fa48SGreg Clayton }
1202289fa48SGreg Clayton 
121b9c1b51eSKate Stone bool SBModule::SetPlatformFileSpec(const lldb::SBFileSpec &platform_file) {
122baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBModule, SetPlatformFileSpec,
123baf5664fSJonas Devlieghere                      (const lldb::SBFileSpec &), platform_file);
124baf5664fSJonas Devlieghere 
1252289fa48SGreg Clayton   bool result = false;
1262289fa48SGreg Clayton 
127c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
128b9c1b51eSKate Stone   if (module_sp) {
129c2ff9318SGreg Clayton     module_sp->SetPlatformFileSpec(*platform_file);
1302289fa48SGreg Clayton     result = true;
1312289fa48SGreg Clayton   }
1322289fa48SGreg Clayton 
1332289fa48SGreg Clayton   return result;
1342289fa48SGreg Clayton }
1352289fa48SGreg Clayton 
136b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetRemoteInstallFileSpec() {
137baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBFileSpec, SBModule,
138baf5664fSJonas Devlieghere                              GetRemoteInstallFileSpec);
139baf5664fSJonas Devlieghere 
140fbb76349SGreg Clayton   SBFileSpec sb_file_spec;
141fbb76349SGreg Clayton   ModuleSP module_sp(GetSP());
142fbb76349SGreg Clayton   if (module_sp)
143fbb76349SGreg Clayton     sb_file_spec.SetFileSpec(module_sp->GetRemoteInstallFileSpec());
144baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_file_spec);
145fbb76349SGreg Clayton }
146fbb76349SGreg Clayton 
147b9c1b51eSKate Stone bool SBModule::SetRemoteInstallFileSpec(lldb::SBFileSpec &file) {
148baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBModule, SetRemoteInstallFileSpec,
149baf5664fSJonas Devlieghere                      (lldb::SBFileSpec &), file);
150baf5664fSJonas Devlieghere 
151fbb76349SGreg Clayton   ModuleSP module_sp(GetSP());
152b9c1b51eSKate Stone   if (module_sp) {
153fbb76349SGreg Clayton     module_sp->SetRemoteInstallFileSpec(file.ref());
154fbb76349SGreg Clayton     return true;
155fbb76349SGreg Clayton   }
156fbb76349SGreg Clayton   return false;
157fbb76349SGreg Clayton }
1582289fa48SGreg Clayton 
159b9c1b51eSKate Stone const uint8_t *SBModule::GetUUIDBytes() const {
160baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const uint8_t *, SBModule, GetUUIDBytes);
161baf5664fSJonas Devlieghere 
162248a1305SKonrad Kleine   const uint8_t *uuid_bytes = nullptr;
163c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
164c2ff9318SGreg Clayton   if (module_sp)
165470b286eSPavel Labath     uuid_bytes = module_sp->GetUUID().GetBytes().data();
166ceb6b139SCaroline Tice 
1674838131bSGreg Clayton   return uuid_bytes;
16830fdc8d8SChris Lattner }
16930fdc8d8SChris Lattner 
170b9c1b51eSKate Stone const char *SBModule::GetUUIDString() const {
171baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBModule, GetUUIDString);
172baf5664fSJonas Devlieghere 
173248a1305SKonrad Kleine   const char *uuid_cstr = nullptr;
174c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
175b9c1b51eSKate Stone   if (module_sp) {
17605097246SAdrian Prantl     // We are going to return a "const char *" value through the public API, so
17705097246SAdrian Prantl     // we need to constify it so it gets added permanently the string pool and
17805097246SAdrian Prantl     // then we don't need to worry about the lifetime of the string as it will
17905097246SAdrian Prantl     // never go away once it has been put into the ConstString string pool
180f1be855aSGreg Clayton     uuid_cstr = ConstString(module_sp->GetUUID().GetAsString()).GetCString();
181f1be855aSGreg Clayton   }
182f1be855aSGreg Clayton 
183b9c1b51eSKate Stone   if (uuid_cstr && uuid_cstr[0]) {
184f1be855aSGreg Clayton     return uuid_cstr;
185c16b4af0SJason Molenda   }
186df2963edSJohnny Chen 
187248a1305SKonrad Kleine   return nullptr;
188df2963edSJohnny Chen }
189df2963edSJohnny Chen 
190b9c1b51eSKate Stone bool SBModule::operator==(const SBModule &rhs) const {
191baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBModule, operator==,(const lldb::SBModule &),
192baf5664fSJonas Devlieghere                            rhs);
193baf5664fSJonas Devlieghere 
1946611103cSGreg Clayton   if (m_opaque_sp)
1956611103cSGreg Clayton     return m_opaque_sp.get() == rhs.m_opaque_sp.get();
19630fdc8d8SChris Lattner   return false;
19730fdc8d8SChris Lattner }
19830fdc8d8SChris Lattner 
199b9c1b51eSKate Stone bool SBModule::operator!=(const SBModule &rhs) const {
200baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBModule, operator!=,(const lldb::SBModule &),
201baf5664fSJonas Devlieghere                            rhs);
202baf5664fSJonas Devlieghere 
2036611103cSGreg Clayton   if (m_opaque_sp)
2046611103cSGreg Clayton     return m_opaque_sp.get() != rhs.m_opaque_sp.get();
20530fdc8d8SChris Lattner   return false;
20630fdc8d8SChris Lattner }
20730fdc8d8SChris Lattner 
208b9c1b51eSKate Stone ModuleSP SBModule::GetSP() const { return m_opaque_sp; }
20930fdc8d8SChris Lattner 
210b9c1b51eSKate Stone void SBModule::SetSP(const ModuleSP &module_sp) { m_opaque_sp = module_sp; }
21130fdc8d8SChris Lattner 
212b9c1b51eSKate Stone SBAddress SBModule::ResolveFileAddress(lldb::addr_t vm_addr) {
213baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBAddress, SBModule, ResolveFileAddress,
214baf5664fSJonas Devlieghere                      (lldb::addr_t), vm_addr);
215baf5664fSJonas Devlieghere 
216cac9c5f9SGreg Clayton   lldb::SBAddress sb_addr;
217c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
218b9c1b51eSKate Stone   if (module_sp) {
219cac9c5f9SGreg Clayton     Address addr;
220c2ff9318SGreg Clayton     if (module_sp->ResolveFileAddress(vm_addr, addr))
221cac9c5f9SGreg Clayton       sb_addr.ref() = addr;
222cac9c5f9SGreg Clayton   }
223baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_addr);
22409960031SGreg Clayton }
22509960031SGreg Clayton 
22609960031SGreg Clayton SBSymbolContext
227b9c1b51eSKate Stone SBModule::ResolveSymbolContextForAddress(const SBAddress &addr,
228b9c1b51eSKate Stone                                          uint32_t resolve_scope) {
229baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbolContext, SBModule,
230baf5664fSJonas Devlieghere                      ResolveSymbolContextForAddress,
231baf5664fSJonas Devlieghere                      (const lldb::SBAddress &, uint32_t), addr, resolve_scope);
232baf5664fSJonas Devlieghere 
23309960031SGreg Clayton   SBSymbolContext sb_sc;
234c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
235991e4453SZachary Turner   SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
236c2ff9318SGreg Clayton   if (module_sp && addr.IsValid())
237991e4453SZachary Turner     module_sp->ResolveSymbolContextForAddress(addr.ref(), scope, *sb_sc);
238baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_sc);
23909960031SGreg Clayton }
24009960031SGreg Clayton 
241b9c1b51eSKate Stone bool SBModule::GetDescription(SBStream &description) {
242baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBModule, GetDescription, (lldb::SBStream &),
243baf5664fSJonas Devlieghere                      description);
244baf5664fSJonas Devlieghere 
245da7bc7d0SGreg Clayton   Stream &strm = description.ref();
246da7bc7d0SGreg Clayton 
247c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
248b9c1b51eSKate Stone   if (module_sp) {
249c2ff9318SGreg Clayton     module_sp->GetDescription(&strm);
250b9c1b51eSKate Stone   } else
251da7bc7d0SGreg Clayton     strm.PutCString("No value");
252dde9cff3SCaroline Tice 
253dde9cff3SCaroline Tice   return true;
254dde9cff3SCaroline Tice }
255bbdabce2SGreg Clayton 
256b9c1b51eSKate Stone uint32_t SBModule::GetNumCompileUnits() {
257baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBModule, GetNumCompileUnits);
258baf5664fSJonas Devlieghere 
259873a7a4bSJohnny Chen   ModuleSP module_sp(GetSP());
260b9c1b51eSKate Stone   if (module_sp) {
261873a7a4bSJohnny Chen     return module_sp->GetNumCompileUnits();
262873a7a4bSJohnny Chen   }
263873a7a4bSJohnny Chen   return 0;
264873a7a4bSJohnny Chen }
265873a7a4bSJohnny Chen 
266b9c1b51eSKate Stone SBCompileUnit SBModule::GetCompileUnitAtIndex(uint32_t index) {
267baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBCompileUnit, SBModule, GetCompileUnitAtIndex,
268baf5664fSJonas Devlieghere                      (uint32_t), index);
269baf5664fSJonas Devlieghere 
270873a7a4bSJohnny Chen   SBCompileUnit sb_cu;
271873a7a4bSJohnny Chen   ModuleSP module_sp(GetSP());
272b9c1b51eSKate Stone   if (module_sp) {
273873a7a4bSJohnny Chen     CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(index);
274873a7a4bSJohnny Chen     sb_cu.reset(cu_sp.get());
275873a7a4bSJohnny Chen   }
276baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_cu);
277873a7a4bSJohnny Chen }
278873a7a4bSJohnny Chen 
279baf5664fSJonas Devlieghere SBSymbolContextList SBModule::FindCompileUnits(const SBFileSpec &sb_file_spec) {
280baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindCompileUnits,
281baf5664fSJonas Devlieghere                      (const lldb::SBFileSpec &), sb_file_spec);
282baf5664fSJonas Devlieghere 
283da0c081fSAlexander Polyakov   SBSymbolContextList sb_sc_list;
284da0c081fSAlexander Polyakov   const ModuleSP module_sp(GetSP());
285da0c081fSAlexander Polyakov   if (sb_file_spec.IsValid() && module_sp) {
286da0c081fSAlexander Polyakov     const bool append = true;
287da0c081fSAlexander Polyakov     module_sp->FindCompileUnits(*sb_file_spec, append, *sb_sc_list);
288da0c081fSAlexander Polyakov   }
289baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_sc_list);
290da0c081fSAlexander Polyakov }
291da0c081fSAlexander Polyakov 
292b9c1b51eSKate Stone static Symtab *GetUnifiedSymbolTable(const lldb::ModuleSP &module_sp) {
293b9c1b51eSKate Stone   if (module_sp) {
294a7499c98SMichael Sartain     SymbolVendor *symbols = module_sp->GetSymbolVendor();
295a7499c98SMichael Sartain     if (symbols)
296a7499c98SMichael Sartain       return symbols->GetSymtab();
297a7499c98SMichael Sartain   }
298248a1305SKonrad Kleine   return nullptr;
299a7499c98SMichael Sartain }
300a7499c98SMichael Sartain 
301b9c1b51eSKate Stone size_t SBModule::GetNumSymbols() {
302baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(size_t, SBModule, GetNumSymbols);
303baf5664fSJonas Devlieghere 
304c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
305b9c1b51eSKate Stone   if (module_sp) {
306a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
307bbdabce2SGreg Clayton     if (symtab)
308bbdabce2SGreg Clayton       return symtab->GetNumSymbols();
309bbdabce2SGreg Clayton   }
310bbdabce2SGreg Clayton   return 0;
311bbdabce2SGreg Clayton }
312bbdabce2SGreg Clayton 
313b9c1b51eSKate Stone SBSymbol SBModule::GetSymbolAtIndex(size_t idx) {
314baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbol, SBModule, GetSymbolAtIndex, (size_t), idx);
315baf5664fSJonas Devlieghere 
316bbdabce2SGreg Clayton   SBSymbol sb_symbol;
317c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
318a7499c98SMichael Sartain   Symtab *symtab = GetUnifiedSymbolTable(module_sp);
319bbdabce2SGreg Clayton   if (symtab)
320bbdabce2SGreg Clayton     sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx));
321baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_symbol);
322bbdabce2SGreg Clayton }
323fe356d35SGreg Clayton 
324b9c1b51eSKate Stone lldb::SBSymbol SBModule::FindSymbol(const char *name,
325b9c1b51eSKate Stone                                     lldb::SymbolType symbol_type) {
326baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbol, SBModule, FindSymbol,
327baf5664fSJonas Devlieghere                      (const char *, lldb::SymbolType), name, symbol_type);
328baf5664fSJonas Devlieghere 
329e14e1925SGreg Clayton   SBSymbol sb_symbol;
330b9c1b51eSKate Stone   if (name && name[0]) {
331e14e1925SGreg Clayton     ModuleSP module_sp(GetSP());
332a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
333e14e1925SGreg Clayton     if (symtab)
334b9c1b51eSKate Stone       sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType(
335b9c1b51eSKate Stone           ConstString(name), symbol_type, Symtab::eDebugAny,
336b9c1b51eSKate Stone           Symtab::eVisibilityAny));
337e14e1925SGreg Clayton   }
338baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_symbol);
339e14e1925SGreg Clayton }
340e14e1925SGreg Clayton 
341b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindSymbols(const char *name,
342b9c1b51eSKate Stone                                                 lldb::SymbolType symbol_type) {
343baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindSymbols,
344baf5664fSJonas Devlieghere                      (const char *, lldb::SymbolType), name, symbol_type);
345baf5664fSJonas Devlieghere 
346e14e1925SGreg Clayton   SBSymbolContextList sb_sc_list;
347b9c1b51eSKate Stone   if (name && name[0]) {
348e14e1925SGreg Clayton     ModuleSP module_sp(GetSP());
349a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
350b9c1b51eSKate Stone     if (symtab) {
351e14e1925SGreg Clayton       std::vector<uint32_t> matching_symbol_indexes;
352b9c1b51eSKate Stone       const size_t num_matches = symtab->FindAllSymbolsWithNameAndType(
353b9c1b51eSKate Stone           ConstString(name), symbol_type, matching_symbol_indexes);
354b9c1b51eSKate Stone       if (num_matches) {
355e14e1925SGreg Clayton         SymbolContext sc;
356e14e1925SGreg Clayton         sc.module_sp = module_sp;
357e14e1925SGreg Clayton         SymbolContextList &sc_list = *sb_sc_list;
358b9c1b51eSKate Stone         for (size_t i = 0; i < num_matches; ++i) {
359e14e1925SGreg Clayton           sc.symbol = symtab->SymbolAtIndex(matching_symbol_indexes[i]);
360e14e1925SGreg Clayton           if (sc.symbol)
361e14e1925SGreg Clayton             sc_list.Append(sc);
362e14e1925SGreg Clayton         }
363e14e1925SGreg Clayton       }
364e14e1925SGreg Clayton     }
365e14e1925SGreg Clayton   }
366baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_sc_list);
367e14e1925SGreg Clayton }
368e14e1925SGreg Clayton 
369b9c1b51eSKate Stone size_t SBModule::GetNumSections() {
370baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(size_t, SBModule, GetNumSections);
371baf5664fSJonas Devlieghere 
372c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
373b9c1b51eSKate Stone   if (module_sp) {
374a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
375a7499c98SMichael Sartain     module_sp->GetSymbolVendor();
3763046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
377cac9c5f9SGreg Clayton     if (section_list)
378cac9c5f9SGreg Clayton       return section_list->GetSize();
379cac9c5f9SGreg Clayton   }
380cac9c5f9SGreg Clayton   return 0;
381cac9c5f9SGreg Clayton }
382cac9c5f9SGreg Clayton 
383b9c1b51eSKate Stone SBSection SBModule::GetSectionAtIndex(size_t idx) {
384baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSection, SBModule, GetSectionAtIndex, (size_t),
385baf5664fSJonas Devlieghere                      idx);
386baf5664fSJonas Devlieghere 
387cac9c5f9SGreg Clayton   SBSection sb_section;
388c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
389b9c1b51eSKate Stone   if (module_sp) {
390a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
391a7499c98SMichael Sartain     module_sp->GetSymbolVendor();
3923046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
393cac9c5f9SGreg Clayton 
394cac9c5f9SGreg Clayton     if (section_list)
395e72dfb32SGreg Clayton       sb_section.SetSP(section_list->GetSectionAtIndex(idx));
396cac9c5f9SGreg Clayton   }
397baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_section);
398cac9c5f9SGreg Clayton }
399cac9c5f9SGreg Clayton 
400b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindFunctions(const char *name,
401b9c1b51eSKate Stone                                                   uint32_t name_type_mask) {
402baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindFunctions,
403baf5664fSJonas Devlieghere                      (const char *, uint32_t), name, name_type_mask);
404baf5664fSJonas Devlieghere 
4055569e64eSGreg Clayton   lldb::SBSymbolContextList sb_sc_list;
406c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
407b9c1b51eSKate Stone   if (name && module_sp) {
4085569e64eSGreg Clayton     const bool append = true;
409fe356d35SGreg Clayton     const bool symbols_ok = true;
4109df05fbbSSean Callanan     const bool inlines_ok = true;
411117b1fa1SZachary Turner     FunctionNameType type = static_cast<FunctionNameType>(name_type_mask);
412248a1305SKonrad Kleine     module_sp->FindFunctions(ConstString(name), nullptr, type, symbols_ok,
413117b1fa1SZachary Turner                              inlines_ok, append, *sb_sc_list);
414fe356d35SGreg Clayton   }
415baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_sc_list);
416fe356d35SGreg Clayton }
417fe356d35SGreg Clayton 
418b9c1b51eSKate Stone SBValueList SBModule::FindGlobalVariables(SBTarget &target, const char *name,
419b9c1b51eSKate Stone                                           uint32_t max_matches) {
420baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBModule, FindGlobalVariables,
421baf5664fSJonas Devlieghere                      (lldb::SBTarget &, const char *, uint32_t), target, name,
422baf5664fSJonas Devlieghere                      max_matches);
423baf5664fSJonas Devlieghere 
424dea8cb4fSGreg Clayton   SBValueList sb_value_list;
425c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
426b9c1b51eSKate Stone   if (name && module_sp) {
427dea8cb4fSGreg Clayton     VariableList variable_list;
428b9c1b51eSKate Stone     const uint32_t match_count = module_sp->FindGlobalVariables(
429248a1305SKonrad Kleine         ConstString(name), nullptr, max_matches, variable_list);
430dea8cb4fSGreg Clayton 
431b9c1b51eSKate Stone     if (match_count > 0) {
432b9c1b51eSKate Stone       for (uint32_t i = 0; i < match_count; ++i) {
433dea8cb4fSGreg Clayton         lldb::ValueObjectSP valobj_sp;
434b9556accSGreg Clayton         TargetSP target_sp(target.GetSP());
435b9c1b51eSKate Stone         valobj_sp = ValueObjectVariable::Create(
436b9c1b51eSKate Stone             target_sp.get(), variable_list.GetVariableAtIndex(i));
437dea8cb4fSGreg Clayton         if (valobj_sp)
43885425d77SEnrico Granata           sb_value_list.Append(SBValue(valobj_sp));
439dea8cb4fSGreg Clayton       }
440dea8cb4fSGreg Clayton     }
441dea8cb4fSGreg Clayton   }
442dea8cb4fSGreg Clayton 
443baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value_list);
444dea8cb4fSGreg Clayton }
4456f3533fbSEnrico Granata 
446b9c1b51eSKate Stone lldb::SBValue SBModule::FindFirstGlobalVariable(lldb::SBTarget &target,
447b9c1b51eSKate Stone                                                 const char *name) {
448baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBModule, FindFirstGlobalVariable,
449baf5664fSJonas Devlieghere                      (lldb::SBTarget &, const char *), target, name);
450baf5664fSJonas Devlieghere 
451bcd80b47SEnrico Granata   SBValueList sb_value_list(FindGlobalVariables(target, name, 1));
452bcd80b47SEnrico Granata   if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0)
453baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value_list.GetValueAtIndex(0));
454baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBValue());
455bcd80b47SEnrico Granata }
456bcd80b47SEnrico Granata 
457b9c1b51eSKate Stone lldb::SBType SBModule::FindFirstType(const char *name_cstr) {
458baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBType, SBModule, FindFirstType, (const char *),
459baf5664fSJonas Devlieghere                      name_cstr);
460baf5664fSJonas Devlieghere 
461fe42ac4dSGreg Clayton   SBType sb_type;
462c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
463b9c1b51eSKate Stone   if (name_cstr && module_sp) {
4646f3533fbSEnrico Granata     SymbolContext sc;
46584db9105SGreg Clayton     const bool exact_match = false;
4666f3533fbSEnrico Granata     ConstString name(name_cstr);
4676f3533fbSEnrico Granata 
468b43165b7SGreg Clayton     sb_type = SBType(module_sp->FindFirstType(sc, name, exact_match));
4696f3533fbSEnrico Granata 
470b9c1b51eSKate Stone     if (!sb_type.IsValid()) {
471*0e252e38SAlex Langford       auto type_system_or_err =
472b9c1b51eSKate Stone           module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
473*0e252e38SAlex Langford       if (auto err = type_system_or_err.takeError()) {
474*0e252e38SAlex Langford         llvm::consumeError(std::move(err));
475*0e252e38SAlex Langford         return LLDB_RECORD_RESULT(SBType());
476*0e252e38SAlex Langford       }
477*0e252e38SAlex Langford       sb_type = SBType(type_system_or_err->GetBuiltinTypeByName(name));
47856939cb3SGreg Clayton     }
4796f3533fbSEnrico Granata   }
480baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_type);
4816f3533fbSEnrico Granata }
4826f3533fbSEnrico Granata 
483b9c1b51eSKate Stone lldb::SBType SBModule::GetBasicType(lldb::BasicType type) {
484baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBType, SBModule, GetBasicType, (lldb::BasicType),
485baf5664fSJonas Devlieghere                      type);
486baf5664fSJonas Devlieghere 
487b43165b7SGreg Clayton   ModuleSP module_sp(GetSP());
488b9c1b51eSKate Stone   if (module_sp) {
489*0e252e38SAlex Langford     auto type_system_or_err =
490b9c1b51eSKate Stone         module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
491*0e252e38SAlex Langford     if (auto err = type_system_or_err.takeError()) {
492*0e252e38SAlex Langford       llvm::consumeError(std::move(err));
493*0e252e38SAlex Langford     } else {
494*0e252e38SAlex Langford       return LLDB_RECORD_RESULT(
495*0e252e38SAlex Langford           SBType(type_system_or_err->GetBasicTypeFromAST(type)));
496*0e252e38SAlex Langford     }
49756939cb3SGreg Clayton   }
498baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBType());
499b43165b7SGreg Clayton }
500b43165b7SGreg Clayton 
501b9c1b51eSKate Stone lldb::SBTypeList SBModule::FindTypes(const char *type) {
502baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeList, SBModule, FindTypes, (const char *),
503baf5664fSJonas Devlieghere                      type);
504baf5664fSJonas Devlieghere 
5056f3533fbSEnrico Granata   SBTypeList retval;
5066f3533fbSEnrico Granata 
507c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
508b9c1b51eSKate Stone   if (type && module_sp) {
5096f3533fbSEnrico Granata     TypeList type_list;
51084db9105SGreg Clayton     const bool exact_match = false;
5116f3533fbSEnrico Granata     ConstString name(type);
512ae088e52SGreg Clayton     llvm::DenseSet<SymbolFile *> searched_symbol_files;
513b9c1b51eSKate Stone     const uint32_t num_matches = module_sp->FindTypes(
514576495e6SZachary Turner         name, exact_match, UINT32_MAX, searched_symbol_files, type_list);
5156f3533fbSEnrico Granata 
516b9c1b51eSKate Stone     if (num_matches > 0) {
517b9c1b51eSKate Stone       for (size_t idx = 0; idx < num_matches; idx++) {
518fe42ac4dSGreg Clayton         TypeSP type_sp(type_list.GetTypeAtIndex(idx));
519fe42ac4dSGreg Clayton         if (type_sp)
520fe42ac4dSGreg Clayton           retval.Append(SBType(type_sp));
521fe42ac4dSGreg Clayton       }
522b9c1b51eSKate Stone     } else {
523*0e252e38SAlex Langford       auto type_system_or_err =
524b9c1b51eSKate Stone           module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
525*0e252e38SAlex Langford       if (auto err = type_system_or_err.takeError()) {
526*0e252e38SAlex Langford         llvm::consumeError(std::move(err));
527*0e252e38SAlex Langford       } else {
528*0e252e38SAlex Langford         CompilerType compiler_type =
529*0e252e38SAlex Langford             type_system_or_err->GetBuiltinTypeByName(name);
53056939cb3SGreg Clayton         if (compiler_type)
53156939cb3SGreg Clayton           retval.Append(SBType(compiler_type));
53256939cb3SGreg Clayton       }
533b43165b7SGreg Clayton     }
534b43165b7SGreg Clayton   }
5356f3533fbSEnrico Granata 
536baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(retval);
5376f3533fbSEnrico Granata }
538cac9c5f9SGreg Clayton 
539b9c1b51eSKate Stone lldb::SBType SBModule::GetTypeByID(lldb::user_id_t uid) {
540baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBType, SBModule, GetTypeByID, (lldb::user_id_t),
541baf5664fSJonas Devlieghere                      uid);
542baf5664fSJonas Devlieghere 
5431f4db7daSGreg Clayton   ModuleSP module_sp(GetSP());
544b9c1b51eSKate Stone   if (module_sp) {
5451f4db7daSGreg Clayton     SymbolVendor *vendor = module_sp->GetSymbolVendor();
546b9c1b51eSKate Stone     if (vendor) {
5471f4db7daSGreg Clayton       Type *type_ptr = vendor->ResolveTypeUID(uid);
5481f4db7daSGreg Clayton       if (type_ptr)
549baf5664fSJonas Devlieghere         return LLDB_RECORD_RESULT(SBType(type_ptr->shared_from_this()));
5501f4db7daSGreg Clayton     }
5511f4db7daSGreg Clayton   }
552baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBType());
5531f4db7daSGreg Clayton }
5541f4db7daSGreg Clayton 
555b9c1b51eSKate Stone lldb::SBTypeList SBModule::GetTypes(uint32_t type_mask) {
556baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeList, SBModule, GetTypes, (uint32_t),
557baf5664fSJonas Devlieghere                      type_mask);
558baf5664fSJonas Devlieghere 
559f02500c7SGreg Clayton   SBTypeList sb_type_list;
560f02500c7SGreg Clayton 
561f02500c7SGreg Clayton   ModuleSP module_sp(GetSP());
562117b1fa1SZachary Turner   if (!module_sp)
563baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_type_list);
564f02500c7SGreg Clayton   SymbolVendor *vendor = module_sp->GetSymbolVendor();
565117b1fa1SZachary Turner   if (!vendor)
566baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_type_list);
567117b1fa1SZachary Turner 
568117b1fa1SZachary Turner   TypeClass type_class = static_cast<TypeClass>(type_mask);
569f02500c7SGreg Clayton   TypeList type_list;
570248a1305SKonrad Kleine   vendor->GetTypes(nullptr, type_class, type_list);
571d5b44036SJonas Devlieghere   sb_type_list.m_opaque_up->Append(type_list);
572baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_type_list);
573f02500c7SGreg Clayton }
574cac9c5f9SGreg Clayton 
575b9c1b51eSKate Stone SBSection SBModule::FindSection(const char *sect_name) {
576baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSection, SBModule, FindSection, (const char *),
577baf5664fSJonas Devlieghere                      sect_name);
578baf5664fSJonas Devlieghere 
579cac9c5f9SGreg Clayton   SBSection sb_section;
580cac9c5f9SGreg Clayton 
581c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
582b9c1b51eSKate Stone   if (sect_name && module_sp) {
583a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
584a7499c98SMichael Sartain     module_sp->GetSymbolVendor();
5853046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
586b9c1b51eSKate Stone     if (section_list) {
587cac9c5f9SGreg Clayton       ConstString const_sect_name(sect_name);
588cac9c5f9SGreg Clayton       SectionSP section_sp(section_list->FindSectionByName(const_sect_name));
589b9c1b51eSKate Stone       if (section_sp) {
590e72dfb32SGreg Clayton         sb_section.SetSP(section_sp);
591cac9c5f9SGreg Clayton       }
592cac9c5f9SGreg Clayton     }
593cac9c5f9SGreg Clayton   }
594baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_section);
595cac9c5f9SGreg Clayton }
596cac9c5f9SGreg Clayton 
597b9c1b51eSKate Stone lldb::ByteOrder SBModule::GetByteOrder() {
598baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::ByteOrder, SBModule, GetByteOrder);
599baf5664fSJonas Devlieghere 
600c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
601c2ff9318SGreg Clayton   if (module_sp)
602c2ff9318SGreg Clayton     return module_sp->GetArchitecture().GetByteOrder();
60313d1950aSGreg Clayton   return eByteOrderInvalid;
60413d1950aSGreg Clayton }
60513d1950aSGreg Clayton 
606b9c1b51eSKate Stone const char *SBModule::GetTriple() {
607baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBModule, GetTriple);
608baf5664fSJonas Devlieghere 
609c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
610b9c1b51eSKate Stone   if (module_sp) {
611c2ff9318SGreg Clayton     std::string triple(module_sp->GetArchitecture().GetTriple().str());
61205097246SAdrian Prantl     // Unique the string so we don't run into ownership issues since the const
61305097246SAdrian Prantl     // strings put the string into the string pool once and the strings never
61405097246SAdrian Prantl     // comes out
61513d1950aSGreg Clayton     ConstString const_triple(triple.c_str());
61613d1950aSGreg Clayton     return const_triple.GetCString();
61713d1950aSGreg Clayton   }
618248a1305SKonrad Kleine   return nullptr;
61913d1950aSGreg Clayton }
62013d1950aSGreg Clayton 
621b9c1b51eSKate Stone uint32_t SBModule::GetAddressByteSize() {
622baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBModule, GetAddressByteSize);
623baf5664fSJonas Devlieghere 
624c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
625c2ff9318SGreg Clayton   if (module_sp)
626c2ff9318SGreg Clayton     return module_sp->GetArchitecture().GetAddressByteSize();
62713d1950aSGreg Clayton   return sizeof(void *);
62813d1950aSGreg Clayton }
62913d1950aSGreg Clayton 
630b9c1b51eSKate Stone uint32_t SBModule::GetVersion(uint32_t *versions, uint32_t num_versions) {
631baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(uint32_t, SBModule, GetVersion, (uint32_t *, uint32_t),
632baf5664fSJonas Devlieghere                      versions, num_versions);
633baf5664fSJonas Devlieghere 
6342272c481SPavel Labath   llvm::VersionTuple version;
6352272c481SPavel Labath   if (ModuleSP module_sp = GetSP())
6362272c481SPavel Labath     version = module_sp->GetVersion();
6372272c481SPavel Labath   uint32_t result = 0;
6382272c481SPavel Labath   if (!version.empty())
6392272c481SPavel Labath     ++result;
6402272c481SPavel Labath   if (version.getMinor())
6412272c481SPavel Labath     ++result;
6422272c481SPavel Labath   if(version.getSubminor())
6432272c481SPavel Labath     ++result;
6442272c481SPavel Labath 
6452272c481SPavel Labath   if (!versions)
6462272c481SPavel Labath     return result;
6472272c481SPavel Labath 
6482272c481SPavel Labath   if (num_versions > 0)
6492272c481SPavel Labath     versions[0] = version.empty() ? UINT32_MAX : version.getMajor();
6502272c481SPavel Labath   if (num_versions > 1)
6512272c481SPavel Labath     versions[1] = version.getMinor().getValueOr(UINT32_MAX);
6522272c481SPavel Labath   if (num_versions > 2)
6532272c481SPavel Labath     versions[2] = version.getSubminor().getValueOr(UINT32_MAX);
6542272c481SPavel Labath   for (uint32_t i = 3; i < num_versions; ++i)
655c2ff9318SGreg Clayton     versions[i] = UINT32_MAX;
6562272c481SPavel Labath   return result;
6573467d80bSEnrico Granata }
658c2ff9318SGreg Clayton 
659b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetSymbolFileSpec() const {
660baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule,
661baf5664fSJonas Devlieghere                                    GetSymbolFileSpec);
662baf5664fSJonas Devlieghere 
663eb2c19a5SIlia K   lldb::SBFileSpec sb_file_spec;
664eb2c19a5SIlia K   ModuleSP module_sp(GetSP());
665b9c1b51eSKate Stone   if (module_sp) {
666eb2c19a5SIlia K     SymbolVendor *symbol_vendor_ptr = module_sp->GetSymbolVendor();
667eb2c19a5SIlia K     if (symbol_vendor_ptr)
668eb2c19a5SIlia K       sb_file_spec.SetFileSpec(symbol_vendor_ptr->GetMainFileSpec());
669eb2c19a5SIlia K   }
670baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_file_spec);
671eb2c19a5SIlia K }
672eb2c19a5SIlia K 
673b9c1b51eSKate Stone lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const {
674baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBModule,
675baf5664fSJonas Devlieghere                                    GetObjectFileHeaderAddress);
676baf5664fSJonas Devlieghere 
677eb2c19a5SIlia K   lldb::SBAddress sb_addr;
678eb2c19a5SIlia K   ModuleSP module_sp(GetSP());
679b9c1b51eSKate Stone   if (module_sp) {
680eb2c19a5SIlia K     ObjectFile *objfile_ptr = module_sp->GetObjectFile();
681eb2c19a5SIlia K     if (objfile_ptr)
682d1e3fe21SPavel Labath       sb_addr.ref() = objfile_ptr->GetBaseAddress();
683eb2c19a5SIlia K   }
684baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_addr);
685eb2c19a5SIlia K }
6869b087d2cSAleksandr Urakov 
6879b087d2cSAleksandr Urakov lldb::SBAddress SBModule::GetObjectFileEntryPointAddress() const {
688baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBModule,
689baf5664fSJonas Devlieghere                                    GetObjectFileEntryPointAddress);
690baf5664fSJonas Devlieghere 
6919b087d2cSAleksandr Urakov   lldb::SBAddress sb_addr;
6929b087d2cSAleksandr Urakov   ModuleSP module_sp(GetSP());
6939b087d2cSAleksandr Urakov   if (module_sp) {
6949b087d2cSAleksandr Urakov     ObjectFile *objfile_ptr = module_sp->GetObjectFile();
6959b087d2cSAleksandr Urakov     if (objfile_ptr)
6969b087d2cSAleksandr Urakov       sb_addr.ref() = objfile_ptr->GetEntryPointAddress();
6979b087d2cSAleksandr Urakov   }
698baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_addr);
6999b087d2cSAleksandr Urakov }
700ae211eceSMichal Gorny 
701ae211eceSMichal Gorny namespace lldb_private {
702ae211eceSMichal Gorny namespace repro {
703ae211eceSMichal Gorny 
704ae211eceSMichal Gorny template <>
705ae211eceSMichal Gorny void RegisterMethods<SBModule>(Registry &R) {
706ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBModule, ());
707ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBModule, (const lldb::SBModuleSpec &));
708ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBModule, (const lldb::SBModule &));
709ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBModule, (lldb::SBProcess &, lldb::addr_t));
710ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const lldb::SBModule &,
711ae211eceSMichal Gorny                        SBModule, operator=,(const lldb::SBModule &));
712ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBModule, IsValid, ());
713ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBModule, operator bool, ());
714ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBModule, Clear, ());
715ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBModule, GetFileSpec, ());
716ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBModule, GetPlatformFileSpec,
717ae211eceSMichal Gorny                              ());
718ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBModule, SetPlatformFileSpec,
719ae211eceSMichal Gorny                        (const lldb::SBFileSpec &));
720ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBFileSpec, SBModule, GetRemoteInstallFileSpec,
721ae211eceSMichal Gorny                        ());
722ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBModule, SetRemoteInstallFileSpec,
723ae211eceSMichal Gorny                        (lldb::SBFileSpec &));
724ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(const char *, SBModule, GetUUIDString, ());
725ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool,
726ae211eceSMichal Gorny                              SBModule, operator==,(const lldb::SBModule &));
727ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool,
728ae211eceSMichal Gorny                              SBModule, operator!=,(const lldb::SBModule &));
729ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBAddress, SBModule, ResolveFileAddress,
730ae211eceSMichal Gorny                        (lldb::addr_t));
731ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBSymbolContext, SBModule,
732ae211eceSMichal Gorny                        ResolveSymbolContextForAddress,
733ae211eceSMichal Gorny                        (const lldb::SBAddress &, uint32_t));
734ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBModule, GetDescription, (lldb::SBStream &));
735ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBModule, GetNumCompileUnits, ());
736ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBCompileUnit, SBModule, GetCompileUnitAtIndex,
737ae211eceSMichal Gorny                        (uint32_t));
738ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBSymbolContextList, SBModule, FindCompileUnits,
739ae211eceSMichal Gorny                        (const lldb::SBFileSpec &));
740ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(size_t, SBModule, GetNumSymbols, ());
741ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBSymbol, SBModule, GetSymbolAtIndex, (size_t));
742ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBSymbol, SBModule, FindSymbol,
743ae211eceSMichal Gorny                        (const char *, lldb::SymbolType));
744ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBSymbolContextList, SBModule, FindSymbols,
745ae211eceSMichal Gorny                        (const char *, lldb::SymbolType));
746ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(size_t, SBModule, GetNumSections, ());
747ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBSection, SBModule, GetSectionAtIndex,
748ae211eceSMichal Gorny                        (size_t));
749ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBSymbolContextList, SBModule, FindFunctions,
750ae211eceSMichal Gorny                        (const char *, uint32_t));
751ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValueList, SBModule, FindGlobalVariables,
752ae211eceSMichal Gorny                        (lldb::SBTarget &, const char *, uint32_t));
753ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBValue, SBModule, FindFirstGlobalVariable,
754ae211eceSMichal Gorny                        (lldb::SBTarget &, const char *));
755ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBType, SBModule, FindFirstType, (const char *));
756ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBType, SBModule, GetBasicType,
757ae211eceSMichal Gorny                        (lldb::BasicType));
758ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeList, SBModule, FindTypes, (const char *));
759ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBType, SBModule, GetTypeByID,
760ae211eceSMichal Gorny                        (lldb::user_id_t));
761ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeList, SBModule, GetTypes, (uint32_t));
762ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBSection, SBModule, FindSection,
763ae211eceSMichal Gorny                        (const char *));
764ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::ByteOrder, SBModule, GetByteOrder, ());
765ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBModule, GetTriple, ());
766ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBModule, GetAddressByteSize, ());
767ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBModule, GetVersion,
768ae211eceSMichal Gorny                        (uint32_t *, uint32_t));
769ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBModule, GetSymbolFileSpec,
770ae211eceSMichal Gorny                              ());
771ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBModule,
772ae211eceSMichal Gorny                              GetObjectFileHeaderAddress, ());
773ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBModule,
774ae211eceSMichal Gorny                              GetObjectFileEntryPointAddress, ());
775ae211eceSMichal Gorny }
776ae211eceSMichal Gorny 
777ae211eceSMichal Gorny }
778ae211eceSMichal Gorny }
779