1 //===-- Module.cpp ----------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/Core/Module.h"
11 #include "lldb/Core/DataBuffer.h"
12 #include "lldb/Core/DataBufferHeap.h"
13 #include "lldb/Core/Log.h"
14 #include "lldb/Core/ModuleList.h"
15 #include "lldb/Core/RegularExpression.h"
16 #include "lldb/Core/StreamString.h"
17 #include "lldb/Core/Timer.h"
18 #include "lldb/Host/Host.h"
19 #include "lldb/lldb-private-log.h"
20 #include "lldb/Symbol/ObjectFile.h"
21 #include "lldb/Symbol/SymbolContext.h"
22 #include "lldb/Symbol/SymbolVendor.h"
23 #include "lldb/Target/Process.h"
24 #include "lldb/Target/Target.h"
25 
26 using namespace lldb;
27 using namespace lldb_private;
28 
29 // Shared pointers to modules track module lifetimes in
30 // targets and in the global module, but this collection
31 // will track all module objects that are still alive
32 typedef std::vector<Module *> ModuleCollection;
33 
34 static ModuleCollection &
35 GetModuleCollection()
36 {
37     // This module collection needs to live past any module, so we could either make it a
38     // shared pointer in each module or just leak is.  Since it is only an empty vector by
39     // the time all the modules have gone away, we just leak it for now.  If we decide this
40     // is a big problem we can introduce a Finalize method that will tear everything down in
41     // a predictable order.
42 
43     static ModuleCollection *g_module_collection = NULL;
44     if (g_module_collection == NULL)
45         g_module_collection = new ModuleCollection();
46 
47     return *g_module_collection;
48 }
49 
50 Mutex *
51 Module::GetAllocationModuleCollectionMutex()
52 {
53     // NOTE: The mutex below must be leaked since the global module list in
54     // the ModuleList class will get torn at some point, and we can't know
55     // if it will tear itself down before the "g_module_collection_mutex" below
56     // will. So we leak a Mutex object below to safeguard against that
57 
58     static Mutex *g_module_collection_mutex = NULL;
59     if (g_module_collection_mutex == NULL)
60         g_module_collection_mutex = new Mutex (Mutex::eMutexTypeRecursive); // NOTE: known leak
61     return g_module_collection_mutex;
62 }
63 
64 size_t
65 Module::GetNumberAllocatedModules ()
66 {
67     Mutex::Locker locker (GetAllocationModuleCollectionMutex());
68     return GetModuleCollection().size();
69 }
70 
71 Module *
72 Module::GetAllocatedModuleAtIndex (size_t idx)
73 {
74     Mutex::Locker locker (GetAllocationModuleCollectionMutex());
75     ModuleCollection &modules = GetModuleCollection();
76     if (idx < modules.size())
77         return modules[idx];
78     return NULL;
79 }
80 #if 0
81 
82 // These functions help us to determine if modules are still loaded, yet don't require that
83 // you have a command interpreter and can easily be called from an external debugger.
84 namespace lldb {
85 
86     void
87     ClearModuleInfo (void)
88     {
89         ModuleList::RemoveOrphanSharedModules();
90     }
91 
92     void
93     DumpModuleInfo (void)
94     {
95         Mutex::Locker locker (Module::GetAllocationModuleCollectionMutex());
96         ModuleCollection &modules = GetModuleCollection();
97         const size_t count = modules.size();
98         printf ("%s: %zu modules:\n", __PRETTY_FUNCTION__, count);
99         for (size_t i=0; i<count; ++i)
100         {
101 
102             StreamString strm;
103             Module *module = modules[i];
104             const bool in_shared_module_list = ModuleList::ModuleIsInCache (module);
105             module->GetDescription(&strm, eDescriptionLevelFull);
106             printf ("%p: shared = %i, ref_count = %3u, module = %s\n",
107                     module,
108                     in_shared_module_list,
109                     (uint32_t)module->use_count(),
110                     strm.GetString().c_str());
111         }
112     }
113 }
114 
115 #endif
116 
117 Module::Module (const ModuleSpec &module_spec) :
118     m_mutex (Mutex::eMutexTypeRecursive),
119     m_mod_time (module_spec.GetFileSpec().GetModificationTime()),
120     m_arch (module_spec.GetArchitecture()),
121     m_uuid (),
122     m_file (module_spec.GetFileSpec()),
123     m_platform_file(module_spec.GetPlatformFileSpec()),
124     m_symfile_spec (module_spec.GetSymbolFileSpec()),
125     m_object_name (module_spec.GetObjectName()),
126     m_object_offset (module_spec.GetObjectOffset()),
127     m_objfile_sp (),
128     m_symfile_ap (),
129     m_ast (),
130     m_source_mappings (),
131     m_did_load_objfile (false),
132     m_did_load_symbol_vendor (false),
133     m_did_parse_uuid (false),
134     m_did_init_ast (false),
135     m_is_dynamic_loader_module (false),
136     m_was_modified (false)
137 {
138     // Scope for locker below...
139     {
140         Mutex::Locker locker (GetAllocationModuleCollectionMutex());
141         GetModuleCollection().push_back(this);
142     }
143 
144     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
145     if (log)
146         log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
147                      this,
148                      m_arch.GetArchitectureName(),
149                      m_file.GetDirectory().AsCString(""),
150                      m_file.GetFilename().AsCString(""),
151                      m_object_name.IsEmpty() ? "" : "(",
152                      m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
153                      m_object_name.IsEmpty() ? "" : ")");
154 }
155 
156 Module::Module(const FileSpec& file_spec,
157                const ArchSpec& arch,
158                const ConstString *object_name,
159                off_t object_offset) :
160     m_mutex (Mutex::eMutexTypeRecursive),
161     m_mod_time (file_spec.GetModificationTime()),
162     m_arch (arch),
163     m_uuid (),
164     m_file (file_spec),
165     m_platform_file(),
166     m_symfile_spec (),
167     m_object_name (),
168     m_object_offset (object_offset),
169     m_objfile_sp (),
170     m_symfile_ap (),
171     m_ast (),
172     m_source_mappings (),
173     m_did_load_objfile (false),
174     m_did_load_symbol_vendor (false),
175     m_did_parse_uuid (false),
176     m_did_init_ast (false),
177     m_is_dynamic_loader_module (false),
178     m_was_modified (false)
179 {
180     // Scope for locker below...
181     {
182         Mutex::Locker locker (GetAllocationModuleCollectionMutex());
183         GetModuleCollection().push_back(this);
184     }
185 
186     if (object_name)
187         m_object_name = *object_name;
188     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
189     if (log)
190         log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
191                      this,
192                      m_arch.GetArchitectureName(),
193                      m_file.GetDirectory().AsCString(""),
194                      m_file.GetFilename().AsCString(""),
195                      m_object_name.IsEmpty() ? "" : "(",
196                      m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
197                      m_object_name.IsEmpty() ? "" : ")");
198 }
199 
200 Module::~Module()
201 {
202     // Scope for locker below...
203     {
204         Mutex::Locker locker (GetAllocationModuleCollectionMutex());
205         ModuleCollection &modules = GetModuleCollection();
206         ModuleCollection::iterator end = modules.end();
207         ModuleCollection::iterator pos = std::find(modules.begin(), end, this);
208         if (pos != end)
209             modules.erase(pos);
210     }
211     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
212     if (log)
213         log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')",
214                      this,
215                      m_arch.GetArchitectureName(),
216                      m_file.GetDirectory().AsCString(""),
217                      m_file.GetFilename().AsCString(""),
218                      m_object_name.IsEmpty() ? "" : "(",
219                      m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
220                      m_object_name.IsEmpty() ? "" : ")");
221     // Release any auto pointers before we start tearing down our member
222     // variables since the object file and symbol files might need to make
223     // function calls back into this module object. The ordering is important
224     // here because symbol files can require the module object file. So we tear
225     // down the symbol file first, then the object file.
226     m_symfile_ap.reset();
227     m_objfile_sp.reset();
228 }
229 
230 ObjectFile *
231 Module::GetMemoryObjectFile (const lldb::ProcessSP &process_sp, lldb::addr_t header_addr, Error &error)
232 {
233     if (m_objfile_sp)
234     {
235         error.SetErrorString ("object file already exists");
236     }
237     else
238     {
239         Mutex::Locker locker (m_mutex);
240         if (process_sp)
241         {
242             StreamString s;
243             if (m_file.GetFilename())
244                 s << m_file.GetFilename();
245                 s.Printf("[0x%16.16llx]", header_addr);
246                 m_file.GetFilename().SetCString (s.GetData());
247             m_did_load_objfile = true;
248             std::auto_ptr<DataBufferHeap> data_ap (new DataBufferHeap (512, 0));
249             Error readmem_error;
250             const size_t bytes_read = process_sp->ReadMemory (header_addr,
251                                                               data_ap->GetBytes(),
252                                                               data_ap->GetByteSize(),
253                                                               readmem_error);
254             if (bytes_read == 512)
255             {
256                 DataBufferSP data_sp(data_ap.release());
257                 m_objfile_sp = ObjectFile::FindPlugin(shared_from_this(), process_sp, header_addr, data_sp);
258                 if (m_objfile_sp)
259                 {
260                     // Once we get the object file, update our module with the object file's
261                     // architecture since it might differ in vendor/os if some parts were
262                     // unknown.
263                     m_objfile_sp->GetArchitecture (m_arch);
264                 }
265                 else
266                 {
267                     error.SetErrorString ("unable to find suitable object file plug-in");
268                 }
269             }
270             else
271             {
272                 error.SetErrorStringWithFormat ("unable to read header from memory: %s", readmem_error.AsCString());
273             }
274         }
275         else
276         {
277             error.SetErrorString ("invalid process");
278         }
279     }
280     return m_objfile_sp.get();
281 }
282 
283 
284 const lldb_private::UUID&
285 Module::GetUUID()
286 {
287     Mutex::Locker locker (m_mutex);
288     if (m_did_parse_uuid == false)
289     {
290         ObjectFile * obj_file = GetObjectFile ();
291 
292         if (obj_file != NULL)
293         {
294             obj_file->GetUUID(&m_uuid);
295             m_did_parse_uuid = true;
296         }
297     }
298     return m_uuid;
299 }
300 
301 ClangASTContext &
302 Module::GetClangASTContext ()
303 {
304     Mutex::Locker locker (m_mutex);
305     if (m_did_init_ast == false)
306     {
307         ObjectFile * objfile = GetObjectFile();
308         ArchSpec object_arch;
309         if (objfile && objfile->GetArchitecture(object_arch))
310         {
311             m_did_init_ast = true;
312             m_ast.SetArchitecture (object_arch);
313         }
314     }
315     return m_ast;
316 }
317 
318 void
319 Module::ParseAllDebugSymbols()
320 {
321     Mutex::Locker locker (m_mutex);
322     uint32_t num_comp_units = GetNumCompileUnits();
323     if (num_comp_units == 0)
324         return;
325 
326     SymbolContext sc;
327     sc.module_sp = shared_from_this();
328     uint32_t cu_idx;
329     SymbolVendor *symbols = GetSymbolVendor ();
330 
331     for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++)
332     {
333         sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get();
334         if (sc.comp_unit)
335         {
336             sc.function = NULL;
337             symbols->ParseVariablesForContext(sc);
338 
339             symbols->ParseCompileUnitFunctions(sc);
340 
341             uint32_t func_idx;
342             for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx)
343             {
344                 symbols->ParseFunctionBlocks(sc);
345 
346                 // Parse the variables for this function and all its blocks
347                 symbols->ParseVariablesForContext(sc);
348             }
349 
350 
351             // Parse all types for this compile unit
352             sc.function = NULL;
353             symbols->ParseTypes(sc);
354         }
355     }
356 }
357 
358 void
359 Module::CalculateSymbolContext(SymbolContext* sc)
360 {
361     sc->module_sp = shared_from_this();
362 }
363 
364 ModuleSP
365 Module::CalculateSymbolContextModule ()
366 {
367     return shared_from_this();
368 }
369 
370 void
371 Module::DumpSymbolContext(Stream *s)
372 {
373     s->Printf(", Module{%p}", this);
374 }
375 
376 uint32_t
377 Module::GetNumCompileUnits()
378 {
379     Mutex::Locker locker (m_mutex);
380     Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this);
381     SymbolVendor *symbols = GetSymbolVendor ();
382     if (symbols)
383         return symbols->GetNumCompileUnits();
384     return 0;
385 }
386 
387 CompUnitSP
388 Module::GetCompileUnitAtIndex (uint32_t index)
389 {
390     Mutex::Locker locker (m_mutex);
391     uint32_t num_comp_units = GetNumCompileUnits ();
392     CompUnitSP cu_sp;
393 
394     if (index < num_comp_units)
395     {
396         SymbolVendor *symbols = GetSymbolVendor ();
397         if (symbols)
398             cu_sp = symbols->GetCompileUnitAtIndex(index);
399     }
400     return cu_sp;
401 }
402 
403 bool
404 Module::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr)
405 {
406     Mutex::Locker locker (m_mutex);
407     Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr);
408     ObjectFile* ofile = GetObjectFile();
409     if (ofile)
410         return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList());
411     return false;
412 }
413 
414 uint32_t
415 Module::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
416 {
417     Mutex::Locker locker (m_mutex);
418     uint32_t resolved_flags = 0;
419 
420     // Clear the result symbol context in case we don't find anything
421     sc.Clear();
422 
423     // Get the section from the section/offset address.
424     SectionSP section_sp (so_addr.GetSection());
425 
426     // Make sure the section matches this module before we try and match anything
427     if (section_sp && section_sp->GetModule().get() == this)
428     {
429         // If the section offset based address resolved itself, then this
430         // is the right module.
431         sc.module_sp = shared_from_this();
432         resolved_flags |= eSymbolContextModule;
433 
434         // Resolve the compile unit, function, block, line table or line
435         // entry if requested.
436         if (resolve_scope & eSymbolContextCompUnit    ||
437             resolve_scope & eSymbolContextFunction    ||
438             resolve_scope & eSymbolContextBlock       ||
439             resolve_scope & eSymbolContextLineEntry   )
440         {
441             SymbolVendor *symbols = GetSymbolVendor ();
442             if (symbols)
443                 resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc);
444         }
445 
446         // Resolve the symbol if requested, but don't re-look it up if we've already found it.
447         if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol))
448         {
449             ObjectFile* ofile = GetObjectFile();
450             if (ofile)
451             {
452                 Symtab *symtab = ofile->GetSymtab();
453                 if (symtab)
454                 {
455                     if (so_addr.IsSectionOffset())
456                     {
457                         sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
458                         if (sc.symbol)
459                             resolved_flags |= eSymbolContextSymbol;
460                     }
461                 }
462             }
463         }
464     }
465     return resolved_flags;
466 }
467 
468 uint32_t
469 Module::ResolveSymbolContextForFilePath
470 (
471     const char *file_path,
472     uint32_t line,
473     bool check_inlines,
474     uint32_t resolve_scope,
475     SymbolContextList& sc_list
476 )
477 {
478     FileSpec file_spec(file_path, false);
479     return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list);
480 }
481 
482 uint32_t
483 Module::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
484 {
485     Mutex::Locker locker (m_mutex);
486     Timer scoped_timer(__PRETTY_FUNCTION__,
487                        "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)",
488                        file_spec.GetDirectory().AsCString(""),
489                        file_spec.GetDirectory() ? "/" : "",
490                        file_spec.GetFilename().AsCString(""),
491                        line,
492                        check_inlines ? "yes" : "no",
493                        resolve_scope);
494 
495     const uint32_t initial_count = sc_list.GetSize();
496 
497     SymbolVendor *symbols = GetSymbolVendor  ();
498     if (symbols)
499         symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list);
500 
501     return sc_list.GetSize() - initial_count;
502 }
503 
504 
505 uint32_t
506 Module::FindGlobalVariables(const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables)
507 {
508     SymbolVendor *symbols = GetSymbolVendor ();
509     if (symbols)
510         return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables);
511     return 0;
512 }
513 uint32_t
514 Module::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
515 {
516     SymbolVendor *symbols = GetSymbolVendor ();
517     if (symbols)
518         return symbols->FindGlobalVariables(regex, append, max_matches, variables);
519     return 0;
520 }
521 
522 uint32_t
523 Module::FindCompileUnits (const FileSpec &path,
524                           bool append,
525                           SymbolContextList &sc_list)
526 {
527     if (!append)
528         sc_list.Clear();
529 
530     const uint32_t start_size = sc_list.GetSize();
531     const uint32_t num_compile_units = GetNumCompileUnits();
532     SymbolContext sc;
533     sc.module_sp = shared_from_this();
534     const bool compare_directory = path.GetDirectory();
535     for (uint32_t i=0; i<num_compile_units; ++i)
536     {
537         sc.comp_unit = GetCompileUnitAtIndex(i).get();
538         if (FileSpec::Equal (*sc.comp_unit, path, compare_directory))
539             sc_list.Append(sc);
540     }
541     return sc_list.GetSize() - start_size;
542 }
543 
544 uint32_t
545 Module::FindFunctions (const ConstString &name,
546                        const ClangNamespaceDecl *namespace_decl,
547                        uint32_t name_type_mask,
548                        bool include_symbols,
549                        bool include_inlines,
550                        bool append,
551                        SymbolContextList& sc_list)
552 {
553     if (!append)
554         sc_list.Clear();
555 
556     const uint32_t start_size = sc_list.GetSize();
557 
558     // Find all the functions (not symbols, but debug information functions...
559     SymbolVendor *symbols = GetSymbolVendor ();
560     if (symbols)
561         symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list);
562 
563     // Now check our symbol table for symbols that are code symbols if requested
564     if (include_symbols)
565     {
566         ObjectFile *objfile = GetObjectFile();
567         if (objfile)
568         {
569             Symtab *symtab = objfile->GetSymtab();
570             if (symtab)
571             {
572                 std::vector<uint32_t> symbol_indexes;
573                 symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
574                 const uint32_t num_matches = symbol_indexes.size();
575                 if (num_matches)
576                 {
577                     const bool merge_symbol_into_function = true;
578                     SymbolContext sc(this);
579                     for (uint32_t i=0; i<num_matches; i++)
580                     {
581                         sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
582                         sc_list.AppendIfUnique (sc, merge_symbol_into_function);
583                     }
584                 }
585             }
586         }
587     }
588     return sc_list.GetSize() - start_size;
589 }
590 
591 uint32_t
592 Module::FindFunctions (const RegularExpression& regex,
593                        bool include_symbols,
594                        bool include_inlines,
595                        bool append,
596                        SymbolContextList& sc_list)
597 {
598     if (!append)
599         sc_list.Clear();
600 
601     const uint32_t start_size = sc_list.GetSize();
602 
603     SymbolVendor *symbols = GetSymbolVendor ();
604     if (symbols)
605         symbols->FindFunctions(regex, include_inlines, append, sc_list);
606     // Now check our symbol table for symbols that are code symbols if requested
607     if (include_symbols)
608     {
609         ObjectFile *objfile = GetObjectFile();
610         if (objfile)
611         {
612             Symtab *symtab = objfile->GetSymtab();
613             if (symtab)
614             {
615                 std::vector<uint32_t> symbol_indexes;
616                 symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
617                 const uint32_t num_matches = symbol_indexes.size();
618                 if (num_matches)
619                 {
620                     const bool merge_symbol_into_function = true;
621                     SymbolContext sc(this);
622                     for (uint32_t i=0; i<num_matches; i++)
623                     {
624                         sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
625                         sc_list.AppendIfUnique (sc, merge_symbol_into_function);
626                     }
627                 }
628             }
629         }
630     }
631     return sc_list.GetSize() - start_size;
632 }
633 
634 uint32_t
635 Module::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types)
636 {
637     Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
638     if (sc.module_sp.get() == NULL || sc.module_sp.get() == this)
639     {
640         SymbolVendor *symbols = GetSymbolVendor ();
641         if (symbols)
642             return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types);
643     }
644     return 0;
645 }
646 
647 // depending on implementation details, type lookup might fail because of
648 // embedded spurious namespace:: prefixes. this call strips them, paying
649 // attention to the fact that a type might have namespace'd type names as
650 // arguments to templates, and those must not be stripped off
651 static const char*
652 StripTypeName(const char* name_cstr)
653 {
654     // Protect against null c string.
655     if (!name_cstr)
656         return name_cstr;
657     const char* skip_namespace = strstr(name_cstr, "::");
658     const char* template_arg_char = strchr(name_cstr, '<');
659     while (skip_namespace != NULL)
660     {
661         if (template_arg_char != NULL &&
662             skip_namespace > template_arg_char) // but namespace'd template arguments are still good to go
663             break;
664         name_cstr = skip_namespace+2;
665         skip_namespace = strstr(name_cstr, "::");
666     }
667     return name_cstr;
668 }
669 
670 uint32_t
671 Module::FindTypes (const SymbolContext& sc,  const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types)
672 {
673     uint32_t retval = FindTypes_Impl(sc, name, namespace_decl, append, max_matches, types);
674 
675     if (retval == 0)
676     {
677         const char *orig_name = name.GetCString();
678         const char *stripped = StripTypeName(orig_name);
679         // Only do this lookup if StripTypeName has stripped the name:
680         if (stripped != orig_name)
681            return FindTypes_Impl(sc, ConstString(stripped), namespace_decl, append, max_matches, types);
682         else
683             return 0;
684     }
685     else
686         return retval;
687 
688 }
689 
690 //uint32_t
691 //Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types)
692 //{
693 //  Timer scoped_timer(__PRETTY_FUNCTION__);
694 //  SymbolVendor *symbols = GetSymbolVendor ();
695 //  if (symbols)
696 //      return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types);
697 //  return 0;
698 //
699 //}
700 
701 SymbolVendor*
702 Module::GetSymbolVendor (bool can_create)
703 {
704     Mutex::Locker locker (m_mutex);
705     if (m_did_load_symbol_vendor == false && can_create)
706     {
707         ObjectFile *obj_file = GetObjectFile ();
708         if (obj_file != NULL)
709         {
710             Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
711             m_symfile_ap.reset(SymbolVendor::FindPlugin(shared_from_this()));
712             m_did_load_symbol_vendor = true;
713         }
714     }
715     return m_symfile_ap.get();
716 }
717 
718 void
719 Module::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name)
720 {
721     // Container objects whose paths do not specify a file directly can call
722     // this function to correct the file and object names.
723     m_file = file;
724     m_mod_time = file.GetModificationTime();
725     m_object_name = object_name;
726 }
727 
728 const ArchSpec&
729 Module::GetArchitecture () const
730 {
731     return m_arch;
732 }
733 
734 void
735 Module::GetDescription (Stream *s, lldb::DescriptionLevel level)
736 {
737     Mutex::Locker locker (m_mutex);
738 
739     if (level >= eDescriptionLevelFull)
740     {
741         if (m_arch.IsValid())
742             s->Printf("(%s) ", m_arch.GetArchitectureName());
743     }
744 
745     if (level == eDescriptionLevelBrief)
746     {
747         const char *filename = m_file.GetFilename().GetCString();
748         if (filename)
749             s->PutCString (filename);
750     }
751     else
752     {
753         char path[PATH_MAX];
754         if (m_file.GetPath(path, sizeof(path)))
755             s->PutCString(path);
756     }
757 
758     const char *object_name = m_object_name.GetCString();
759     if (object_name)
760         s->Printf("(%s)", object_name);
761 }
762 
763 void
764 Module::ReportError (const char *format, ...)
765 {
766     if (format && format[0])
767     {
768         StreamString strm;
769         strm.PutCString("error: ");
770         GetDescription(&strm, lldb::eDescriptionLevelBrief);
771         strm.PutChar (' ');
772         va_list args;
773         va_start (args, format);
774         strm.PrintfVarArg(format, args);
775         va_end (args);
776 
777         const int format_len = strlen(format);
778         if (format_len > 0)
779         {
780             const char last_char = format[format_len-1];
781             if (last_char != '\n' || last_char != '\r')
782                 strm.EOL();
783         }
784         Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
785 
786     }
787 }
788 
789 void
790 Module::ReportErrorIfModifyDetected (const char *format, ...)
791 {
792     if (!GetModified(true) && GetModified(false))
793     {
794         if (format)
795         {
796             StreamString strm;
797             strm.PutCString("error: the object file ");
798             GetDescription(&strm, lldb::eDescriptionLevelFull);
799             strm.PutCString (" has been modified\n");
800 
801             va_list args;
802             va_start (args, format);
803             strm.PrintfVarArg(format, args);
804             va_end (args);
805 
806             const int format_len = strlen(format);
807             if (format_len > 0)
808             {
809                 const char last_char = format[format_len-1];
810                 if (last_char != '\n' || last_char != '\r')
811                     strm.EOL();
812             }
813             strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n");
814             Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
815         }
816     }
817 }
818 
819 void
820 Module::ReportWarning (const char *format, ...)
821 {
822     if (format && format[0])
823     {
824         StreamString strm;
825         strm.PutCString("warning: ");
826         GetDescription(&strm, lldb::eDescriptionLevelFull);
827         strm.PutChar (' ');
828 
829         va_list args;
830         va_start (args, format);
831         strm.PrintfVarArg(format, args);
832         va_end (args);
833 
834         const int format_len = strlen(format);
835         if (format_len > 0)
836         {
837             const char last_char = format[format_len-1];
838             if (last_char != '\n' || last_char != '\r')
839                 strm.EOL();
840         }
841         Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str());
842     }
843 }
844 
845 void
846 Module::LogMessage (Log *log, const char *format, ...)
847 {
848     if (log)
849     {
850         StreamString log_message;
851         GetDescription(&log_message, lldb::eDescriptionLevelFull);
852         log_message.PutCString (": ");
853         va_list args;
854         va_start (args, format);
855         log_message.PrintfVarArg (format, args);
856         va_end (args);
857         log->PutCString(log_message.GetString().c_str());
858     }
859 }
860 
861 bool
862 Module::GetModified (bool use_cached_only)
863 {
864     if (m_was_modified == false && use_cached_only == false)
865     {
866         TimeValue curr_mod_time (m_file.GetModificationTime());
867         m_was_modified = curr_mod_time != m_mod_time;
868     }
869     return m_was_modified;
870 }
871 
872 bool
873 Module::SetModified (bool b)
874 {
875     const bool prev_value = m_was_modified;
876     m_was_modified = b;
877     return prev_value;
878 }
879 
880 
881 void
882 Module::Dump(Stream *s)
883 {
884     Mutex::Locker locker (m_mutex);
885     //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
886     s->Indent();
887     s->Printf("Module %s/%s%s%s%s\n",
888               m_file.GetDirectory().AsCString(),
889               m_file.GetFilename().AsCString(),
890               m_object_name ? "(" : "",
891               m_object_name ? m_object_name.GetCString() : "",
892               m_object_name ? ")" : "");
893 
894     s->IndentMore();
895     ObjectFile *objfile = GetObjectFile ();
896 
897     if (objfile)
898         objfile->Dump(s);
899 
900     SymbolVendor *symbols = GetSymbolVendor ();
901 
902     if (symbols)
903         symbols->Dump(s);
904 
905     s->IndentLess();
906 }
907 
908 
909 TypeList*
910 Module::GetTypeList ()
911 {
912     SymbolVendor *symbols = GetSymbolVendor ();
913     if (symbols)
914         return &symbols->GetTypeList();
915     return NULL;
916 }
917 
918 const ConstString &
919 Module::GetObjectName() const
920 {
921     return m_object_name;
922 }
923 
924 ObjectFile *
925 Module::GetObjectFile()
926 {
927     Mutex::Locker locker (m_mutex);
928     if (m_did_load_objfile == false)
929     {
930         m_did_load_objfile = true;
931         Timer scoped_timer(__PRETTY_FUNCTION__,
932                            "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString(""));
933         DataBufferSP file_data_sp;
934         m_objfile_sp = ObjectFile::FindPlugin (shared_from_this(),
935                                                &m_file,
936                                                m_object_offset,
937                                                m_file.GetByteSize(),
938                                                file_data_sp);
939         if (m_objfile_sp)
940         {
941 			// Once we get the object file, update our module with the object file's
942 			// architecture since it might differ in vendor/os if some parts were
943 			// unknown.
944             m_objfile_sp->GetArchitecture (m_arch);
945         }
946     }
947     return m_objfile_sp.get();
948 }
949 
950 
951 const Symbol *
952 Module::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type)
953 {
954     Timer scoped_timer(__PRETTY_FUNCTION__,
955                        "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)",
956                        name.AsCString(),
957                        symbol_type);
958     ObjectFile *objfile = GetObjectFile();
959     if (objfile)
960     {
961         Symtab *symtab = objfile->GetSymtab();
962         if (symtab)
963             return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny);
964     }
965     return NULL;
966 }
967 void
968 Module::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list)
969 {
970     // No need to protect this call using m_mutex all other method calls are
971     // already thread safe.
972 
973     size_t num_indices = symbol_indexes.size();
974     if (num_indices > 0)
975     {
976         SymbolContext sc;
977         CalculateSymbolContext (&sc);
978         for (size_t i = 0; i < num_indices; i++)
979         {
980             sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]);
981             if (sc.symbol)
982                 sc_list.Append (sc);
983         }
984     }
985 }
986 
987 size_t
988 Module::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list)
989 {
990     // No need to protect this call using m_mutex all other method calls are
991     // already thread safe.
992 
993 
994     Timer scoped_timer(__PRETTY_FUNCTION__,
995                        "Module::FindSymbolsWithNameAndType (name = %s, type = %i)",
996                        name.AsCString(),
997                        symbol_type);
998     const size_t initial_size = sc_list.GetSize();
999     ObjectFile *objfile = GetObjectFile ();
1000     if (objfile)
1001     {
1002         Symtab *symtab = objfile->GetSymtab();
1003         if (symtab)
1004         {
1005             std::vector<uint32_t> symbol_indexes;
1006             symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes);
1007             SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
1008         }
1009     }
1010     return sc_list.GetSize() - initial_size;
1011 }
1012 
1013 size_t
1014 Module::FindSymbolsMatchingRegExAndType (const RegularExpression &regex, SymbolType symbol_type, SymbolContextList &sc_list)
1015 {
1016     // No need to protect this call using m_mutex all other method calls are
1017     // already thread safe.
1018 
1019     Timer scoped_timer(__PRETTY_FUNCTION__,
1020                        "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)",
1021                        regex.GetText(),
1022                        symbol_type);
1023     const size_t initial_size = sc_list.GetSize();
1024     ObjectFile *objfile = GetObjectFile ();
1025     if (objfile)
1026     {
1027         Symtab *symtab = objfile->GetSymtab();
1028         if (symtab)
1029         {
1030             std::vector<uint32_t> symbol_indexes;
1031             symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
1032             SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
1033         }
1034     }
1035     return sc_list.GetSize() - initial_size;
1036 }
1037 
1038 const TimeValue &
1039 Module::GetModificationTime () const
1040 {
1041     return m_mod_time;
1042 }
1043 
1044 bool
1045 Module::IsExecutable ()
1046 {
1047     if (GetObjectFile() == NULL)
1048         return false;
1049     else
1050         return GetObjectFile()->IsExecutable();
1051 }
1052 
1053 bool
1054 Module::IsLoadedInTarget (Target *target)
1055 {
1056     ObjectFile *obj_file = GetObjectFile();
1057     if (obj_file)
1058     {
1059         SectionList *sections = obj_file->GetSectionList();
1060         if (sections != NULL)
1061         {
1062             size_t num_sections = sections->GetSize();
1063             for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++)
1064             {
1065                 SectionSP section_sp = sections->GetSectionAtIndex(sect_idx);
1066                 if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS)
1067                 {
1068                     return true;
1069                 }
1070             }
1071         }
1072     }
1073     return false;
1074 }
1075 bool
1076 Module::SetArchitecture (const ArchSpec &new_arch)
1077 {
1078     if (!m_arch.IsValid())
1079     {
1080         m_arch = new_arch;
1081         return true;
1082     }
1083     return m_arch == new_arch;
1084 }
1085 
1086 bool
1087 Module::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed)
1088 {
1089     changed = false;
1090     ObjectFile *image_object_file = GetObjectFile();
1091     if (image_object_file)
1092     {
1093         SectionList *section_list = image_object_file->GetSectionList ();
1094         if (section_list)
1095         {
1096             const size_t num_sections = section_list->GetSize();
1097             size_t sect_idx = 0;
1098             for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
1099             {
1100                 // Iterate through the object file sections to find the
1101                 // first section that starts of file offset zero and that
1102                 // has bytes in the file...
1103                 Section *section = section_list->GetSectionAtIndex (sect_idx).get();
1104                 if (section)
1105                 {
1106                     if (target.GetSectionLoadList().SetSectionLoadAddress (section, section->GetFileAddress() + offset))
1107                         changed = true;
1108                 }
1109             }
1110             return sect_idx > 0;
1111         }
1112     }
1113     return false;
1114 }
1115 
1116 
1117 bool
1118 Module::MatchesModuleSpec (const ModuleSpec &module_ref)
1119 {
1120     const UUID &uuid = module_ref.GetUUID();
1121 
1122     if (uuid.IsValid())
1123     {
1124         // If the UUID matches, then nothing more needs to match...
1125         if (uuid == GetUUID())
1126             return true;
1127         else
1128             return false;
1129     }
1130 
1131     const FileSpec &file_spec = module_ref.GetFileSpec();
1132     if (file_spec)
1133     {
1134         if (!FileSpec::Equal (file_spec, m_file, file_spec.GetDirectory()))
1135             return false;
1136     }
1137 
1138     const FileSpec &platform_file_spec = module_ref.GetPlatformFileSpec();
1139     if (platform_file_spec)
1140     {
1141         if (!FileSpec::Equal (platform_file_spec, m_platform_file, platform_file_spec.GetDirectory()))
1142             return false;
1143     }
1144 
1145     const ArchSpec &arch = module_ref.GetArchitecture();
1146     if (arch.IsValid())
1147     {
1148         if (m_arch != arch)
1149             return false;
1150     }
1151 
1152     const ConstString &object_name = module_ref.GetObjectName();
1153     if (object_name)
1154     {
1155         if (object_name != GetObjectName())
1156             return false;
1157     }
1158     return true;
1159 }
1160 
1161 bool
1162 Module::FindSourceFile (const FileSpec &orig_spec, FileSpec &new_spec) const
1163 {
1164     Mutex::Locker locker (m_mutex);
1165     return m_source_mappings.FindFile (orig_spec, new_spec);
1166 }
1167 
1168