130fdc8d8SChris Lattner //===-- SBModule.cpp --------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
930fdc8d8SChris Lattner #include "lldb/API/SBModule.h"
1009960031SGreg Clayton #include "lldb/API/SBAddress.h"
1109960031SGreg Clayton #include "lldb/API/SBFileSpec.h"
12226cce25SGreg Clayton #include "lldb/API/SBModuleSpec.h"
13c9660546SGreg Clayton #include "lldb/API/SBProcess.h"
14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
15fe356d35SGreg Clayton #include "lldb/API/SBSymbolContextList.h"
16b9c1b51eSKate Stone #include "lldb/Core/Module.h"
171f746071SGreg Clayton #include "lldb/Core/Section.h"
18dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectList.h"
19dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectVariable.h"
201f746071SGreg Clayton #include "lldb/Symbol/ObjectFile.h"
21ae088e52SGreg Clayton #include "lldb/Symbol/SymbolFile.h"
226f3533fbSEnrico Granata #include "lldb/Symbol/SymbolVendor.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"
276f9e6901SZachary Turner #include "lldb/Utility/Log.h"
28bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h"
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner using namespace lldb;
31ceb6b139SCaroline Tice using namespace lldb_private;
3230fdc8d8SChris Lattner 
33b9c1b51eSKate Stone SBModule::SBModule() : m_opaque_sp() {}
3430fdc8d8SChris Lattner 
35b9c1b51eSKate Stone SBModule::SBModule(const lldb::ModuleSP &module_sp) : m_opaque_sp(module_sp) {}
3630fdc8d8SChris Lattner 
37b9c1b51eSKate Stone SBModule::SBModule(const SBModuleSpec &module_spec) : m_opaque_sp() {
38226cce25SGreg Clayton   ModuleSP module_sp;
3997206d57SZachary Turner   Status error = ModuleList::GetSharedModule(*module_spec.m_opaque_ap,
4097206d57SZachary Turner                                              module_sp, NULL, NULL, NULL);
41226cce25SGreg Clayton   if (module_sp)
42226cce25SGreg Clayton     SetSP(module_sp);
43226cce25SGreg Clayton }
44226cce25SGreg Clayton 
45b9c1b51eSKate Stone SBModule::SBModule(const SBModule &rhs) : m_opaque_sp(rhs.m_opaque_sp) {}
46efabb123SGreg Clayton 
47b9c1b51eSKate Stone SBModule::SBModule(lldb::SBProcess &process, lldb::addr_t header_addr)
48b9c1b51eSKate Stone     : m_opaque_sp() {
49c9660546SGreg Clayton   ProcessSP process_sp(process.GetSP());
50b9c1b51eSKate Stone   if (process_sp) {
5139f7ee86SGreg Clayton     m_opaque_sp = process_sp->ReadModuleFromMemory(FileSpec(), header_addr);
52b9c1b51eSKate Stone     if (m_opaque_sp) {
5339f7ee86SGreg Clayton       Target &target = process_sp->GetTarget();
5439f7ee86SGreg Clayton       bool changed = false;
55751caf65SGreg Clayton       m_opaque_sp->SetLoadAddress(target, 0, true, changed);
5639f7ee86SGreg Clayton       target.GetImages().Append(m_opaque_sp);
5739f7ee86SGreg Clayton     }
58c859e2d5SGreg Clayton   }
59c9660546SGreg Clayton }
60c9660546SGreg Clayton 
61b9c1b51eSKate Stone const SBModule &SBModule::operator=(const SBModule &rhs) {
62efabb123SGreg Clayton   if (this != &rhs)
63efabb123SGreg Clayton     m_opaque_sp = rhs.m_opaque_sp;
64efabb123SGreg Clayton   return *this;
65efabb123SGreg Clayton }
66efabb123SGreg Clayton 
67b9c1b51eSKate Stone SBModule::~SBModule() {}
6830fdc8d8SChris Lattner 
69b9c1b51eSKate Stone bool SBModule::IsValid() const { return m_opaque_sp.get() != NULL; }
7030fdc8d8SChris Lattner 
71b9c1b51eSKate Stone void SBModule::Clear() { m_opaque_sp.reset(); }
725d3bca4eSJim Ingham 
73b9c1b51eSKate Stone SBFileSpec SBModule::GetFileSpec() const {
745160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
75ceb6b139SCaroline Tice 
7630fdc8d8SChris Lattner   SBFileSpec file_spec;
77c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
78c2ff9318SGreg Clayton   if (module_sp)
79c2ff9318SGreg Clayton     file_spec.SetFileSpec(module_sp->GetFileSpec());
80ceb6b139SCaroline Tice 
81ceb6b139SCaroline Tice   if (log)
82cfd1acedSGreg Clayton     log->Printf("SBModule(%p)::GetFileSpec () => SBFileSpec(%p)",
83324a1036SSaleem Abdulrasool                 static_cast<void *>(module_sp.get()),
84324a1036SSaleem Abdulrasool                 static_cast<const void *>(file_spec.get()));
85ceb6b139SCaroline Tice 
8630fdc8d8SChris Lattner   return file_spec;
8730fdc8d8SChris Lattner }
8830fdc8d8SChris Lattner 
89b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetPlatformFileSpec() const {
905160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
912289fa48SGreg Clayton 
922289fa48SGreg Clayton   SBFileSpec file_spec;
93c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
94c2ff9318SGreg Clayton   if (module_sp)
95c2ff9318SGreg Clayton     file_spec.SetFileSpec(module_sp->GetPlatformFileSpec());
962289fa48SGreg Clayton 
972289fa48SGreg Clayton   if (log)
982289fa48SGreg Clayton     log->Printf("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)",
99324a1036SSaleem Abdulrasool                 static_cast<void *>(module_sp.get()),
100324a1036SSaleem Abdulrasool                 static_cast<const void *>(file_spec.get()));
1012289fa48SGreg Clayton 
1022289fa48SGreg Clayton   return file_spec;
1032289fa48SGreg Clayton }
1042289fa48SGreg Clayton 
105b9c1b51eSKate Stone bool SBModule::SetPlatformFileSpec(const lldb::SBFileSpec &platform_file) {
1062289fa48SGreg Clayton   bool result = false;
1075160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1082289fa48SGreg Clayton 
109c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
110b9c1b51eSKate Stone   if (module_sp) {
111c2ff9318SGreg Clayton     module_sp->SetPlatformFileSpec(*platform_file);
1122289fa48SGreg Clayton     result = true;
1132289fa48SGreg Clayton   }
1142289fa48SGreg Clayton 
1152289fa48SGreg Clayton   if (log)
116b5ad4ec7SGreg Clayton     log->Printf("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s)) => %i",
117324a1036SSaleem Abdulrasool                 static_cast<void *>(module_sp.get()),
118324a1036SSaleem Abdulrasool                 static_cast<const void *>(platform_file.get()),
119324a1036SSaleem Abdulrasool                 platform_file->GetPath().c_str(), result);
1202289fa48SGreg Clayton   return result;
1212289fa48SGreg Clayton }
1222289fa48SGreg Clayton 
123b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetRemoteInstallFileSpec() {
124fbb76349SGreg Clayton   SBFileSpec sb_file_spec;
125fbb76349SGreg Clayton   ModuleSP module_sp(GetSP());
126fbb76349SGreg Clayton   if (module_sp)
127fbb76349SGreg Clayton     sb_file_spec.SetFileSpec(module_sp->GetRemoteInstallFileSpec());
128fbb76349SGreg Clayton   return sb_file_spec;
129fbb76349SGreg Clayton }
130fbb76349SGreg Clayton 
131b9c1b51eSKate Stone bool SBModule::SetRemoteInstallFileSpec(lldb::SBFileSpec &file) {
132fbb76349SGreg Clayton   ModuleSP module_sp(GetSP());
133b9c1b51eSKate Stone   if (module_sp) {
134fbb76349SGreg Clayton     module_sp->SetRemoteInstallFileSpec(file.ref());
135fbb76349SGreg Clayton     return true;
136fbb76349SGreg Clayton   }
137fbb76349SGreg Clayton   return false;
138fbb76349SGreg Clayton }
1392289fa48SGreg Clayton 
140b9c1b51eSKate Stone const uint8_t *SBModule::GetUUIDBytes() const {
1415160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
142ceb6b139SCaroline Tice 
1434838131bSGreg Clayton   const uint8_t *uuid_bytes = NULL;
144c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
145c2ff9318SGreg Clayton   if (module_sp)
146470b286eSPavel Labath     uuid_bytes = module_sp->GetUUID().GetBytes().data();
147ceb6b139SCaroline Tice 
148b9c1b51eSKate Stone   if (log) {
149b9c1b51eSKate Stone     if (uuid_bytes) {
1504838131bSGreg Clayton       StreamString s;
151c2ff9318SGreg Clayton       module_sp->GetUUID().Dump(&s);
152324a1036SSaleem Abdulrasool       log->Printf("SBModule(%p)::GetUUIDBytes () => %s",
153324a1036SSaleem Abdulrasool                   static_cast<void *>(module_sp.get()), s.GetData());
154b9c1b51eSKate Stone     } else
155324a1036SSaleem Abdulrasool       log->Printf("SBModule(%p)::GetUUIDBytes () => NULL",
156324a1036SSaleem Abdulrasool                   static_cast<void *>(module_sp.get()));
1574838131bSGreg Clayton   }
1584838131bSGreg Clayton   return uuid_bytes;
15930fdc8d8SChris Lattner }
16030fdc8d8SChris Lattner 
161b9c1b51eSKate Stone const char *SBModule::GetUUIDString() const {
1625160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
163df2963edSJohnny Chen 
164f1be855aSGreg Clayton   const char *uuid_cstr = NULL;
165c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
166b9c1b51eSKate Stone   if (module_sp) {
16705097246SAdrian Prantl     // We are going to return a "const char *" value through the public API, so
16805097246SAdrian Prantl     // we need to constify it so it gets added permanently the string pool and
16905097246SAdrian Prantl     // then we don't need to worry about the lifetime of the string as it will
17005097246SAdrian Prantl     // never go away once it has been put into the ConstString string pool
171f1be855aSGreg Clayton     uuid_cstr = ConstString(module_sp->GetUUID().GetAsString()).GetCString();
172f1be855aSGreg Clayton   }
173f1be855aSGreg Clayton 
174b9c1b51eSKate Stone   if (uuid_cstr && uuid_cstr[0]) {
175f1be855aSGreg Clayton     if (log)
176b9c1b51eSKate Stone       log->Printf("SBModule(%p)::GetUUIDString () => %s",
177b9c1b51eSKate Stone                   static_cast<void *>(module_sp.get()), uuid_cstr);
178f1be855aSGreg Clayton     return uuid_cstr;
179c16b4af0SJason Molenda   }
180df2963edSJohnny Chen 
181df2963edSJohnny Chen   if (log)
182b9c1b51eSKate Stone     log->Printf("SBModule(%p)::GetUUIDString () => NULL",
183b9c1b51eSKate Stone                 static_cast<void *>(module_sp.get()));
184f1be855aSGreg Clayton   return NULL;
185df2963edSJohnny Chen }
186df2963edSJohnny Chen 
187b9c1b51eSKate Stone bool SBModule::operator==(const SBModule &rhs) const {
1886611103cSGreg Clayton   if (m_opaque_sp)
1896611103cSGreg Clayton     return m_opaque_sp.get() == rhs.m_opaque_sp.get();
19030fdc8d8SChris Lattner   return false;
19130fdc8d8SChris Lattner }
19230fdc8d8SChris Lattner 
193b9c1b51eSKate Stone bool SBModule::operator!=(const SBModule &rhs) const {
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 ModuleSP SBModule::GetSP() const { return m_opaque_sp; }
20030fdc8d8SChris Lattner 
201b9c1b51eSKate Stone void SBModule::SetSP(const ModuleSP &module_sp) { m_opaque_sp = module_sp; }
20230fdc8d8SChris Lattner 
203b9c1b51eSKate Stone SBAddress SBModule::ResolveFileAddress(lldb::addr_t vm_addr) {
204cac9c5f9SGreg Clayton   lldb::SBAddress sb_addr;
205c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
206b9c1b51eSKate Stone   if (module_sp) {
207cac9c5f9SGreg Clayton     Address addr;
208c2ff9318SGreg Clayton     if (module_sp->ResolveFileAddress(vm_addr, addr))
209cac9c5f9SGreg Clayton       sb_addr.ref() = addr;
210cac9c5f9SGreg Clayton   }
211cac9c5f9SGreg Clayton   return sb_addr;
21209960031SGreg Clayton }
21309960031SGreg Clayton 
21409960031SGreg Clayton SBSymbolContext
215b9c1b51eSKate Stone SBModule::ResolveSymbolContextForAddress(const SBAddress &addr,
216b9c1b51eSKate Stone                                          uint32_t resolve_scope) {
21709960031SGreg Clayton   SBSymbolContext sb_sc;
218c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
219991e4453SZachary Turner   SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
220c2ff9318SGreg Clayton   if (module_sp && addr.IsValid())
221991e4453SZachary Turner     module_sp->ResolveSymbolContextForAddress(addr.ref(), scope, *sb_sc);
22209960031SGreg Clayton   return sb_sc;
22309960031SGreg Clayton }
22409960031SGreg Clayton 
225b9c1b51eSKate Stone bool SBModule::GetDescription(SBStream &description) {
226da7bc7d0SGreg Clayton   Stream &strm = description.ref();
227da7bc7d0SGreg Clayton 
228c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
229b9c1b51eSKate Stone   if (module_sp) {
230c2ff9318SGreg Clayton     module_sp->GetDescription(&strm);
231b9c1b51eSKate Stone   } else
232da7bc7d0SGreg Clayton     strm.PutCString("No value");
233dde9cff3SCaroline Tice 
234dde9cff3SCaroline Tice   return true;
235dde9cff3SCaroline Tice }
236bbdabce2SGreg Clayton 
237b9c1b51eSKate Stone uint32_t SBModule::GetNumCompileUnits() {
238873a7a4bSJohnny Chen   ModuleSP module_sp(GetSP());
239b9c1b51eSKate Stone   if (module_sp) {
240873a7a4bSJohnny Chen     return module_sp->GetNumCompileUnits();
241873a7a4bSJohnny Chen   }
242873a7a4bSJohnny Chen   return 0;
243873a7a4bSJohnny Chen }
244873a7a4bSJohnny Chen 
245b9c1b51eSKate Stone SBCompileUnit SBModule::GetCompileUnitAtIndex(uint32_t index) {
246873a7a4bSJohnny Chen   SBCompileUnit sb_cu;
247873a7a4bSJohnny Chen   ModuleSP module_sp(GetSP());
248b9c1b51eSKate Stone   if (module_sp) {
249873a7a4bSJohnny Chen     CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(index);
250873a7a4bSJohnny Chen     sb_cu.reset(cu_sp.get());
251873a7a4bSJohnny Chen   }
252873a7a4bSJohnny Chen   return sb_cu;
253873a7a4bSJohnny Chen }
254873a7a4bSJohnny Chen 
255da0c081fSAlexander Polyakov SBSymbolContextList
256da0c081fSAlexander Polyakov SBModule::FindCompileUnits(const SBFileSpec &sb_file_spec) {
257da0c081fSAlexander Polyakov   SBSymbolContextList sb_sc_list;
258da0c081fSAlexander Polyakov   const ModuleSP module_sp(GetSP());
259da0c081fSAlexander Polyakov   if (sb_file_spec.IsValid() && module_sp) {
260da0c081fSAlexander Polyakov     const bool append = true;
261da0c081fSAlexander Polyakov     module_sp->FindCompileUnits(*sb_file_spec, append, *sb_sc_list);
262da0c081fSAlexander Polyakov   }
263da0c081fSAlexander Polyakov   return sb_sc_list;
264da0c081fSAlexander Polyakov }
265da0c081fSAlexander Polyakov 
266b9c1b51eSKate Stone static Symtab *GetUnifiedSymbolTable(const lldb::ModuleSP &module_sp) {
267b9c1b51eSKate Stone   if (module_sp) {
268a7499c98SMichael Sartain     SymbolVendor *symbols = module_sp->GetSymbolVendor();
269a7499c98SMichael Sartain     if (symbols)
270a7499c98SMichael Sartain       return symbols->GetSymtab();
271a7499c98SMichael Sartain   }
272a7499c98SMichael Sartain   return NULL;
273a7499c98SMichael Sartain }
274a7499c98SMichael Sartain 
275b9c1b51eSKate Stone size_t SBModule::GetNumSymbols() {
276c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
277b9c1b51eSKate Stone   if (module_sp) {
278a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
279bbdabce2SGreg Clayton     if (symtab)
280bbdabce2SGreg Clayton       return symtab->GetNumSymbols();
281bbdabce2SGreg Clayton   }
282bbdabce2SGreg Clayton   return 0;
283bbdabce2SGreg Clayton }
284bbdabce2SGreg Clayton 
285b9c1b51eSKate Stone SBSymbol SBModule::GetSymbolAtIndex(size_t idx) {
286bbdabce2SGreg Clayton   SBSymbol sb_symbol;
287c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
288a7499c98SMichael Sartain   Symtab *symtab = GetUnifiedSymbolTable(module_sp);
289bbdabce2SGreg Clayton   if (symtab)
290bbdabce2SGreg Clayton     sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx));
291bbdabce2SGreg Clayton   return sb_symbol;
292bbdabce2SGreg Clayton }
293fe356d35SGreg Clayton 
294b9c1b51eSKate Stone lldb::SBSymbol SBModule::FindSymbol(const char *name,
295b9c1b51eSKate Stone                                     lldb::SymbolType symbol_type) {
296e14e1925SGreg Clayton   SBSymbol sb_symbol;
297b9c1b51eSKate Stone   if (name && name[0]) {
298e14e1925SGreg Clayton     ModuleSP module_sp(GetSP());
299a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
300e14e1925SGreg Clayton     if (symtab)
301b9c1b51eSKate Stone       sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType(
302b9c1b51eSKate Stone           ConstString(name), symbol_type, Symtab::eDebugAny,
303b9c1b51eSKate Stone           Symtab::eVisibilityAny));
304e14e1925SGreg Clayton   }
305e14e1925SGreg Clayton   return sb_symbol;
306e14e1925SGreg Clayton }
307e14e1925SGreg Clayton 
308b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindSymbols(const char *name,
309b9c1b51eSKate Stone                                                 lldb::SymbolType symbol_type) {
310e14e1925SGreg Clayton   SBSymbolContextList sb_sc_list;
311b9c1b51eSKate Stone   if (name && name[0]) {
312e14e1925SGreg Clayton     ModuleSP module_sp(GetSP());
313a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
314b9c1b51eSKate Stone     if (symtab) {
315e14e1925SGreg Clayton       std::vector<uint32_t> matching_symbol_indexes;
316b9c1b51eSKate Stone       const size_t num_matches = symtab->FindAllSymbolsWithNameAndType(
317b9c1b51eSKate Stone           ConstString(name), symbol_type, matching_symbol_indexes);
318b9c1b51eSKate Stone       if (num_matches) {
319e14e1925SGreg Clayton         SymbolContext sc;
320e14e1925SGreg Clayton         sc.module_sp = module_sp;
321e14e1925SGreg Clayton         SymbolContextList &sc_list = *sb_sc_list;
322b9c1b51eSKate Stone         for (size_t i = 0; i < num_matches; ++i) {
323e14e1925SGreg Clayton           sc.symbol = symtab->SymbolAtIndex(matching_symbol_indexes[i]);
324e14e1925SGreg Clayton           if (sc.symbol)
325e14e1925SGreg Clayton             sc_list.Append(sc);
326e14e1925SGreg Clayton         }
327e14e1925SGreg Clayton       }
328e14e1925SGreg Clayton     }
329e14e1925SGreg Clayton   }
330e14e1925SGreg Clayton   return sb_sc_list;
331e14e1925SGreg Clayton }
332e14e1925SGreg Clayton 
333b9c1b51eSKate Stone size_t SBModule::GetNumSections() {
334c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
335b9c1b51eSKate Stone   if (module_sp) {
336a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
337a7499c98SMichael Sartain     module_sp->GetSymbolVendor();
3383046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
339cac9c5f9SGreg Clayton     if (section_list)
340cac9c5f9SGreg Clayton       return section_list->GetSize();
341cac9c5f9SGreg Clayton   }
342cac9c5f9SGreg Clayton   return 0;
343cac9c5f9SGreg Clayton }
344cac9c5f9SGreg Clayton 
345b9c1b51eSKate Stone SBSection SBModule::GetSectionAtIndex(size_t idx) {
346cac9c5f9SGreg Clayton   SBSection sb_section;
347c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
348b9c1b51eSKate Stone   if (module_sp) {
349a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
350a7499c98SMichael Sartain     module_sp->GetSymbolVendor();
3513046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
352cac9c5f9SGreg Clayton 
353cac9c5f9SGreg Clayton     if (section_list)
354e72dfb32SGreg Clayton       sb_section.SetSP(section_list->GetSectionAtIndex(idx));
355cac9c5f9SGreg Clayton   }
356cac9c5f9SGreg Clayton   return sb_section;
357cac9c5f9SGreg Clayton }
358cac9c5f9SGreg Clayton 
359b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindFunctions(const char *name,
360b9c1b51eSKate Stone                                                   uint32_t name_type_mask) {
3615569e64eSGreg Clayton   lldb::SBSymbolContextList sb_sc_list;
362c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
363b9c1b51eSKate Stone   if (name && module_sp) {
3645569e64eSGreg Clayton     const bool append = true;
365fe356d35SGreg Clayton     const bool symbols_ok = true;
3669df05fbbSSean Callanan     const bool inlines_ok = true;
367117b1fa1SZachary Turner     FunctionNameType type = static_cast<FunctionNameType>(name_type_mask);
368117b1fa1SZachary Turner     module_sp->FindFunctions(ConstString(name), NULL, type, symbols_ok,
369117b1fa1SZachary Turner                              inlines_ok, append, *sb_sc_list);
370fe356d35SGreg Clayton   }
3715569e64eSGreg Clayton   return sb_sc_list;
372fe356d35SGreg Clayton }
373fe356d35SGreg Clayton 
374b9c1b51eSKate Stone SBValueList SBModule::FindGlobalVariables(SBTarget &target, const char *name,
375b9c1b51eSKate Stone                                           uint32_t max_matches) {
376dea8cb4fSGreg Clayton   SBValueList sb_value_list;
377c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
378b9c1b51eSKate Stone   if (name && module_sp) {
379dea8cb4fSGreg Clayton     VariableList variable_list;
380b9c1b51eSKate Stone     const uint32_t match_count = module_sp->FindGlobalVariables(
38134cda14bSPavel Labath         ConstString(name), NULL, max_matches, variable_list);
382dea8cb4fSGreg Clayton 
383b9c1b51eSKate Stone     if (match_count > 0) {
384b9c1b51eSKate Stone       for (uint32_t i = 0; i < match_count; ++i) {
385dea8cb4fSGreg Clayton         lldb::ValueObjectSP valobj_sp;
386b9556accSGreg Clayton         TargetSP target_sp(target.GetSP());
387b9c1b51eSKate Stone         valobj_sp = ValueObjectVariable::Create(
388b9c1b51eSKate Stone             target_sp.get(), variable_list.GetVariableAtIndex(i));
389dea8cb4fSGreg Clayton         if (valobj_sp)
39085425d77SEnrico Granata           sb_value_list.Append(SBValue(valobj_sp));
391dea8cb4fSGreg Clayton       }
392dea8cb4fSGreg Clayton     }
393dea8cb4fSGreg Clayton   }
394dea8cb4fSGreg Clayton 
395dea8cb4fSGreg Clayton   return sb_value_list;
396dea8cb4fSGreg Clayton }
3976f3533fbSEnrico Granata 
398b9c1b51eSKate Stone lldb::SBValue SBModule::FindFirstGlobalVariable(lldb::SBTarget &target,
399b9c1b51eSKate Stone                                                 const char *name) {
400bcd80b47SEnrico Granata   SBValueList sb_value_list(FindGlobalVariables(target, name, 1));
401bcd80b47SEnrico Granata   if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0)
402bcd80b47SEnrico Granata     return sb_value_list.GetValueAtIndex(0);
403bcd80b47SEnrico Granata   return SBValue();
404bcd80b47SEnrico Granata }
405bcd80b47SEnrico Granata 
406b9c1b51eSKate Stone lldb::SBType SBModule::FindFirstType(const char *name_cstr) {
407fe42ac4dSGreg Clayton   SBType sb_type;
408c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
409b9c1b51eSKate Stone   if (name_cstr && module_sp) {
4106f3533fbSEnrico Granata     SymbolContext sc;
41184db9105SGreg Clayton     const bool exact_match = false;
4126f3533fbSEnrico Granata     ConstString name(name_cstr);
4136f3533fbSEnrico Granata 
414b43165b7SGreg Clayton     sb_type = SBType(module_sp->FindFirstType(sc, name, exact_match));
4156f3533fbSEnrico Granata 
416b9c1b51eSKate Stone     if (!sb_type.IsValid()) {
417b9c1b51eSKate Stone       TypeSystem *type_system =
418b9c1b51eSKate Stone           module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
41956939cb3SGreg Clayton       if (type_system)
42056939cb3SGreg Clayton         sb_type = SBType(type_system->GetBuiltinTypeByName(name));
42156939cb3SGreg Clayton     }
4226f3533fbSEnrico Granata   }
423fe42ac4dSGreg Clayton   return sb_type;
4246f3533fbSEnrico Granata }
4256f3533fbSEnrico Granata 
426b9c1b51eSKate Stone lldb::SBType SBModule::GetBasicType(lldb::BasicType type) {
427b43165b7SGreg Clayton   ModuleSP module_sp(GetSP());
428b9c1b51eSKate Stone   if (module_sp) {
429b9c1b51eSKate Stone     TypeSystem *type_system =
430b9c1b51eSKate Stone         module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
43156939cb3SGreg Clayton     if (type_system)
43256939cb3SGreg Clayton       return SBType(type_system->GetBasicTypeFromAST(type));
43356939cb3SGreg Clayton   }
434b43165b7SGreg Clayton   return SBType();
435b43165b7SGreg Clayton }
436b43165b7SGreg Clayton 
437b9c1b51eSKate Stone lldb::SBTypeList SBModule::FindTypes(const char *type) {
4386f3533fbSEnrico Granata   SBTypeList retval;
4396f3533fbSEnrico Granata 
440c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
441b9c1b51eSKate Stone   if (type && module_sp) {
4426f3533fbSEnrico Granata     TypeList type_list;
44384db9105SGreg Clayton     const bool exact_match = false;
4446f3533fbSEnrico Granata     ConstString name(type);
445ae088e52SGreg Clayton     llvm::DenseSet<SymbolFile *> searched_symbol_files;
446b9c1b51eSKate Stone     const uint32_t num_matches = module_sp->FindTypes(
447576495e6SZachary Turner         name, exact_match, UINT32_MAX, searched_symbol_files, type_list);
4486f3533fbSEnrico Granata 
449b9c1b51eSKate Stone     if (num_matches > 0) {
450b9c1b51eSKate Stone       for (size_t idx = 0; idx < num_matches; idx++) {
451fe42ac4dSGreg Clayton         TypeSP type_sp(type_list.GetTypeAtIndex(idx));
452fe42ac4dSGreg Clayton         if (type_sp)
453fe42ac4dSGreg Clayton           retval.Append(SBType(type_sp));
454fe42ac4dSGreg Clayton       }
455b9c1b51eSKate Stone     } else {
456b9c1b51eSKate Stone       TypeSystem *type_system =
457b9c1b51eSKate Stone           module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
458b9c1b51eSKate Stone       if (type_system) {
45956939cb3SGreg Clayton         CompilerType compiler_type = type_system->GetBuiltinTypeByName(name);
46056939cb3SGreg Clayton         if (compiler_type)
46156939cb3SGreg Clayton           retval.Append(SBType(compiler_type));
46256939cb3SGreg Clayton       }
463b43165b7SGreg Clayton     }
464b43165b7SGreg Clayton   }
4656f3533fbSEnrico Granata 
4666f3533fbSEnrico Granata   return retval;
4676f3533fbSEnrico Granata }
468cac9c5f9SGreg Clayton 
469b9c1b51eSKate Stone lldb::SBType SBModule::GetTypeByID(lldb::user_id_t uid) {
4701f4db7daSGreg Clayton   ModuleSP module_sp(GetSP());
471b9c1b51eSKate Stone   if (module_sp) {
4721f4db7daSGreg Clayton     SymbolVendor *vendor = module_sp->GetSymbolVendor();
473b9c1b51eSKate Stone     if (vendor) {
4741f4db7daSGreg Clayton       Type *type_ptr = vendor->ResolveTypeUID(uid);
4751f4db7daSGreg Clayton       if (type_ptr)
4761f4db7daSGreg Clayton         return SBType(type_ptr->shared_from_this());
4771f4db7daSGreg Clayton     }
4781f4db7daSGreg Clayton   }
4791f4db7daSGreg Clayton   return SBType();
4801f4db7daSGreg Clayton }
4811f4db7daSGreg Clayton 
482b9c1b51eSKate Stone lldb::SBTypeList SBModule::GetTypes(uint32_t type_mask) {
483f02500c7SGreg Clayton   SBTypeList sb_type_list;
484f02500c7SGreg Clayton 
485f02500c7SGreg Clayton   ModuleSP module_sp(GetSP());
486117b1fa1SZachary Turner   if (!module_sp)
487117b1fa1SZachary Turner     return sb_type_list;
488f02500c7SGreg Clayton   SymbolVendor *vendor = module_sp->GetSymbolVendor();
489117b1fa1SZachary Turner   if (!vendor)
490117b1fa1SZachary Turner     return sb_type_list;
491117b1fa1SZachary Turner 
492117b1fa1SZachary Turner   TypeClass type_class = static_cast<TypeClass>(type_mask);
493f02500c7SGreg Clayton   TypeList type_list;
494117b1fa1SZachary Turner   vendor->GetTypes(NULL, type_class, type_list);
495f02500c7SGreg Clayton   sb_type_list.m_opaque_ap->Append(type_list);
496f02500c7SGreg Clayton   return sb_type_list;
497f02500c7SGreg Clayton }
498cac9c5f9SGreg Clayton 
499b9c1b51eSKate Stone SBSection SBModule::FindSection(const char *sect_name) {
500cac9c5f9SGreg Clayton   SBSection sb_section;
501cac9c5f9SGreg Clayton 
502c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
503b9c1b51eSKate Stone   if (sect_name && module_sp) {
504a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
505a7499c98SMichael Sartain     module_sp->GetSymbolVendor();
5063046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
507b9c1b51eSKate Stone     if (section_list) {
508cac9c5f9SGreg Clayton       ConstString const_sect_name(sect_name);
509cac9c5f9SGreg Clayton       SectionSP section_sp(section_list->FindSectionByName(const_sect_name));
510b9c1b51eSKate Stone       if (section_sp) {
511e72dfb32SGreg Clayton         sb_section.SetSP(section_sp);
512cac9c5f9SGreg Clayton       }
513cac9c5f9SGreg Clayton     }
514cac9c5f9SGreg Clayton   }
515cac9c5f9SGreg Clayton   return sb_section;
516cac9c5f9SGreg Clayton }
517cac9c5f9SGreg Clayton 
518b9c1b51eSKate Stone lldb::ByteOrder SBModule::GetByteOrder() {
519c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
520c2ff9318SGreg Clayton   if (module_sp)
521c2ff9318SGreg Clayton     return module_sp->GetArchitecture().GetByteOrder();
52213d1950aSGreg Clayton   return eByteOrderInvalid;
52313d1950aSGreg Clayton }
52413d1950aSGreg Clayton 
525b9c1b51eSKate Stone const char *SBModule::GetTriple() {
526c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
527b9c1b51eSKate Stone   if (module_sp) {
528c2ff9318SGreg Clayton     std::string triple(module_sp->GetArchitecture().GetTriple().str());
52905097246SAdrian Prantl     // Unique the string so we don't run into ownership issues since the const
53005097246SAdrian Prantl     // strings put the string into the string pool once and the strings never
53105097246SAdrian Prantl     // comes out
53213d1950aSGreg Clayton     ConstString const_triple(triple.c_str());
53313d1950aSGreg Clayton     return const_triple.GetCString();
53413d1950aSGreg Clayton   }
53513d1950aSGreg Clayton   return NULL;
53613d1950aSGreg Clayton }
53713d1950aSGreg Clayton 
538b9c1b51eSKate Stone uint32_t SBModule::GetAddressByteSize() {
539c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
540c2ff9318SGreg Clayton   if (module_sp)
541c2ff9318SGreg Clayton     return module_sp->GetArchitecture().GetAddressByteSize();
54213d1950aSGreg Clayton   return sizeof(void *);
54313d1950aSGreg Clayton }
54413d1950aSGreg Clayton 
545b9c1b51eSKate Stone uint32_t SBModule::GetVersion(uint32_t *versions, uint32_t num_versions) {
5462272c481SPavel Labath   llvm::VersionTuple version;
5472272c481SPavel Labath   if (ModuleSP module_sp = GetSP())
5482272c481SPavel Labath     version = module_sp->GetVersion();
5492272c481SPavel Labath   uint32_t result = 0;
5502272c481SPavel Labath   if (!version.empty())
5512272c481SPavel Labath     ++result;
5522272c481SPavel Labath   if (version.getMinor())
5532272c481SPavel Labath     ++result;
5542272c481SPavel Labath   if(version.getSubminor())
5552272c481SPavel Labath     ++result;
5562272c481SPavel Labath 
5572272c481SPavel Labath   if (!versions)
5582272c481SPavel Labath     return result;
5592272c481SPavel Labath 
5602272c481SPavel Labath   if (num_versions > 0)
5612272c481SPavel Labath     versions[0] = version.empty() ? UINT32_MAX : version.getMajor();
5622272c481SPavel Labath   if (num_versions > 1)
5632272c481SPavel Labath     versions[1] = version.getMinor().getValueOr(UINT32_MAX);
5642272c481SPavel Labath   if (num_versions > 2)
5652272c481SPavel Labath     versions[2] = version.getSubminor().getValueOr(UINT32_MAX);
5662272c481SPavel Labath   for (uint32_t i = 3; i < num_versions; ++i)
567c2ff9318SGreg Clayton     versions[i] = UINT32_MAX;
5682272c481SPavel Labath   return result;
5693467d80bSEnrico Granata }
570c2ff9318SGreg Clayton 
571b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetSymbolFileSpec() const {
572eb2c19a5SIlia K   lldb::SBFileSpec sb_file_spec;
573eb2c19a5SIlia K   ModuleSP module_sp(GetSP());
574b9c1b51eSKate Stone   if (module_sp) {
575eb2c19a5SIlia K     SymbolVendor *symbol_vendor_ptr = module_sp->GetSymbolVendor();
576eb2c19a5SIlia K     if (symbol_vendor_ptr)
577eb2c19a5SIlia K       sb_file_spec.SetFileSpec(symbol_vendor_ptr->GetMainFileSpec());
578eb2c19a5SIlia K   }
579eb2c19a5SIlia K   return sb_file_spec;
580eb2c19a5SIlia K }
581eb2c19a5SIlia K 
582b9c1b51eSKate Stone lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const {
583eb2c19a5SIlia K   lldb::SBAddress sb_addr;
584eb2c19a5SIlia K   ModuleSP module_sp(GetSP());
585b9c1b51eSKate Stone   if (module_sp) {
586eb2c19a5SIlia K     ObjectFile *objfile_ptr = module_sp->GetObjectFile();
587eb2c19a5SIlia K     if (objfile_ptr)
588d1e3fe21SPavel Labath       sb_addr.ref() = objfile_ptr->GetBaseAddress();
589eb2c19a5SIlia K   }
590eb2c19a5SIlia K   return sb_addr;
591eb2c19a5SIlia K }
5929b087d2cSAleksandr Urakov 
5939b087d2cSAleksandr Urakov lldb::SBAddress SBModule::GetObjectFileEntryPointAddress() const {
5949b087d2cSAleksandr Urakov   lldb::SBAddress sb_addr;
5959b087d2cSAleksandr Urakov   ModuleSP module_sp(GetSP());
5969b087d2cSAleksandr Urakov   if (module_sp) {
5979b087d2cSAleksandr Urakov     ObjectFile *objfile_ptr = module_sp->GetObjectFile();
5989b087d2cSAleksandr Urakov     if (objfile_ptr)
5999b087d2cSAleksandr Urakov       sb_addr.ref() = objfile_ptr->GetEntryPointAddress();
6009b087d2cSAleksandr Urakov   }
6019b087d2cSAleksandr Urakov   return sb_addr;
6029b087d2cSAleksandr Urakov }
603