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"
10*baf5664fSJonas 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"
286f9e6901SZachary Turner #include "lldb/Utility/Log.h"
29bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h"
3030fdc8d8SChris Lattner 
3130fdc8d8SChris Lattner using namespace lldb;
32ceb6b139SCaroline Tice using namespace lldb_private;
3330fdc8d8SChris Lattner 
34*baf5664fSJonas Devlieghere SBModule::SBModule() : m_opaque_sp() {
35*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBModule);
36*baf5664fSJonas Devlieghere }
3730fdc8d8SChris Lattner 
38b9c1b51eSKate Stone SBModule::SBModule(const lldb::ModuleSP &module_sp) : m_opaque_sp(module_sp) {}
3930fdc8d8SChris Lattner 
40b9c1b51eSKate Stone SBModule::SBModule(const SBModuleSpec &module_spec) : m_opaque_sp() {
41*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBModule, (const lldb::SBModuleSpec &), module_spec);
42*baf5664fSJonas Devlieghere 
43226cce25SGreg Clayton   ModuleSP module_sp;
44d5b44036SJonas Devlieghere   Status error = ModuleList::GetSharedModule(*module_spec.m_opaque_up,
4597206d57SZachary Turner                                              module_sp, NULL, NULL, NULL);
46226cce25SGreg Clayton   if (module_sp)
47226cce25SGreg Clayton     SetSP(module_sp);
48226cce25SGreg Clayton }
49226cce25SGreg Clayton 
50*baf5664fSJonas Devlieghere SBModule::SBModule(const SBModule &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
51*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBModule, (const lldb::SBModule &), rhs);
52*baf5664fSJonas Devlieghere }
53efabb123SGreg Clayton 
54b9c1b51eSKate Stone SBModule::SBModule(lldb::SBProcess &process, lldb::addr_t header_addr)
55b9c1b51eSKate Stone     : m_opaque_sp() {
56*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBModule, (lldb::SBProcess &, lldb::addr_t), process,
57*baf5664fSJonas Devlieghere                           header_addr);
58*baf5664fSJonas Devlieghere 
59c9660546SGreg Clayton   ProcessSP process_sp(process.GetSP());
60b9c1b51eSKate Stone   if (process_sp) {
6139f7ee86SGreg Clayton     m_opaque_sp = process_sp->ReadModuleFromMemory(FileSpec(), header_addr);
62b9c1b51eSKate Stone     if (m_opaque_sp) {
6339f7ee86SGreg Clayton       Target &target = process_sp->GetTarget();
6439f7ee86SGreg Clayton       bool changed = false;
65751caf65SGreg Clayton       m_opaque_sp->SetLoadAddress(target, 0, true, changed);
6639f7ee86SGreg Clayton       target.GetImages().Append(m_opaque_sp);
6739f7ee86SGreg Clayton     }
68c859e2d5SGreg Clayton   }
69c9660546SGreg Clayton }
70c9660546SGreg Clayton 
71b9c1b51eSKate Stone const SBModule &SBModule::operator=(const SBModule &rhs) {
72*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBModule &,
73*baf5664fSJonas Devlieghere                      SBModule, operator=,(const lldb::SBModule &), rhs);
74*baf5664fSJonas Devlieghere 
75efabb123SGreg Clayton   if (this != &rhs)
76efabb123SGreg Clayton     m_opaque_sp = rhs.m_opaque_sp;
77efabb123SGreg Clayton   return *this;
78efabb123SGreg Clayton }
79efabb123SGreg Clayton 
80b9c1b51eSKate Stone SBModule::~SBModule() {}
8130fdc8d8SChris Lattner 
82*baf5664fSJonas Devlieghere bool SBModule::IsValid() const {
83*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBModule, IsValid);
8430fdc8d8SChris Lattner 
85*baf5664fSJonas Devlieghere   return m_opaque_sp.get() != NULL;
86*baf5664fSJonas Devlieghere }
87*baf5664fSJonas Devlieghere 
88*baf5664fSJonas Devlieghere void SBModule::Clear() {
89*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBModule, Clear);
90*baf5664fSJonas Devlieghere 
91*baf5664fSJonas Devlieghere   m_opaque_sp.reset();
92*baf5664fSJonas Devlieghere }
935d3bca4eSJim Ingham 
94b9c1b51eSKate Stone SBFileSpec SBModule::GetFileSpec() const {
95*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule, GetFileSpec);
96*baf5664fSJonas Devlieghere 
975160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
98ceb6b139SCaroline Tice 
9930fdc8d8SChris Lattner   SBFileSpec file_spec;
100c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
101c2ff9318SGreg Clayton   if (module_sp)
102c2ff9318SGreg Clayton     file_spec.SetFileSpec(module_sp->GetFileSpec());
103ceb6b139SCaroline Tice 
104ceb6b139SCaroline Tice   if (log)
105cfd1acedSGreg Clayton     log->Printf("SBModule(%p)::GetFileSpec () => SBFileSpec(%p)",
106324a1036SSaleem Abdulrasool                 static_cast<void *>(module_sp.get()),
107324a1036SSaleem Abdulrasool                 static_cast<const void *>(file_spec.get()));
108ceb6b139SCaroline Tice 
109*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(file_spec);
11030fdc8d8SChris Lattner }
11130fdc8d8SChris Lattner 
112b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetPlatformFileSpec() const {
113*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule,
114*baf5664fSJonas Devlieghere                                    GetPlatformFileSpec);
115*baf5664fSJonas Devlieghere 
1165160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1172289fa48SGreg Clayton 
1182289fa48SGreg Clayton   SBFileSpec file_spec;
119c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
120c2ff9318SGreg Clayton   if (module_sp)
121c2ff9318SGreg Clayton     file_spec.SetFileSpec(module_sp->GetPlatformFileSpec());
1222289fa48SGreg Clayton 
1232289fa48SGreg Clayton   if (log)
1242289fa48SGreg Clayton     log->Printf("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)",
125324a1036SSaleem Abdulrasool                 static_cast<void *>(module_sp.get()),
126324a1036SSaleem Abdulrasool                 static_cast<const void *>(file_spec.get()));
1272289fa48SGreg Clayton 
128*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(file_spec);
1292289fa48SGreg Clayton }
1302289fa48SGreg Clayton 
131b9c1b51eSKate Stone bool SBModule::SetPlatformFileSpec(const lldb::SBFileSpec &platform_file) {
132*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBModule, SetPlatformFileSpec,
133*baf5664fSJonas Devlieghere                      (const lldb::SBFileSpec &), platform_file);
134*baf5664fSJonas Devlieghere 
1352289fa48SGreg Clayton   bool result = false;
1365160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1372289fa48SGreg Clayton 
138c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
139b9c1b51eSKate Stone   if (module_sp) {
140c2ff9318SGreg Clayton     module_sp->SetPlatformFileSpec(*platform_file);
1412289fa48SGreg Clayton     result = true;
1422289fa48SGreg Clayton   }
1432289fa48SGreg Clayton 
1442289fa48SGreg Clayton   if (log)
145b5ad4ec7SGreg Clayton     log->Printf("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s)) => %i",
146324a1036SSaleem Abdulrasool                 static_cast<void *>(module_sp.get()),
147324a1036SSaleem Abdulrasool                 static_cast<const void *>(platform_file.get()),
148324a1036SSaleem Abdulrasool                 platform_file->GetPath().c_str(), result);
1492289fa48SGreg Clayton   return result;
1502289fa48SGreg Clayton }
1512289fa48SGreg Clayton 
152b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetRemoteInstallFileSpec() {
153*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBFileSpec, SBModule,
154*baf5664fSJonas Devlieghere                              GetRemoteInstallFileSpec);
155*baf5664fSJonas Devlieghere 
156fbb76349SGreg Clayton   SBFileSpec sb_file_spec;
157fbb76349SGreg Clayton   ModuleSP module_sp(GetSP());
158fbb76349SGreg Clayton   if (module_sp)
159fbb76349SGreg Clayton     sb_file_spec.SetFileSpec(module_sp->GetRemoteInstallFileSpec());
160*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_file_spec);
161fbb76349SGreg Clayton }
162fbb76349SGreg Clayton 
163b9c1b51eSKate Stone bool SBModule::SetRemoteInstallFileSpec(lldb::SBFileSpec &file) {
164*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBModule, SetRemoteInstallFileSpec,
165*baf5664fSJonas Devlieghere                      (lldb::SBFileSpec &), file);
166*baf5664fSJonas Devlieghere 
167fbb76349SGreg Clayton   ModuleSP module_sp(GetSP());
168b9c1b51eSKate Stone   if (module_sp) {
169fbb76349SGreg Clayton     module_sp->SetRemoteInstallFileSpec(file.ref());
170fbb76349SGreg Clayton     return true;
171fbb76349SGreg Clayton   }
172fbb76349SGreg Clayton   return false;
173fbb76349SGreg Clayton }
1742289fa48SGreg Clayton 
175b9c1b51eSKate Stone const uint8_t *SBModule::GetUUIDBytes() const {
176*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const uint8_t *, SBModule, GetUUIDBytes);
177*baf5664fSJonas Devlieghere 
1785160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
179ceb6b139SCaroline Tice 
1804838131bSGreg Clayton   const uint8_t *uuid_bytes = NULL;
181c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
182c2ff9318SGreg Clayton   if (module_sp)
183470b286eSPavel Labath     uuid_bytes = module_sp->GetUUID().GetBytes().data();
184ceb6b139SCaroline Tice 
185b9c1b51eSKate Stone   if (log) {
186b9c1b51eSKate Stone     if (uuid_bytes) {
1874838131bSGreg Clayton       StreamString s;
188c2ff9318SGreg Clayton       module_sp->GetUUID().Dump(&s);
189324a1036SSaleem Abdulrasool       log->Printf("SBModule(%p)::GetUUIDBytes () => %s",
190324a1036SSaleem Abdulrasool                   static_cast<void *>(module_sp.get()), s.GetData());
191b9c1b51eSKate Stone     } else
192324a1036SSaleem Abdulrasool       log->Printf("SBModule(%p)::GetUUIDBytes () => NULL",
193324a1036SSaleem Abdulrasool                   static_cast<void *>(module_sp.get()));
1944838131bSGreg Clayton   }
1954838131bSGreg Clayton   return uuid_bytes;
19630fdc8d8SChris Lattner }
19730fdc8d8SChris Lattner 
198b9c1b51eSKate Stone const char *SBModule::GetUUIDString() const {
199*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBModule, GetUUIDString);
200*baf5664fSJonas Devlieghere 
2015160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
202df2963edSJohnny Chen 
203f1be855aSGreg Clayton   const char *uuid_cstr = NULL;
204c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
205b9c1b51eSKate Stone   if (module_sp) {
20605097246SAdrian Prantl     // We are going to return a "const char *" value through the public API, so
20705097246SAdrian Prantl     // we need to constify it so it gets added permanently the string pool and
20805097246SAdrian Prantl     // then we don't need to worry about the lifetime of the string as it will
20905097246SAdrian Prantl     // never go away once it has been put into the ConstString string pool
210f1be855aSGreg Clayton     uuid_cstr = ConstString(module_sp->GetUUID().GetAsString()).GetCString();
211f1be855aSGreg Clayton   }
212f1be855aSGreg Clayton 
213b9c1b51eSKate Stone   if (uuid_cstr && uuid_cstr[0]) {
214f1be855aSGreg Clayton     if (log)
215b9c1b51eSKate Stone       log->Printf("SBModule(%p)::GetUUIDString () => %s",
216b9c1b51eSKate Stone                   static_cast<void *>(module_sp.get()), uuid_cstr);
217f1be855aSGreg Clayton     return uuid_cstr;
218c16b4af0SJason Molenda   }
219df2963edSJohnny Chen 
220df2963edSJohnny Chen   if (log)
221b9c1b51eSKate Stone     log->Printf("SBModule(%p)::GetUUIDString () => NULL",
222b9c1b51eSKate Stone                 static_cast<void *>(module_sp.get()));
223f1be855aSGreg Clayton   return NULL;
224df2963edSJohnny Chen }
225df2963edSJohnny Chen 
226b9c1b51eSKate Stone bool SBModule::operator==(const SBModule &rhs) const {
227*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBModule, operator==,(const lldb::SBModule &),
228*baf5664fSJonas Devlieghere                            rhs);
229*baf5664fSJonas Devlieghere 
2306611103cSGreg Clayton   if (m_opaque_sp)
2316611103cSGreg Clayton     return m_opaque_sp.get() == rhs.m_opaque_sp.get();
23230fdc8d8SChris Lattner   return false;
23330fdc8d8SChris Lattner }
23430fdc8d8SChris Lattner 
235b9c1b51eSKate Stone bool SBModule::operator!=(const SBModule &rhs) const {
236*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBModule, operator!=,(const lldb::SBModule &),
237*baf5664fSJonas Devlieghere                            rhs);
238*baf5664fSJonas Devlieghere 
2396611103cSGreg Clayton   if (m_opaque_sp)
2406611103cSGreg Clayton     return m_opaque_sp.get() != rhs.m_opaque_sp.get();
24130fdc8d8SChris Lattner   return false;
24230fdc8d8SChris Lattner }
24330fdc8d8SChris Lattner 
244b9c1b51eSKate Stone ModuleSP SBModule::GetSP() const { return m_opaque_sp; }
24530fdc8d8SChris Lattner 
246b9c1b51eSKate Stone void SBModule::SetSP(const ModuleSP &module_sp) { m_opaque_sp = module_sp; }
24730fdc8d8SChris Lattner 
248b9c1b51eSKate Stone SBAddress SBModule::ResolveFileAddress(lldb::addr_t vm_addr) {
249*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBAddress, SBModule, ResolveFileAddress,
250*baf5664fSJonas Devlieghere                      (lldb::addr_t), vm_addr);
251*baf5664fSJonas Devlieghere 
252cac9c5f9SGreg Clayton   lldb::SBAddress sb_addr;
253c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
254b9c1b51eSKate Stone   if (module_sp) {
255cac9c5f9SGreg Clayton     Address addr;
256c2ff9318SGreg Clayton     if (module_sp->ResolveFileAddress(vm_addr, addr))
257cac9c5f9SGreg Clayton       sb_addr.ref() = addr;
258cac9c5f9SGreg Clayton   }
259*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_addr);
26009960031SGreg Clayton }
26109960031SGreg Clayton 
26209960031SGreg Clayton SBSymbolContext
263b9c1b51eSKate Stone SBModule::ResolveSymbolContextForAddress(const SBAddress &addr,
264b9c1b51eSKate Stone                                          uint32_t resolve_scope) {
265*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbolContext, SBModule,
266*baf5664fSJonas Devlieghere                      ResolveSymbolContextForAddress,
267*baf5664fSJonas Devlieghere                      (const lldb::SBAddress &, uint32_t), addr, resolve_scope);
268*baf5664fSJonas Devlieghere 
26909960031SGreg Clayton   SBSymbolContext sb_sc;
270c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
271991e4453SZachary Turner   SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
272c2ff9318SGreg Clayton   if (module_sp && addr.IsValid())
273991e4453SZachary Turner     module_sp->ResolveSymbolContextForAddress(addr.ref(), scope, *sb_sc);
274*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_sc);
27509960031SGreg Clayton }
27609960031SGreg Clayton 
277b9c1b51eSKate Stone bool SBModule::GetDescription(SBStream &description) {
278*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBModule, GetDescription, (lldb::SBStream &),
279*baf5664fSJonas Devlieghere                      description);
280*baf5664fSJonas Devlieghere 
281da7bc7d0SGreg Clayton   Stream &strm = description.ref();
282da7bc7d0SGreg Clayton 
283c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
284b9c1b51eSKate Stone   if (module_sp) {
285c2ff9318SGreg Clayton     module_sp->GetDescription(&strm);
286b9c1b51eSKate Stone   } else
287da7bc7d0SGreg Clayton     strm.PutCString("No value");
288dde9cff3SCaroline Tice 
289dde9cff3SCaroline Tice   return true;
290dde9cff3SCaroline Tice }
291bbdabce2SGreg Clayton 
292b9c1b51eSKate Stone uint32_t SBModule::GetNumCompileUnits() {
293*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBModule, GetNumCompileUnits);
294*baf5664fSJonas Devlieghere 
295873a7a4bSJohnny Chen   ModuleSP module_sp(GetSP());
296b9c1b51eSKate Stone   if (module_sp) {
297873a7a4bSJohnny Chen     return module_sp->GetNumCompileUnits();
298873a7a4bSJohnny Chen   }
299873a7a4bSJohnny Chen   return 0;
300873a7a4bSJohnny Chen }
301873a7a4bSJohnny Chen 
302b9c1b51eSKate Stone SBCompileUnit SBModule::GetCompileUnitAtIndex(uint32_t index) {
303*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBCompileUnit, SBModule, GetCompileUnitAtIndex,
304*baf5664fSJonas Devlieghere                      (uint32_t), index);
305*baf5664fSJonas Devlieghere 
306873a7a4bSJohnny Chen   SBCompileUnit sb_cu;
307873a7a4bSJohnny Chen   ModuleSP module_sp(GetSP());
308b9c1b51eSKate Stone   if (module_sp) {
309873a7a4bSJohnny Chen     CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(index);
310873a7a4bSJohnny Chen     sb_cu.reset(cu_sp.get());
311873a7a4bSJohnny Chen   }
312*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_cu);
313873a7a4bSJohnny Chen }
314873a7a4bSJohnny Chen 
315*baf5664fSJonas Devlieghere SBSymbolContextList SBModule::FindCompileUnits(const SBFileSpec &sb_file_spec) {
316*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindCompileUnits,
317*baf5664fSJonas Devlieghere                      (const lldb::SBFileSpec &), sb_file_spec);
318*baf5664fSJonas Devlieghere 
319da0c081fSAlexander Polyakov   SBSymbolContextList sb_sc_list;
320da0c081fSAlexander Polyakov   const ModuleSP module_sp(GetSP());
321da0c081fSAlexander Polyakov   if (sb_file_spec.IsValid() && module_sp) {
322da0c081fSAlexander Polyakov     const bool append = true;
323da0c081fSAlexander Polyakov     module_sp->FindCompileUnits(*sb_file_spec, append, *sb_sc_list);
324da0c081fSAlexander Polyakov   }
325*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_sc_list);
326da0c081fSAlexander Polyakov }
327da0c081fSAlexander Polyakov 
328b9c1b51eSKate Stone static Symtab *GetUnifiedSymbolTable(const lldb::ModuleSP &module_sp) {
329b9c1b51eSKate Stone   if (module_sp) {
330a7499c98SMichael Sartain     SymbolVendor *symbols = module_sp->GetSymbolVendor();
331a7499c98SMichael Sartain     if (symbols)
332a7499c98SMichael Sartain       return symbols->GetSymtab();
333a7499c98SMichael Sartain   }
334a7499c98SMichael Sartain   return NULL;
335a7499c98SMichael Sartain }
336a7499c98SMichael Sartain 
337b9c1b51eSKate Stone size_t SBModule::GetNumSymbols() {
338*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(size_t, SBModule, GetNumSymbols);
339*baf5664fSJonas Devlieghere 
340c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
341b9c1b51eSKate Stone   if (module_sp) {
342a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
343bbdabce2SGreg Clayton     if (symtab)
344bbdabce2SGreg Clayton       return symtab->GetNumSymbols();
345bbdabce2SGreg Clayton   }
346bbdabce2SGreg Clayton   return 0;
347bbdabce2SGreg Clayton }
348bbdabce2SGreg Clayton 
349b9c1b51eSKate Stone SBSymbol SBModule::GetSymbolAtIndex(size_t idx) {
350*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbol, SBModule, GetSymbolAtIndex, (size_t), idx);
351*baf5664fSJonas Devlieghere 
352bbdabce2SGreg Clayton   SBSymbol sb_symbol;
353c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
354a7499c98SMichael Sartain   Symtab *symtab = GetUnifiedSymbolTable(module_sp);
355bbdabce2SGreg Clayton   if (symtab)
356bbdabce2SGreg Clayton     sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx));
357*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_symbol);
358bbdabce2SGreg Clayton }
359fe356d35SGreg Clayton 
360b9c1b51eSKate Stone lldb::SBSymbol SBModule::FindSymbol(const char *name,
361b9c1b51eSKate Stone                                     lldb::SymbolType symbol_type) {
362*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbol, SBModule, FindSymbol,
363*baf5664fSJonas Devlieghere                      (const char *, lldb::SymbolType), name, symbol_type);
364*baf5664fSJonas Devlieghere 
365e14e1925SGreg Clayton   SBSymbol sb_symbol;
366b9c1b51eSKate Stone   if (name && name[0]) {
367e14e1925SGreg Clayton     ModuleSP module_sp(GetSP());
368a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
369e14e1925SGreg Clayton     if (symtab)
370b9c1b51eSKate Stone       sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType(
371b9c1b51eSKate Stone           ConstString(name), symbol_type, Symtab::eDebugAny,
372b9c1b51eSKate Stone           Symtab::eVisibilityAny));
373e14e1925SGreg Clayton   }
374*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_symbol);
375e14e1925SGreg Clayton }
376e14e1925SGreg Clayton 
377b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindSymbols(const char *name,
378b9c1b51eSKate Stone                                                 lldb::SymbolType symbol_type) {
379*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindSymbols,
380*baf5664fSJonas Devlieghere                      (const char *, lldb::SymbolType), name, symbol_type);
381*baf5664fSJonas Devlieghere 
382e14e1925SGreg Clayton   SBSymbolContextList sb_sc_list;
383b9c1b51eSKate Stone   if (name && name[0]) {
384e14e1925SGreg Clayton     ModuleSP module_sp(GetSP());
385a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
386b9c1b51eSKate Stone     if (symtab) {
387e14e1925SGreg Clayton       std::vector<uint32_t> matching_symbol_indexes;
388b9c1b51eSKate Stone       const size_t num_matches = symtab->FindAllSymbolsWithNameAndType(
389b9c1b51eSKate Stone           ConstString(name), symbol_type, matching_symbol_indexes);
390b9c1b51eSKate Stone       if (num_matches) {
391e14e1925SGreg Clayton         SymbolContext sc;
392e14e1925SGreg Clayton         sc.module_sp = module_sp;
393e14e1925SGreg Clayton         SymbolContextList &sc_list = *sb_sc_list;
394b9c1b51eSKate Stone         for (size_t i = 0; i < num_matches; ++i) {
395e14e1925SGreg Clayton           sc.symbol = symtab->SymbolAtIndex(matching_symbol_indexes[i]);
396e14e1925SGreg Clayton           if (sc.symbol)
397e14e1925SGreg Clayton             sc_list.Append(sc);
398e14e1925SGreg Clayton         }
399e14e1925SGreg Clayton       }
400e14e1925SGreg Clayton     }
401e14e1925SGreg Clayton   }
402*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_sc_list);
403e14e1925SGreg Clayton }
404e14e1925SGreg Clayton 
405b9c1b51eSKate Stone size_t SBModule::GetNumSections() {
406*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(size_t, SBModule, GetNumSections);
407*baf5664fSJonas Devlieghere 
408c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
409b9c1b51eSKate Stone   if (module_sp) {
410a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
411a7499c98SMichael Sartain     module_sp->GetSymbolVendor();
4123046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
413cac9c5f9SGreg Clayton     if (section_list)
414cac9c5f9SGreg Clayton       return section_list->GetSize();
415cac9c5f9SGreg Clayton   }
416cac9c5f9SGreg Clayton   return 0;
417cac9c5f9SGreg Clayton }
418cac9c5f9SGreg Clayton 
419b9c1b51eSKate Stone SBSection SBModule::GetSectionAtIndex(size_t idx) {
420*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSection, SBModule, GetSectionAtIndex, (size_t),
421*baf5664fSJonas Devlieghere                      idx);
422*baf5664fSJonas Devlieghere 
423cac9c5f9SGreg Clayton   SBSection sb_section;
424c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
425b9c1b51eSKate Stone   if (module_sp) {
426a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
427a7499c98SMichael Sartain     module_sp->GetSymbolVendor();
4283046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
429cac9c5f9SGreg Clayton 
430cac9c5f9SGreg Clayton     if (section_list)
431e72dfb32SGreg Clayton       sb_section.SetSP(section_list->GetSectionAtIndex(idx));
432cac9c5f9SGreg Clayton   }
433*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_section);
434cac9c5f9SGreg Clayton }
435cac9c5f9SGreg Clayton 
436b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindFunctions(const char *name,
437b9c1b51eSKate Stone                                                   uint32_t name_type_mask) {
438*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindFunctions,
439*baf5664fSJonas Devlieghere                      (const char *, uint32_t), name, name_type_mask);
440*baf5664fSJonas Devlieghere 
4415569e64eSGreg Clayton   lldb::SBSymbolContextList sb_sc_list;
442c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
443b9c1b51eSKate Stone   if (name && module_sp) {
4445569e64eSGreg Clayton     const bool append = true;
445fe356d35SGreg Clayton     const bool symbols_ok = true;
4469df05fbbSSean Callanan     const bool inlines_ok = true;
447117b1fa1SZachary Turner     FunctionNameType type = static_cast<FunctionNameType>(name_type_mask);
448117b1fa1SZachary Turner     module_sp->FindFunctions(ConstString(name), NULL, type, symbols_ok,
449117b1fa1SZachary Turner                              inlines_ok, append, *sb_sc_list);
450fe356d35SGreg Clayton   }
451*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_sc_list);
452fe356d35SGreg Clayton }
453fe356d35SGreg Clayton 
454b9c1b51eSKate Stone SBValueList SBModule::FindGlobalVariables(SBTarget &target, const char *name,
455b9c1b51eSKate Stone                                           uint32_t max_matches) {
456*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValueList, SBModule, FindGlobalVariables,
457*baf5664fSJonas Devlieghere                      (lldb::SBTarget &, const char *, uint32_t), target, name,
458*baf5664fSJonas Devlieghere                      max_matches);
459*baf5664fSJonas Devlieghere 
460dea8cb4fSGreg Clayton   SBValueList sb_value_list;
461c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
462b9c1b51eSKate Stone   if (name && module_sp) {
463dea8cb4fSGreg Clayton     VariableList variable_list;
464b9c1b51eSKate Stone     const uint32_t match_count = module_sp->FindGlobalVariables(
46534cda14bSPavel Labath         ConstString(name), NULL, max_matches, variable_list);
466dea8cb4fSGreg Clayton 
467b9c1b51eSKate Stone     if (match_count > 0) {
468b9c1b51eSKate Stone       for (uint32_t i = 0; i < match_count; ++i) {
469dea8cb4fSGreg Clayton         lldb::ValueObjectSP valobj_sp;
470b9556accSGreg Clayton         TargetSP target_sp(target.GetSP());
471b9c1b51eSKate Stone         valobj_sp = ValueObjectVariable::Create(
472b9c1b51eSKate Stone             target_sp.get(), variable_list.GetVariableAtIndex(i));
473dea8cb4fSGreg Clayton         if (valobj_sp)
47485425d77SEnrico Granata           sb_value_list.Append(SBValue(valobj_sp));
475dea8cb4fSGreg Clayton       }
476dea8cb4fSGreg Clayton     }
477dea8cb4fSGreg Clayton   }
478dea8cb4fSGreg Clayton 
479*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_value_list);
480dea8cb4fSGreg Clayton }
4816f3533fbSEnrico Granata 
482b9c1b51eSKate Stone lldb::SBValue SBModule::FindFirstGlobalVariable(lldb::SBTarget &target,
483b9c1b51eSKate Stone                                                 const char *name) {
484*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBValue, SBModule, FindFirstGlobalVariable,
485*baf5664fSJonas Devlieghere                      (lldb::SBTarget &, const char *), target, name);
486*baf5664fSJonas Devlieghere 
487bcd80b47SEnrico Granata   SBValueList sb_value_list(FindGlobalVariables(target, name, 1));
488bcd80b47SEnrico Granata   if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0)
489*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_value_list.GetValueAtIndex(0));
490*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBValue());
491bcd80b47SEnrico Granata }
492bcd80b47SEnrico Granata 
493b9c1b51eSKate Stone lldb::SBType SBModule::FindFirstType(const char *name_cstr) {
494*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBType, SBModule, FindFirstType, (const char *),
495*baf5664fSJonas Devlieghere                      name_cstr);
496*baf5664fSJonas Devlieghere 
497fe42ac4dSGreg Clayton   SBType sb_type;
498c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
499b9c1b51eSKate Stone   if (name_cstr && module_sp) {
5006f3533fbSEnrico Granata     SymbolContext sc;
50184db9105SGreg Clayton     const bool exact_match = false;
5026f3533fbSEnrico Granata     ConstString name(name_cstr);
5036f3533fbSEnrico Granata 
504b43165b7SGreg Clayton     sb_type = SBType(module_sp->FindFirstType(sc, name, exact_match));
5056f3533fbSEnrico Granata 
506b9c1b51eSKate Stone     if (!sb_type.IsValid()) {
507b9c1b51eSKate Stone       TypeSystem *type_system =
508b9c1b51eSKate Stone           module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
50956939cb3SGreg Clayton       if (type_system)
51056939cb3SGreg Clayton         sb_type = SBType(type_system->GetBuiltinTypeByName(name));
51156939cb3SGreg Clayton     }
5126f3533fbSEnrico Granata   }
513*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_type);
5146f3533fbSEnrico Granata }
5156f3533fbSEnrico Granata 
516b9c1b51eSKate Stone lldb::SBType SBModule::GetBasicType(lldb::BasicType type) {
517*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBType, SBModule, GetBasicType, (lldb::BasicType),
518*baf5664fSJonas Devlieghere                      type);
519*baf5664fSJonas Devlieghere 
520b43165b7SGreg Clayton   ModuleSP module_sp(GetSP());
521b9c1b51eSKate Stone   if (module_sp) {
522b9c1b51eSKate Stone     TypeSystem *type_system =
523b9c1b51eSKate Stone         module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
52456939cb3SGreg Clayton     if (type_system)
525*baf5664fSJonas Devlieghere       return LLDB_RECORD_RESULT(SBType(type_system->GetBasicTypeFromAST(type)));
52656939cb3SGreg Clayton   }
527*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBType());
528b43165b7SGreg Clayton }
529b43165b7SGreg Clayton 
530b9c1b51eSKate Stone lldb::SBTypeList SBModule::FindTypes(const char *type) {
531*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeList, SBModule, FindTypes, (const char *),
532*baf5664fSJonas Devlieghere                      type);
533*baf5664fSJonas Devlieghere 
5346f3533fbSEnrico Granata   SBTypeList retval;
5356f3533fbSEnrico Granata 
536c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
537b9c1b51eSKate Stone   if (type && module_sp) {
5386f3533fbSEnrico Granata     TypeList type_list;
53984db9105SGreg Clayton     const bool exact_match = false;
5406f3533fbSEnrico Granata     ConstString name(type);
541ae088e52SGreg Clayton     llvm::DenseSet<SymbolFile *> searched_symbol_files;
542b9c1b51eSKate Stone     const uint32_t num_matches = module_sp->FindTypes(
543576495e6SZachary Turner         name, exact_match, UINT32_MAX, searched_symbol_files, type_list);
5446f3533fbSEnrico Granata 
545b9c1b51eSKate Stone     if (num_matches > 0) {
546b9c1b51eSKate Stone       for (size_t idx = 0; idx < num_matches; idx++) {
547fe42ac4dSGreg Clayton         TypeSP type_sp(type_list.GetTypeAtIndex(idx));
548fe42ac4dSGreg Clayton         if (type_sp)
549fe42ac4dSGreg Clayton           retval.Append(SBType(type_sp));
550fe42ac4dSGreg Clayton       }
551b9c1b51eSKate Stone     } else {
552b9c1b51eSKate Stone       TypeSystem *type_system =
553b9c1b51eSKate Stone           module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
554b9c1b51eSKate Stone       if (type_system) {
55556939cb3SGreg Clayton         CompilerType compiler_type = type_system->GetBuiltinTypeByName(name);
55656939cb3SGreg Clayton         if (compiler_type)
55756939cb3SGreg Clayton           retval.Append(SBType(compiler_type));
55856939cb3SGreg Clayton       }
559b43165b7SGreg Clayton     }
560b43165b7SGreg Clayton   }
5616f3533fbSEnrico Granata 
562*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(retval);
5636f3533fbSEnrico Granata }
564cac9c5f9SGreg Clayton 
565b9c1b51eSKate Stone lldb::SBType SBModule::GetTypeByID(lldb::user_id_t uid) {
566*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBType, SBModule, GetTypeByID, (lldb::user_id_t),
567*baf5664fSJonas Devlieghere                      uid);
568*baf5664fSJonas Devlieghere 
5691f4db7daSGreg Clayton   ModuleSP module_sp(GetSP());
570b9c1b51eSKate Stone   if (module_sp) {
5711f4db7daSGreg Clayton     SymbolVendor *vendor = module_sp->GetSymbolVendor();
572b9c1b51eSKate Stone     if (vendor) {
5731f4db7daSGreg Clayton       Type *type_ptr = vendor->ResolveTypeUID(uid);
5741f4db7daSGreg Clayton       if (type_ptr)
575*baf5664fSJonas Devlieghere         return LLDB_RECORD_RESULT(SBType(type_ptr->shared_from_this()));
5761f4db7daSGreg Clayton     }
5771f4db7daSGreg Clayton   }
578*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBType());
5791f4db7daSGreg Clayton }
5801f4db7daSGreg Clayton 
581b9c1b51eSKate Stone lldb::SBTypeList SBModule::GetTypes(uint32_t type_mask) {
582*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeList, SBModule, GetTypes, (uint32_t),
583*baf5664fSJonas Devlieghere                      type_mask);
584*baf5664fSJonas Devlieghere 
585f02500c7SGreg Clayton   SBTypeList sb_type_list;
586f02500c7SGreg Clayton 
587f02500c7SGreg Clayton   ModuleSP module_sp(GetSP());
588117b1fa1SZachary Turner   if (!module_sp)
589*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_type_list);
590f02500c7SGreg Clayton   SymbolVendor *vendor = module_sp->GetSymbolVendor();
591117b1fa1SZachary Turner   if (!vendor)
592*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_type_list);
593117b1fa1SZachary Turner 
594117b1fa1SZachary Turner   TypeClass type_class = static_cast<TypeClass>(type_mask);
595f02500c7SGreg Clayton   TypeList type_list;
596117b1fa1SZachary Turner   vendor->GetTypes(NULL, type_class, type_list);
597d5b44036SJonas Devlieghere   sb_type_list.m_opaque_up->Append(type_list);
598*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_type_list);
599f02500c7SGreg Clayton }
600cac9c5f9SGreg Clayton 
601b9c1b51eSKate Stone SBSection SBModule::FindSection(const char *sect_name) {
602*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBSection, SBModule, FindSection, (const char *),
603*baf5664fSJonas Devlieghere                      sect_name);
604*baf5664fSJonas Devlieghere 
605cac9c5f9SGreg Clayton   SBSection sb_section;
606cac9c5f9SGreg Clayton 
607c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
608b9c1b51eSKate Stone   if (sect_name && module_sp) {
609a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
610a7499c98SMichael Sartain     module_sp->GetSymbolVendor();
6113046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
612b9c1b51eSKate Stone     if (section_list) {
613cac9c5f9SGreg Clayton       ConstString const_sect_name(sect_name);
614cac9c5f9SGreg Clayton       SectionSP section_sp(section_list->FindSectionByName(const_sect_name));
615b9c1b51eSKate Stone       if (section_sp) {
616e72dfb32SGreg Clayton         sb_section.SetSP(section_sp);
617cac9c5f9SGreg Clayton       }
618cac9c5f9SGreg Clayton     }
619cac9c5f9SGreg Clayton   }
620*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_section);
621cac9c5f9SGreg Clayton }
622cac9c5f9SGreg Clayton 
623b9c1b51eSKate Stone lldb::ByteOrder SBModule::GetByteOrder() {
624*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::ByteOrder, SBModule, GetByteOrder);
625*baf5664fSJonas Devlieghere 
626c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
627c2ff9318SGreg Clayton   if (module_sp)
628c2ff9318SGreg Clayton     return module_sp->GetArchitecture().GetByteOrder();
62913d1950aSGreg Clayton   return eByteOrderInvalid;
63013d1950aSGreg Clayton }
63113d1950aSGreg Clayton 
632b9c1b51eSKate Stone const char *SBModule::GetTriple() {
633*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBModule, GetTriple);
634*baf5664fSJonas Devlieghere 
635c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
636b9c1b51eSKate Stone   if (module_sp) {
637c2ff9318SGreg Clayton     std::string triple(module_sp->GetArchitecture().GetTriple().str());
63805097246SAdrian Prantl     // Unique the string so we don't run into ownership issues since the const
63905097246SAdrian Prantl     // strings put the string into the string pool once and the strings never
64005097246SAdrian Prantl     // comes out
64113d1950aSGreg Clayton     ConstString const_triple(triple.c_str());
64213d1950aSGreg Clayton     return const_triple.GetCString();
64313d1950aSGreg Clayton   }
64413d1950aSGreg Clayton   return NULL;
64513d1950aSGreg Clayton }
64613d1950aSGreg Clayton 
647b9c1b51eSKate Stone uint32_t SBModule::GetAddressByteSize() {
648*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBModule, GetAddressByteSize);
649*baf5664fSJonas Devlieghere 
650c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
651c2ff9318SGreg Clayton   if (module_sp)
652c2ff9318SGreg Clayton     return module_sp->GetArchitecture().GetAddressByteSize();
65313d1950aSGreg Clayton   return sizeof(void *);
65413d1950aSGreg Clayton }
65513d1950aSGreg Clayton 
656b9c1b51eSKate Stone uint32_t SBModule::GetVersion(uint32_t *versions, uint32_t num_versions) {
657*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(uint32_t, SBModule, GetVersion, (uint32_t *, uint32_t),
658*baf5664fSJonas Devlieghere                      versions, num_versions);
659*baf5664fSJonas Devlieghere 
6602272c481SPavel Labath   llvm::VersionTuple version;
6612272c481SPavel Labath   if (ModuleSP module_sp = GetSP())
6622272c481SPavel Labath     version = module_sp->GetVersion();
6632272c481SPavel Labath   uint32_t result = 0;
6642272c481SPavel Labath   if (!version.empty())
6652272c481SPavel Labath     ++result;
6662272c481SPavel Labath   if (version.getMinor())
6672272c481SPavel Labath     ++result;
6682272c481SPavel Labath   if(version.getSubminor())
6692272c481SPavel Labath     ++result;
6702272c481SPavel Labath 
6712272c481SPavel Labath   if (!versions)
6722272c481SPavel Labath     return result;
6732272c481SPavel Labath 
6742272c481SPavel Labath   if (num_versions > 0)
6752272c481SPavel Labath     versions[0] = version.empty() ? UINT32_MAX : version.getMajor();
6762272c481SPavel Labath   if (num_versions > 1)
6772272c481SPavel Labath     versions[1] = version.getMinor().getValueOr(UINT32_MAX);
6782272c481SPavel Labath   if (num_versions > 2)
6792272c481SPavel Labath     versions[2] = version.getSubminor().getValueOr(UINT32_MAX);
6802272c481SPavel Labath   for (uint32_t i = 3; i < num_versions; ++i)
681c2ff9318SGreg Clayton     versions[i] = UINT32_MAX;
6822272c481SPavel Labath   return result;
6833467d80bSEnrico Granata }
684c2ff9318SGreg Clayton 
685b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetSymbolFileSpec() const {
686*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule,
687*baf5664fSJonas Devlieghere                                    GetSymbolFileSpec);
688*baf5664fSJonas Devlieghere 
689eb2c19a5SIlia K   lldb::SBFileSpec sb_file_spec;
690eb2c19a5SIlia K   ModuleSP module_sp(GetSP());
691b9c1b51eSKate Stone   if (module_sp) {
692eb2c19a5SIlia K     SymbolVendor *symbol_vendor_ptr = module_sp->GetSymbolVendor();
693eb2c19a5SIlia K     if (symbol_vendor_ptr)
694eb2c19a5SIlia K       sb_file_spec.SetFileSpec(symbol_vendor_ptr->GetMainFileSpec());
695eb2c19a5SIlia K   }
696*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_file_spec);
697eb2c19a5SIlia K }
698eb2c19a5SIlia K 
699b9c1b51eSKate Stone lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const {
700*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBModule,
701*baf5664fSJonas Devlieghere                                    GetObjectFileHeaderAddress);
702*baf5664fSJonas Devlieghere 
703eb2c19a5SIlia K   lldb::SBAddress sb_addr;
704eb2c19a5SIlia K   ModuleSP module_sp(GetSP());
705b9c1b51eSKate Stone   if (module_sp) {
706eb2c19a5SIlia K     ObjectFile *objfile_ptr = module_sp->GetObjectFile();
707eb2c19a5SIlia K     if (objfile_ptr)
708d1e3fe21SPavel Labath       sb_addr.ref() = objfile_ptr->GetBaseAddress();
709eb2c19a5SIlia K   }
710*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_addr);
711eb2c19a5SIlia K }
7129b087d2cSAleksandr Urakov 
7139b087d2cSAleksandr Urakov lldb::SBAddress SBModule::GetObjectFileEntryPointAddress() const {
714*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBModule,
715*baf5664fSJonas Devlieghere                                    GetObjectFileEntryPointAddress);
716*baf5664fSJonas Devlieghere 
7179b087d2cSAleksandr Urakov   lldb::SBAddress sb_addr;
7189b087d2cSAleksandr Urakov   ModuleSP module_sp(GetSP());
7199b087d2cSAleksandr Urakov   if (module_sp) {
7209b087d2cSAleksandr Urakov     ObjectFile *objfile_ptr = module_sp->GetObjectFile();
7219b087d2cSAleksandr Urakov     if (objfile_ptr)
7229b087d2cSAleksandr Urakov       sb_addr.ref() = objfile_ptr->GetEntryPointAddress();
7239b087d2cSAleksandr Urakov   }
724*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_addr);
7259b087d2cSAleksandr Urakov }
726