Module.cpp revision 08205a649cf8a94477f7f9ab8e42dd95ebfc9626
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" 1475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton#include "lldb/Core/StreamString.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 16df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton#include "lldb/Host/Host.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// Shared pointers to modules track module lifetimes in 26899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// targets and in the global module, but this collection 27899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// will track all module objects that are still alive 28899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytontypedef std::vector<Module *> ModuleCollection; 29899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 30899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonstatic ModuleCollection & 31899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonGetModuleCollection() 32899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 33b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // This module collection needs to live past any module, so we could either make it a 34b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // shared pointer in each module or just leak is. Since it is only an empty vector by 35b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // the time all the modules have gone away, we just leak it for now. If we decide this 36b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // is a big problem we can introduce a Finalize method that will tear everything down in 37b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // a predictable order. 38b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham 39b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham static ModuleCollection *g_module_collection = NULL; 40b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham if (g_module_collection == NULL) 41b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham g_module_collection = new ModuleCollection(); 42b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham 43b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham return *g_module_collection; 44899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 45899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 46c149c8b3a88e5c8a94febdf956551e378c531797Greg ClaytonMutex * 47899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocationModuleCollectionMutex() 48899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 49c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // NOTE: The mutex below must be leaked since the global module list in 50c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // the ModuleList class will get torn at some point, and we can't know 51c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // if it will tear itself down before the "g_module_collection_mutex" below 52c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // will. So we leak a Mutex object below to safeguard against that 53c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton 54c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton static Mutex *g_module_collection_mutex = NULL; 55c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton if (g_module_collection_mutex == NULL) 56c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton g_module_collection_mutex = new Mutex (Mutex::eMutexTypeRecursive); // NOTE: known leak 57c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton return g_module_collection_mutex; 58899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 59899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 60899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonsize_t 61899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetNumberAllocatedModules () 62899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 63899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 64899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return GetModuleCollection().size(); 65899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 66899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 67899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule * 68899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocatedModuleAtIndex (size_t idx) 69899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 70899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 71899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection &modules = GetModuleCollection(); 72899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton if (idx < modules.size()) 73899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return modules[idx]; 74899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return NULL; 75899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 7608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#if 0 77899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 7808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// These functions help us to determine if modules are still loaded, yet don't require that 7908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// you have a command interpreter and can easily be called from an external debugger. 8008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Claytonnamespace lldb { 81899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 8208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton void 8308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton ClearModuleInfo (void) 8408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 8508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton ModuleList::RemoveOrphanSharedModules(); 8608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 8708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 8808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton void 8908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton DumpModuleInfo (void) 9008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 9108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton Mutex::Locker locker (Module::GetAllocationModuleCollectionMutex()); 9208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton ModuleCollection &modules = GetModuleCollection(); 9308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton const size_t count = modules.size(); 9408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton printf ("%s: %zu modules:\n", __PRETTY_FUNCTION__, count); 9508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton for (size_t i=0; i<count; ++i) 9608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 9708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 9808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton StreamString strm; 9908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton Module *module = modules[i]; 10008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton const bool in_shared_module_list = ModuleList::ModuleIsInCache (module); 10108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton module->GetDescription(&strm, eDescriptionLevelFull); 10208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton printf ("%p: shared = %i, ref_count = %3u, module = %s\n", 10308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton module, 10408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton in_shared_module_list, 10508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton (uint32_t)module->use_count(), 10608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton strm.GetString().c_str()); 10708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 10808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 10908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton} 11008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 11108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#endif 112899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 113899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Module(const FileSpec& file_spec, const ArchSpec& arch, const ConstString *object_name, off_t object_offset) : 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mutex (Mutex::eMutexTypeRecursive), 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time (file_spec.GetModificationTime()), 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arch (arch), 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_uuid (), 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file (file_spec), 12024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_platform_file(), 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name (), 122b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_object_offset (object_offset), 123e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_objfile_sp (), 124236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_symfile_ap (), 125b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast (), 126236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile (false), 127236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor (false), 128236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid (false), 129b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast (false), 130df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_is_dynamic_loader_module (false), 131df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_was_modified (false) 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 133899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 134899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 135899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 136899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton GetModuleCollection().push_back(this); 137899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 138899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_name) 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = *object_name; 141e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 145940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module() 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 155899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 156899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 157899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 158899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection &modules = GetModuleCollection(); 159899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator end = modules.end(); 160899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator pos = std::find(modules.begin(), end, this); 161899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton if (pos != end) 162899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton modules.erase(pos); 163899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 164e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')", 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 168940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 174b01000fd063629facd45044f137446fb748ee179Greg Clayton // Release any auto pointers before we start tearing down our member 175b01000fd063629facd45044f137446fb748ee179Greg Clayton // variables since the object file and symbol files might need to make 176b01000fd063629facd45044f137446fb748ee179Greg Clayton // function calls back into this module object. The ordering is important 177b01000fd063629facd45044f137446fb748ee179Greg Clayton // here because symbol files can require the module object file. So we tear 178b01000fd063629facd45044f137446fb748ee179Greg Clayton // down the symbol file first, then the object file. 179b01000fd063629facd45044f137446fb748ee179Greg Clayton m_symfile_ap.reset(); 180e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_objfile_sp.reset(); 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1840467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID& 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID() 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 188236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_parse_uuid == false) 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile * obj_file = GetObjectFile (); 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner obj_file->GetUUID(&m_uuid); 195236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid = true; 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_uuid; 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 201b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext & 202b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext () 203b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 204b01000fd063629facd45044f137446fb748ee179Greg Clayton Mutex::Locker locker (m_mutex); 205b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_did_init_ast == false) 206b01000fd063629facd45044f137446fb748ee179Greg Clayton { 207b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjectFile * objfile = GetObjectFile(); 208395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton ArchSpec object_arch; 209395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (objfile && objfile->GetArchitecture(object_arch)) 210b01000fd063629facd45044f137446fb748ee179Greg Clayton { 211b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast = true; 212395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton m_ast.SetArchitecture (object_arch); 213b01000fd063629facd45044f137446fb748ee179Greg Clayton } 214b01000fd063629facd45044f137446fb748ee179Greg Clayton } 215b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast; 216b01000fd063629facd45044f137446fb748ee179Greg Clayton} 217b01000fd063629facd45044f137446fb748ee179Greg Clayton 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols() 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits(); 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_comp_units == 0) 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22602e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton SymbolContext sc; 22702e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton sc.module_sp = this; 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t cu_idx; 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++) 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get(); 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit) 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseCompileUnitFunctions(sc); 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t func_idx; 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx) 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseFunctionBlocks(sc); 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse the variables for this function and all its blocks 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse all types for this compile unit 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseTypes(sc); 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc) 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26102e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton sc->module_sp = this; 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule * 265c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule::CalculateSymbolContextModule () 266c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{ 267c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton return this; 268c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton} 269c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s) 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2737e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda s->Printf(", Module{%p}", this); 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits() 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this); 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->GetNumCompileUnits(); 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetCompileUnitAtIndex (uint32_t index) 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits (); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompUnitSP cu_sp; 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index < num_comp_units) 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu_sp = symbols->GetCompileUnitAtIndex(index); 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return cu_sp; 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr) 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr); 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList()); 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved_flags = 0; 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the result symbol context in case we don't find anything 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.Clear(); 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the section from the section/offset address. 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Section *section = so_addr.GetSection(); 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure the section matches this module before we try and match anything 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (section && section->GetModule() == this) 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If the section offset based address resolved itself, then this 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is the right module. 33102e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton sc.module_sp = this; 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextModule; 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Resolve the compile unit, function, block, line table or line 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // entry if requested. 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (resolve_scope & eSymbolContextCompUnit || 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextFunction || 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextBlock || 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextLineEntry ) 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc); 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 346bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham // Resolve the symbol if requested, but don't re-look it up if we've already found it. 347bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol)) 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = ofile->GetSymtab(); 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (so_addr.IsSectionOffset()) 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress()); 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextSymbol; 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved_flags; 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 369537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath 370537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton( 371537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton const char *file_path, 372537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t line, 373537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton bool check_inlines, 374537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t resolve_scope, 375537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton SymbolContextList& sc_list 376537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton) 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 378537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec file_spec(file_path, false); 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list); 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)", 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory().AsCString(""), 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory() ? "/" : "", 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetFilename().AsCString(""), 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line, 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner check_inlines ? "yes" : "no", 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope); 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t initial_count = sc_list.GetSize(); 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list); 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_count; 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 4063e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindGlobalVariables(const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables) 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 4100fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables); 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindGlobalVariables(regex, append, max_matches, variables); 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 423801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonModule::FindCompileUnits (const FileSpec &path, 424801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton bool append, 425801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContextList &sc_list) 426801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{ 427801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (!append) 428801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc_list.Clear(); 429801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 430801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const uint32_t start_size = sc_list.GetSize(); 431801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const uint32_t num_compile_units = GetNumCompileUnits(); 432801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContext sc; 43302e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton sc.module_sp = this; 434801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const bool compare_directory = path.GetDirectory(); 435801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton for (uint32_t i=0; i<num_compile_units; ++i) 436801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 437801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc.comp_unit = GetCompileUnitAtIndex(i).get(); 438801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (FileSpec::Equal (*sc.comp_unit, path, compare_directory)) 439801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc_list.Append(sc); 440801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 441801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton return sc_list.GetSize() - start_size; 442801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton} 443801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 444801417e453f8531ac176cd952200587bf15d9ccfGreg Claytonuint32_t 4453e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindFunctions (const ConstString &name, 4463e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan const ClangNamespaceDecl *namespace_decl, 44728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton uint32_t name_type_mask, 44828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool include_symbols, 44928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 45028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 45328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 45428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 45528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t start_size = sc_list.GetSize(); 45628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 45728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Find all the functions (not symbols, but debug information functions... 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 4600fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan symbols->FindFunctions(name, namespace_decl, name_type_mask, append, sc_list); 46128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 46228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 46328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 46428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 46528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 46628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 46728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 46828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 46928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 47028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 47128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 47228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 47328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t num_matches = symbol_indexes.size(); 47428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 47528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 476889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const bool merge_symbol_into_function = true; 47728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 47828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton for (uint32_t i=0; i<num_matches; i++) 47928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 48028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 481889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 48228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 48328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 48428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 48528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 48628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 48728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 49128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex, 49228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool include_symbols, 49328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 49428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 49728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 49828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 49928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t start_size = sc_list.GetSize(); 50028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 5039935a860350721f6bb32e841d89e1c25c07b98a7Jim Ingham symbols->FindFunctions(regex, append, sc_list); 50428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 50528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 50628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 50728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 50828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 50928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 51028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 51128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 51228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 51328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 51428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 51528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t num_matches = symbol_indexes.size(); 51628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 51728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 518889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const bool merge_symbol_into_function = true; 51928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 52028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton for (uint32_t i=0; i<num_matches; i++) 52128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 52228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 523889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 52428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 52528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 52628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 52728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 52828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 52928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5327aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Claytonuint32_t 5330fcec13c6639ab49216fa9447b25888b7bc9ff59Sean CallananModule::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types) 5347aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{ 5357aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 5367aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (sc.module_sp.get() == NULL || sc.module_sp.get() == this) 5377aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton { 5387aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton SymbolVendor *symbols = GetSymbolVendor (); 5397aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (symbols) 5400fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types); 5417aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton } 5427aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton return 0; 5437aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton} 5447aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton 545979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// depending on implementation details, type lookup might fail because of 546979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// embedded spurious namespace:: prefixes. this call strips them, paying 547979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// attention to the fact that a type might have namespace'd type names as 548979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// arguments to templates, and those must not be stripped off 549979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatastatic const char* 550979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataStripTypeName(const char* name_cstr) 551979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 552cd186e5ef6dacca7bd4914e99ef6b7551b5e79e4Johnny Chen // Protect against null c string. 553cd186e5ef6dacca7bd4914e99ef6b7551b5e79e4Johnny Chen if (!name_cstr) 554cd186e5ef6dacca7bd4914e99ef6b7551b5e79e4Johnny Chen return name_cstr; 555979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata const char* skip_namespace = strstr(name_cstr, "::"); 556979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata const char* template_arg_char = strchr(name_cstr, '<'); 557979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata while (skip_namespace != NULL) 558979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 559979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (template_arg_char != NULL && 560979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata skip_namespace > template_arg_char) // but namespace'd template arguments are still good to go 561979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 562979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata name_cstr = skip_namespace+2; 563979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata skip_namespace = strstr(name_cstr, "::"); 564979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 565979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return name_cstr; 566979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 567979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 568979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatauint32_t 5693e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindTypes (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types) 570979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 5710fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan uint32_t retval = FindTypes_Impl(sc, name, namespace_decl, append, max_matches, types); 572979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 573979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (retval == 0) 574979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 575a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham const char *orig_name = name.GetCString(); 576a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham const char *stripped = StripTypeName(orig_name); 577a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham // Only do this lookup if StripTypeName has stripped the name: 578a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham if (stripped != orig_name) 579a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham return FindTypes_Impl(sc, ConstString(stripped), namespace_decl, append, max_matches, types); 580a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham else 581a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham return 0; 582979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 583979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata else 584979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return retval; 585979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 586979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 587979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types) 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Timer scoped_timer(__PRETTY_FUNCTION__); 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolVendor *symbols = GetSymbolVendor (); 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (symbols) 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types); 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return 0; 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor* 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSymbolVendor (bool can_create) 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 603236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_symbol_vendor == false && can_create) 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *obj_file = GetObjectFile (); 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_symfile_ap.reset(SymbolVendor::FindPlugin(this)); 610236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor = true; 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_symfile_ap.get(); 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name) 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Container objects whose paths do not specify a file directly can call 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // this function to correct the file and object names. 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file = file; 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time = file.GetModificationTime(); 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = object_name; 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec& 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_arch; 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 63375d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::GetDescription (Stream *s, lldb::DescriptionLevel level) 6347826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{ 6357826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice Mutex::Locker locker (m_mutex); 6367826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 63775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (level >= eDescriptionLevelFull) 63875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 63975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (m_arch.IsValid()) 64075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->Printf("(%s) ", m_arch.GetArchitectureName()); 64175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 6427826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 64375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (level == eDescriptionLevelBrief) 64475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 64575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton const char *filename = m_file.GetFilename().GetCString(); 64675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (filename) 64775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->PutCString (filename); 64875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 64975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton else 65075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 65175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton char path[PATH_MAX]; 65275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (m_file.GetPath(path, sizeof(path))) 65375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->PutCString(path); 65475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 65549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 65649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton const char *object_name = m_object_name.GetCString(); 65749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton if (object_name) 65849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton s->Printf("(%s)", object_name); 6597826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice} 6607826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 6617826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid 66275d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportError (const char *format, ...) 66375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 664df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format && format[0]) 665df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 666df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton StreamString strm; 667df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("error: "); 668df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetDescription(&strm, lldb::eDescriptionLevelBrief); 6697129913a93594dc4d7b4e417212a366768337852Greg Clayton strm.PutChar (' '); 670df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 671df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 672df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PrintfVarArg(format, args); 673df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 674df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 675df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const int format_len = strlen(format); 676df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format_len > 0) 677df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 678df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const char last_char = format[format_len-1]; 679df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (last_char != '\n' || last_char != '\r') 680df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.EOL(); 681df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 682df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); 683df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 684df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 685df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton} 686df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 687df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonvoid 688df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::ReportErrorIfModifyDetected (const char *format, ...) 689df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{ 690df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (!GetModified(true) && GetModified(false)) 691df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 692df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format) 693df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 694df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton StreamString strm; 695df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("error: the object file "); 696df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetDescription(&strm, lldb::eDescriptionLevelFull); 697df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString (" has been modified\n"); 698df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 699df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 700df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 701df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PrintfVarArg(format, args); 702df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 703df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 704df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const int format_len = strlen(format); 705df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format_len > 0) 706df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 707df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const char last_char = format[format_len-1]; 708df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (last_char != '\n' || last_char != '\r') 709df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.EOL(); 710df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 711df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n"); 712df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); 713df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 714df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 71575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 71675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 71775d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 71875d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportWarning (const char *format, ...) 71975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 720df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format && format[0]) 721df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 722df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton StreamString strm; 723df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("warning: "); 7247129913a93594dc4d7b4e417212a366768337852Greg Clayton GetDescription(&strm, lldb::eDescriptionLevelFull); 7257129913a93594dc4d7b4e417212a366768337852Greg Clayton strm.PutChar (' '); 726df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 727df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 728df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 729df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PrintfVarArg(format, args); 730df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 731df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 732df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const int format_len = strlen(format); 733df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format_len > 0) 734df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 735df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const char last_char = format[format_len-1]; 736df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (last_char != '\n' || last_char != '\r') 737df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.EOL(); 738df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 739df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str()); 740df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 74175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 74275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 74375d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 74475d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::LogMessage (Log *log, const char *format, ...) 74575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 74675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (log) 74775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 74875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton StreamString log_message; 7497129913a93594dc4d7b4e417212a366768337852Greg Clayton GetDescription(&log_message, lldb::eDescriptionLevelFull); 75075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log_message.PutCString (": "); 75175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_list args; 75275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_start (args, format); 75375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log_message.PrintfVarArg (format, args); 75475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_end (args); 75575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log->PutCString(log_message.GetString().c_str()); 75675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 75775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 75875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 759df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonbool 760df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::GetModified (bool use_cached_only) 761df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{ 762df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (m_was_modified == false && use_cached_only == false) 763df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 764df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton TimeValue curr_mod_time (m_file.GetModificationTime()); 765df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_was_modified = curr_mod_time != m_mod_time; 766df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 767df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton return m_was_modified; 768df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton} 769df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 770df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonbool 771df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::SetModified (bool b) 772df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{ 773df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const bool prev_value = m_was_modified; 774df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_was_modified = b; 775df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton return prev_value; 776df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton} 777df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 778df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 77975d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s) 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 7833fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Indent(); 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("Module %s/%s%s%s%s\n", 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(), 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(), 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? "(" : "", 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? m_object_name.GetCString() : "", 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? ")" : ""); 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentMore(); 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner objfile->Dump(s); 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->Dump(s); 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentLess(); 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList* 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList () 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &symbols->GetTypeList(); 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_object_name; 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile() 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 826236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_objfile == false) 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 828236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile = true; 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString("")); 831db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton DataBufferSP file_data_sp; 832db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton m_objfile_sp = ObjectFile::FindPlugin(this, &m_file, m_object_offset, m_file.GetByteSize(), file_data_sp); 8336a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (m_objfile_sp) 8346a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton { 8356a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // Once we get the object file, update our module with the object file's 8366a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // architecture since it might differ in vendor/os if some parts were 8376a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // unknown. 8386a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton m_objfile_sp->GetArchitecture (m_arch); 8396a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton } 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 841e40b6424d9e49306392bec4b44060da36414c382Greg Clayton return m_objfile_sp.get(); 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol * 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type) 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)", 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile(); 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 8577c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny); 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list) 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t num_indices = symbol_indexes.size(); 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_indices > 0) 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc; 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateSymbolContext (&sc); 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i = 0; i < num_indices; i++) 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]); 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Append (sc); 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 882aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean CallananModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list) 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsWithNameAndType (name = %s, type = %i)", 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes); 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression ®ex, SymbolType symbol_type, SymbolContextList &sc_list) 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)", 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText(), 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 9257c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue & 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mod_time; 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9377508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 9387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 9397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable () 9407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 9417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (GetObjectFile() == NULL) 9427508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return false; 9437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham else 9447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return GetObjectFile()->IsExecutable(); 9457508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 9467508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 94751b11e06de746667396f56b303d1867f007baf8bJim Inghambool 94851b11e06de746667396f56b303d1867f007baf8bJim InghamModule::IsLoadedInTarget (Target *target) 94951b11e06de746667396f56b303d1867f007baf8bJim Ingham{ 95051b11e06de746667396f56b303d1867f007baf8bJim Ingham ObjectFile *obj_file = GetObjectFile(); 95151b11e06de746667396f56b303d1867f007baf8bJim Ingham if (obj_file) 95251b11e06de746667396f56b303d1867f007baf8bJim Ingham { 95351b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionList *sections = obj_file->GetSectionList(); 95451b11e06de746667396f56b303d1867f007baf8bJim Ingham if (sections != NULL) 95551b11e06de746667396f56b303d1867f007baf8bJim Ingham { 95651b11e06de746667396f56b303d1867f007baf8bJim Ingham size_t num_sections = sections->GetSize(); 95751b11e06de746667396f56b303d1867f007baf8bJim Ingham for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++) 95851b11e06de746667396f56b303d1867f007baf8bJim Ingham { 95951b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionSP section_sp = sections->GetSectionAtIndex(sect_idx); 96051b11e06de746667396f56b303d1867f007baf8bJim Ingham if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS) 96151b11e06de746667396f56b303d1867f007baf8bJim Ingham { 96251b11e06de746667396f56b303d1867f007baf8bJim Ingham return true; 96351b11e06de746667396f56b303d1867f007baf8bJim Ingham } 96451b11e06de746667396f56b303d1867f007baf8bJim Ingham } 96551b11e06de746667396f56b303d1867f007baf8bJim Ingham } 96651b11e06de746667396f56b303d1867f007baf8bJim Ingham } 96751b11e06de746667396f56b303d1867f007baf8bJim Ingham return false; 96851b11e06de746667396f56b303d1867f007baf8bJim Ingham} 9697508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 9707508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch) 9717508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 972940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (!m_arch.IsValid()) 9737508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 9747508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham m_arch = new_arch; 9757508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return true; 976940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 977940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return m_arch == new_arch; 9787508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 9797508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 980