Module.cpp revision 3508c387c3f0c9ecc439d98048fd7694d41bab1b
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 { 8908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton ModuleList::RemoveOrphanSharedModules(); 9008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 9108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 9208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton void 9308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton DumpModuleInfo (void) 9408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 9508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton Mutex::Locker locker (Module::GetAllocationModuleCollectionMutex()); 9608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton ModuleCollection &modules = GetModuleCollection(); 9708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton const size_t count = modules.size(); 9808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton printf ("%s: %zu modules:\n", __PRETTY_FUNCTION__, count); 9908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton for (size_t i=0; i<count; ++i) 10008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 10108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 10208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton StreamString strm; 10308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton Module *module = modules[i]; 10408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton const bool in_shared_module_list = ModuleList::ModuleIsInCache (module); 10508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton module->GetDescription(&strm, eDescriptionLevelFull); 10608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton printf ("%p: shared = %i, ref_count = %3u, module = %s\n", 10708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton module, 10808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton in_shared_module_list, 10908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton (uint32_t)module->use_count(), 11008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton strm.GetString().c_str()); 11108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 11208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 11308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton} 11408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 11508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#endif 116899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 117899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 118b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonModule::Module(const FileSpec& file_spec, const lldb::ProcessSP &process_sp, lldb::addr_t header_addr) : 119b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_mutex (Mutex::eMutexTypeRecursive), 120b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_mod_time (), 121b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_arch (), 122b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_uuid (), 123b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_file (file_spec), 124b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_platform_file(), 1253508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_symfile_spec (), 126b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_object_name (), 127b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_object_offset (), 128b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_objfile_sp (), 129b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_symfile_ap (), 130b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_ast (), 131b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_did_load_objfile (false), 132b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_did_load_symbol_vendor (false), 133b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_did_parse_uuid (false), 134b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_did_init_ast (false), 135b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_is_dynamic_loader_module (false), 136b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_was_modified (false) 137b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 138b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Scope for locker below... 139b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 140b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 141b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton GetModuleCollection().push_back(this); 142b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 143b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton StreamString s; 144b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (m_file.GetFilename()) 145b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton s << m_file.GetFilename(); 146b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton s.Printf("[0x%16.16llx]", header_addr); 147b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_file.GetFilename().SetCString (s.GetData()); 148b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton Mutex::Locker locker (m_mutex); 149b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton DataBufferSP data_sp; 150b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (process_sp) 151b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 152b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_did_load_objfile = true; 153b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton std::auto_ptr<DataBufferHeap> data_ap (new DataBufferHeap (512, 0)); 154b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton Error error; 155b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const size_t bytes_read = process_sp->ReadMemory (header_addr, 156b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton data_ap->GetBytes(), 157b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton data_ap->GetByteSize(), 158b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton error); 159b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (bytes_read == 512) 160b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 161b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton data_sp.reset (data_ap.release()); 1623508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_objfile_sp = ObjectFile::FindPlugin(shared_from_this(), process_sp, header_addr, data_sp); 163b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (m_objfile_sp) 164b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 165b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Once we get the object file, update our module with the object file's 166b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // architecture since it might differ in vendor/os if some parts were 167b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // unknown. 168b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_objfile_sp->GetArchitecture (m_arch); 169b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 170b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 171b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 172b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 173b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 1743508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModule::Module(const FileSpec& file_spec, 1753508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const ArchSpec& arch, 1763508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const ConstString *object_name, 1773508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton off_t object_offset) : 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mutex (Mutex::eMutexTypeRecursive), 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time (file_spec.GetModificationTime()), 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arch (arch), 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_uuid (), 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file (file_spec), 18324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_platform_file(), 1843508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_symfile_spec (), 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name (), 186b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_object_offset (object_offset), 187e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_objfile_sp (), 188236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_symfile_ap (), 189b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast (), 190236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile (false), 191236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor (false), 192236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid (false), 193b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast (false), 194df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_is_dynamic_loader_module (false), 195df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_was_modified (false) 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 197899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 198899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 199899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 200899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton GetModuleCollection().push_back(this); 201899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 202899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_name) 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = *object_name; 205e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 209940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module() 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 219899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 220899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 221899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 222899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection &modules = GetModuleCollection(); 223899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator end = modules.end(); 224899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator pos = std::find(modules.begin(), end, this); 225899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton if (pos != end) 226899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton modules.erase(pos); 227899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 228e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')", 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 232940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 238b01000fd063629facd45044f137446fb748ee179Greg Clayton // Release any auto pointers before we start tearing down our member 239b01000fd063629facd45044f137446fb748ee179Greg Clayton // variables since the object file and symbol files might need to make 240b01000fd063629facd45044f137446fb748ee179Greg Clayton // function calls back into this module object. The ordering is important 241b01000fd063629facd45044f137446fb748ee179Greg Clayton // here because symbol files can require the module object file. So we tear 242b01000fd063629facd45044f137446fb748ee179Greg Clayton // down the symbol file first, then the object file. 243b01000fd063629facd45044f137446fb748ee179Greg Clayton m_symfile_ap.reset(); 244e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_objfile_sp.reset(); 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2480467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID& 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID() 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 252236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_parse_uuid == false) 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile * obj_file = GetObjectFile (); 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner obj_file->GetUUID(&m_uuid); 259236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid = true; 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_uuid; 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 265b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext & 266b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext () 267b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 268b01000fd063629facd45044f137446fb748ee179Greg Clayton Mutex::Locker locker (m_mutex); 269b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_did_init_ast == false) 270b01000fd063629facd45044f137446fb748ee179Greg Clayton { 271b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjectFile * objfile = GetObjectFile(); 272395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton ArchSpec object_arch; 273395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (objfile && objfile->GetArchitecture(object_arch)) 274b01000fd063629facd45044f137446fb748ee179Greg Clayton { 275b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast = true; 276395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton m_ast.SetArchitecture (object_arch); 277b01000fd063629facd45044f137446fb748ee179Greg Clayton } 278b01000fd063629facd45044f137446fb748ee179Greg Clayton } 279b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast; 280b01000fd063629facd45044f137446fb748ee179Greg Clayton} 281b01000fd063629facd45044f137446fb748ee179Greg Clayton 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols() 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits(); 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_comp_units == 0) 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29002e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton SymbolContext sc; 29113d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc.module_sp = shared_from_this(); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t cu_idx; 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++) 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get(); 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit) 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseCompileUnitFunctions(sc); 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t func_idx; 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx) 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseFunctionBlocks(sc); 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse the variables for this function and all its blocks 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse all types for this compile unit 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseTypes(sc); 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc) 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc->module_sp = shared_from_this(); 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3283508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModuleSP 329c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule::CalculateSymbolContextModule () 330c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{ 3313508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton return shared_from_this(); 332c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton} 333c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s) 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3377e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda s->Printf(", Module{%p}", this); 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits() 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this); 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->GetNumCompileUnits(); 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetCompileUnitAtIndex (uint32_t index) 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits (); 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompUnitSP cu_sp; 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index < num_comp_units) 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu_sp = symbols->GetCompileUnitAtIndex(index); 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return cu_sp; 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr) 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr); 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList()); 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved_flags = 0; 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the result symbol context in case we don't find anything 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.Clear(); 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the section from the section/offset address. 3883508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SectionSP section_sp (so_addr.GetSection()); 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure the section matches this module before we try and match anything 3913508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (section_sp && section_sp->GetModule().get() == this) 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If the section offset based address resolved itself, then this 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is the right module. 39513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc.module_sp = shared_from_this(); 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextModule; 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Resolve the compile unit, function, block, line table or line 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // entry if requested. 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (resolve_scope & eSymbolContextCompUnit || 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextFunction || 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextBlock || 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextLineEntry ) 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc); 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 410bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham // Resolve the symbol if requested, but don't re-look it up if we've already found it. 411bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol)) 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = ofile->GetSymtab(); 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (so_addr.IsSectionOffset()) 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress()); 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextSymbol; 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved_flags; 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 433537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath 434537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton( 435537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton const char *file_path, 436537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t line, 437537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton bool check_inlines, 438537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t resolve_scope, 439537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton SymbolContextList& sc_list 440537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton) 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 442537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec file_spec(file_path, false); 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list); 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)", 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory().AsCString(""), 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory() ? "/" : "", 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetFilename().AsCString(""), 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line, 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner check_inlines ? "yes" : "no", 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope); 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t initial_count = sc_list.GetSize(); 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list); 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_count; 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 4703e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindGlobalVariables(const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables) 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 4740fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables); 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindGlobalVariables(regex, append, max_matches, variables); 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 487801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonModule::FindCompileUnits (const FileSpec &path, 488801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton bool append, 489801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContextList &sc_list) 490801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{ 491801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (!append) 492801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc_list.Clear(); 493801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 494801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const uint32_t start_size = sc_list.GetSize(); 495801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const uint32_t num_compile_units = GetNumCompileUnits(); 496801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContext sc; 49713d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc.module_sp = shared_from_this(); 498801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const bool compare_directory = path.GetDirectory(); 499801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton for (uint32_t i=0; i<num_compile_units; ++i) 500801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 501801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc.comp_unit = GetCompileUnitAtIndex(i).get(); 502801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (FileSpec::Equal (*sc.comp_unit, path, compare_directory)) 503801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc_list.Append(sc); 504801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 505801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton return sc_list.GetSize() - start_size; 506801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton} 507801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 508801417e453f8531ac176cd952200587bf15d9ccfGreg Claytonuint32_t 5093e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindFunctions (const ConstString &name, 5103e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan const ClangNamespaceDecl *namespace_decl, 51128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton uint32_t name_type_mask, 512302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_symbols, 513302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_inlines, 51428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 51528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 51728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 51828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 51928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 52028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t start_size = sc_list.GetSize(); 52128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 52228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Find all the functions (not symbols, but debug information functions... 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 525302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list); 52628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 52728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 52828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 52928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 53028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 53128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 53228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 53328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 53428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 53528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 53628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 53728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 53828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t num_matches = symbol_indexes.size(); 53928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 54028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 541889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const bool merge_symbol_into_function = true; 54228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 54328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton for (uint32_t i=0; i<num_matches; i++) 54428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 54528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 546889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 54728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 54828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 54928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 55028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 55128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 55228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 55628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex, 557302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_symbols, 558302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_inlines, 55928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 56028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 56228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 56328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 56428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 56528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t start_size = sc_list.GetSize(); 56628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 569302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan symbols->FindFunctions(regex, include_inlines, append, sc_list); 57028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 57128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 57228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 57328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 57428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 57528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 57628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 57728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 57828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 57928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 58028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 58128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t num_matches = symbol_indexes.size(); 58228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 58328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 584889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const bool merge_symbol_into_function = true; 58528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 58628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton for (uint32_t i=0; i<num_matches; i++) 58728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 58828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 589889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 59028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 59128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 59228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 59328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 59428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 59528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5987aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Claytonuint32_t 5990fcec13c6639ab49216fa9447b25888b7bc9ff59Sean CallananModule::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types) 6007aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{ 6017aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 6027aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (sc.module_sp.get() == NULL || sc.module_sp.get() == this) 6037aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton { 6047aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton SymbolVendor *symbols = GetSymbolVendor (); 6057aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (symbols) 6060fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types); 6077aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton } 6087aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton return 0; 6097aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton} 6107aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton 611979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// depending on implementation details, type lookup might fail because of 612979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// embedded spurious namespace:: prefixes. this call strips them, paying 613979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// attention to the fact that a type might have namespace'd type names as 614979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// arguments to templates, and those must not be stripped off 615979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatastatic const char* 616979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataStripTypeName(const char* name_cstr) 617979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 618cd186e5ef6dacca7bd4914e99ef6b7551b5e79e4Johnny Chen // Protect against null c string. 619cd186e5ef6dacca7bd4914e99ef6b7551b5e79e4Johnny Chen if (!name_cstr) 620cd186e5ef6dacca7bd4914e99ef6b7551b5e79e4Johnny Chen return name_cstr; 621979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata const char* skip_namespace = strstr(name_cstr, "::"); 622979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata const char* template_arg_char = strchr(name_cstr, '<'); 623979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata while (skip_namespace != NULL) 624979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 625979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (template_arg_char != NULL && 626979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata skip_namespace > template_arg_char) // but namespace'd template arguments are still good to go 627979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 628979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata name_cstr = skip_namespace+2; 629979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata skip_namespace = strstr(name_cstr, "::"); 630979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 631979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return name_cstr; 632979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 633979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 634979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatauint32_t 6353e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindTypes (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types) 636979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 6370fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan uint32_t retval = FindTypes_Impl(sc, name, namespace_decl, append, max_matches, types); 638979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 639979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (retval == 0) 640979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 641a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham const char *orig_name = name.GetCString(); 642a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham const char *stripped = StripTypeName(orig_name); 643a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham // Only do this lookup if StripTypeName has stripped the name: 644a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham if (stripped != orig_name) 645a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham return FindTypes_Impl(sc, ConstString(stripped), namespace_decl, append, max_matches, types); 646a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham else 647a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham return 0; 648979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 649979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata else 650979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return retval; 651979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 652979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 653979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types) 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Timer scoped_timer(__PRETTY_FUNCTION__); 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolVendor *symbols = GetSymbolVendor (); 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (symbols) 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types); 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return 0; 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor* 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSymbolVendor (bool can_create) 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 669236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_symbol_vendor == false && can_create) 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *obj_file = GetObjectFile (); 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 6753508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_symfile_ap.reset(SymbolVendor::FindPlugin(shared_from_this())); 676236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor = true; 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_symfile_ap.get(); 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name) 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Container objects whose paths do not specify a file directly can call 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // this function to correct the file and object names. 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file = file; 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time = file.GetModificationTime(); 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = object_name; 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec& 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_arch; 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 69975d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::GetDescription (Stream *s, lldb::DescriptionLevel level) 7007826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{ 7017826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice Mutex::Locker locker (m_mutex); 7027826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 70375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (level >= eDescriptionLevelFull) 70475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 70575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (m_arch.IsValid()) 70675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->Printf("(%s) ", m_arch.GetArchitectureName()); 70775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 7087826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 70975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (level == eDescriptionLevelBrief) 71075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 71175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton const char *filename = m_file.GetFilename().GetCString(); 71275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (filename) 71375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->PutCString (filename); 71475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 71575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton else 71675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 71775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton char path[PATH_MAX]; 71875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (m_file.GetPath(path, sizeof(path))) 71975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->PutCString(path); 72075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 72149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 72249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton const char *object_name = m_object_name.GetCString(); 72349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton if (object_name) 72449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton s->Printf("(%s)", object_name); 7257826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice} 7267826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 7277826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid 72875d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportError (const char *format, ...) 72975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 730df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format && format[0]) 731df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 732df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton StreamString strm; 733df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("error: "); 734df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetDescription(&strm, lldb::eDescriptionLevelBrief); 7357129913a93594dc4d7b4e417212a366768337852Greg Clayton strm.PutChar (' '); 736df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 737df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 738df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PrintfVarArg(format, args); 739df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 740df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 741df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const int format_len = strlen(format); 742df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format_len > 0) 743df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 744df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const char last_char = format[format_len-1]; 745df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (last_char != '\n' || last_char != '\r') 746df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.EOL(); 747df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 748df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); 749df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 750df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 751df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton} 752df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 753df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonvoid 754df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::ReportErrorIfModifyDetected (const char *format, ...) 755df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{ 756df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (!GetModified(true) && GetModified(false)) 757df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 758df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format) 759df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 760df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton StreamString strm; 761df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("error: the object file "); 762df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetDescription(&strm, lldb::eDescriptionLevelFull); 763df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString (" has been modified\n"); 764df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 765df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 766df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 767df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PrintfVarArg(format, args); 768df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 769df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 770df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const int format_len = strlen(format); 771df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format_len > 0) 772df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 773df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const char last_char = format[format_len-1]; 774df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (last_char != '\n' || last_char != '\r') 775df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.EOL(); 776df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 777df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n"); 778df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); 779df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 780df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 78175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 78275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 78375d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 78475d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportWarning (const char *format, ...) 78575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 786df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format && format[0]) 787df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 788df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton StreamString strm; 789df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("warning: "); 7907129913a93594dc4d7b4e417212a366768337852Greg Clayton GetDescription(&strm, lldb::eDescriptionLevelFull); 7917129913a93594dc4d7b4e417212a366768337852Greg Clayton strm.PutChar (' '); 792df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 793df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 794df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 795df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PrintfVarArg(format, args); 796df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 797df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 798df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const int format_len = strlen(format); 799df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format_len > 0) 800df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 801df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const char last_char = format[format_len-1]; 802df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (last_char != '\n' || last_char != '\r') 803df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.EOL(); 804df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 805df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str()); 806df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 80775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 80875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 80975d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 81075d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::LogMessage (Log *log, const char *format, ...) 81175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 81275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (log) 81375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 81475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton StreamString log_message; 8157129913a93594dc4d7b4e417212a366768337852Greg Clayton GetDescription(&log_message, lldb::eDescriptionLevelFull); 81675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log_message.PutCString (": "); 81775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_list args; 81875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_start (args, format); 81975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log_message.PrintfVarArg (format, args); 82075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_end (args); 82175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log->PutCString(log_message.GetString().c_str()); 82275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 82375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 82475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 825df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonbool 826df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::GetModified (bool use_cached_only) 827df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{ 828df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (m_was_modified == false && use_cached_only == false) 829df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 830df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton TimeValue curr_mod_time (m_file.GetModificationTime()); 831df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_was_modified = curr_mod_time != m_mod_time; 832df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 833df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton return m_was_modified; 834df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton} 835df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 836df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonbool 837df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::SetModified (bool b) 838df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{ 839df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const bool prev_value = m_was_modified; 840df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_was_modified = b; 841df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton return prev_value; 842df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton} 843df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 844df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 84575d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s) 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 8493fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Indent(); 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("Module %s/%s%s%s%s\n", 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(), 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(), 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? "(" : "", 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? m_object_name.GetCString() : "", 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? ")" : ""); 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentMore(); 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner objfile->Dump(s); 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->Dump(s); 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentLess(); 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList* 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList () 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &symbols->GetTypeList(); 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_object_name; 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile() 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 892236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_objfile == false) 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 894236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile = true; 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString("")); 897db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton DataBufferSP file_data_sp; 8983508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_objfile_sp = ObjectFile::FindPlugin (shared_from_this(), 8993508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton &m_file, 9003508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_object_offset, 9013508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_file.GetByteSize(), 9023508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton file_data_sp); 9036a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (m_objfile_sp) 9046a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton { 9056a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // Once we get the object file, update our module with the object file's 9066a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // architecture since it might differ in vendor/os if some parts were 9076a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // unknown. 9086a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton m_objfile_sp->GetArchitecture (m_arch); 9096a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton } 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 911e40b6424d9e49306392bec4b44060da36414c382Greg Clayton return m_objfile_sp.get(); 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol * 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type) 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)", 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile(); 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 9277c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny); 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list) 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t num_indices = symbol_indexes.size(); 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_indices > 0) 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc; 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateSymbolContext (&sc); 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i = 0; i < num_indices; i++) 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]); 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Append (sc); 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 952aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean CallananModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list) 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsWithNameAndType (name = %s, type = %i)", 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes); 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression ®ex, SymbolType symbol_type, SymbolContextList &sc_list) 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)", 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText(), 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 9957c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue & 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mod_time; 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10077508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 10087508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 10097508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable () 10107508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 10117508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (GetObjectFile() == NULL) 10127508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return false; 10137508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham else 10147508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return GetObjectFile()->IsExecutable(); 10157508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 10167508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 101751b11e06de746667396f56b303d1867f007baf8bJim Inghambool 101851b11e06de746667396f56b303d1867f007baf8bJim InghamModule::IsLoadedInTarget (Target *target) 101951b11e06de746667396f56b303d1867f007baf8bJim Ingham{ 102051b11e06de746667396f56b303d1867f007baf8bJim Ingham ObjectFile *obj_file = GetObjectFile(); 102151b11e06de746667396f56b303d1867f007baf8bJim Ingham if (obj_file) 102251b11e06de746667396f56b303d1867f007baf8bJim Ingham { 102351b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionList *sections = obj_file->GetSectionList(); 102451b11e06de746667396f56b303d1867f007baf8bJim Ingham if (sections != NULL) 102551b11e06de746667396f56b303d1867f007baf8bJim Ingham { 102651b11e06de746667396f56b303d1867f007baf8bJim Ingham size_t num_sections = sections->GetSize(); 102751b11e06de746667396f56b303d1867f007baf8bJim Ingham for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++) 102851b11e06de746667396f56b303d1867f007baf8bJim Ingham { 102951b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionSP section_sp = sections->GetSectionAtIndex(sect_idx); 103051b11e06de746667396f56b303d1867f007baf8bJim Ingham if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS) 103151b11e06de746667396f56b303d1867f007baf8bJim Ingham { 103251b11e06de746667396f56b303d1867f007baf8bJim Ingham return true; 103351b11e06de746667396f56b303d1867f007baf8bJim Ingham } 103451b11e06de746667396f56b303d1867f007baf8bJim Ingham } 103551b11e06de746667396f56b303d1867f007baf8bJim Ingham } 103651b11e06de746667396f56b303d1867f007baf8bJim Ingham } 103751b11e06de746667396f56b303d1867f007baf8bJim Ingham return false; 103851b11e06de746667396f56b303d1867f007baf8bJim Ingham} 10397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 10407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch) 10417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 1042940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (!m_arch.IsValid()) 10437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 10447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham m_arch = new_arch; 10457508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return true; 1046940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 1047940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return m_arch == new_arch; 10487508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 10497508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 1050b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonbool 1051b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonModule::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed) 1052b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 1053b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton changed = false; 1054b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ObjectFile *image_object_file = GetObjectFile(); 1055b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (image_object_file) 1056b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1057b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton SectionList *section_list = image_object_file->GetSectionList (); 1058b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (section_list) 1059b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1060b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const size_t num_sections = section_list->GetSize(); 1061b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton size_t sect_idx = 0; 1062b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) 1063b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1064b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Iterate through the object file sections to find the 1065b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // first section that starts of file offset zero and that 1066b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // has bytes in the file... 1067b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton Section *section = section_list->GetSectionAtIndex (sect_idx).get(); 1068b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (section) 1069b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1070b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (target.GetSectionLoadList().SetSectionLoadAddress (section, section->GetFileAddress() + offset)) 1071b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton changed = true; 1072b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 1073b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 1074b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return sect_idx > 0; 1075b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 1076b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 1077b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return false; 1078b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 1079b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 1080