Module.cpp revision 860b9ea0038cdcea2dda00b1657f945363c96d00
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" 11b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Core/DataBuffer.h" 12b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Core/DataBufferHeap.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h" 1675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton#include "lldb/Core/StreamString.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 18df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton#include "lldb/Host/Host.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h" 23b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Process.h" 24b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Target.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// Shared pointers to modules track module lifetimes in 30899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// targets and in the global module, but this collection 31899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// will track all module objects that are still alive 32899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytontypedef std::vector<Module *> ModuleCollection; 33899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 34899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonstatic ModuleCollection & 35899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonGetModuleCollection() 36899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 37b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // This module collection needs to live past any module, so we could either make it a 38b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // shared pointer in each module or just leak is. Since it is only an empty vector by 39b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // the time all the modules have gone away, we just leak it for now. If we decide this 40b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // is a big problem we can introduce a Finalize method that will tear everything down in 41b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // a predictable order. 42b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham 43b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham static ModuleCollection *g_module_collection = NULL; 44b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham if (g_module_collection == NULL) 45b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham g_module_collection = new ModuleCollection(); 46b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham 47b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham return *g_module_collection; 48899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 49899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 50c149c8b3a88e5c8a94febdf956551e378c531797Greg ClaytonMutex * 51899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocationModuleCollectionMutex() 52899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 53c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // NOTE: The mutex below must be leaked since the global module list in 54c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // the ModuleList class will get torn at some point, and we can't know 55c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // if it will tear itself down before the "g_module_collection_mutex" below 56c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // will. So we leak a Mutex object below to safeguard against that 57c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton 58c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton static Mutex *g_module_collection_mutex = NULL; 59c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton if (g_module_collection_mutex == NULL) 60c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton g_module_collection_mutex = new Mutex (Mutex::eMutexTypeRecursive); // NOTE: known leak 61c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton return g_module_collection_mutex; 62899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 63899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 64899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonsize_t 65899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetNumberAllocatedModules () 66899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 67899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 68899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return GetModuleCollection().size(); 69899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 70899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 71899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule * 72899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocatedModuleAtIndex (size_t idx) 73899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 74899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 75899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection &modules = GetModuleCollection(); 76899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton if (idx < modules.size()) 77899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return modules[idx]; 78899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return NULL; 79899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 8008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#if 0 81899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 8208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// These functions help us to determine if modules are still loaded, yet don't require that 8308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// you have a command interpreter and can easily be called from an external debugger. 8408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Claytonnamespace lldb { 85899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 8608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton void 8708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton ClearModuleInfo (void) 8808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 89860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton const bool mandatory = true; 90860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton ModuleList::RemoveOrphanSharedModules(mandatory); 9108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 9208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 9308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton void 9408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton DumpModuleInfo (void) 9508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 9608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton Mutex::Locker locker (Module::GetAllocationModuleCollectionMutex()); 9708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton ModuleCollection &modules = GetModuleCollection(); 9808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton const size_t count = modules.size(); 9908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton printf ("%s: %zu modules:\n", __PRETTY_FUNCTION__, count); 10008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton for (size_t i=0; i<count; ++i) 10108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 10208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 10308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton StreamString strm; 10408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton Module *module = modules[i]; 10508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton const bool in_shared_module_list = ModuleList::ModuleIsInCache (module); 10608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton module->GetDescription(&strm, eDescriptionLevelFull); 10708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton printf ("%p: shared = %i, ref_count = %3u, module = %s\n", 10808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton module, 10908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton in_shared_module_list, 11008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton (uint32_t)module->use_count(), 11108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton strm.GetString().c_str()); 11208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 11308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 11408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton} 11508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 11608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#endif 117899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 118444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonModule::Module (const ModuleSpec &module_spec) : 119444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_mutex (Mutex::eMutexTypeRecursive), 120444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_mod_time (module_spec.GetFileSpec().GetModificationTime()), 121444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_arch (module_spec.GetArchitecture()), 122444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_uuid (), 123444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_file (module_spec.GetFileSpec()), 124444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_platform_file(module_spec.GetPlatformFileSpec()), 125444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_symfile_spec (module_spec.GetSymbolFileSpec()), 126444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_name (module_spec.GetObjectName()), 127444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_offset (module_spec.GetObjectOffset()), 128444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_objfile_sp (), 129444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_symfile_ap (), 130444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_ast (), 131964deba8853eb794e59263322b59b09b43669618Greg Clayton m_source_mappings (), 132444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_did_load_objfile (false), 133444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_did_load_symbol_vendor (false), 134444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_did_parse_uuid (false), 135444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_did_init_ast (false), 136444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_is_dynamic_loader_module (false), 137444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_was_modified (false) 138444fe998bf707bd076a70c3a779db8575533695eGreg Clayton{ 139444fe998bf707bd076a70c3a779db8575533695eGreg Clayton // Scope for locker below... 140444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 141444fe998bf707bd076a70c3a779db8575533695eGreg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 142444fe998bf707bd076a70c3a779db8575533695eGreg Clayton GetModuleCollection().push_back(this); 143444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 144444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 145444fe998bf707bd076a70c3a779db8575533695eGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 146444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (log) 147444fe998bf707bd076a70c3a779db8575533695eGreg Clayton log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", 148444fe998bf707bd076a70c3a779db8575533695eGreg Clayton this, 149444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_arch.GetArchitectureName(), 150444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_file.GetDirectory().AsCString(""), 151444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_file.GetFilename().AsCString(""), 152444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_name.IsEmpty() ? "" : "(", 153444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 154444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_name.IsEmpty() ? "" : ")"); 155444fe998bf707bd076a70c3a779db8575533695eGreg Clayton} 156444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1573508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModule::Module(const FileSpec& file_spec, 1583508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const ArchSpec& arch, 1593508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const ConstString *object_name, 1603508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton off_t object_offset) : 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mutex (Mutex::eMutexTypeRecursive), 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time (file_spec.GetModificationTime()), 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arch (arch), 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_uuid (), 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file (file_spec), 16624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_platform_file(), 1673508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_symfile_spec (), 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name (), 169b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_object_offset (object_offset), 170e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_objfile_sp (), 171236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_symfile_ap (), 172b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast (), 173964deba8853eb794e59263322b59b09b43669618Greg Clayton m_source_mappings (), 174236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile (false), 175236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor (false), 176236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid (false), 177b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast (false), 178df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_is_dynamic_loader_module (false), 179df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_was_modified (false) 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 181899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 182899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 183899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 184899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton GetModuleCollection().push_back(this); 185899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 186899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_name) 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = *object_name; 189e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 193940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module() 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 203899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 204899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 205899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 206899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection &modules = GetModuleCollection(); 207899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator end = modules.end(); 208899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator pos = std::find(modules.begin(), end, this); 209899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton if (pos != end) 210899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton modules.erase(pos); 211899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 212e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')", 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 216940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 222b01000fd063629facd45044f137446fb748ee179Greg Clayton // Release any auto pointers before we start tearing down our member 223b01000fd063629facd45044f137446fb748ee179Greg Clayton // variables since the object file and symbol files might need to make 224b01000fd063629facd45044f137446fb748ee179Greg Clayton // function calls back into this module object. The ordering is important 225b01000fd063629facd45044f137446fb748ee179Greg Clayton // here because symbol files can require the module object file. So we tear 226b01000fd063629facd45044f137446fb748ee179Greg Clayton // down the symbol file first, then the object file. 227b01000fd063629facd45044f137446fb748ee179Greg Clayton m_symfile_ap.reset(); 228e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_objfile_sp.reset(); 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2316c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonObjectFile * 2326c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonModule::GetMemoryObjectFile (const lldb::ProcessSP &process_sp, lldb::addr_t header_addr, Error &error) 2336c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton{ 2346c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (m_objfile_sp) 2356c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2366c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorString ("object file already exists"); 2376c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2386c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton else 2396c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2406c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton Mutex::Locker locker (m_mutex); 2416c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (process_sp) 2426c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2436c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton StreamString s; 2446c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (m_file.GetFilename()) 2456c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton s << m_file.GetFilename(); 2466c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton s.Printf("[0x%16.16llx]", header_addr); 2476c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton m_file.GetFilename().SetCString (s.GetData()); 2486c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton m_did_load_objfile = true; 2496c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton std::auto_ptr<DataBufferHeap> data_ap (new DataBufferHeap (512, 0)); 2506c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton Error readmem_error; 2516c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton const size_t bytes_read = process_sp->ReadMemory (header_addr, 2526c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton data_ap->GetBytes(), 2536c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton data_ap->GetByteSize(), 2546c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton readmem_error); 2556c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (bytes_read == 512) 2566c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2576c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton DataBufferSP data_sp(data_ap.release()); 2586c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton m_objfile_sp = ObjectFile::FindPlugin(shared_from_this(), process_sp, header_addr, data_sp); 2596c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (m_objfile_sp) 2606c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2616c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton // Once we get the object file, update our module with the object file's 2626c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton // architecture since it might differ in vendor/os if some parts were 2636c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton // unknown. 2646c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton m_objfile_sp->GetArchitecture (m_arch); 2656c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2666c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton else 2676c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2686c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorString ("unable to find suitable object file plug-in"); 2696c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2706c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2716c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton else 2726c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2736c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorStringWithFormat ("unable to read header from memory: %s", readmem_error.AsCString()); 2746c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2756c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2766c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton else 2776c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2786c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorString ("invalid process"); 2796c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2806c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2816c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton return m_objfile_sp.get(); 2826c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton} 2836c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2850467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID& 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID() 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 289236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_parse_uuid == false) 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile * obj_file = GetObjectFile (); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner obj_file->GetUUID(&m_uuid); 296236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid = true; 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_uuid; 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext & 303b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext () 304b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 305b01000fd063629facd45044f137446fb748ee179Greg Clayton Mutex::Locker locker (m_mutex); 306b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_did_init_ast == false) 307b01000fd063629facd45044f137446fb748ee179Greg Clayton { 308b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjectFile * objfile = GetObjectFile(); 309395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton ArchSpec object_arch; 310395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (objfile && objfile->GetArchitecture(object_arch)) 311b01000fd063629facd45044f137446fb748ee179Greg Clayton { 312b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast = true; 313395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton m_ast.SetArchitecture (object_arch); 314b01000fd063629facd45044f137446fb748ee179Greg Clayton } 315b01000fd063629facd45044f137446fb748ee179Greg Clayton } 316b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast; 317b01000fd063629facd45044f137446fb748ee179Greg Clayton} 318b01000fd063629facd45044f137446fb748ee179Greg Clayton 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols() 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits(); 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_comp_units == 0) 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32702e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton SymbolContext sc; 32813d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc.module_sp = shared_from_this(); 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t cu_idx; 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++) 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get(); 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit) 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseCompileUnitFunctions(sc); 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t func_idx; 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx) 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseFunctionBlocks(sc); 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse the variables for this function and all its blocks 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse all types for this compile unit 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseTypes(sc); 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc) 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36213d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc->module_sp = shared_from_this(); 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3653508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModuleSP 366c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule::CalculateSymbolContextModule () 367c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{ 3683508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton return shared_from_this(); 369c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton} 370c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s) 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3747e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda s->Printf(", Module{%p}", this); 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits() 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this); 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->GetNumCompileUnits(); 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetCompileUnitAtIndex (uint32_t index) 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits (); 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompUnitSP cu_sp; 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index < num_comp_units) 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu_sp = symbols->GetCompileUnitAtIndex(index); 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return cu_sp; 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr) 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr); 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList()); 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved_flags = 0; 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the result symbol context in case we don't find anything 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.Clear(); 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the section from the section/offset address. 4253508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SectionSP section_sp (so_addr.GetSection()); 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure the section matches this module before we try and match anything 4283508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (section_sp && section_sp->GetModule().get() == this) 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If the section offset based address resolved itself, then this 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is the right module. 43213d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc.module_sp = shared_from_this(); 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextModule; 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Resolve the compile unit, function, block, line table or line 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // entry if requested. 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (resolve_scope & eSymbolContextCompUnit || 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextFunction || 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextBlock || 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextLineEntry ) 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc); 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 447bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham // Resolve the symbol if requested, but don't re-look it up if we've already found it. 448bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol)) 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = ofile->GetSymtab(); 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (so_addr.IsSectionOffset()) 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress()); 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextSymbol; 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved_flags; 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 470537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath 471537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton( 472537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton const char *file_path, 473537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t line, 474537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton bool check_inlines, 475537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t resolve_scope, 476537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton SymbolContextList& sc_list 477537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton) 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 479537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec file_spec(file_path, false); 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list); 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)", 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory().AsCString(""), 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory() ? "/" : "", 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetFilename().AsCString(""), 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line, 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner check_inlines ? "yes" : "no", 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope); 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t initial_count = sc_list.GetSize(); 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list); 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_count; 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 5073e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindGlobalVariables(const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables) 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 5110fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables); 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindGlobalVariables(regex, append, max_matches, variables); 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 524801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonModule::FindCompileUnits (const FileSpec &path, 525801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton bool append, 526801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContextList &sc_list) 527801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{ 528801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (!append) 529801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc_list.Clear(); 530801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 531801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const uint32_t start_size = sc_list.GetSize(); 532801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const uint32_t num_compile_units = GetNumCompileUnits(); 533801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContext sc; 53413d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc.module_sp = shared_from_this(); 535801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const bool compare_directory = path.GetDirectory(); 536801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton for (uint32_t i=0; i<num_compile_units; ++i) 537801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 538801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc.comp_unit = GetCompileUnitAtIndex(i).get(); 539801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (FileSpec::Equal (*sc.comp_unit, path, compare_directory)) 540801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc_list.Append(sc); 541801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 542801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton return sc_list.GetSize() - start_size; 543801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton} 544801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 545801417e453f8531ac176cd952200587bf15d9ccfGreg Claytonuint32_t 5463e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindFunctions (const ConstString &name, 5473e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan const ClangNamespaceDecl *namespace_decl, 54828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton uint32_t name_type_mask, 549302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_symbols, 550302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_inlines, 55128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 55228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 55428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 55528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 55628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 55728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t start_size = sc_list.GetSize(); 55828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 55928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Find all the functions (not symbols, but debug information functions... 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 562302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list); 56328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 56428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 56528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 56628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 56728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 56828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 56928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 57028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 57128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 57228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 57328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 57428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 57528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t num_matches = symbol_indexes.size(); 57628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 57728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 578889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const bool merge_symbol_into_function = true; 57928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 58028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton for (uint32_t i=0; i<num_matches; i++) 58128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 58228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 583889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 58428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 58528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 58628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 58728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 58828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 58928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 59328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex, 594302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_symbols, 595302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_inlines, 59628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 59728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 59928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 60028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 60128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 60228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t start_size = sc_list.GetSize(); 60328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 606302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan symbols->FindFunctions(regex, include_inlines, append, sc_list); 60728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 60828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 60928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 61028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 61128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 61228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 61328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 61428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 61528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 61628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 61728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 61828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t num_matches = symbol_indexes.size(); 61928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 62028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 621889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const bool merge_symbol_into_function = true; 62228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 62328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton for (uint32_t i=0; i<num_matches; i++) 62428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 62528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 626889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 62728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 62828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 62928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 63028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 63128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 63228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6357aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Claytonuint32_t 636dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypes_Impl (const SymbolContext& sc, 637dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ConstString &name, 638dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ClangNamespaceDecl *namespace_decl, 639dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton bool append, 640dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton uint32_t max_matches, 641dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton TypeList& types) 6427aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{ 6437aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 6447aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (sc.module_sp.get() == NULL || sc.module_sp.get() == this) 6457aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton { 6467aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton SymbolVendor *symbols = GetSymbolVendor (); 6477aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (symbols) 6480fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types); 6497aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton } 6507aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton return 0; 6517aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton} 6527aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton 653dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Claytonuint32_t 654dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypesInNamespace (const SymbolContext& sc, 655dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ConstString &type_name, 656dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ClangNamespaceDecl *namespace_decl, 657dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton uint32_t max_matches, 658dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton TypeList& type_list) 659979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 660dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const bool append = true; 661dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return FindTypes_Impl(sc, type_name, namespace_decl, append, max_matches, type_list); 662979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 663979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 664979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatauint32_t 665dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypes (const SymbolContext& sc, 666dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ConstString &name, 667dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton bool exact_match, 668dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton uint32_t max_matches, 669dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton TypeList& types) 670979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 671dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton uint32_t num_matches = 0; 672dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const char *type_name_cstr = name.GetCString(); 673dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton std::string type_scope; 674dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton std::string type_basename; 675dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const bool append = true; 676dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (Type::GetTypeScopeAndBasename (type_name_cstr, type_scope, type_basename)) 677979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 678dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // Check if "name" starts with "::" which means the qualified type starts 679dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // from the root namespace and implies and exact match. The typenames we 680dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // get back from clang do not start with "::" so we need to strip this off 681dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // in order to get the qualfied names to match 682dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 683dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (type_scope.size() >= 2 && type_scope[0] == ':' && type_scope[1] == ':') 684dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 685dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton type_scope.erase(0,2); 686dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton exact_match = true; 687dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 688dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton ConstString type_basename_const_str (type_basename.c_str()); 689dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (FindTypes_Impl(sc, type_basename_const_str, NULL, append, max_matches, types)) 690dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 691dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton types.RemoveMismatchedTypes (type_scope, type_basename, exact_match); 692dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton num_matches = types.GetSize(); 693dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 694a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham else 695dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 696dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton types.Clear(); 697dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 698979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 699979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata else 700dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 701dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // The type is not in a namespace/class scope, just search for it by basename 702dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton num_matches = FindTypes_Impl(sc, name, NULL, append, max_matches, types); 703dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 704dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 705dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return num_matches; 706979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 707979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 708979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types) 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Timer scoped_timer(__PRETTY_FUNCTION__); 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolVendor *symbols = GetSymbolVendor (); 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (symbols) 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types); 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return 0; 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor* 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSymbolVendor (bool can_create) 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 724236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_symbol_vendor == false && can_create) 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *obj_file = GetObjectFile (); 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 7303508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_symfile_ap.reset(SymbolVendor::FindPlugin(shared_from_this())); 731236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor = true; 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_symfile_ap.get(); 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name) 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Container objects whose paths do not specify a file directly can call 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // this function to correct the file and object names. 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file = file; 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time = file.GetModificationTime(); 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = object_name; 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec& 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_arch; 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 75475d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::GetDescription (Stream *s, lldb::DescriptionLevel level) 7557826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{ 7567826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice Mutex::Locker locker (m_mutex); 7577826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 75875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (level >= eDescriptionLevelFull) 75975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 76075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (m_arch.IsValid()) 76175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->Printf("(%s) ", m_arch.GetArchitectureName()); 76275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 7637826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 76475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (level == eDescriptionLevelBrief) 76575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 76675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton const char *filename = m_file.GetFilename().GetCString(); 76775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (filename) 76875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->PutCString (filename); 76975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 77075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton else 77175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 77275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton char path[PATH_MAX]; 77375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (m_file.GetPath(path, sizeof(path))) 77475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->PutCString(path); 77575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 77649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 77749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton const char *object_name = m_object_name.GetCString(); 77849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton if (object_name) 77949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton s->Printf("(%s)", object_name); 7807826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice} 7817826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 7827826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid 78375d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportError (const char *format, ...) 78475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 785df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format && format[0]) 786df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 787df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton StreamString strm; 788df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("error: "); 789df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetDescription(&strm, lldb::eDescriptionLevelBrief); 7907129913a93594dc4d7b4e417212a366768337852Greg Clayton strm.PutChar (' '); 791df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 792df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 793df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PrintfVarArg(format, args); 794df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 795df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 796df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const int format_len = strlen(format); 797df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format_len > 0) 798df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 799df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const char last_char = format[format_len-1]; 800df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (last_char != '\n' || last_char != '\r') 801df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.EOL(); 802df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 803df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); 804df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 805df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 806df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton} 807df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 808df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonvoid 809df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::ReportErrorIfModifyDetected (const char *format, ...) 810df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{ 811df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (!GetModified(true) && GetModified(false)) 812df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 813df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format) 814df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 815df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton StreamString strm; 816df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("error: the object file "); 817df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetDescription(&strm, lldb::eDescriptionLevelFull); 818df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString (" has been modified\n"); 819df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 820df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 821df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 822df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PrintfVarArg(format, args); 823df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 824df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 825df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const int format_len = strlen(format); 826df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format_len > 0) 827df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 828df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const char last_char = format[format_len-1]; 829df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (last_char != '\n' || last_char != '\r') 830df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.EOL(); 831df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 832df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n"); 833df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); 834df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 835df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 83675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 83775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 83875d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 83975d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportWarning (const char *format, ...) 84075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 841df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format && format[0]) 842df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 843df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton StreamString strm; 844df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("warning: "); 8457129913a93594dc4d7b4e417212a366768337852Greg Clayton GetDescription(&strm, lldb::eDescriptionLevelFull); 8467129913a93594dc4d7b4e417212a366768337852Greg Clayton strm.PutChar (' '); 847df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 848df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 849df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 850df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PrintfVarArg(format, args); 851df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 852df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 853df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const int format_len = strlen(format); 854df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format_len > 0) 855df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 856df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const char last_char = format[format_len-1]; 857df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (last_char != '\n' || last_char != '\r') 858df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.EOL(); 859df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 860df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str()); 861df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 86275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 86375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 86475d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 86575d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::LogMessage (Log *log, const char *format, ...) 86675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 86775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (log) 86875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 86975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton StreamString log_message; 8707129913a93594dc4d7b4e417212a366768337852Greg Clayton GetDescription(&log_message, lldb::eDescriptionLevelFull); 87175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log_message.PutCString (": "); 87275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_list args; 87375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_start (args, format); 87475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log_message.PrintfVarArg (format, args); 87575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_end (args); 87675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log->PutCString(log_message.GetString().c_str()); 87775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 87875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 87975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 880df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonbool 881df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::GetModified (bool use_cached_only) 882df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{ 883df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (m_was_modified == false && use_cached_only == false) 884df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 885df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton TimeValue curr_mod_time (m_file.GetModificationTime()); 886df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_was_modified = curr_mod_time != m_mod_time; 887df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 888df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton return m_was_modified; 889df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton} 890df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 891df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonbool 892df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::SetModified (bool b) 893df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{ 894df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const bool prev_value = m_was_modified; 895df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_was_modified = b; 896df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton return prev_value; 897df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton} 898df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 899df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 90075d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s) 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 9043fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Indent(); 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("Module %s/%s%s%s%s\n", 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(), 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(), 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? "(" : "", 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? m_object_name.GetCString() : "", 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? ")" : ""); 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentMore(); 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner objfile->Dump(s); 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->Dump(s); 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentLess(); 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList* 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList () 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &symbols->GetTypeList(); 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_object_name; 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile() 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 947236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_objfile == false) 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 949236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile = true; 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString("")); 952db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton DataBufferSP file_data_sp; 9533508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_objfile_sp = ObjectFile::FindPlugin (shared_from_this(), 9543508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton &m_file, 9553508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_object_offset, 9563508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_file.GetByteSize(), 9573508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton file_data_sp); 9586a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (m_objfile_sp) 9596a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton { 9606a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // Once we get the object file, update our module with the object file's 9616a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // architecture since it might differ in vendor/os if some parts were 9626a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // unknown. 9636a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton m_objfile_sp->GetArchitecture (m_arch); 9646a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton } 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 966e40b6424d9e49306392bec4b44060da36414c382Greg Clayton return m_objfile_sp.get(); 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol * 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type) 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)", 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile(); 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 9827c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny); 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list) 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t num_indices = symbol_indexes.size(); 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_indices > 0) 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc; 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateSymbolContext (&sc); 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i = 0; i < num_indices; i++) 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]); 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Append (sc); 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 1007aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean CallananModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list) 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsWithNameAndType (name = %s, type = %i)", 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes); 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression ®ex, SymbolType symbol_type, SymbolContextList &sc_list) 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)", 104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText(), 104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 10507c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue & 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mod_time; 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10627508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 10637508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 10647508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable () 10657508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 10667508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (GetObjectFile() == NULL) 10677508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return false; 10687508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham else 10697508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return GetObjectFile()->IsExecutable(); 10707508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 10717508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 107251b11e06de746667396f56b303d1867f007baf8bJim Inghambool 107351b11e06de746667396f56b303d1867f007baf8bJim InghamModule::IsLoadedInTarget (Target *target) 107451b11e06de746667396f56b303d1867f007baf8bJim Ingham{ 107551b11e06de746667396f56b303d1867f007baf8bJim Ingham ObjectFile *obj_file = GetObjectFile(); 107651b11e06de746667396f56b303d1867f007baf8bJim Ingham if (obj_file) 107751b11e06de746667396f56b303d1867f007baf8bJim Ingham { 107851b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionList *sections = obj_file->GetSectionList(); 107951b11e06de746667396f56b303d1867f007baf8bJim Ingham if (sections != NULL) 108051b11e06de746667396f56b303d1867f007baf8bJim Ingham { 108151b11e06de746667396f56b303d1867f007baf8bJim Ingham size_t num_sections = sections->GetSize(); 108251b11e06de746667396f56b303d1867f007baf8bJim Ingham for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++) 108351b11e06de746667396f56b303d1867f007baf8bJim Ingham { 108451b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionSP section_sp = sections->GetSectionAtIndex(sect_idx); 108551b11e06de746667396f56b303d1867f007baf8bJim Ingham if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS) 108651b11e06de746667396f56b303d1867f007baf8bJim Ingham { 108751b11e06de746667396f56b303d1867f007baf8bJim Ingham return true; 108851b11e06de746667396f56b303d1867f007baf8bJim Ingham } 108951b11e06de746667396f56b303d1867f007baf8bJim Ingham } 109051b11e06de746667396f56b303d1867f007baf8bJim Ingham } 109151b11e06de746667396f56b303d1867f007baf8bJim Ingham } 109251b11e06de746667396f56b303d1867f007baf8bJim Ingham return false; 109351b11e06de746667396f56b303d1867f007baf8bJim Ingham} 10947508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 10957508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch) 10967508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 1097940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (!m_arch.IsValid()) 10987508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 10997508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham m_arch = new_arch; 11007508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return true; 1101940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 1102940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return m_arch == new_arch; 11037508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 11047508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 1105b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonbool 1106b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonModule::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed) 1107b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 11089ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton size_t num_loaded_sections = 0; 11099ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton ObjectFile *objfile = GetObjectFile(); 11109ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton if (objfile) 1111b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 11129ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton SectionList *section_list = objfile->GetSectionList (); 1113b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (section_list) 1114b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1115b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const size_t num_sections = section_list->GetSize(); 1116b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton size_t sect_idx = 0; 1117b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) 1118b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1119b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Iterate through the object file sections to find the 1120b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // first section that starts of file offset zero and that 1121b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // has bytes in the file... 1122b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton Section *section = section_list->GetSectionAtIndex (sect_idx).get(); 11239ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton // Only load non-thread specific sections when given a slide 11249ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton if (section && !section->IsThreadSpecific()) 1125b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1126b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (target.GetSectionLoadList().SetSectionLoadAddress (section, section->GetFileAddress() + offset)) 11279ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton ++num_loaded_sections; 1128b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 1129b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 1130b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 1131b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 11329ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton changed = num_loaded_sections > 0; 11339ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton return num_loaded_sections > 0; 1134b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 1135b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 1136444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1137444fe998bf707bd076a70c3a779db8575533695eGreg Claytonbool 1138444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonModule::MatchesModuleSpec (const ModuleSpec &module_ref) 1139444fe998bf707bd076a70c3a779db8575533695eGreg Clayton{ 1140444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const UUID &uuid = module_ref.GetUUID(); 1141444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1142444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (uuid.IsValid()) 1143444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 1144444fe998bf707bd076a70c3a779db8575533695eGreg Clayton // If the UUID matches, then nothing more needs to match... 1145444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (uuid == GetUUID()) 1146444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return true; 1147444fe998bf707bd076a70c3a779db8575533695eGreg Clayton else 1148444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1149444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1150444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1151444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const FileSpec &file_spec = module_ref.GetFileSpec(); 1152444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (file_spec) 1153444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 1154444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (!FileSpec::Equal (file_spec, m_file, file_spec.GetDirectory())) 1155444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1156444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1157444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1158444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const FileSpec &platform_file_spec = module_ref.GetPlatformFileSpec(); 1159444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (platform_file_spec) 1160444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 1161444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (!FileSpec::Equal (platform_file_spec, m_platform_file, platform_file_spec.GetDirectory())) 1162444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1163444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1164444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1165444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const ArchSpec &arch = module_ref.GetArchitecture(); 1166444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (arch.IsValid()) 1167444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 1168444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (m_arch != arch) 1169444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1170444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1171444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1172444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const ConstString &object_name = module_ref.GetObjectName(); 1173444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (object_name) 1174444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 1175444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (object_name != GetObjectName()) 1176444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1177444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1178444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return true; 1179444fe998bf707bd076a70c3a779db8575533695eGreg Clayton} 1180444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1181964deba8853eb794e59263322b59b09b43669618Greg Claytonbool 1182964deba8853eb794e59263322b59b09b43669618Greg ClaytonModule::FindSourceFile (const FileSpec &orig_spec, FileSpec &new_spec) const 1183964deba8853eb794e59263322b59b09b43669618Greg Clayton{ 1184964deba8853eb794e59263322b59b09b43669618Greg Clayton Mutex::Locker locker (m_mutex); 1185964deba8853eb794e59263322b59b09b43669618Greg Clayton return m_source_mappings.FindFile (orig_spec, new_spec); 1186964deba8853eb794e59263322b59b09b43669618Greg Clayton} 1187964deba8853eb794e59263322b59b09b43669618Greg Clayton 11882418fddf2e200c827da5bc6c855f3d4971b2d867Greg Claytonbool 11892418fddf2e200c827da5bc6c855f3d4971b2d867Greg ClaytonModule::RemapSourceFile (const char *path, std::string &new_path) const 11902418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton{ 11912418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton Mutex::Locker locker (m_mutex); 11922418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton return m_source_mappings.RemapPath(path, new_path); 11932418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton} 11942418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton 1195