1*30fdc8d8SChris Lattner //===-- Module.cpp ----------------------------------------------*- C++ -*-===//
2*30fdc8d8SChris Lattner //
3*30fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
4*30fdc8d8SChris Lattner //
5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
7*30fdc8d8SChris Lattner //
8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
9*30fdc8d8SChris Lattner 
10*30fdc8d8SChris Lattner #include "lldb/Core/Module.h"
11*30fdc8d8SChris Lattner #include "lldb/Core/Log.h"
12*30fdc8d8SChris Lattner #include "lldb/Core/ModuleList.h"
13*30fdc8d8SChris Lattner #include "lldb/Core/RegularExpression.h"
14*30fdc8d8SChris Lattner #include "lldb/Core/Timer.h"
15*30fdc8d8SChris Lattner #include "lldb/lldb-private-log.h"
16*30fdc8d8SChris Lattner #include "lldb/Symbol/ObjectFile.h"
17*30fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
18*30fdc8d8SChris Lattner #include "lldb/Symbol/SymbolVendor.h"
19*30fdc8d8SChris Lattner 
20*30fdc8d8SChris Lattner using namespace lldb;
21*30fdc8d8SChris Lattner using namespace lldb_private;
22*30fdc8d8SChris Lattner 
23*30fdc8d8SChris Lattner Module::Module(const FileSpec& file_spec, const ArchSpec& arch, const ConstString *object_name, off_t object_offset) :
24*30fdc8d8SChris Lattner     m_mutex (Mutex::eMutexTypeRecursive),
25*30fdc8d8SChris Lattner     m_mod_time (file_spec.GetModificationTime()),
26*30fdc8d8SChris Lattner     m_arch (arch),
27*30fdc8d8SChris Lattner     m_uuid (),
28*30fdc8d8SChris Lattner     m_file (file_spec),
29*30fdc8d8SChris Lattner     m_flags (),
30*30fdc8d8SChris Lattner     m_object_name (),
31*30fdc8d8SChris Lattner     m_objfile_ap (),
32*30fdc8d8SChris Lattner     m_symfile_ap ()
33*30fdc8d8SChris Lattner {
34*30fdc8d8SChris Lattner     if (object_name)
35*30fdc8d8SChris Lattner         m_object_name = *object_name;
36*30fdc8d8SChris Lattner     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT);
37*30fdc8d8SChris Lattner     if (log)
38*30fdc8d8SChris Lattner         log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
39*30fdc8d8SChris Lattner                      this,
40*30fdc8d8SChris Lattner                      m_arch.AsCString(),
41*30fdc8d8SChris Lattner                      m_file.GetDirectory().AsCString(""),
42*30fdc8d8SChris Lattner                      m_file.GetFilename().AsCString(""),
43*30fdc8d8SChris Lattner                      m_object_name.IsEmpty() ? "" : "(",
44*30fdc8d8SChris Lattner                      m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
45*30fdc8d8SChris Lattner                      m_object_name.IsEmpty() ? "" : ")");
46*30fdc8d8SChris Lattner 
47*30fdc8d8SChris Lattner }
48*30fdc8d8SChris Lattner 
49*30fdc8d8SChris Lattner Module::~Module()
50*30fdc8d8SChris Lattner {
51*30fdc8d8SChris Lattner     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT);
52*30fdc8d8SChris Lattner     if (log)
53*30fdc8d8SChris Lattner         log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')",
54*30fdc8d8SChris Lattner                      this,
55*30fdc8d8SChris Lattner                      m_arch.AsCString(),
56*30fdc8d8SChris Lattner                      m_file.GetDirectory().AsCString(""),
57*30fdc8d8SChris Lattner                      m_file.GetFilename().AsCString(""),
58*30fdc8d8SChris Lattner                      m_object_name.IsEmpty() ? "" : "(",
59*30fdc8d8SChris Lattner                      m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
60*30fdc8d8SChris Lattner                      m_object_name.IsEmpty() ? "" : ")");
61*30fdc8d8SChris Lattner }
62*30fdc8d8SChris Lattner 
63*30fdc8d8SChris Lattner 
64*30fdc8d8SChris Lattner ModuleSP
65*30fdc8d8SChris Lattner Module::GetSP ()
66*30fdc8d8SChris Lattner {
67*30fdc8d8SChris Lattner     return ModuleList::GetModuleSP (this);
68*30fdc8d8SChris Lattner }
69*30fdc8d8SChris Lattner 
70*30fdc8d8SChris Lattner const UUID&
71*30fdc8d8SChris Lattner Module::GetUUID()
72*30fdc8d8SChris Lattner {
73*30fdc8d8SChris Lattner     Mutex::Locker locker (m_mutex);
74*30fdc8d8SChris Lattner     if (m_flags.IsClear(flagsParsedUUID))
75*30fdc8d8SChris Lattner     {
76*30fdc8d8SChris Lattner         ObjectFile * obj_file = GetObjectFile ();
77*30fdc8d8SChris Lattner 
78*30fdc8d8SChris Lattner         if (obj_file != NULL)
79*30fdc8d8SChris Lattner         {
80*30fdc8d8SChris Lattner             obj_file->GetUUID(&m_uuid);
81*30fdc8d8SChris Lattner             m_flags.Set(flagsParsedUUID);
82*30fdc8d8SChris Lattner         }
83*30fdc8d8SChris Lattner     }
84*30fdc8d8SChris Lattner     return m_uuid;
85*30fdc8d8SChris Lattner }
86*30fdc8d8SChris Lattner 
87*30fdc8d8SChris Lattner void
88*30fdc8d8SChris Lattner Module::ParseAllDebugSymbols()
89*30fdc8d8SChris Lattner {
90*30fdc8d8SChris Lattner     Mutex::Locker locker (m_mutex);
91*30fdc8d8SChris Lattner     uint32_t num_comp_units = GetNumCompileUnits();
92*30fdc8d8SChris Lattner     if (num_comp_units == 0)
93*30fdc8d8SChris Lattner         return;
94*30fdc8d8SChris Lattner 
95*30fdc8d8SChris Lattner     TargetSP null_target;
96*30fdc8d8SChris Lattner     SymbolContext sc(null_target, GetSP());
97*30fdc8d8SChris Lattner     uint32_t cu_idx;
98*30fdc8d8SChris Lattner     SymbolVendor *symbols = GetSymbolVendor ();
99*30fdc8d8SChris Lattner 
100*30fdc8d8SChris Lattner     for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++)
101*30fdc8d8SChris Lattner     {
102*30fdc8d8SChris Lattner         sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get();
103*30fdc8d8SChris Lattner         if (sc.comp_unit)
104*30fdc8d8SChris Lattner         {
105*30fdc8d8SChris Lattner             sc.function = NULL;
106*30fdc8d8SChris Lattner             symbols->ParseVariablesForContext(sc);
107*30fdc8d8SChris Lattner 
108*30fdc8d8SChris Lattner             symbols->ParseCompileUnitFunctions(sc);
109*30fdc8d8SChris Lattner 
110*30fdc8d8SChris Lattner             uint32_t func_idx;
111*30fdc8d8SChris Lattner             for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx)
112*30fdc8d8SChris Lattner             {
113*30fdc8d8SChris Lattner                 symbols->ParseFunctionBlocks(sc);
114*30fdc8d8SChris Lattner 
115*30fdc8d8SChris Lattner                 // Parse the variables for this function and all its blocks
116*30fdc8d8SChris Lattner                 symbols->ParseVariablesForContext(sc);
117*30fdc8d8SChris Lattner             }
118*30fdc8d8SChris Lattner 
119*30fdc8d8SChris Lattner 
120*30fdc8d8SChris Lattner             // Parse all types for this compile unit
121*30fdc8d8SChris Lattner             sc.function = NULL;
122*30fdc8d8SChris Lattner             symbols->ParseTypes(sc);
123*30fdc8d8SChris Lattner         }
124*30fdc8d8SChris Lattner     }
125*30fdc8d8SChris Lattner }
126*30fdc8d8SChris Lattner 
127*30fdc8d8SChris Lattner void
128*30fdc8d8SChris Lattner Module::CalculateSymbolContext(SymbolContext* sc)
129*30fdc8d8SChris Lattner {
130*30fdc8d8SChris Lattner     sc->module_sp = GetSP();
131*30fdc8d8SChris Lattner }
132*30fdc8d8SChris Lattner 
133*30fdc8d8SChris Lattner void
134*30fdc8d8SChris Lattner Module::DumpSymbolContext(Stream *s)
135*30fdc8d8SChris Lattner {
136*30fdc8d8SChris Lattner     s->Printf(", Module{0x%8.8x}", this);
137*30fdc8d8SChris Lattner }
138*30fdc8d8SChris Lattner 
139*30fdc8d8SChris Lattner uint32_t
140*30fdc8d8SChris Lattner Module::GetNumCompileUnits()
141*30fdc8d8SChris Lattner {
142*30fdc8d8SChris Lattner     Mutex::Locker locker (m_mutex);
143*30fdc8d8SChris Lattner     Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this);
144*30fdc8d8SChris Lattner     SymbolVendor *symbols = GetSymbolVendor ();
145*30fdc8d8SChris Lattner     if (symbols)
146*30fdc8d8SChris Lattner         return symbols->GetNumCompileUnits();
147*30fdc8d8SChris Lattner     return 0;
148*30fdc8d8SChris Lattner }
149*30fdc8d8SChris Lattner 
150*30fdc8d8SChris Lattner CompUnitSP
151*30fdc8d8SChris Lattner Module::GetCompileUnitAtIndex (uint32_t index)
152*30fdc8d8SChris Lattner {
153*30fdc8d8SChris Lattner     Mutex::Locker locker (m_mutex);
154*30fdc8d8SChris Lattner     uint32_t num_comp_units = GetNumCompileUnits ();
155*30fdc8d8SChris Lattner     CompUnitSP cu_sp;
156*30fdc8d8SChris Lattner 
157*30fdc8d8SChris Lattner     if (index < num_comp_units)
158*30fdc8d8SChris Lattner     {
159*30fdc8d8SChris Lattner         SymbolVendor *symbols = GetSymbolVendor ();
160*30fdc8d8SChris Lattner         if (symbols)
161*30fdc8d8SChris Lattner             cu_sp = symbols->GetCompileUnitAtIndex(index);
162*30fdc8d8SChris Lattner     }
163*30fdc8d8SChris Lattner     return cu_sp;
164*30fdc8d8SChris Lattner }
165*30fdc8d8SChris Lattner 
166*30fdc8d8SChris Lattner //CompUnitSP
167*30fdc8d8SChris Lattner //Module::FindCompUnit(lldb::user_id_t uid)
168*30fdc8d8SChris Lattner //{
169*30fdc8d8SChris Lattner //  CompUnitSP cu_sp;
170*30fdc8d8SChris Lattner //  SymbolVendor *symbols = GetSymbolVendor ();
171*30fdc8d8SChris Lattner //  if (symbols)
172*30fdc8d8SChris Lattner //      cu_sp = symbols->FindCompUnit(uid);
173*30fdc8d8SChris Lattner //  return cu_sp;
174*30fdc8d8SChris Lattner //}
175*30fdc8d8SChris Lattner 
176*30fdc8d8SChris Lattner bool
177*30fdc8d8SChris Lattner Module::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr)
178*30fdc8d8SChris Lattner {
179*30fdc8d8SChris Lattner     Mutex::Locker locker (m_mutex);
180*30fdc8d8SChris Lattner     Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr);
181*30fdc8d8SChris Lattner     ObjectFile* ofile = GetObjectFile();
182*30fdc8d8SChris Lattner     if (ofile)
183*30fdc8d8SChris Lattner         return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList());
184*30fdc8d8SChris Lattner     return false;
185*30fdc8d8SChris Lattner }
186*30fdc8d8SChris Lattner 
187*30fdc8d8SChris Lattner uint32_t
188*30fdc8d8SChris Lattner Module::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
189*30fdc8d8SChris Lattner {
190*30fdc8d8SChris Lattner     Mutex::Locker locker (m_mutex);
191*30fdc8d8SChris Lattner     uint32_t resolved_flags = 0;
192*30fdc8d8SChris Lattner 
193*30fdc8d8SChris Lattner     // Clear the result symbol context in case we don't find anything
194*30fdc8d8SChris Lattner     sc.Clear();
195*30fdc8d8SChris Lattner 
196*30fdc8d8SChris Lattner     // Get the section from the section/offset address.
197*30fdc8d8SChris Lattner     const Section *section = so_addr.GetSection();
198*30fdc8d8SChris Lattner 
199*30fdc8d8SChris Lattner     // Make sure the section matches this module before we try and match anything
200*30fdc8d8SChris Lattner     if (section && section->GetModule() == this)
201*30fdc8d8SChris Lattner     {
202*30fdc8d8SChris Lattner         // If the section offset based address resolved itself, then this
203*30fdc8d8SChris Lattner         // is the right module.
204*30fdc8d8SChris Lattner         sc.module_sp = GetSP();
205*30fdc8d8SChris Lattner         resolved_flags |= eSymbolContextModule;
206*30fdc8d8SChris Lattner 
207*30fdc8d8SChris Lattner         // Resolve the compile unit, function, block, line table or line
208*30fdc8d8SChris Lattner         // entry if requested.
209*30fdc8d8SChris Lattner         if (resolve_scope & eSymbolContextCompUnit    ||
210*30fdc8d8SChris Lattner             resolve_scope & eSymbolContextFunction    ||
211*30fdc8d8SChris Lattner             resolve_scope & eSymbolContextBlock       ||
212*30fdc8d8SChris Lattner             resolve_scope & eSymbolContextLineEntry   )
213*30fdc8d8SChris Lattner         {
214*30fdc8d8SChris Lattner             SymbolVendor *symbols = GetSymbolVendor ();
215*30fdc8d8SChris Lattner             if (symbols)
216*30fdc8d8SChris Lattner                 resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc);
217*30fdc8d8SChris Lattner         }
218*30fdc8d8SChris Lattner 
219*30fdc8d8SChris Lattner         // Resolve the symbol if requested
220*30fdc8d8SChris Lattner         if (resolve_scope & eSymbolContextSymbol)
221*30fdc8d8SChris Lattner         {
222*30fdc8d8SChris Lattner             ObjectFile* ofile = GetObjectFile();
223*30fdc8d8SChris Lattner             if (ofile)
224*30fdc8d8SChris Lattner             {
225*30fdc8d8SChris Lattner                 Symtab *symtab = ofile->GetSymtab();
226*30fdc8d8SChris Lattner                 if (symtab)
227*30fdc8d8SChris Lattner                 {
228*30fdc8d8SChris Lattner                     if (so_addr.IsSectionOffset())
229*30fdc8d8SChris Lattner                     {
230*30fdc8d8SChris Lattner                         sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
231*30fdc8d8SChris Lattner                         if (sc.symbol)
232*30fdc8d8SChris Lattner                             resolved_flags |= eSymbolContextSymbol;
233*30fdc8d8SChris Lattner                     }
234*30fdc8d8SChris Lattner                 }
235*30fdc8d8SChris Lattner             }
236*30fdc8d8SChris Lattner         }
237*30fdc8d8SChris Lattner     }
238*30fdc8d8SChris Lattner     return resolved_flags;
239*30fdc8d8SChris Lattner }
240*30fdc8d8SChris Lattner 
241*30fdc8d8SChris Lattner uint32_t
242*30fdc8d8SChris Lattner Module::ResolveSymbolContextForFilePath (const char *file_path, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
243*30fdc8d8SChris Lattner {
244*30fdc8d8SChris Lattner     FileSpec file_spec(file_path);
245*30fdc8d8SChris Lattner     return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list);
246*30fdc8d8SChris Lattner }
247*30fdc8d8SChris Lattner 
248*30fdc8d8SChris Lattner uint32_t
249*30fdc8d8SChris Lattner Module::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
250*30fdc8d8SChris Lattner {
251*30fdc8d8SChris Lattner     Mutex::Locker locker (m_mutex);
252*30fdc8d8SChris Lattner     Timer scoped_timer(__PRETTY_FUNCTION__,
253*30fdc8d8SChris Lattner                        "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)",
254*30fdc8d8SChris Lattner                        file_spec.GetDirectory().AsCString(""),
255*30fdc8d8SChris Lattner                        file_spec.GetDirectory() ? "/" : "",
256*30fdc8d8SChris Lattner                        file_spec.GetFilename().AsCString(""),
257*30fdc8d8SChris Lattner                        line,
258*30fdc8d8SChris Lattner                        check_inlines ? "yes" : "no",
259*30fdc8d8SChris Lattner                        resolve_scope);
260*30fdc8d8SChris Lattner 
261*30fdc8d8SChris Lattner     const uint32_t initial_count = sc_list.GetSize();
262*30fdc8d8SChris Lattner 
263*30fdc8d8SChris Lattner     SymbolVendor *symbols = GetSymbolVendor  ();
264*30fdc8d8SChris Lattner     if (symbols)
265*30fdc8d8SChris Lattner         symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list);
266*30fdc8d8SChris Lattner 
267*30fdc8d8SChris Lattner     return sc_list.GetSize() - initial_count;
268*30fdc8d8SChris Lattner }
269*30fdc8d8SChris Lattner 
270*30fdc8d8SChris Lattner 
271*30fdc8d8SChris Lattner uint32_t
272*30fdc8d8SChris Lattner Module::FindGlobalVariables(const ConstString &name, bool append, uint32_t max_matches, VariableList& variables)
273*30fdc8d8SChris Lattner {
274*30fdc8d8SChris Lattner     SymbolVendor *symbols = GetSymbolVendor ();
275*30fdc8d8SChris Lattner     if (symbols)
276*30fdc8d8SChris Lattner         return symbols->FindGlobalVariables(name, append, max_matches, variables);
277*30fdc8d8SChris Lattner     return 0;
278*30fdc8d8SChris Lattner }
279*30fdc8d8SChris Lattner uint32_t
280*30fdc8d8SChris Lattner Module::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
281*30fdc8d8SChris Lattner {
282*30fdc8d8SChris Lattner     SymbolVendor *symbols = GetSymbolVendor ();
283*30fdc8d8SChris Lattner     if (symbols)
284*30fdc8d8SChris Lattner         return symbols->FindGlobalVariables(regex, append, max_matches, variables);
285*30fdc8d8SChris Lattner     return 0;
286*30fdc8d8SChris Lattner }
287*30fdc8d8SChris Lattner 
288*30fdc8d8SChris Lattner uint32_t
289*30fdc8d8SChris Lattner Module::FindFunctions(const ConstString &name, bool append, SymbolContextList& sc_list)
290*30fdc8d8SChris Lattner {
291*30fdc8d8SChris Lattner     SymbolVendor *symbols = GetSymbolVendor ();
292*30fdc8d8SChris Lattner     if (symbols)
293*30fdc8d8SChris Lattner         return symbols->FindFunctions(name, append, sc_list);
294*30fdc8d8SChris Lattner     return 0;
295*30fdc8d8SChris Lattner }
296*30fdc8d8SChris Lattner 
297*30fdc8d8SChris Lattner uint32_t
298*30fdc8d8SChris Lattner Module::FindFunctions(const RegularExpression& regex, bool append, SymbolContextList& sc_list)
299*30fdc8d8SChris Lattner {
300*30fdc8d8SChris Lattner     SymbolVendor *symbols = GetSymbolVendor ();
301*30fdc8d8SChris Lattner     if (symbols)
302*30fdc8d8SChris Lattner         return symbols->FindFunctions(regex, append, sc_list);
303*30fdc8d8SChris Lattner     return 0;
304*30fdc8d8SChris Lattner }
305*30fdc8d8SChris Lattner 
306*30fdc8d8SChris Lattner //uint32_t
307*30fdc8d8SChris Lattner //Module::FindTypes(const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types)
308*30fdc8d8SChris Lattner //{
309*30fdc8d8SChris Lattner //  Timer scoped_timer(__PRETTY_FUNCTION__);
310*30fdc8d8SChris Lattner //  SymbolVendor *symbols = GetSymbolVendor ();
311*30fdc8d8SChris Lattner //  if (symbols)
312*30fdc8d8SChris Lattner //      return symbols->FindTypes(sc, name, append, max_matches, encoding, udt_name, types);
313*30fdc8d8SChris Lattner //  return 0;
314*30fdc8d8SChris Lattner //}
315*30fdc8d8SChris Lattner //
316*30fdc8d8SChris Lattner //uint32_t
317*30fdc8d8SChris Lattner //Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types)
318*30fdc8d8SChris Lattner //{
319*30fdc8d8SChris Lattner //  Timer scoped_timer(__PRETTY_FUNCTION__);
320*30fdc8d8SChris Lattner //  SymbolVendor *symbols = GetSymbolVendor ();
321*30fdc8d8SChris Lattner //  if (symbols)
322*30fdc8d8SChris Lattner //      return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types);
323*30fdc8d8SChris Lattner //  return 0;
324*30fdc8d8SChris Lattner //
325*30fdc8d8SChris Lattner //}
326*30fdc8d8SChris Lattner 
327*30fdc8d8SChris Lattner SymbolVendor*
328*30fdc8d8SChris Lattner Module::GetSymbolVendor (bool can_create)
329*30fdc8d8SChris Lattner {
330*30fdc8d8SChris Lattner     Mutex::Locker locker (m_mutex);
331*30fdc8d8SChris Lattner     if (m_flags.IsClear(flagsSearchedForSymVendor) && can_create)
332*30fdc8d8SChris Lattner     {
333*30fdc8d8SChris Lattner         ObjectFile *obj_file = GetObjectFile ();
334*30fdc8d8SChris Lattner         if (obj_file != NULL)
335*30fdc8d8SChris Lattner         {
336*30fdc8d8SChris Lattner             Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
337*30fdc8d8SChris Lattner             m_symfile_ap.reset(SymbolVendor::FindPlugin(this));
338*30fdc8d8SChris Lattner             m_flags.Set (flagsSearchedForSymVendor);
339*30fdc8d8SChris Lattner         }
340*30fdc8d8SChris Lattner     }
341*30fdc8d8SChris Lattner     return m_symfile_ap.get();
342*30fdc8d8SChris Lattner }
343*30fdc8d8SChris Lattner 
344*30fdc8d8SChris Lattner const FileSpec &
345*30fdc8d8SChris Lattner Module::GetFileSpec () const
346*30fdc8d8SChris Lattner {
347*30fdc8d8SChris Lattner     return m_file;
348*30fdc8d8SChris Lattner }
349*30fdc8d8SChris Lattner 
350*30fdc8d8SChris Lattner void
351*30fdc8d8SChris Lattner Module::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name)
352*30fdc8d8SChris Lattner {
353*30fdc8d8SChris Lattner     // Container objects whose paths do not specify a file directly can call
354*30fdc8d8SChris Lattner     // this function to correct the file and object names.
355*30fdc8d8SChris Lattner     m_file = file;
356*30fdc8d8SChris Lattner     m_mod_time = file.GetModificationTime();
357*30fdc8d8SChris Lattner     m_object_name = object_name;
358*30fdc8d8SChris Lattner }
359*30fdc8d8SChris Lattner 
360*30fdc8d8SChris Lattner const ArchSpec&
361*30fdc8d8SChris Lattner Module::GetArchitecture () const
362*30fdc8d8SChris Lattner {
363*30fdc8d8SChris Lattner     return m_arch;
364*30fdc8d8SChris Lattner }
365*30fdc8d8SChris Lattner 
366*30fdc8d8SChris Lattner void
367*30fdc8d8SChris Lattner Module::Dump(Stream *s)
368*30fdc8d8SChris Lattner {
369*30fdc8d8SChris Lattner     Mutex::Locker locker (m_mutex);
370*30fdc8d8SChris Lattner     s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
371*30fdc8d8SChris Lattner     s->Indent();
372*30fdc8d8SChris Lattner     s->Printf("Module %s/%s%s%s%s\n",
373*30fdc8d8SChris Lattner               m_file.GetDirectory().AsCString(),
374*30fdc8d8SChris Lattner               m_file.GetFilename().AsCString(),
375*30fdc8d8SChris Lattner               m_object_name ? "(" : "",
376*30fdc8d8SChris Lattner               m_object_name ? m_object_name.GetCString() : "",
377*30fdc8d8SChris Lattner               m_object_name ? ")" : "");
378*30fdc8d8SChris Lattner 
379*30fdc8d8SChris Lattner     s->IndentMore();
380*30fdc8d8SChris Lattner     ObjectFile *objfile = GetObjectFile ();
381*30fdc8d8SChris Lattner 
382*30fdc8d8SChris Lattner     if (objfile)
383*30fdc8d8SChris Lattner         objfile->Dump(s);
384*30fdc8d8SChris Lattner 
385*30fdc8d8SChris Lattner     SymbolVendor *symbols = GetSymbolVendor ();
386*30fdc8d8SChris Lattner 
387*30fdc8d8SChris Lattner     if (symbols)
388*30fdc8d8SChris Lattner         symbols->Dump(s);
389*30fdc8d8SChris Lattner 
390*30fdc8d8SChris Lattner     s->IndentLess();
391*30fdc8d8SChris Lattner }
392*30fdc8d8SChris Lattner 
393*30fdc8d8SChris Lattner 
394*30fdc8d8SChris Lattner TypeList*
395*30fdc8d8SChris Lattner Module::GetTypeList ()
396*30fdc8d8SChris Lattner {
397*30fdc8d8SChris Lattner     SymbolVendor *symbols = GetSymbolVendor ();
398*30fdc8d8SChris Lattner     if (symbols)
399*30fdc8d8SChris Lattner         return &symbols->GetTypeList();
400*30fdc8d8SChris Lattner     return NULL;
401*30fdc8d8SChris Lattner }
402*30fdc8d8SChris Lattner 
403*30fdc8d8SChris Lattner const ConstString &
404*30fdc8d8SChris Lattner Module::GetObjectName() const
405*30fdc8d8SChris Lattner {
406*30fdc8d8SChris Lattner     return m_object_name;
407*30fdc8d8SChris Lattner }
408*30fdc8d8SChris Lattner 
409*30fdc8d8SChris Lattner ObjectFile *
410*30fdc8d8SChris Lattner Module::GetObjectFile()
411*30fdc8d8SChris Lattner {
412*30fdc8d8SChris Lattner     Mutex::Locker locker (m_mutex);
413*30fdc8d8SChris Lattner     if (m_flags.IsClear(flagsSearchedForObjParser))
414*30fdc8d8SChris Lattner     {
415*30fdc8d8SChris Lattner         m_flags.Set (flagsSearchedForObjParser);
416*30fdc8d8SChris Lattner         Timer scoped_timer(__PRETTY_FUNCTION__,
417*30fdc8d8SChris Lattner                            "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString(""));
418*30fdc8d8SChris Lattner         m_objfile_ap.reset(ObjectFile::FindPlugin(this, &m_file, 0, m_file.GetByteSize()));
419*30fdc8d8SChris Lattner     }
420*30fdc8d8SChris Lattner     return m_objfile_ap.get();
421*30fdc8d8SChris Lattner }
422*30fdc8d8SChris Lattner 
423*30fdc8d8SChris Lattner 
424*30fdc8d8SChris Lattner const Symbol *
425*30fdc8d8SChris Lattner Module::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type)
426*30fdc8d8SChris Lattner {
427*30fdc8d8SChris Lattner     Timer scoped_timer(__PRETTY_FUNCTION__,
428*30fdc8d8SChris Lattner                        "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)",
429*30fdc8d8SChris Lattner                        name.AsCString(),
430*30fdc8d8SChris Lattner                        symbol_type);
431*30fdc8d8SChris Lattner     ObjectFile *objfile = GetObjectFile();
432*30fdc8d8SChris Lattner     if (objfile)
433*30fdc8d8SChris Lattner     {
434*30fdc8d8SChris Lattner         Symtab *symtab = objfile->GetSymtab();
435*30fdc8d8SChris Lattner         if (symtab)
436*30fdc8d8SChris Lattner             return symtab->FindFirstSymbolWithNameAndType (name, symbol_type);
437*30fdc8d8SChris Lattner     }
438*30fdc8d8SChris Lattner     return NULL;
439*30fdc8d8SChris Lattner }
440*30fdc8d8SChris Lattner void
441*30fdc8d8SChris Lattner Module::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list)
442*30fdc8d8SChris Lattner {
443*30fdc8d8SChris Lattner     // No need to protect this call using m_mutex all other method calls are
444*30fdc8d8SChris Lattner     // already thread safe.
445*30fdc8d8SChris Lattner 
446*30fdc8d8SChris Lattner     size_t num_indices = symbol_indexes.size();
447*30fdc8d8SChris Lattner     if (num_indices > 0)
448*30fdc8d8SChris Lattner     {
449*30fdc8d8SChris Lattner         SymbolContext sc;
450*30fdc8d8SChris Lattner         CalculateSymbolContext (&sc);
451*30fdc8d8SChris Lattner         for (size_t i = 0; i < num_indices; i++)
452*30fdc8d8SChris Lattner         {
453*30fdc8d8SChris Lattner             sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]);
454*30fdc8d8SChris Lattner             if (sc.symbol)
455*30fdc8d8SChris Lattner                 sc_list.Append (sc);
456*30fdc8d8SChris Lattner         }
457*30fdc8d8SChris Lattner     }
458*30fdc8d8SChris Lattner }
459*30fdc8d8SChris Lattner 
460*30fdc8d8SChris Lattner size_t
461*30fdc8d8SChris Lattner Module::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list)
462*30fdc8d8SChris Lattner {
463*30fdc8d8SChris Lattner     // No need to protect this call using m_mutex all other method calls are
464*30fdc8d8SChris Lattner     // already thread safe.
465*30fdc8d8SChris Lattner 
466*30fdc8d8SChris Lattner 
467*30fdc8d8SChris Lattner     Timer scoped_timer(__PRETTY_FUNCTION__,
468*30fdc8d8SChris Lattner                        "Module::FindSymbolsWithNameAndType (name = %s, type = %i)",
469*30fdc8d8SChris Lattner                        name.AsCString(),
470*30fdc8d8SChris Lattner                        symbol_type);
471*30fdc8d8SChris Lattner     const size_t initial_size = sc_list.GetSize();
472*30fdc8d8SChris Lattner     ObjectFile *objfile = GetObjectFile ();
473*30fdc8d8SChris Lattner     if (objfile)
474*30fdc8d8SChris Lattner     {
475*30fdc8d8SChris Lattner         Symtab *symtab = objfile->GetSymtab();
476*30fdc8d8SChris Lattner         if (symtab)
477*30fdc8d8SChris Lattner         {
478*30fdc8d8SChris Lattner             std::vector<uint32_t> symbol_indexes;
479*30fdc8d8SChris Lattner             symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes);
480*30fdc8d8SChris Lattner             SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
481*30fdc8d8SChris Lattner         }
482*30fdc8d8SChris Lattner     }
483*30fdc8d8SChris Lattner     return sc_list.GetSize() - initial_size;
484*30fdc8d8SChris Lattner }
485*30fdc8d8SChris Lattner 
486*30fdc8d8SChris Lattner size_t
487*30fdc8d8SChris Lattner Module::FindSymbolsMatchingRegExAndType (const RegularExpression &regex, SymbolType symbol_type, SymbolContextList &sc_list)
488*30fdc8d8SChris Lattner {
489*30fdc8d8SChris Lattner     // No need to protect this call using m_mutex all other method calls are
490*30fdc8d8SChris Lattner     // already thread safe.
491*30fdc8d8SChris Lattner 
492*30fdc8d8SChris Lattner     Timer scoped_timer(__PRETTY_FUNCTION__,
493*30fdc8d8SChris Lattner                        "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)",
494*30fdc8d8SChris Lattner                        regex.GetText(),
495*30fdc8d8SChris Lattner                        symbol_type);
496*30fdc8d8SChris Lattner     const size_t initial_size = sc_list.GetSize();
497*30fdc8d8SChris Lattner     ObjectFile *objfile = GetObjectFile ();
498*30fdc8d8SChris Lattner     if (objfile)
499*30fdc8d8SChris Lattner     {
500*30fdc8d8SChris Lattner         Symtab *symtab = objfile->GetSymtab();
501*30fdc8d8SChris Lattner         if (symtab)
502*30fdc8d8SChris Lattner         {
503*30fdc8d8SChris Lattner             std::vector<uint32_t> symbol_indexes;
504*30fdc8d8SChris Lattner             symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, symbol_indexes);
505*30fdc8d8SChris Lattner             SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
506*30fdc8d8SChris Lattner         }
507*30fdc8d8SChris Lattner     }
508*30fdc8d8SChris Lattner     return sc_list.GetSize() - initial_size;
509*30fdc8d8SChris Lattner }
510*30fdc8d8SChris Lattner 
511*30fdc8d8SChris Lattner const TimeValue &
512*30fdc8d8SChris Lattner Module::GetModificationTime () const
513*30fdc8d8SChris Lattner {
514*30fdc8d8SChris Lattner     return m_mod_time;
515*30fdc8d8SChris Lattner }
516