Module.cpp revision 02e210cad27e36108bef493b798c2c1eb3b04cb8
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Module.cpp ----------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// Shared pointers to modules track module lifetimes in 24899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// targets and in the global module, but this collection 25899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// will track all module objects that are still alive 26899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytontypedef std::vector<Module *> ModuleCollection; 27899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 28899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonstatic ModuleCollection & 29899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonGetModuleCollection() 30899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 31899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton static ModuleCollection g_module_collection; 32899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return g_module_collection; 33899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 34899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 35899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonMutex & 36899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocationModuleCollectionMutex() 37899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 38899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton static Mutex g_module_collection_mutex(Mutex::eMutexTypeRecursive); 39899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return g_module_collection_mutex; 40899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 41899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 42899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonsize_t 43899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetNumberAllocatedModules () 44899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 45899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 46899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return GetModuleCollection().size(); 47899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 48899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 49899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule * 50899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocatedModuleAtIndex (size_t idx) 51899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 52899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 53899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection &modules = GetModuleCollection(); 54899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton if (idx < modules.size()) 55899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return modules[idx]; 56899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return NULL; 57899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 58899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 59899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 60899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 61899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Module(const FileSpec& file_spec, const ArchSpec& arch, const ConstString *object_name, off_t object_offset) : 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mutex (Mutex::eMutexTypeRecursive), 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time (file_spec.GetModificationTime()), 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arch (arch), 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_uuid (), 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file (file_spec), 6824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_platform_file(), 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name (), 70b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_object_offset (object_offset), 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_objfile_ap (), 72236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_symfile_ap (), 73b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast (), 74236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile (false), 75236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor (false), 76236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid (false), 77b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast (false), 78236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_is_dynamic_loader_module (false) 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 80899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 81899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 82899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 83899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton GetModuleCollection().push_back(this); 84899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 85899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_name) 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = *object_name; 88e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 92940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module() 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 102899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 103899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 104899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 105899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection &modules = GetModuleCollection(); 106899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator end = modules.end(); 107899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator pos = std::find(modules.begin(), end, this); 108899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton if (pos != end) 109899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton modules.erase(pos); 110899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 111e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')", 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 115940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 121b01000fd063629facd45044f137446fb748ee179Greg Clayton // Release any auto pointers before we start tearing down our member 122b01000fd063629facd45044f137446fb748ee179Greg Clayton // variables since the object file and symbol files might need to make 123b01000fd063629facd45044f137446fb748ee179Greg Clayton // function calls back into this module object. The ordering is important 124b01000fd063629facd45044f137446fb748ee179Greg Clayton // here because symbol files can require the module object file. So we tear 125b01000fd063629facd45044f137446fb748ee179Greg Clayton // down the symbol file first, then the object file. 126b01000fd063629facd45044f137446fb748ee179Greg Clayton m_symfile_ap.reset(); 127b01000fd063629facd45044f137446fb748ee179Greg Clayton m_objfile_ap.reset(); 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1310467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID& 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID() 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 135236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_parse_uuid == false) 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile * obj_file = GetObjectFile (); 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner obj_file->GetUUID(&m_uuid); 142236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid = true; 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_uuid; 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 148b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext & 149b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext () 150b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 151b01000fd063629facd45044f137446fb748ee179Greg Clayton Mutex::Locker locker (m_mutex); 152b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_did_init_ast == false) 153b01000fd063629facd45044f137446fb748ee179Greg Clayton { 154b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjectFile * objfile = GetObjectFile(); 155395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton ArchSpec object_arch; 156395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (objfile && objfile->GetArchitecture(object_arch)) 157b01000fd063629facd45044f137446fb748ee179Greg Clayton { 158b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast = true; 159395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton m_ast.SetArchitecture (object_arch); 160b01000fd063629facd45044f137446fb748ee179Greg Clayton } 161b01000fd063629facd45044f137446fb748ee179Greg Clayton } 162b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast; 163b01000fd063629facd45044f137446fb748ee179Greg Clayton} 164b01000fd063629facd45044f137446fb748ee179Greg Clayton 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols() 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits(); 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_comp_units == 0) 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17302e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton SymbolContext sc; 17402e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton sc.module_sp = this; 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t cu_idx; 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++) 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get(); 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit) 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseCompileUnitFunctions(sc); 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t func_idx; 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx) 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseFunctionBlocks(sc); 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse the variables for this function and all its blocks 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse all types for this compile unit 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseTypes(sc); 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc) 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 20802e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton sc->module_sp = this; 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 211c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule * 212c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule::CalculateSymbolContextModule () 213c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{ 214c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton return this; 215c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton} 216c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s) 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(", Module{0x%8.8x}", this); 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits() 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this); 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->GetNumCompileUnits(); 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetCompileUnitAtIndex (uint32_t index) 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits (); 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompUnitSP cu_sp; 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index < num_comp_units) 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu_sp = symbols->GetCompileUnitAtIndex(index); 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return cu_sp; 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr) 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr); 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList()); 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved_flags = 0; 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the result symbol context in case we don't find anything 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.Clear(); 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the section from the section/offset address. 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Section *section = so_addr.GetSection(); 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure the section matches this module before we try and match anything 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (section && section->GetModule() == this) 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If the section offset based address resolved itself, then this 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is the right module. 27802e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton sc.module_sp = this; 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextModule; 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Resolve the compile unit, function, block, line table or line 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // entry if requested. 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (resolve_scope & eSymbolContextCompUnit || 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextFunction || 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextBlock || 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextLineEntry ) 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc); 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham // Resolve the symbol if requested, but don't re-look it up if we've already found it. 294bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol)) 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = ofile->GetSymtab(); 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (so_addr.IsSectionOffset()) 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress()); 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextSymbol; 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved_flags; 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 316537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath 317537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton( 318537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton const char *file_path, 319537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t line, 320537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton bool check_inlines, 321537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t resolve_scope, 322537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton SymbolContextList& sc_list 323537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton) 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 325537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec file_spec(file_path, false); 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list); 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)", 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory().AsCString(""), 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory() ? "/" : "", 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetFilename().AsCString(""), 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line, 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner check_inlines ? "yes" : "no", 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope); 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t initial_count = sc_list.GetSize(); 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list); 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_count; 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const ConstString &name, bool append, uint32_t max_matches, VariableList& variables) 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindGlobalVariables(name, append, max_matches, variables); 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindGlobalVariables(regex, append, max_matches, variables); 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 370801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonModule::FindCompileUnits (const FileSpec &path, 371801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton bool append, 372801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContextList &sc_list) 373801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{ 374801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (!append) 375801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc_list.Clear(); 376801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 377801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const uint32_t start_size = sc_list.GetSize(); 378801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const uint32_t num_compile_units = GetNumCompileUnits(); 379801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContext sc; 38002e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton sc.module_sp = this; 381801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const bool compare_directory = path.GetDirectory(); 382801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton for (uint32_t i=0; i<num_compile_units; ++i) 383801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 384801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc.comp_unit = GetCompileUnitAtIndex(i).get(); 385801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (FileSpec::Equal (*sc.comp_unit, path, compare_directory)) 386801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc_list.Append(sc); 387801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 388801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton return sc_list.GetSize() - start_size; 389801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton} 390801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 391801417e453f8531ac176cd952200587bf15d9ccfGreg Claytonuint32_t 39228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const ConstString &name, 39328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton uint32_t name_type_mask, 39428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool include_symbols, 39528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 39628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 39928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 40028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 40128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t start_size = sc_list.GetSize(); 40228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 40328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Find all the functions (not symbols, but debug information functions... 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 40628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symbols->FindFunctions(name, name_type_mask, append, sc_list); 40728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 40828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 40928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 41028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 41128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 41228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 41328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 41428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 41528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 41628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 41728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 41828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 41928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t num_matches = symbol_indexes.size(); 42028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 42128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 422889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const bool merge_symbol_into_function = true; 42328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 42428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton for (uint32_t i=0; i<num_matches; i++) 42528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 42628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 427889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 42828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 42928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 43028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 43128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 43228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 43328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 43728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex, 43828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool include_symbols, 43928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 44028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 44328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 44428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 44528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t start_size = sc_list.GetSize(); 44628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 4499935a860350721f6bb32e841d89e1c25c07b98a7Jim Ingham symbols->FindFunctions(regex, append, sc_list); 45028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 45128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 45228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 45328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 45428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 45528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 45628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 45728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 45828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 45928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 46028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 46128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t num_matches = symbol_indexes.size(); 46228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 46328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 464889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const bool merge_symbol_into_function = true; 46528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 46628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton for (uint32_t i=0; i<num_matches; i++) 46728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 46828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 469889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 47028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 47128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 47228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 47328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 47428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 47528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4787aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Claytonuint32_t 479979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataModule::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types) 4807aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{ 4817aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 4827aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (sc.module_sp.get() == NULL || sc.module_sp.get() == this) 4837aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton { 4847aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton SymbolVendor *symbols = GetSymbolVendor (); 4857aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (symbols) 4867aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton return symbols->FindTypes(sc, name, append, max_matches, types); 4877aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton } 4887aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton return 0; 4897aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton} 4907aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton 491979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// depending on implementation details, type lookup might fail because of 492979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// embedded spurious namespace:: prefixes. this call strips them, paying 493979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// attention to the fact that a type might have namespace'd type names as 494979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// arguments to templates, and those must not be stripped off 495979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatastatic const char* 496979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataStripTypeName(const char* name_cstr) 497979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 498979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata const char* skip_namespace = strstr(name_cstr, "::"); 499979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata const char* template_arg_char = strchr(name_cstr, '<'); 500979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata while (skip_namespace != NULL) 501979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 502979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (template_arg_char != NULL && 503979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata skip_namespace > template_arg_char) // but namespace'd template arguments are still good to go 504979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 505979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata name_cstr = skip_namespace+2; 506979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata skip_namespace = strstr(name_cstr, "::"); 507979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 508979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return name_cstr; 509979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 510979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 511979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatauint32_t 512979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataModule::FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types) 513979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 514979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata uint32_t retval = FindTypes_Impl(sc, name, append, max_matches, types); 515979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 516979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (retval == 0) 517979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 518979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata const char *stripped = StripTypeName(name.GetCString()); 519979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return FindTypes_Impl(sc, ConstString(stripped), append, max_matches, types); 520979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 521979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata else 522979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return retval; 523979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 524979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 525979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types) 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Timer scoped_timer(__PRETTY_FUNCTION__); 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolVendor *symbols = GetSymbolVendor (); 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (symbols) 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types); 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return 0; 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor* 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSymbolVendor (bool can_create) 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 541236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_symbol_vendor == false && can_create) 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *obj_file = GetObjectFile (); 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_symfile_ap.reset(SymbolVendor::FindPlugin(this)); 548236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor = true; 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_symfile_ap.get(); 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name) 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Container objects whose paths do not specify a file directly can call 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // this function to correct the file and object names. 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file = file; 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time = file.GetModificationTime(); 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = object_name; 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec& 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_arch; 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 5717826c8894803dc729f29789ebc038956a94d3e7aCaroline TiceModule::GetDescription (Stream *s) 5727826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{ 5737826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice Mutex::Locker locker (m_mutex); 5747826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 57549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton if (m_arch.IsValid()) 576940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton s->Printf("(%s) ", m_arch.GetArchitectureName()); 5777826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 57849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton char path[PATH_MAX]; 57949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton if (m_file.GetPath(path, sizeof(path))) 58049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton s->PutCString(path); 58149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 58249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton const char *object_name = m_object_name.GetCString(); 58349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton if (object_name) 58449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton s->Printf("(%s)", object_name); 5857826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice} 5867826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 5877826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s) 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 5913fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Indent(); 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("Module %s/%s%s%s%s\n", 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(), 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(), 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? "(" : "", 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? m_object_name.GetCString() : "", 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? ")" : ""); 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentMore(); 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner objfile->Dump(s); 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->Dump(s); 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentLess(); 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList* 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList () 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &symbols->GetTypeList(); 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_object_name; 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile() 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 634236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_objfile == false) 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 636236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile = true; 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString("")); 639b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_objfile_ap.reset(ObjectFile::FindPlugin(this, &m_file, m_object_offset, m_file.GetByteSize())); 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_objfile_ap.get(); 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol * 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type) 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)", 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile(); 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 6577c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny); 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list) 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t num_indices = symbol_indexes.size(); 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_indices > 0) 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc; 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateSymbolContext (&sc); 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i = 0; i < num_indices; i++) 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]); 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Append (sc); 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list) 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsWithNameAndType (name = %s, type = %i)", 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes); 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression ®ex, SymbolType symbol_type, SymbolContextList &sc_list) 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)", 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText(), 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 7257c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue & 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mod_time; 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7377508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 7387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 7397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable () 7407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 7417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (GetObjectFile() == NULL) 7427508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return false; 7437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham else 7447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return GetObjectFile()->IsExecutable(); 7457508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 7467508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 74751b11e06de746667396f56b303d1867f007baf8bJim Inghambool 74851b11e06de746667396f56b303d1867f007baf8bJim InghamModule::IsLoadedInTarget (Target *target) 74951b11e06de746667396f56b303d1867f007baf8bJim Ingham{ 75051b11e06de746667396f56b303d1867f007baf8bJim Ingham ObjectFile *obj_file = GetObjectFile(); 75151b11e06de746667396f56b303d1867f007baf8bJim Ingham if (obj_file) 75251b11e06de746667396f56b303d1867f007baf8bJim Ingham { 75351b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionList *sections = obj_file->GetSectionList(); 75451b11e06de746667396f56b303d1867f007baf8bJim Ingham if (sections != NULL) 75551b11e06de746667396f56b303d1867f007baf8bJim Ingham { 75651b11e06de746667396f56b303d1867f007baf8bJim Ingham size_t num_sections = sections->GetSize(); 75751b11e06de746667396f56b303d1867f007baf8bJim Ingham for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++) 75851b11e06de746667396f56b303d1867f007baf8bJim Ingham { 75951b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionSP section_sp = sections->GetSectionAtIndex(sect_idx); 76051b11e06de746667396f56b303d1867f007baf8bJim Ingham if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS) 76151b11e06de746667396f56b303d1867f007baf8bJim Ingham { 76251b11e06de746667396f56b303d1867f007baf8bJim Ingham return true; 76351b11e06de746667396f56b303d1867f007baf8bJim Ingham } 76451b11e06de746667396f56b303d1867f007baf8bJim Ingham } 76551b11e06de746667396f56b303d1867f007baf8bJim Ingham } 76651b11e06de746667396f56b303d1867f007baf8bJim Ingham } 76751b11e06de746667396f56b303d1867f007baf8bJim Ingham return false; 76851b11e06de746667396f56b303d1867f007baf8bJim Ingham} 7697508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 7707508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch) 7717508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 772940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (!m_arch.IsValid()) 7737508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 7747508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham m_arch = new_arch; 7757508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return true; 776940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 777940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return m_arch == new_arch; 7787508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 7797508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 780