130fdc8d8SChris Lattner //===-- Module.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/Core/Module.h" 1130fdc8d8SChris Lattner #include "lldb/Core/Log.h" 1230fdc8d8SChris Lattner #include "lldb/Core/ModuleList.h" 1330fdc8d8SChris Lattner #include "lldb/Core/RegularExpression.h" 14c982b3d6SGreg Clayton #include "lldb/Core/StreamString.h" 1530fdc8d8SChris Lattner #include "lldb/Core/Timer.h" 16e38a5eddSGreg Clayton #include "lldb/Host/Host.h" 1730fdc8d8SChris Lattner #include "lldb/lldb-private-log.h" 1830fdc8d8SChris Lattner #include "lldb/Symbol/ObjectFile.h" 1930fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 2030fdc8d8SChris Lattner #include "lldb/Symbol/SymbolVendor.h" 2130fdc8d8SChris Lattner 2230fdc8d8SChris Lattner using namespace lldb; 2330fdc8d8SChris Lattner using namespace lldb_private; 2430fdc8d8SChris Lattner 2565a03991SGreg Clayton // Shared pointers to modules track module lifetimes in 2665a03991SGreg Clayton // targets and in the global module, but this collection 2765a03991SGreg Clayton // will track all module objects that are still alive 2865a03991SGreg Clayton typedef std::vector<Module *> ModuleCollection; 2965a03991SGreg Clayton 3065a03991SGreg Clayton static ModuleCollection & 3165a03991SGreg Clayton GetModuleCollection() 3265a03991SGreg Clayton { 33549f7374SJim Ingham // This module collection needs to live past any module, so we could either make it a 34549f7374SJim Ingham // shared pointer in each module or just leak is. Since it is only an empty vector by 35549f7374SJim Ingham // the time all the modules have gone away, we just leak it for now. If we decide this 36549f7374SJim Ingham // is a big problem we can introduce a Finalize method that will tear everything down in 37549f7374SJim Ingham // a predictable order. 38549f7374SJim Ingham 39549f7374SJim Ingham static ModuleCollection *g_module_collection = NULL; 40549f7374SJim Ingham if (g_module_collection == NULL) 41549f7374SJim Ingham g_module_collection = new ModuleCollection(); 42549f7374SJim Ingham 43549f7374SJim Ingham return *g_module_collection; 4465a03991SGreg Clayton } 4565a03991SGreg Clayton 46*b26e6bebSGreg Clayton Mutex * 4765a03991SGreg Clayton Module::GetAllocationModuleCollectionMutex() 4865a03991SGreg Clayton { 49*b26e6bebSGreg Clayton // NOTE: The mutex below must be leaked since the global module list in 50*b26e6bebSGreg Clayton // the ModuleList class will get torn at some point, and we can't know 51*b26e6bebSGreg Clayton // if it will tear itself down before the "g_module_collection_mutex" below 52*b26e6bebSGreg Clayton // will. So we leak a Mutex object below to safeguard against that 53*b26e6bebSGreg Clayton 54*b26e6bebSGreg Clayton static Mutex *g_module_collection_mutex = NULL; 55*b26e6bebSGreg Clayton if (g_module_collection_mutex == NULL) 56*b26e6bebSGreg Clayton g_module_collection_mutex = new Mutex (Mutex::eMutexTypeRecursive); // NOTE: known leak 5765a03991SGreg Clayton return g_module_collection_mutex; 5865a03991SGreg Clayton } 5965a03991SGreg Clayton 6065a03991SGreg Clayton size_t 6165a03991SGreg Clayton Module::GetNumberAllocatedModules () 6265a03991SGreg Clayton { 6365a03991SGreg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 6465a03991SGreg Clayton return GetModuleCollection().size(); 6565a03991SGreg Clayton } 6665a03991SGreg Clayton 6765a03991SGreg Clayton Module * 6865a03991SGreg Clayton Module::GetAllocatedModuleAtIndex (size_t idx) 6965a03991SGreg Clayton { 7065a03991SGreg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 7165a03991SGreg Clayton ModuleCollection &modules = GetModuleCollection(); 7265a03991SGreg Clayton if (idx < modules.size()) 7365a03991SGreg Clayton return modules[idx]; 7465a03991SGreg Clayton return NULL; 7565a03991SGreg Clayton } 7665a03991SGreg Clayton 7765a03991SGreg Clayton 7865a03991SGreg Clayton 7965a03991SGreg Clayton 8030fdc8d8SChris Lattner Module::Module(const FileSpec& file_spec, const ArchSpec& arch, const ConstString *object_name, off_t object_offset) : 8130fdc8d8SChris Lattner m_mutex (Mutex::eMutexTypeRecursive), 8230fdc8d8SChris Lattner m_mod_time (file_spec.GetModificationTime()), 8330fdc8d8SChris Lattner m_arch (arch), 8430fdc8d8SChris Lattner m_uuid (), 8530fdc8d8SChris Lattner m_file (file_spec), 8632e0a750SGreg Clayton m_platform_file(), 8730fdc8d8SChris Lattner m_object_name (), 888b82f087SGreg Clayton m_object_offset (object_offset), 89762f7135SGreg Clayton m_objfile_sp (), 90e83e731eSGreg Clayton m_symfile_ap (), 916beaaa68SGreg Clayton m_ast (), 92e83e731eSGreg Clayton m_did_load_objfile (false), 93e83e731eSGreg Clayton m_did_load_symbol_vendor (false), 94e83e731eSGreg Clayton m_did_parse_uuid (false), 956beaaa68SGreg Clayton m_did_init_ast (false), 96e38a5eddSGreg Clayton m_is_dynamic_loader_module (false), 97e38a5eddSGreg Clayton m_was_modified (false) 9830fdc8d8SChris Lattner { 9965a03991SGreg Clayton // Scope for locker below... 10065a03991SGreg Clayton { 10165a03991SGreg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 10265a03991SGreg Clayton GetModuleCollection().push_back(this); 10365a03991SGreg Clayton } 10465a03991SGreg Clayton 10530fdc8d8SChris Lattner if (object_name) 10630fdc8d8SChris Lattner m_object_name = *object_name; 1072d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 10830fdc8d8SChris Lattner if (log) 10930fdc8d8SChris Lattner log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", 11030fdc8d8SChris Lattner this, 11164195a2cSGreg Clayton m_arch.GetArchitectureName(), 11230fdc8d8SChris Lattner m_file.GetDirectory().AsCString(""), 11330fdc8d8SChris Lattner m_file.GetFilename().AsCString(""), 11430fdc8d8SChris Lattner m_object_name.IsEmpty() ? "" : "(", 11530fdc8d8SChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 11630fdc8d8SChris Lattner m_object_name.IsEmpty() ? "" : ")"); 11730fdc8d8SChris Lattner } 11830fdc8d8SChris Lattner 11930fdc8d8SChris Lattner Module::~Module() 12030fdc8d8SChris Lattner { 12165a03991SGreg Clayton // Scope for locker below... 12265a03991SGreg Clayton { 12365a03991SGreg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 12465a03991SGreg Clayton ModuleCollection &modules = GetModuleCollection(); 12565a03991SGreg Clayton ModuleCollection::iterator end = modules.end(); 12665a03991SGreg Clayton ModuleCollection::iterator pos = std::find(modules.begin(), end, this); 12765a03991SGreg Clayton if (pos != end) 12865a03991SGreg Clayton modules.erase(pos); 12965a03991SGreg Clayton } 1302d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 13130fdc8d8SChris Lattner if (log) 13230fdc8d8SChris Lattner log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')", 13330fdc8d8SChris Lattner this, 13464195a2cSGreg Clayton m_arch.GetArchitectureName(), 13530fdc8d8SChris Lattner m_file.GetDirectory().AsCString(""), 13630fdc8d8SChris Lattner m_file.GetFilename().AsCString(""), 13730fdc8d8SChris Lattner m_object_name.IsEmpty() ? "" : "(", 13830fdc8d8SChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 13930fdc8d8SChris Lattner m_object_name.IsEmpty() ? "" : ")"); 1406beaaa68SGreg Clayton // Release any auto pointers before we start tearing down our member 1416beaaa68SGreg Clayton // variables since the object file and symbol files might need to make 1426beaaa68SGreg Clayton // function calls back into this module object. The ordering is important 1436beaaa68SGreg Clayton // here because symbol files can require the module object file. So we tear 1446beaaa68SGreg Clayton // down the symbol file first, then the object file. 1456beaaa68SGreg Clayton m_symfile_ap.reset(); 146762f7135SGreg Clayton m_objfile_sp.reset(); 14730fdc8d8SChris Lattner } 14830fdc8d8SChris Lattner 14930fdc8d8SChris Lattner 15060830268SGreg Clayton const lldb_private::UUID& 15130fdc8d8SChris Lattner Module::GetUUID() 15230fdc8d8SChris Lattner { 15330fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 154e83e731eSGreg Clayton if (m_did_parse_uuid == false) 15530fdc8d8SChris Lattner { 15630fdc8d8SChris Lattner ObjectFile * obj_file = GetObjectFile (); 15730fdc8d8SChris Lattner 15830fdc8d8SChris Lattner if (obj_file != NULL) 15930fdc8d8SChris Lattner { 16030fdc8d8SChris Lattner obj_file->GetUUID(&m_uuid); 161e83e731eSGreg Clayton m_did_parse_uuid = true; 16230fdc8d8SChris Lattner } 16330fdc8d8SChris Lattner } 16430fdc8d8SChris Lattner return m_uuid; 16530fdc8d8SChris Lattner } 16630fdc8d8SChris Lattner 1676beaaa68SGreg Clayton ClangASTContext & 1686beaaa68SGreg Clayton Module::GetClangASTContext () 1696beaaa68SGreg Clayton { 1706beaaa68SGreg Clayton Mutex::Locker locker (m_mutex); 1716beaaa68SGreg Clayton if (m_did_init_ast == false) 1726beaaa68SGreg Clayton { 1736beaaa68SGreg Clayton ObjectFile * objfile = GetObjectFile(); 174514487e8SGreg Clayton ArchSpec object_arch; 175514487e8SGreg Clayton if (objfile && objfile->GetArchitecture(object_arch)) 1766beaaa68SGreg Clayton { 1776beaaa68SGreg Clayton m_did_init_ast = true; 178514487e8SGreg Clayton m_ast.SetArchitecture (object_arch); 1796beaaa68SGreg Clayton } 1806beaaa68SGreg Clayton } 1816beaaa68SGreg Clayton return m_ast; 1826beaaa68SGreg Clayton } 1836beaaa68SGreg Clayton 18430fdc8d8SChris Lattner void 18530fdc8d8SChris Lattner Module::ParseAllDebugSymbols() 18630fdc8d8SChris Lattner { 18730fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 18830fdc8d8SChris Lattner uint32_t num_comp_units = GetNumCompileUnits(); 18930fdc8d8SChris Lattner if (num_comp_units == 0) 19030fdc8d8SChris Lattner return; 19130fdc8d8SChris Lattner 192a2eee184SGreg Clayton SymbolContext sc; 193a2eee184SGreg Clayton sc.module_sp = this; 19430fdc8d8SChris Lattner uint32_t cu_idx; 19530fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 19630fdc8d8SChris Lattner 19730fdc8d8SChris Lattner for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++) 19830fdc8d8SChris Lattner { 19930fdc8d8SChris Lattner sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get(); 20030fdc8d8SChris Lattner if (sc.comp_unit) 20130fdc8d8SChris Lattner { 20230fdc8d8SChris Lattner sc.function = NULL; 20330fdc8d8SChris Lattner symbols->ParseVariablesForContext(sc); 20430fdc8d8SChris Lattner 20530fdc8d8SChris Lattner symbols->ParseCompileUnitFunctions(sc); 20630fdc8d8SChris Lattner 20730fdc8d8SChris Lattner uint32_t func_idx; 20830fdc8d8SChris Lattner for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx) 20930fdc8d8SChris Lattner { 21030fdc8d8SChris Lattner symbols->ParseFunctionBlocks(sc); 21130fdc8d8SChris Lattner 21230fdc8d8SChris Lattner // Parse the variables for this function and all its blocks 21330fdc8d8SChris Lattner symbols->ParseVariablesForContext(sc); 21430fdc8d8SChris Lattner } 21530fdc8d8SChris Lattner 21630fdc8d8SChris Lattner 21730fdc8d8SChris Lattner // Parse all types for this compile unit 21830fdc8d8SChris Lattner sc.function = NULL; 21930fdc8d8SChris Lattner symbols->ParseTypes(sc); 22030fdc8d8SChris Lattner } 22130fdc8d8SChris Lattner } 22230fdc8d8SChris Lattner } 22330fdc8d8SChris Lattner 22430fdc8d8SChris Lattner void 22530fdc8d8SChris Lattner Module::CalculateSymbolContext(SymbolContext* sc) 22630fdc8d8SChris Lattner { 227a2eee184SGreg Clayton sc->module_sp = this; 22830fdc8d8SChris Lattner } 22930fdc8d8SChris Lattner 2307e9b1fd0SGreg Clayton Module * 2317e9b1fd0SGreg Clayton Module::CalculateSymbolContextModule () 2327e9b1fd0SGreg Clayton { 2337e9b1fd0SGreg Clayton return this; 2347e9b1fd0SGreg Clayton } 2357e9b1fd0SGreg Clayton 23630fdc8d8SChris Lattner void 23730fdc8d8SChris Lattner Module::DumpSymbolContext(Stream *s) 23830fdc8d8SChris Lattner { 239fd54b368SJason Molenda s->Printf(", Module{%p}", this); 24030fdc8d8SChris Lattner } 24130fdc8d8SChris Lattner 24230fdc8d8SChris Lattner uint32_t 24330fdc8d8SChris Lattner Module::GetNumCompileUnits() 24430fdc8d8SChris Lattner { 24530fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 24630fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this); 24730fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 24830fdc8d8SChris Lattner if (symbols) 24930fdc8d8SChris Lattner return symbols->GetNumCompileUnits(); 25030fdc8d8SChris Lattner return 0; 25130fdc8d8SChris Lattner } 25230fdc8d8SChris Lattner 25330fdc8d8SChris Lattner CompUnitSP 25430fdc8d8SChris Lattner Module::GetCompileUnitAtIndex (uint32_t index) 25530fdc8d8SChris Lattner { 25630fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 25730fdc8d8SChris Lattner uint32_t num_comp_units = GetNumCompileUnits (); 25830fdc8d8SChris Lattner CompUnitSP cu_sp; 25930fdc8d8SChris Lattner 26030fdc8d8SChris Lattner if (index < num_comp_units) 26130fdc8d8SChris Lattner { 26230fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 26330fdc8d8SChris Lattner if (symbols) 26430fdc8d8SChris Lattner cu_sp = symbols->GetCompileUnitAtIndex(index); 26530fdc8d8SChris Lattner } 26630fdc8d8SChris Lattner return cu_sp; 26730fdc8d8SChris Lattner } 26830fdc8d8SChris Lattner 26930fdc8d8SChris Lattner bool 27030fdc8d8SChris Lattner Module::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr) 27130fdc8d8SChris Lattner { 27230fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 27330fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr); 27430fdc8d8SChris Lattner ObjectFile* ofile = GetObjectFile(); 27530fdc8d8SChris Lattner if (ofile) 27630fdc8d8SChris Lattner return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList()); 27730fdc8d8SChris Lattner return false; 27830fdc8d8SChris Lattner } 27930fdc8d8SChris Lattner 28030fdc8d8SChris Lattner uint32_t 28130fdc8d8SChris Lattner Module::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 28230fdc8d8SChris Lattner { 28330fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 28430fdc8d8SChris Lattner uint32_t resolved_flags = 0; 28530fdc8d8SChris Lattner 28630fdc8d8SChris Lattner // Clear the result symbol context in case we don't find anything 28730fdc8d8SChris Lattner sc.Clear(); 28830fdc8d8SChris Lattner 28930fdc8d8SChris Lattner // Get the section from the section/offset address. 29030fdc8d8SChris Lattner const Section *section = so_addr.GetSection(); 29130fdc8d8SChris Lattner 29230fdc8d8SChris Lattner // Make sure the section matches this module before we try and match anything 29330fdc8d8SChris Lattner if (section && section->GetModule() == this) 29430fdc8d8SChris Lattner { 29530fdc8d8SChris Lattner // If the section offset based address resolved itself, then this 29630fdc8d8SChris Lattner // is the right module. 297a2eee184SGreg Clayton sc.module_sp = this; 29830fdc8d8SChris Lattner resolved_flags |= eSymbolContextModule; 29930fdc8d8SChris Lattner 30030fdc8d8SChris Lattner // Resolve the compile unit, function, block, line table or line 30130fdc8d8SChris Lattner // entry if requested. 30230fdc8d8SChris Lattner if (resolve_scope & eSymbolContextCompUnit || 30330fdc8d8SChris Lattner resolve_scope & eSymbolContextFunction || 30430fdc8d8SChris Lattner resolve_scope & eSymbolContextBlock || 30530fdc8d8SChris Lattner resolve_scope & eSymbolContextLineEntry ) 30630fdc8d8SChris Lattner { 30730fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 30830fdc8d8SChris Lattner if (symbols) 30930fdc8d8SChris Lattner resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc); 31030fdc8d8SChris Lattner } 31130fdc8d8SChris Lattner 312680e1778SJim Ingham // Resolve the symbol if requested, but don't re-look it up if we've already found it. 313680e1778SJim Ingham if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol)) 31430fdc8d8SChris Lattner { 31530fdc8d8SChris Lattner ObjectFile* ofile = GetObjectFile(); 31630fdc8d8SChris Lattner if (ofile) 31730fdc8d8SChris Lattner { 31830fdc8d8SChris Lattner Symtab *symtab = ofile->GetSymtab(); 31930fdc8d8SChris Lattner if (symtab) 32030fdc8d8SChris Lattner { 32130fdc8d8SChris Lattner if (so_addr.IsSectionOffset()) 32230fdc8d8SChris Lattner { 32330fdc8d8SChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress()); 32430fdc8d8SChris Lattner if (sc.symbol) 32530fdc8d8SChris Lattner resolved_flags |= eSymbolContextSymbol; 32630fdc8d8SChris Lattner } 32730fdc8d8SChris Lattner } 32830fdc8d8SChris Lattner } 32930fdc8d8SChris Lattner } 33030fdc8d8SChris Lattner } 33130fdc8d8SChris Lattner return resolved_flags; 33230fdc8d8SChris Lattner } 33330fdc8d8SChris Lattner 33430fdc8d8SChris Lattner uint32_t 335274060b6SGreg Clayton Module::ResolveSymbolContextForFilePath 336274060b6SGreg Clayton ( 337274060b6SGreg Clayton const char *file_path, 338274060b6SGreg Clayton uint32_t line, 339274060b6SGreg Clayton bool check_inlines, 340274060b6SGreg Clayton uint32_t resolve_scope, 341274060b6SGreg Clayton SymbolContextList& sc_list 342274060b6SGreg Clayton ) 34330fdc8d8SChris Lattner { 344274060b6SGreg Clayton FileSpec file_spec(file_path, false); 34530fdc8d8SChris Lattner return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list); 34630fdc8d8SChris Lattner } 34730fdc8d8SChris Lattner 34830fdc8d8SChris Lattner uint32_t 34930fdc8d8SChris Lattner Module::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 35030fdc8d8SChris Lattner { 35130fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 35230fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 35330fdc8d8SChris Lattner "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)", 35430fdc8d8SChris Lattner file_spec.GetDirectory().AsCString(""), 35530fdc8d8SChris Lattner file_spec.GetDirectory() ? "/" : "", 35630fdc8d8SChris Lattner file_spec.GetFilename().AsCString(""), 35730fdc8d8SChris Lattner line, 35830fdc8d8SChris Lattner check_inlines ? "yes" : "no", 35930fdc8d8SChris Lattner resolve_scope); 36030fdc8d8SChris Lattner 36130fdc8d8SChris Lattner const uint32_t initial_count = sc_list.GetSize(); 36230fdc8d8SChris Lattner 36330fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 36430fdc8d8SChris Lattner if (symbols) 36530fdc8d8SChris Lattner symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list); 36630fdc8d8SChris Lattner 36730fdc8d8SChris Lattner return sc_list.GetSize() - initial_count; 36830fdc8d8SChris Lattner } 36930fdc8d8SChris Lattner 37030fdc8d8SChris Lattner 37130fdc8d8SChris Lattner uint32_t 372b6d70ebcSSean Callanan Module::FindGlobalVariables(const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables) 37330fdc8d8SChris Lattner { 37430fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 37530fdc8d8SChris Lattner if (symbols) 376213fdb8bSSean Callanan return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables); 37730fdc8d8SChris Lattner return 0; 37830fdc8d8SChris Lattner } 37930fdc8d8SChris Lattner uint32_t 38030fdc8d8SChris Lattner Module::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 38130fdc8d8SChris Lattner { 38230fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 38330fdc8d8SChris Lattner if (symbols) 38430fdc8d8SChris Lattner return symbols->FindGlobalVariables(regex, append, max_matches, variables); 38530fdc8d8SChris Lattner return 0; 38630fdc8d8SChris Lattner } 38730fdc8d8SChris Lattner 38830fdc8d8SChris Lattner uint32_t 389644247c1SGreg Clayton Module::FindCompileUnits (const FileSpec &path, 390644247c1SGreg Clayton bool append, 391644247c1SGreg Clayton SymbolContextList &sc_list) 392644247c1SGreg Clayton { 393644247c1SGreg Clayton if (!append) 394644247c1SGreg Clayton sc_list.Clear(); 395644247c1SGreg Clayton 396644247c1SGreg Clayton const uint32_t start_size = sc_list.GetSize(); 397644247c1SGreg Clayton const uint32_t num_compile_units = GetNumCompileUnits(); 398644247c1SGreg Clayton SymbolContext sc; 399a2eee184SGreg Clayton sc.module_sp = this; 400644247c1SGreg Clayton const bool compare_directory = path.GetDirectory(); 401644247c1SGreg Clayton for (uint32_t i=0; i<num_compile_units; ++i) 402644247c1SGreg Clayton { 403644247c1SGreg Clayton sc.comp_unit = GetCompileUnitAtIndex(i).get(); 404644247c1SGreg Clayton if (FileSpec::Equal (*sc.comp_unit, path, compare_directory)) 405644247c1SGreg Clayton sc_list.Append(sc); 406644247c1SGreg Clayton } 407644247c1SGreg Clayton return sc_list.GetSize() - start_size; 408644247c1SGreg Clayton } 409644247c1SGreg Clayton 410644247c1SGreg Clayton uint32_t 411931180e6SGreg Clayton Module::FindFunctions (const ConstString &name, 412b6d70ebcSSean Callanan const ClangNamespaceDecl *namespace_decl, 413931180e6SGreg Clayton uint32_t name_type_mask, 414931180e6SGreg Clayton bool include_symbols, 415931180e6SGreg Clayton bool append, 416931180e6SGreg Clayton SymbolContextList& sc_list) 41730fdc8d8SChris Lattner { 418931180e6SGreg Clayton if (!append) 419931180e6SGreg Clayton sc_list.Clear(); 420931180e6SGreg Clayton 421931180e6SGreg Clayton const uint32_t start_size = sc_list.GetSize(); 422931180e6SGreg Clayton 423931180e6SGreg Clayton // Find all the functions (not symbols, but debug information functions... 42430fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 42530fdc8d8SChris Lattner if (symbols) 426213fdb8bSSean Callanan symbols->FindFunctions(name, namespace_decl, name_type_mask, append, sc_list); 427931180e6SGreg Clayton 428931180e6SGreg Clayton // Now check our symbol table for symbols that are code symbols if requested 429931180e6SGreg Clayton if (include_symbols) 430931180e6SGreg Clayton { 431931180e6SGreg Clayton ObjectFile *objfile = GetObjectFile(); 432931180e6SGreg Clayton if (objfile) 433931180e6SGreg Clayton { 434931180e6SGreg Clayton Symtab *symtab = objfile->GetSymtab(); 435931180e6SGreg Clayton if (symtab) 436931180e6SGreg Clayton { 437931180e6SGreg Clayton std::vector<uint32_t> symbol_indexes; 438931180e6SGreg Clayton symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 439931180e6SGreg Clayton const uint32_t num_matches = symbol_indexes.size(); 440931180e6SGreg Clayton if (num_matches) 441931180e6SGreg Clayton { 442357132ebSGreg Clayton const bool merge_symbol_into_function = true; 443931180e6SGreg Clayton SymbolContext sc(this); 444931180e6SGreg Clayton for (uint32_t i=0; i<num_matches; i++) 445931180e6SGreg Clayton { 446931180e6SGreg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 447357132ebSGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 448931180e6SGreg Clayton } 449931180e6SGreg Clayton } 450931180e6SGreg Clayton } 451931180e6SGreg Clayton } 452931180e6SGreg Clayton } 453931180e6SGreg Clayton return sc_list.GetSize() - start_size; 45430fdc8d8SChris Lattner } 45530fdc8d8SChris Lattner 45630fdc8d8SChris Lattner uint32_t 457931180e6SGreg Clayton Module::FindFunctions (const RegularExpression& regex, 458931180e6SGreg Clayton bool include_symbols, 459931180e6SGreg Clayton bool append, 460931180e6SGreg Clayton SymbolContextList& sc_list) 46130fdc8d8SChris Lattner { 462931180e6SGreg Clayton if (!append) 463931180e6SGreg Clayton sc_list.Clear(); 464931180e6SGreg Clayton 465931180e6SGreg Clayton const uint32_t start_size = sc_list.GetSize(); 466931180e6SGreg Clayton 46730fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 46830fdc8d8SChris Lattner if (symbols) 469832332d7SJim Ingham symbols->FindFunctions(regex, append, sc_list); 470931180e6SGreg Clayton // Now check our symbol table for symbols that are code symbols if requested 471931180e6SGreg Clayton if (include_symbols) 472931180e6SGreg Clayton { 473931180e6SGreg Clayton ObjectFile *objfile = GetObjectFile(); 474931180e6SGreg Clayton if (objfile) 475931180e6SGreg Clayton { 476931180e6SGreg Clayton Symtab *symtab = objfile->GetSymtab(); 477931180e6SGreg Clayton if (symtab) 478931180e6SGreg Clayton { 479931180e6SGreg Clayton std::vector<uint32_t> symbol_indexes; 480931180e6SGreg Clayton symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 481931180e6SGreg Clayton const uint32_t num_matches = symbol_indexes.size(); 482931180e6SGreg Clayton if (num_matches) 483931180e6SGreg Clayton { 484357132ebSGreg Clayton const bool merge_symbol_into_function = true; 485931180e6SGreg Clayton SymbolContext sc(this); 486931180e6SGreg Clayton for (uint32_t i=0; i<num_matches; i++) 487931180e6SGreg Clayton { 488931180e6SGreg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 489357132ebSGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 490931180e6SGreg Clayton } 491931180e6SGreg Clayton } 492931180e6SGreg Clayton } 493931180e6SGreg Clayton } 494931180e6SGreg Clayton } 495931180e6SGreg Clayton return sc_list.GetSize() - start_size; 49630fdc8d8SChris Lattner } 49730fdc8d8SChris Lattner 4983504eee8SGreg Clayton uint32_t 499213fdb8bSSean Callanan Module::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types) 5003504eee8SGreg Clayton { 5013504eee8SGreg Clayton Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 5023504eee8SGreg Clayton if (sc.module_sp.get() == NULL || sc.module_sp.get() == this) 5033504eee8SGreg Clayton { 5043504eee8SGreg Clayton SymbolVendor *symbols = GetSymbolVendor (); 5053504eee8SGreg Clayton if (symbols) 506213fdb8bSSean Callanan return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types); 5073504eee8SGreg Clayton } 5083504eee8SGreg Clayton return 0; 5093504eee8SGreg Clayton } 5103504eee8SGreg Clayton 5116f3533fbSEnrico Granata // depending on implementation details, type lookup might fail because of 5126f3533fbSEnrico Granata // embedded spurious namespace:: prefixes. this call strips them, paying 5136f3533fbSEnrico Granata // attention to the fact that a type might have namespace'd type names as 5146f3533fbSEnrico Granata // arguments to templates, and those must not be stripped off 5156f3533fbSEnrico Granata static const char* 5166f3533fbSEnrico Granata StripTypeName(const char* name_cstr) 5176f3533fbSEnrico Granata { 518c6770763SJohnny Chen // Protect against null c string. 519c6770763SJohnny Chen if (!name_cstr) 520c6770763SJohnny Chen return name_cstr; 5216f3533fbSEnrico Granata const char* skip_namespace = strstr(name_cstr, "::"); 5226f3533fbSEnrico Granata const char* template_arg_char = strchr(name_cstr, '<'); 5236f3533fbSEnrico Granata while (skip_namespace != NULL) 5246f3533fbSEnrico Granata { 5256f3533fbSEnrico Granata if (template_arg_char != NULL && 5266f3533fbSEnrico Granata skip_namespace > template_arg_char) // but namespace'd template arguments are still good to go 5276f3533fbSEnrico Granata break; 5286f3533fbSEnrico Granata name_cstr = skip_namespace+2; 5296f3533fbSEnrico Granata skip_namespace = strstr(name_cstr, "::"); 5306f3533fbSEnrico Granata } 5316f3533fbSEnrico Granata return name_cstr; 5326f3533fbSEnrico Granata } 5336f3533fbSEnrico Granata 5346f3533fbSEnrico Granata uint32_t 535b6d70ebcSSean Callanan Module::FindTypes (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types) 5366f3533fbSEnrico Granata { 537213fdb8bSSean Callanan uint32_t retval = FindTypes_Impl(sc, name, namespace_decl, append, max_matches, types); 5386f3533fbSEnrico Granata 5396f3533fbSEnrico Granata if (retval == 0) 5406f3533fbSEnrico Granata { 54150b3d507SJim Ingham const char *orig_name = name.GetCString(); 54250b3d507SJim Ingham const char *stripped = StripTypeName(orig_name); 54350b3d507SJim Ingham // Only do this lookup if StripTypeName has stripped the name: 54450b3d507SJim Ingham if (stripped != orig_name) 545213fdb8bSSean Callanan return FindTypes_Impl(sc, ConstString(stripped), namespace_decl, append, max_matches, types); 54650b3d507SJim Ingham else 54750b3d507SJim Ingham return 0; 5486f3533fbSEnrico Granata } 5496f3533fbSEnrico Granata else 5506f3533fbSEnrico Granata return retval; 5516f3533fbSEnrico Granata 5526f3533fbSEnrico Granata } 5536f3533fbSEnrico Granata 55430fdc8d8SChris Lattner //uint32_t 55530fdc8d8SChris Lattner //Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types) 55630fdc8d8SChris Lattner //{ 55730fdc8d8SChris Lattner // Timer scoped_timer(__PRETTY_FUNCTION__); 55830fdc8d8SChris Lattner // SymbolVendor *symbols = GetSymbolVendor (); 55930fdc8d8SChris Lattner // if (symbols) 56030fdc8d8SChris Lattner // return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types); 56130fdc8d8SChris Lattner // return 0; 56230fdc8d8SChris Lattner // 56330fdc8d8SChris Lattner //} 56430fdc8d8SChris Lattner 56530fdc8d8SChris Lattner SymbolVendor* 56630fdc8d8SChris Lattner Module::GetSymbolVendor (bool can_create) 56730fdc8d8SChris Lattner { 56830fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 569e83e731eSGreg Clayton if (m_did_load_symbol_vendor == false && can_create) 57030fdc8d8SChris Lattner { 57130fdc8d8SChris Lattner ObjectFile *obj_file = GetObjectFile (); 57230fdc8d8SChris Lattner if (obj_file != NULL) 57330fdc8d8SChris Lattner { 57430fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 57530fdc8d8SChris Lattner m_symfile_ap.reset(SymbolVendor::FindPlugin(this)); 576e83e731eSGreg Clayton m_did_load_symbol_vendor = true; 57730fdc8d8SChris Lattner } 57830fdc8d8SChris Lattner } 57930fdc8d8SChris Lattner return m_symfile_ap.get(); 58030fdc8d8SChris Lattner } 58130fdc8d8SChris Lattner 58230fdc8d8SChris Lattner void 58330fdc8d8SChris Lattner Module::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name) 58430fdc8d8SChris Lattner { 58530fdc8d8SChris Lattner // Container objects whose paths do not specify a file directly can call 58630fdc8d8SChris Lattner // this function to correct the file and object names. 58730fdc8d8SChris Lattner m_file = file; 58830fdc8d8SChris Lattner m_mod_time = file.GetModificationTime(); 58930fdc8d8SChris Lattner m_object_name = object_name; 59030fdc8d8SChris Lattner } 59130fdc8d8SChris Lattner 59230fdc8d8SChris Lattner const ArchSpec& 59330fdc8d8SChris Lattner Module::GetArchitecture () const 59430fdc8d8SChris Lattner { 59530fdc8d8SChris Lattner return m_arch; 59630fdc8d8SChris Lattner } 59730fdc8d8SChris Lattner 59830fdc8d8SChris Lattner void 599c982b3d6SGreg Clayton Module::GetDescription (Stream *s, lldb::DescriptionLevel level) 600ceb6b139SCaroline Tice { 601ceb6b139SCaroline Tice Mutex::Locker locker (m_mutex); 602ceb6b139SCaroline Tice 603c982b3d6SGreg Clayton if (level >= eDescriptionLevelFull) 604c982b3d6SGreg Clayton { 605cfd1acedSGreg Clayton if (m_arch.IsValid()) 60664195a2cSGreg Clayton s->Printf("(%s) ", m_arch.GetArchitectureName()); 607c982b3d6SGreg Clayton } 608ceb6b139SCaroline Tice 609c982b3d6SGreg Clayton if (level == eDescriptionLevelBrief) 610c982b3d6SGreg Clayton { 611c982b3d6SGreg Clayton const char *filename = m_file.GetFilename().GetCString(); 612c982b3d6SGreg Clayton if (filename) 613c982b3d6SGreg Clayton s->PutCString (filename); 614c982b3d6SGreg Clayton } 615c982b3d6SGreg Clayton else 616c982b3d6SGreg Clayton { 617cfd1acedSGreg Clayton char path[PATH_MAX]; 618cfd1acedSGreg Clayton if (m_file.GetPath(path, sizeof(path))) 619cfd1acedSGreg Clayton s->PutCString(path); 620c982b3d6SGreg Clayton } 621cfd1acedSGreg Clayton 622cfd1acedSGreg Clayton const char *object_name = m_object_name.GetCString(); 623cfd1acedSGreg Clayton if (object_name) 624cfd1acedSGreg Clayton s->Printf("(%s)", object_name); 625ceb6b139SCaroline Tice } 626ceb6b139SCaroline Tice 627ceb6b139SCaroline Tice void 628c982b3d6SGreg Clayton Module::ReportError (const char *format, ...) 629c982b3d6SGreg Clayton { 630e38a5eddSGreg Clayton if (format && format[0]) 631e38a5eddSGreg Clayton { 632e38a5eddSGreg Clayton StreamString strm; 633e38a5eddSGreg Clayton strm.PutCString("error: "); 634e38a5eddSGreg Clayton GetDescription(&strm, lldb::eDescriptionLevelBrief); 6358b35334eSGreg Clayton strm.PutChar (' '); 636c982b3d6SGreg Clayton va_list args; 637c982b3d6SGreg Clayton va_start (args, format); 638e38a5eddSGreg Clayton strm.PrintfVarArg(format, args); 639c982b3d6SGreg Clayton va_end (args); 640e38a5eddSGreg Clayton 641e38a5eddSGreg Clayton const int format_len = strlen(format); 642e38a5eddSGreg Clayton if (format_len > 0) 643e38a5eddSGreg Clayton { 644e38a5eddSGreg Clayton const char last_char = format[format_len-1]; 645e38a5eddSGreg Clayton if (last_char != '\n' || last_char != '\r') 646e38a5eddSGreg Clayton strm.EOL(); 647e38a5eddSGreg Clayton } 648e38a5eddSGreg Clayton Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); 649e38a5eddSGreg Clayton 650e38a5eddSGreg Clayton } 651e38a5eddSGreg Clayton } 652e38a5eddSGreg Clayton 653e38a5eddSGreg Clayton void 654e38a5eddSGreg Clayton Module::ReportErrorIfModifyDetected (const char *format, ...) 655e38a5eddSGreg Clayton { 656e38a5eddSGreg Clayton if (!GetModified(true) && GetModified(false)) 657e38a5eddSGreg Clayton { 658e38a5eddSGreg Clayton if (format) 659e38a5eddSGreg Clayton { 660e38a5eddSGreg Clayton StreamString strm; 661e38a5eddSGreg Clayton strm.PutCString("error: the object file "); 662e38a5eddSGreg Clayton GetDescription(&strm, lldb::eDescriptionLevelFull); 663e38a5eddSGreg Clayton strm.PutCString (" has been modified\n"); 664e38a5eddSGreg Clayton 665e38a5eddSGreg Clayton va_list args; 666e38a5eddSGreg Clayton va_start (args, format); 667e38a5eddSGreg Clayton strm.PrintfVarArg(format, args); 668e38a5eddSGreg Clayton va_end (args); 669e38a5eddSGreg Clayton 670e38a5eddSGreg Clayton const int format_len = strlen(format); 671e38a5eddSGreg Clayton if (format_len > 0) 672e38a5eddSGreg Clayton { 673e38a5eddSGreg Clayton const char last_char = format[format_len-1]; 674e38a5eddSGreg Clayton if (last_char != '\n' || last_char != '\r') 675e38a5eddSGreg Clayton strm.EOL(); 676e38a5eddSGreg Clayton } 677e38a5eddSGreg Clayton strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n"); 678e38a5eddSGreg Clayton Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); 679e38a5eddSGreg Clayton } 680e38a5eddSGreg Clayton } 681c982b3d6SGreg Clayton } 682c982b3d6SGreg Clayton 683c982b3d6SGreg Clayton void 684c982b3d6SGreg Clayton Module::ReportWarning (const char *format, ...) 685c982b3d6SGreg Clayton { 686e38a5eddSGreg Clayton if (format && format[0]) 687e38a5eddSGreg Clayton { 688e38a5eddSGreg Clayton StreamString strm; 689e38a5eddSGreg Clayton strm.PutCString("warning: "); 6908b35334eSGreg Clayton GetDescription(&strm, lldb::eDescriptionLevelFull); 6918b35334eSGreg Clayton strm.PutChar (' '); 692c982b3d6SGreg Clayton 693c982b3d6SGreg Clayton va_list args; 694c982b3d6SGreg Clayton va_start (args, format); 695e38a5eddSGreg Clayton strm.PrintfVarArg(format, args); 696c982b3d6SGreg Clayton va_end (args); 697e38a5eddSGreg Clayton 698e38a5eddSGreg Clayton const int format_len = strlen(format); 699e38a5eddSGreg Clayton if (format_len > 0) 700e38a5eddSGreg Clayton { 701e38a5eddSGreg Clayton const char last_char = format[format_len-1]; 702e38a5eddSGreg Clayton if (last_char != '\n' || last_char != '\r') 703e38a5eddSGreg Clayton strm.EOL(); 704e38a5eddSGreg Clayton } 705e38a5eddSGreg Clayton Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str()); 706e38a5eddSGreg Clayton } 707c982b3d6SGreg Clayton } 708c982b3d6SGreg Clayton 709c982b3d6SGreg Clayton void 710c982b3d6SGreg Clayton Module::LogMessage (Log *log, const char *format, ...) 711c982b3d6SGreg Clayton { 712c982b3d6SGreg Clayton if (log) 713c982b3d6SGreg Clayton { 714c982b3d6SGreg Clayton StreamString log_message; 7158b35334eSGreg Clayton GetDescription(&log_message, lldb::eDescriptionLevelFull); 716c982b3d6SGreg Clayton log_message.PutCString (": "); 717c982b3d6SGreg Clayton va_list args; 718c982b3d6SGreg Clayton va_start (args, format); 719c982b3d6SGreg Clayton log_message.PrintfVarArg (format, args); 720c982b3d6SGreg Clayton va_end (args); 721c982b3d6SGreg Clayton log->PutCString(log_message.GetString().c_str()); 722c982b3d6SGreg Clayton } 723c982b3d6SGreg Clayton } 724c982b3d6SGreg Clayton 725e38a5eddSGreg Clayton bool 726e38a5eddSGreg Clayton Module::GetModified (bool use_cached_only) 727e38a5eddSGreg Clayton { 728e38a5eddSGreg Clayton if (m_was_modified == false && use_cached_only == false) 729e38a5eddSGreg Clayton { 730e38a5eddSGreg Clayton TimeValue curr_mod_time (m_file.GetModificationTime()); 731e38a5eddSGreg Clayton m_was_modified = curr_mod_time != m_mod_time; 732e38a5eddSGreg Clayton } 733e38a5eddSGreg Clayton return m_was_modified; 734e38a5eddSGreg Clayton } 735e38a5eddSGreg Clayton 736e38a5eddSGreg Clayton bool 737e38a5eddSGreg Clayton Module::SetModified (bool b) 738e38a5eddSGreg Clayton { 739e38a5eddSGreg Clayton const bool prev_value = m_was_modified; 740e38a5eddSGreg Clayton m_was_modified = b; 741e38a5eddSGreg Clayton return prev_value; 742e38a5eddSGreg Clayton } 743e38a5eddSGreg Clayton 744e38a5eddSGreg Clayton 745c982b3d6SGreg Clayton void 74630fdc8d8SChris Lattner Module::Dump(Stream *s) 74730fdc8d8SChris Lattner { 74830fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 7498941142aSGreg Clayton //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 75030fdc8d8SChris Lattner s->Indent(); 75130fdc8d8SChris Lattner s->Printf("Module %s/%s%s%s%s\n", 75230fdc8d8SChris Lattner m_file.GetDirectory().AsCString(), 75330fdc8d8SChris Lattner m_file.GetFilename().AsCString(), 75430fdc8d8SChris Lattner m_object_name ? "(" : "", 75530fdc8d8SChris Lattner m_object_name ? m_object_name.GetCString() : "", 75630fdc8d8SChris Lattner m_object_name ? ")" : ""); 75730fdc8d8SChris Lattner 75830fdc8d8SChris Lattner s->IndentMore(); 75930fdc8d8SChris Lattner ObjectFile *objfile = GetObjectFile (); 76030fdc8d8SChris Lattner 76130fdc8d8SChris Lattner if (objfile) 76230fdc8d8SChris Lattner objfile->Dump(s); 76330fdc8d8SChris Lattner 76430fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 76530fdc8d8SChris Lattner 76630fdc8d8SChris Lattner if (symbols) 76730fdc8d8SChris Lattner symbols->Dump(s); 76830fdc8d8SChris Lattner 76930fdc8d8SChris Lattner s->IndentLess(); 77030fdc8d8SChris Lattner } 77130fdc8d8SChris Lattner 77230fdc8d8SChris Lattner 77330fdc8d8SChris Lattner TypeList* 77430fdc8d8SChris Lattner Module::GetTypeList () 77530fdc8d8SChris Lattner { 77630fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 77730fdc8d8SChris Lattner if (symbols) 77830fdc8d8SChris Lattner return &symbols->GetTypeList(); 77930fdc8d8SChris Lattner return NULL; 78030fdc8d8SChris Lattner } 78130fdc8d8SChris Lattner 78230fdc8d8SChris Lattner const ConstString & 78330fdc8d8SChris Lattner Module::GetObjectName() const 78430fdc8d8SChris Lattner { 78530fdc8d8SChris Lattner return m_object_name; 78630fdc8d8SChris Lattner } 78730fdc8d8SChris Lattner 78830fdc8d8SChris Lattner ObjectFile * 78930fdc8d8SChris Lattner Module::GetObjectFile() 79030fdc8d8SChris Lattner { 79130fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 792e83e731eSGreg Clayton if (m_did_load_objfile == false) 79330fdc8d8SChris Lattner { 794e83e731eSGreg Clayton m_did_load_objfile = true; 79530fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 79630fdc8d8SChris Lattner "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString("")); 79744435ed0SGreg Clayton DataBufferSP file_data_sp; 79844435ed0SGreg Clayton m_objfile_sp = ObjectFile::FindPlugin(this, &m_file, m_object_offset, m_file.GetByteSize(), file_data_sp); 799593577a1SGreg Clayton if (m_objfile_sp) 800593577a1SGreg Clayton { 801593577a1SGreg Clayton // Once we get the object file, update our module with the object file's 802593577a1SGreg Clayton // architecture since it might differ in vendor/os if some parts were 803593577a1SGreg Clayton // unknown. 804593577a1SGreg Clayton m_objfile_sp->GetArchitecture (m_arch); 805593577a1SGreg Clayton } 80630fdc8d8SChris Lattner } 807762f7135SGreg Clayton return m_objfile_sp.get(); 80830fdc8d8SChris Lattner } 80930fdc8d8SChris Lattner 81030fdc8d8SChris Lattner 81130fdc8d8SChris Lattner const Symbol * 81230fdc8d8SChris Lattner Module::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type) 81330fdc8d8SChris Lattner { 81430fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 81530fdc8d8SChris Lattner "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)", 81630fdc8d8SChris Lattner name.AsCString(), 81730fdc8d8SChris Lattner symbol_type); 81830fdc8d8SChris Lattner ObjectFile *objfile = GetObjectFile(); 81930fdc8d8SChris Lattner if (objfile) 82030fdc8d8SChris Lattner { 82130fdc8d8SChris Lattner Symtab *symtab = objfile->GetSymtab(); 82230fdc8d8SChris Lattner if (symtab) 823bcf2cfbdSGreg Clayton return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny); 82430fdc8d8SChris Lattner } 82530fdc8d8SChris Lattner return NULL; 82630fdc8d8SChris Lattner } 82730fdc8d8SChris Lattner void 82830fdc8d8SChris Lattner Module::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list) 82930fdc8d8SChris Lattner { 83030fdc8d8SChris Lattner // No need to protect this call using m_mutex all other method calls are 83130fdc8d8SChris Lattner // already thread safe. 83230fdc8d8SChris Lattner 83330fdc8d8SChris Lattner size_t num_indices = symbol_indexes.size(); 83430fdc8d8SChris Lattner if (num_indices > 0) 83530fdc8d8SChris Lattner { 83630fdc8d8SChris Lattner SymbolContext sc; 83730fdc8d8SChris Lattner CalculateSymbolContext (&sc); 83830fdc8d8SChris Lattner for (size_t i = 0; i < num_indices; i++) 83930fdc8d8SChris Lattner { 84030fdc8d8SChris Lattner sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]); 84130fdc8d8SChris Lattner if (sc.symbol) 84230fdc8d8SChris Lattner sc_list.Append (sc); 84330fdc8d8SChris Lattner } 84430fdc8d8SChris Lattner } 84530fdc8d8SChris Lattner } 84630fdc8d8SChris Lattner 84730fdc8d8SChris Lattner size_t 848b96ff33bSSean Callanan Module::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list) 84930fdc8d8SChris Lattner { 85030fdc8d8SChris Lattner // No need to protect this call using m_mutex all other method calls are 85130fdc8d8SChris Lattner // already thread safe. 85230fdc8d8SChris Lattner 85330fdc8d8SChris Lattner 85430fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 85530fdc8d8SChris Lattner "Module::FindSymbolsWithNameAndType (name = %s, type = %i)", 85630fdc8d8SChris Lattner name.AsCString(), 85730fdc8d8SChris Lattner symbol_type); 85830fdc8d8SChris Lattner const size_t initial_size = sc_list.GetSize(); 85930fdc8d8SChris Lattner ObjectFile *objfile = GetObjectFile (); 86030fdc8d8SChris Lattner if (objfile) 86130fdc8d8SChris Lattner { 86230fdc8d8SChris Lattner Symtab *symtab = objfile->GetSymtab(); 86330fdc8d8SChris Lattner if (symtab) 86430fdc8d8SChris Lattner { 86530fdc8d8SChris Lattner std::vector<uint32_t> symbol_indexes; 86630fdc8d8SChris Lattner symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes); 86730fdc8d8SChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 86830fdc8d8SChris Lattner } 86930fdc8d8SChris Lattner } 87030fdc8d8SChris Lattner return sc_list.GetSize() - initial_size; 87130fdc8d8SChris Lattner } 87230fdc8d8SChris Lattner 87330fdc8d8SChris Lattner size_t 87430fdc8d8SChris Lattner Module::FindSymbolsMatchingRegExAndType (const RegularExpression ®ex, SymbolType symbol_type, SymbolContextList &sc_list) 87530fdc8d8SChris Lattner { 87630fdc8d8SChris Lattner // No need to protect this call using m_mutex all other method calls are 87730fdc8d8SChris Lattner // already thread safe. 87830fdc8d8SChris Lattner 87930fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 88030fdc8d8SChris Lattner "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)", 88130fdc8d8SChris Lattner regex.GetText(), 88230fdc8d8SChris Lattner symbol_type); 88330fdc8d8SChris Lattner const size_t initial_size = sc_list.GetSize(); 88430fdc8d8SChris Lattner ObjectFile *objfile = GetObjectFile (); 88530fdc8d8SChris Lattner if (objfile) 88630fdc8d8SChris Lattner { 88730fdc8d8SChris Lattner Symtab *symtab = objfile->GetSymtab(); 88830fdc8d8SChris Lattner if (symtab) 88930fdc8d8SChris Lattner { 89030fdc8d8SChris Lattner std::vector<uint32_t> symbol_indexes; 891bcf2cfbdSGreg Clayton symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 89230fdc8d8SChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 89330fdc8d8SChris Lattner } 89430fdc8d8SChris Lattner } 89530fdc8d8SChris Lattner return sc_list.GetSize() - initial_size; 89630fdc8d8SChris Lattner } 89730fdc8d8SChris Lattner 89830fdc8d8SChris Lattner const TimeValue & 89930fdc8d8SChris Lattner Module::GetModificationTime () const 90030fdc8d8SChris Lattner { 90130fdc8d8SChris Lattner return m_mod_time; 90230fdc8d8SChris Lattner } 9035aee162fSJim Ingham 9045aee162fSJim Ingham bool 9055aee162fSJim Ingham Module::IsExecutable () 9065aee162fSJim Ingham { 9075aee162fSJim Ingham if (GetObjectFile() == NULL) 9085aee162fSJim Ingham return false; 9095aee162fSJim Ingham else 9105aee162fSJim Ingham return GetObjectFile()->IsExecutable(); 9115aee162fSJim Ingham } 9125aee162fSJim Ingham 9135aee162fSJim Ingham bool 914b53cb271SJim Ingham Module::IsLoadedInTarget (Target *target) 915b53cb271SJim Ingham { 916b53cb271SJim Ingham ObjectFile *obj_file = GetObjectFile(); 917b53cb271SJim Ingham if (obj_file) 918b53cb271SJim Ingham { 919b53cb271SJim Ingham SectionList *sections = obj_file->GetSectionList(); 920b53cb271SJim Ingham if (sections != NULL) 921b53cb271SJim Ingham { 922b53cb271SJim Ingham size_t num_sections = sections->GetSize(); 923b53cb271SJim Ingham for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++) 924b53cb271SJim Ingham { 925b53cb271SJim Ingham SectionSP section_sp = sections->GetSectionAtIndex(sect_idx); 926b53cb271SJim Ingham if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS) 927b53cb271SJim Ingham { 928b53cb271SJim Ingham return true; 929b53cb271SJim Ingham } 930b53cb271SJim Ingham } 931b53cb271SJim Ingham } 932b53cb271SJim Ingham } 933b53cb271SJim Ingham return false; 934b53cb271SJim Ingham } 935b53cb271SJim Ingham bool 9365aee162fSJim Ingham Module::SetArchitecture (const ArchSpec &new_arch) 9375aee162fSJim Ingham { 93864195a2cSGreg Clayton if (!m_arch.IsValid()) 9395aee162fSJim Ingham { 9405aee162fSJim Ingham m_arch = new_arch; 9415aee162fSJim Ingham return true; 9425aee162fSJim Ingham } 94364195a2cSGreg Clayton return m_arch == new_arch; 9445aee162fSJim Ingham } 9455aee162fSJim Ingham 946