130fdc8d8SChris Lattner //===-- SBModule.cpp --------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/API/SBModule.h"
1109960031SGreg Clayton #include "lldb/API/SBAddress.h"
1209960031SGreg Clayton #include "lldb/API/SBFileSpec.h"
13c9660546SGreg Clayton #include "lldb/API/SBProcess.h"
14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
15fe356d35SGreg Clayton #include "lldb/API/SBSymbolContextList.h"
1630fdc8d8SChris Lattner #include "lldb/Core/Module.h"
17ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
1838adbbb8SGreg Clayton #include "lldb/Core/StreamString.h"
19dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectList.h"
20dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectVariable.h"
216f3533fbSEnrico Granata #include "lldb/Symbol/SymbolVendor.h"
22dea8cb4fSGreg Clayton #include "lldb/Symbol/VariableList.h"
23dea8cb4fSGreg Clayton #include "lldb/Target/Target.h"
2430fdc8d8SChris Lattner 
2530fdc8d8SChris Lattner using namespace lldb;
26ceb6b139SCaroline Tice using namespace lldb_private;
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner 
2930fdc8d8SChris Lattner SBModule::SBModule () :
306611103cSGreg Clayton     m_opaque_sp ()
3130fdc8d8SChris Lattner {
3230fdc8d8SChris Lattner }
3330fdc8d8SChris Lattner 
3430fdc8d8SChris Lattner SBModule::SBModule (const lldb::ModuleSP& module_sp) :
356611103cSGreg Clayton     m_opaque_sp (module_sp)
3630fdc8d8SChris Lattner {
3730fdc8d8SChris Lattner }
3830fdc8d8SChris Lattner 
39efabb123SGreg Clayton SBModule::SBModule(const SBModule &rhs) :
40efabb123SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
41efabb123SGreg Clayton {
42efabb123SGreg Clayton }
43efabb123SGreg Clayton 
44c9660546SGreg Clayton SBModule::SBModule (lldb::SBProcess &process, lldb::addr_t header_addr) :
45c9660546SGreg Clayton     m_opaque_sp ()
46c9660546SGreg Clayton {
47c9660546SGreg Clayton     ProcessSP process_sp (process.GetSP());
48c9660546SGreg Clayton     if (process_sp)
49c9660546SGreg Clayton         m_opaque_sp = process_sp->ReadModuleFromMemory (FileSpec(), header_addr);
50c9660546SGreg Clayton }
51c9660546SGreg Clayton 
52efabb123SGreg Clayton const SBModule &
53efabb123SGreg Clayton SBModule::operator = (const SBModule &rhs)
54efabb123SGreg Clayton {
55efabb123SGreg Clayton     if (this != &rhs)
56efabb123SGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
57efabb123SGreg Clayton     return *this;
58efabb123SGreg Clayton }
59efabb123SGreg Clayton 
6030fdc8d8SChris Lattner SBModule::~SBModule ()
6130fdc8d8SChris Lattner {
6230fdc8d8SChris Lattner }
6330fdc8d8SChris Lattner 
6430fdc8d8SChris Lattner bool
6530fdc8d8SChris Lattner SBModule::IsValid () const
6630fdc8d8SChris Lattner {
676611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
6830fdc8d8SChris Lattner }
6930fdc8d8SChris Lattner 
705d3bca4eSJim Ingham void
715d3bca4eSJim Ingham SBModule::Clear()
725d3bca4eSJim Ingham {
735d3bca4eSJim Ingham     m_opaque_sp.reset();
745d3bca4eSJim Ingham }
755d3bca4eSJim Ingham 
7630fdc8d8SChris Lattner SBFileSpec
7730fdc8d8SChris Lattner SBModule::GetFileSpec () const
7830fdc8d8SChris Lattner {
792d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
80ceb6b139SCaroline Tice 
8130fdc8d8SChris Lattner     SBFileSpec file_spec;
826611103cSGreg Clayton     if (m_opaque_sp)
836611103cSGreg Clayton         file_spec.SetFileSpec(m_opaque_sp->GetFileSpec());
84ceb6b139SCaroline Tice 
85ceb6b139SCaroline Tice     if (log)
86ceb6b139SCaroline Tice     {
87cfd1acedSGreg Clayton         log->Printf ("SBModule(%p)::GetFileSpec () => SBFileSpec(%p)",
88cfd1acedSGreg Clayton         m_opaque_sp.get(), file_spec.get());
89ceb6b139SCaroline Tice     }
90ceb6b139SCaroline Tice 
9130fdc8d8SChris Lattner     return file_spec;
9230fdc8d8SChris Lattner }
9330fdc8d8SChris Lattner 
942289fa48SGreg Clayton lldb::SBFileSpec
952289fa48SGreg Clayton SBModule::GetPlatformFileSpec () const
962289fa48SGreg Clayton {
972289fa48SGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
982289fa48SGreg Clayton 
992289fa48SGreg Clayton     SBFileSpec file_spec;
1002289fa48SGreg Clayton     if (m_opaque_sp)
1012289fa48SGreg Clayton         file_spec.SetFileSpec(m_opaque_sp->GetPlatformFileSpec());
1022289fa48SGreg Clayton 
1032289fa48SGreg Clayton     if (log)
1042289fa48SGreg Clayton     {
1052289fa48SGreg Clayton         log->Printf ("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)",
1062289fa48SGreg Clayton                      m_opaque_sp.get(), file_spec.get());
1072289fa48SGreg Clayton     }
1082289fa48SGreg Clayton 
1092289fa48SGreg Clayton     return file_spec;
1102289fa48SGreg Clayton 
1112289fa48SGreg Clayton }
1122289fa48SGreg Clayton 
1132289fa48SGreg Clayton bool
1142289fa48SGreg Clayton SBModule::SetPlatformFileSpec (const lldb::SBFileSpec &platform_file)
1152289fa48SGreg Clayton {
1162289fa48SGreg Clayton     bool result = false;
1172289fa48SGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1182289fa48SGreg Clayton 
1192289fa48SGreg Clayton     if (m_opaque_sp)
1202289fa48SGreg Clayton     {
1212289fa48SGreg Clayton         m_opaque_sp->SetPlatformFileSpec(*platform_file);
1222289fa48SGreg Clayton         result = true;
1232289fa48SGreg Clayton     }
1242289fa48SGreg Clayton 
1252289fa48SGreg Clayton     if (log)
1262289fa48SGreg Clayton     {
1272289fa48SGreg Clayton         log->Printf ("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s%s%s)) => %i",
1282289fa48SGreg Clayton                      m_opaque_sp.get(),
1292289fa48SGreg Clayton                      platform_file.get(),
1302289fa48SGreg Clayton                      platform_file->GetDirectory().GetCString(),
1312289fa48SGreg Clayton                      platform_file->GetDirectory() ? "/" : "",
1322289fa48SGreg Clayton                      platform_file->GetFilename().GetCString(),
1332289fa48SGreg Clayton                      result);
1342289fa48SGreg Clayton     }
1352289fa48SGreg Clayton     return result;
1362289fa48SGreg Clayton }
1372289fa48SGreg Clayton 
1382289fa48SGreg Clayton 
1392289fa48SGreg Clayton 
14030fdc8d8SChris Lattner const uint8_t *
14130fdc8d8SChris Lattner SBModule::GetUUIDBytes () const
14230fdc8d8SChris Lattner {
1432d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
144ceb6b139SCaroline Tice 
1454838131bSGreg Clayton     const uint8_t *uuid_bytes = NULL;
1466611103cSGreg Clayton     if (m_opaque_sp)
1474838131bSGreg Clayton         uuid_bytes = (const uint8_t *)m_opaque_sp->GetUUID().GetBytes();
148ceb6b139SCaroline Tice 
149ceb6b139SCaroline Tice     if (log)
1504838131bSGreg Clayton     {
1514838131bSGreg Clayton         if (uuid_bytes)
1524838131bSGreg Clayton         {
1534838131bSGreg Clayton             StreamString s;
1544838131bSGreg Clayton             m_opaque_sp->GetUUID().Dump (&s);
1554838131bSGreg Clayton             log->Printf ("SBModule(%p)::GetUUIDBytes () => %s", m_opaque_sp.get(), s.GetData());
1564838131bSGreg Clayton         }
1574838131bSGreg Clayton         else
1584838131bSGreg Clayton             log->Printf ("SBModule(%p)::GetUUIDBytes () => NULL", m_opaque_sp.get());
1594838131bSGreg Clayton     }
1604838131bSGreg Clayton     return uuid_bytes;
16130fdc8d8SChris Lattner }
16230fdc8d8SChris Lattner 
16330fdc8d8SChris Lattner 
164df2963edSJohnny Chen const char *
165df2963edSJohnny Chen SBModule::GetUUIDString () const
166df2963edSJohnny Chen {
167df2963edSJohnny Chen     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
168df2963edSJohnny Chen 
169df2963edSJohnny Chen     static char uuid_string[80];
170df2963edSJohnny Chen     const char * uuid_c_string = NULL;
171df2963edSJohnny Chen     if (m_opaque_sp)
172df2963edSJohnny Chen         uuid_c_string = (const char *)m_opaque_sp->GetUUID().GetAsCString(uuid_string, sizeof(uuid_string));
173df2963edSJohnny Chen 
174df2963edSJohnny Chen     if (log)
175df2963edSJohnny Chen     {
176df2963edSJohnny Chen         if (uuid_c_string)
177df2963edSJohnny Chen         {
178df2963edSJohnny Chen             StreamString s;
179df2963edSJohnny Chen             m_opaque_sp->GetUUID().Dump (&s);
180df2963edSJohnny Chen             log->Printf ("SBModule(%p)::GetUUIDString () => %s", m_opaque_sp.get(), s.GetData());
181df2963edSJohnny Chen         }
182df2963edSJohnny Chen         else
183df2963edSJohnny Chen             log->Printf ("SBModule(%p)::GetUUIDString () => NULL", m_opaque_sp.get());
184df2963edSJohnny Chen     }
185df2963edSJohnny Chen     return uuid_c_string;
186df2963edSJohnny Chen }
187df2963edSJohnny Chen 
188df2963edSJohnny Chen 
18930fdc8d8SChris Lattner bool
19030fdc8d8SChris Lattner SBModule::operator == (const SBModule &rhs) const
19130fdc8d8SChris Lattner {
1926611103cSGreg Clayton     if (m_opaque_sp)
1936611103cSGreg Clayton         return m_opaque_sp.get() == rhs.m_opaque_sp.get();
19430fdc8d8SChris Lattner     return false;
19530fdc8d8SChris Lattner }
19630fdc8d8SChris Lattner 
19730fdc8d8SChris Lattner bool
19830fdc8d8SChris Lattner SBModule::operator != (const SBModule &rhs) const
19930fdc8d8SChris Lattner {
2006611103cSGreg Clayton     if (m_opaque_sp)
2016611103cSGreg Clayton         return m_opaque_sp.get() != rhs.m_opaque_sp.get();
20230fdc8d8SChris Lattner     return false;
20330fdc8d8SChris Lattner }
20430fdc8d8SChris Lattner 
205acdbe816SGreg Clayton ModuleSP
206acdbe816SGreg Clayton SBModule::GetSP () const
207cac9c5f9SGreg Clayton {
208cac9c5f9SGreg Clayton     return m_opaque_sp;
209cac9c5f9SGreg Clayton }
21030fdc8d8SChris Lattner 
21130fdc8d8SChris Lattner void
212acdbe816SGreg Clayton SBModule::SetSP (const ModuleSP &module_sp)
21330fdc8d8SChris Lattner {
2146611103cSGreg Clayton     m_opaque_sp = module_sp;
21530fdc8d8SChris Lattner }
21630fdc8d8SChris Lattner 
217cac9c5f9SGreg Clayton SBAddress
218cac9c5f9SGreg Clayton SBModule::ResolveFileAddress (lldb::addr_t vm_addr)
21909960031SGreg Clayton {
220cac9c5f9SGreg Clayton     lldb::SBAddress sb_addr;
221cac9c5f9SGreg Clayton     if (m_opaque_sp)
222cac9c5f9SGreg Clayton     {
223cac9c5f9SGreg Clayton         Address addr;
224cac9c5f9SGreg Clayton         if (m_opaque_sp->ResolveFileAddress (vm_addr, addr))
225cac9c5f9SGreg Clayton             sb_addr.ref() = addr;
226cac9c5f9SGreg Clayton     }
227cac9c5f9SGreg Clayton     return sb_addr;
22809960031SGreg Clayton }
22909960031SGreg Clayton 
23009960031SGreg Clayton SBSymbolContext
23109960031SGreg Clayton SBModule::ResolveSymbolContextForAddress (const SBAddress& addr, uint32_t resolve_scope)
23209960031SGreg Clayton {
23309960031SGreg Clayton     SBSymbolContext sb_sc;
23409960031SGreg Clayton     if (m_opaque_sp && addr.IsValid())
23500e6fbfeSGreg Clayton         m_opaque_sp->ResolveSymbolContextForAddress (addr.ref(), resolve_scope, *sb_sc);
23609960031SGreg Clayton     return sb_sc;
23709960031SGreg Clayton }
23809960031SGreg Clayton 
239dde9cff3SCaroline Tice bool
240dde9cff3SCaroline Tice SBModule::GetDescription (SBStream &description)
241dde9cff3SCaroline Tice {
242da7bc7d0SGreg Clayton     Stream &strm = description.ref();
243da7bc7d0SGreg Clayton 
244dde9cff3SCaroline Tice     if (m_opaque_sp)
245dde9cff3SCaroline Tice     {
246da7bc7d0SGreg Clayton         m_opaque_sp->GetDescription (&strm);
247dde9cff3SCaroline Tice     }
248dde9cff3SCaroline Tice     else
249da7bc7d0SGreg Clayton         strm.PutCString ("No value");
250dde9cff3SCaroline Tice 
251dde9cff3SCaroline Tice     return true;
252dde9cff3SCaroline Tice }
253bbdabce2SGreg Clayton 
254bbdabce2SGreg Clayton size_t
255bbdabce2SGreg Clayton SBModule::GetNumSymbols ()
256bbdabce2SGreg Clayton {
257bbdabce2SGreg Clayton     if (m_opaque_sp)
258bbdabce2SGreg Clayton     {
259bbdabce2SGreg Clayton         ObjectFile *obj_file = m_opaque_sp->GetObjectFile();
260bbdabce2SGreg Clayton         if (obj_file)
261bbdabce2SGreg Clayton         {
262bbdabce2SGreg Clayton             Symtab *symtab = obj_file->GetSymtab();
263bbdabce2SGreg Clayton             if (symtab)
264bbdabce2SGreg Clayton                 return symtab->GetNumSymbols();
265bbdabce2SGreg Clayton         }
266bbdabce2SGreg Clayton     }
267bbdabce2SGreg Clayton     return 0;
268bbdabce2SGreg Clayton }
269bbdabce2SGreg Clayton 
270bbdabce2SGreg Clayton SBSymbol
271bbdabce2SGreg Clayton SBModule::GetSymbolAtIndex (size_t idx)
272bbdabce2SGreg Clayton {
273bbdabce2SGreg Clayton     SBSymbol sb_symbol;
274bbdabce2SGreg Clayton     if (m_opaque_sp)
275bbdabce2SGreg Clayton     {
276bbdabce2SGreg Clayton         ObjectFile *obj_file = m_opaque_sp->GetObjectFile();
277bbdabce2SGreg Clayton         if (obj_file)
278bbdabce2SGreg Clayton         {
279bbdabce2SGreg Clayton             Symtab *symtab = obj_file->GetSymtab();
280bbdabce2SGreg Clayton             if (symtab)
281bbdabce2SGreg Clayton                 sb_symbol.SetSymbol(symtab->SymbolAtIndex (idx));
282bbdabce2SGreg Clayton         }
283bbdabce2SGreg Clayton     }
284bbdabce2SGreg Clayton     return sb_symbol;
285bbdabce2SGreg Clayton }
286fe356d35SGreg Clayton 
287cac9c5f9SGreg Clayton size_t
288cac9c5f9SGreg Clayton SBModule::GetNumSections ()
289cac9c5f9SGreg Clayton {
290cac9c5f9SGreg Clayton     if (m_opaque_sp)
291cac9c5f9SGreg Clayton     {
292cac9c5f9SGreg Clayton         ObjectFile *obj_file = m_opaque_sp->GetObjectFile();
293cac9c5f9SGreg Clayton         if (obj_file)
294cac9c5f9SGreg Clayton         {
295cac9c5f9SGreg Clayton             SectionList *section_list = obj_file->GetSectionList ();
296cac9c5f9SGreg Clayton             if (section_list)
297cac9c5f9SGreg Clayton                 return section_list->GetSize();
298cac9c5f9SGreg Clayton         }
299cac9c5f9SGreg Clayton     }
300cac9c5f9SGreg Clayton     return 0;
301cac9c5f9SGreg Clayton }
302cac9c5f9SGreg Clayton 
303cac9c5f9SGreg Clayton SBSection
304cac9c5f9SGreg Clayton SBModule::GetSectionAtIndex (size_t idx)
305cac9c5f9SGreg Clayton {
306cac9c5f9SGreg Clayton     SBSection sb_section;
307cac9c5f9SGreg Clayton     if (m_opaque_sp)
308cac9c5f9SGreg Clayton     {
309cac9c5f9SGreg Clayton         ObjectFile *obj_file = m_opaque_sp->GetObjectFile();
310cac9c5f9SGreg Clayton         if (obj_file)
311cac9c5f9SGreg Clayton         {
312cac9c5f9SGreg Clayton             SectionList *section_list = obj_file->GetSectionList ();
313cac9c5f9SGreg Clayton 
314cac9c5f9SGreg Clayton             if (section_list)
315cac9c5f9SGreg Clayton                 sb_section.SetSection(section_list->GetSectionAtIndex (idx).get());
316cac9c5f9SGreg Clayton         }
317cac9c5f9SGreg Clayton     }
318cac9c5f9SGreg Clayton     return sb_section;
319cac9c5f9SGreg Clayton }
320cac9c5f9SGreg Clayton 
3215569e64eSGreg Clayton lldb::SBSymbolContextList
322fe356d35SGreg Clayton SBModule::FindFunctions (const char *name,
3235569e64eSGreg Clayton                          uint32_t name_type_mask)
324fe356d35SGreg Clayton {
3255569e64eSGreg Clayton     lldb::SBSymbolContextList sb_sc_list;
3264efffd9aSJohnny Chen     if (name && m_opaque_sp)
327fe356d35SGreg Clayton     {
3285569e64eSGreg Clayton         const bool append = true;
329fe356d35SGreg Clayton         const bool symbols_ok = true;
330*9df05fbbSSean Callanan         const bool inlines_ok = true;
3315569e64eSGreg Clayton         m_opaque_sp->FindFunctions (ConstString(name),
332b6d70ebcSSean Callanan                                     NULL,
333fe356d35SGreg Clayton                                     name_type_mask,
334fe356d35SGreg Clayton                                     symbols_ok,
335*9df05fbbSSean Callanan                                     inlines_ok,
336fe356d35SGreg Clayton                                     append,
3375569e64eSGreg Clayton                                     *sb_sc_list);
338fe356d35SGreg Clayton     }
3395569e64eSGreg Clayton     return sb_sc_list;
340fe356d35SGreg Clayton }
341fe356d35SGreg Clayton 
342dea8cb4fSGreg Clayton 
343dea8cb4fSGreg Clayton SBValueList
344dea8cb4fSGreg Clayton SBModule::FindGlobalVariables (SBTarget &target, const char *name, uint32_t max_matches)
345dea8cb4fSGreg Clayton {
346dea8cb4fSGreg Clayton     SBValueList sb_value_list;
3474efffd9aSJohnny Chen     if (name && m_opaque_sp)
348dea8cb4fSGreg Clayton     {
349dea8cb4fSGreg Clayton         VariableList variable_list;
350dea8cb4fSGreg Clayton         const uint32_t match_count = m_opaque_sp->FindGlobalVariables (ConstString (name),
351b6d70ebcSSean Callanan                                                                        NULL,
352dea8cb4fSGreg Clayton                                                                        false,
353dea8cb4fSGreg Clayton                                                                        max_matches,
354dea8cb4fSGreg Clayton                                                                        variable_list);
355dea8cb4fSGreg Clayton 
356dea8cb4fSGreg Clayton         if (match_count > 0)
357dea8cb4fSGreg Clayton         {
358dea8cb4fSGreg Clayton             ValueObjectList &value_object_list = sb_value_list.ref();
359dea8cb4fSGreg Clayton             for (uint32_t i=0; i<match_count; ++i)
360dea8cb4fSGreg Clayton             {
361dea8cb4fSGreg Clayton                 lldb::ValueObjectSP valobj_sp;
362b9556accSGreg Clayton                 TargetSP target_sp (target.GetSP());
363b9556accSGreg Clayton                 valobj_sp = ValueObjectVariable::Create (target_sp.get(), variable_list.GetVariableAtIndex(i));
364dea8cb4fSGreg Clayton                 if (valobj_sp)
365dea8cb4fSGreg Clayton                     value_object_list.Append(valobj_sp);
366dea8cb4fSGreg Clayton             }
367dea8cb4fSGreg Clayton         }
368dea8cb4fSGreg Clayton     }
369dea8cb4fSGreg Clayton 
370dea8cb4fSGreg Clayton     return sb_value_list;
371dea8cb4fSGreg Clayton }
3726f3533fbSEnrico Granata 
3736f3533fbSEnrico Granata lldb::SBType
3746f3533fbSEnrico Granata SBModule::FindFirstType (const char *name_cstr)
3756f3533fbSEnrico Granata {
376fe42ac4dSGreg Clayton     SBType sb_type;
3774efffd9aSJohnny Chen     if (name_cstr && IsValid())
378fe42ac4dSGreg Clayton     {
3796f3533fbSEnrico Granata         SymbolContext sc;
3806f3533fbSEnrico Granata         TypeList type_list;
3816f3533fbSEnrico Granata         uint32_t num_matches = 0;
3826f3533fbSEnrico Granata         ConstString name(name_cstr);
3836f3533fbSEnrico Granata 
3846f3533fbSEnrico Granata         num_matches = m_opaque_sp->FindTypes(sc,
3856f3533fbSEnrico Granata                                              name,
386b6d70ebcSSean Callanan                                              NULL,
3876f3533fbSEnrico Granata                                              false,
3886f3533fbSEnrico Granata                                              1,
3896f3533fbSEnrico Granata                                              type_list);
3906f3533fbSEnrico Granata 
3916f3533fbSEnrico Granata         if (num_matches)
392fe42ac4dSGreg Clayton             sb_type = lldb::SBType(type_list.GetTypeAtIndex(0));
3936f3533fbSEnrico Granata     }
394fe42ac4dSGreg Clayton     return sb_type;
3956f3533fbSEnrico Granata }
3966f3533fbSEnrico Granata 
3976f3533fbSEnrico Granata lldb::SBTypeList
3986f3533fbSEnrico Granata SBModule::FindTypes (const char *type)
3996f3533fbSEnrico Granata {
4006f3533fbSEnrico Granata 
4016f3533fbSEnrico Granata     SBTypeList retval;
4026f3533fbSEnrico Granata 
4034efffd9aSJohnny Chen     if (type && IsValid())
404fe42ac4dSGreg Clayton     {
4056f3533fbSEnrico Granata         SymbolContext sc;
4066f3533fbSEnrico Granata         TypeList type_list;
4076f3533fbSEnrico Granata         uint32_t num_matches = 0;
4086f3533fbSEnrico Granata         ConstString name(type);
4096f3533fbSEnrico Granata 
4106f3533fbSEnrico Granata         num_matches = m_opaque_sp->FindTypes(sc,
4116f3533fbSEnrico Granata                                              name,
412b6d70ebcSSean Callanan                                              NULL,
4136f3533fbSEnrico Granata                                              false,
4146f3533fbSEnrico Granata                                              UINT32_MAX,
4156f3533fbSEnrico Granata                                              type_list);
4166f3533fbSEnrico Granata 
4176f3533fbSEnrico Granata         for (size_t idx = 0; idx < num_matches; idx++)
4186f3533fbSEnrico Granata         {
419fe42ac4dSGreg Clayton             TypeSP type_sp (type_list.GetTypeAtIndex(idx));
420fe42ac4dSGreg Clayton             if (type_sp)
421fe42ac4dSGreg Clayton                 retval.Append(SBType(type_sp));
422fe42ac4dSGreg Clayton         }
4236f3533fbSEnrico Granata     }
4246f3533fbSEnrico Granata 
4256f3533fbSEnrico Granata     return retval;
4266f3533fbSEnrico Granata }
427cac9c5f9SGreg Clayton 
428cac9c5f9SGreg Clayton 
429cac9c5f9SGreg Clayton SBSection
430cac9c5f9SGreg Clayton SBModule::FindSection (const char *sect_name)
431cac9c5f9SGreg Clayton {
432cac9c5f9SGreg Clayton     SBSection sb_section;
433cac9c5f9SGreg Clayton 
4344efffd9aSJohnny Chen     if (sect_name && IsValid())
435cac9c5f9SGreg Clayton     {
436cac9c5f9SGreg Clayton         ObjectFile *objfile = m_opaque_sp->GetObjectFile();
437cac9c5f9SGreg Clayton         if (objfile)
438cac9c5f9SGreg Clayton         {
439cac9c5f9SGreg Clayton             SectionList *section_list = objfile->GetSectionList();
440cac9c5f9SGreg Clayton             if (section_list)
441cac9c5f9SGreg Clayton             {
442cac9c5f9SGreg Clayton                 ConstString const_sect_name(sect_name);
443cac9c5f9SGreg Clayton                 SectionSP section_sp (section_list->FindSectionByName(const_sect_name));
444cac9c5f9SGreg Clayton                 if (section_sp)
445cac9c5f9SGreg Clayton                 {
446cac9c5f9SGreg Clayton                     sb_section.SetSection(section_sp.get());
447cac9c5f9SGreg Clayton                 }
448cac9c5f9SGreg Clayton             }
449cac9c5f9SGreg Clayton         }
450cac9c5f9SGreg Clayton     }
451cac9c5f9SGreg Clayton     return sb_section;
452cac9c5f9SGreg Clayton }
453cac9c5f9SGreg Clayton 
45413d1950aSGreg Clayton lldb::ByteOrder
45513d1950aSGreg Clayton SBModule::GetByteOrder ()
45613d1950aSGreg Clayton {
45713d1950aSGreg Clayton     if (m_opaque_sp)
45813d1950aSGreg Clayton         return m_opaque_sp->GetArchitecture().GetByteOrder();
45913d1950aSGreg Clayton     return eByteOrderInvalid;
46013d1950aSGreg Clayton }
46113d1950aSGreg Clayton 
46213d1950aSGreg Clayton const char *
46313d1950aSGreg Clayton SBModule::GetTriple ()
46413d1950aSGreg Clayton {
46513d1950aSGreg Clayton     if (m_opaque_sp)
46613d1950aSGreg Clayton     {
46713d1950aSGreg Clayton         std::string triple (m_opaque_sp->GetArchitecture().GetTriple().str());
46813d1950aSGreg Clayton         // Unique the string so we don't run into ownership issues since
46913d1950aSGreg Clayton         // the const strings put the string into the string pool once and
47013d1950aSGreg Clayton         // the strings never comes out
47113d1950aSGreg Clayton         ConstString const_triple (triple.c_str());
47213d1950aSGreg Clayton         return const_triple.GetCString();
47313d1950aSGreg Clayton     }
47413d1950aSGreg Clayton     return NULL;
47513d1950aSGreg Clayton }
47613d1950aSGreg Clayton 
47713d1950aSGreg Clayton uint32_t
47813d1950aSGreg Clayton SBModule::GetAddressByteSize()
47913d1950aSGreg Clayton {
48013d1950aSGreg Clayton     if (m_opaque_sp)
48113d1950aSGreg Clayton         return m_opaque_sp->GetArchitecture().GetAddressByteSize();
48213d1950aSGreg Clayton     return sizeof(void*);
48313d1950aSGreg Clayton }
48413d1950aSGreg Clayton 
485