Module.cpp revision a7e864cb0a450c7ef65b6f9f6c9bae839c405906
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 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 12146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata#include "lldb/Core/Error.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 14b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Core/DataBuffer.h" 15b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Core/DataBufferHeap.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h" 1849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h" 2049ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Section.h" 2175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton#include "lldb/Core/StreamString.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 23df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton#include "lldb/Host/Host.h" 24146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata#include "lldb/Host/Symbols.h" 25146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata#include "lldb/Interpreter/CommandInterpreter.h" 26146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata#include "lldb/Interpreter/ScriptInterpreter.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 2849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h" 32b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Process.h" 33b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Target.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// Shared pointers to modules track module lifetimes in 39899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// targets and in the global module, but this collection 40899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// will track all module objects that are still alive 41899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytontypedef std::vector<Module *> ModuleCollection; 42899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 43899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonstatic ModuleCollection & 44899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonGetModuleCollection() 45899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 46b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // This module collection needs to live past any module, so we could either make it a 47b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // shared pointer in each module or just leak is. Since it is only an empty vector by 48b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // the time all the modules have gone away, we just leak it for now. If we decide this 49b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // is a big problem we can introduce a Finalize method that will tear everything down in 50b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // a predictable order. 51b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham 52b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham static ModuleCollection *g_module_collection = NULL; 53b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham if (g_module_collection == NULL) 54b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham g_module_collection = new ModuleCollection(); 55b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham 56b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham return *g_module_collection; 57899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 58899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 59c149c8b3a88e5c8a94febdf956551e378c531797Greg ClaytonMutex * 60899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocationModuleCollectionMutex() 61899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 62c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // NOTE: The mutex below must be leaked since the global module list in 63c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // the ModuleList class will get torn at some point, and we can't know 64c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // if it will tear itself down before the "g_module_collection_mutex" below 65c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // will. So we leak a Mutex object below to safeguard against that 66c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton 67c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton static Mutex *g_module_collection_mutex = NULL; 68c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton if (g_module_collection_mutex == NULL) 69c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton g_module_collection_mutex = new Mutex (Mutex::eMutexTypeRecursive); // NOTE: known leak 70c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton return g_module_collection_mutex; 71899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 72899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 73899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonsize_t 74899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetNumberAllocatedModules () 75899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 76899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 77899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return GetModuleCollection().size(); 78899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 79899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 80899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule * 81899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocatedModuleAtIndex (size_t idx) 82899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 83899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 84899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection &modules = GetModuleCollection(); 85899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton if (idx < modules.size()) 86899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return modules[idx]; 87899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return NULL; 88899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 8908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#if 0 90899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 9108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// These functions help us to determine if modules are still loaded, yet don't require that 9208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// you have a command interpreter and can easily be called from an external debugger. 9308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Claytonnamespace lldb { 94899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 9508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton void 9608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton ClearModuleInfo (void) 9708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 98860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton const bool mandatory = true; 99860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton ModuleList::RemoveOrphanSharedModules(mandatory); 10008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 10108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 10208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton void 10308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton DumpModuleInfo (void) 10408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 10508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton Mutex::Locker locker (Module::GetAllocationModuleCollectionMutex()); 10608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton ModuleCollection &modules = GetModuleCollection(); 10708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton const size_t count = modules.size(); 1085f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea printf ("%s: %" PRIu64 " modules:\n", __PRETTY_FUNCTION__, (uint64_t)count); 10908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton for (size_t i=0; i<count; ++i) 11008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 11108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 11208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton StreamString strm; 11308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton Module *module = modules[i]; 11408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton const bool in_shared_module_list = ModuleList::ModuleIsInCache (module); 11508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton module->GetDescription(&strm, eDescriptionLevelFull); 11608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton printf ("%p: shared = %i, ref_count = %3u, module = %s\n", 11708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton module, 11808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton in_shared_module_list, 11908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton (uint32_t)module->use_count(), 12008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton strm.GetString().c_str()); 12108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 12208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 12308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton} 12408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 12508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#endif 126f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton 127444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonModule::Module (const ModuleSpec &module_spec) : 128444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_mutex (Mutex::eMutexTypeRecursive), 129444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_mod_time (module_spec.GetFileSpec().GetModificationTime()), 130444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_arch (module_spec.GetArchitecture()), 131444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_uuid (), 132444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_file (module_spec.GetFileSpec()), 133444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_platform_file(module_spec.GetPlatformFileSpec()), 134444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_symfile_spec (module_spec.GetSymbolFileSpec()), 135444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_name (module_spec.GetObjectName()), 136444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_offset (module_spec.GetObjectOffset()), 137444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_objfile_sp (), 138444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_symfile_ap (), 139444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_ast (), 140964deba8853eb794e59263322b59b09b43669618Greg Clayton m_source_mappings (), 141444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_did_load_objfile (false), 142444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_did_load_symbol_vendor (false), 143444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_did_parse_uuid (false), 144444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_did_init_ast (false), 145444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_is_dynamic_loader_module (false), 146cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton m_file_has_changed (false), 147cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton m_first_file_changed_log (false) 148444fe998bf707bd076a70c3a779db8575533695eGreg Clayton{ 149444fe998bf707bd076a70c3a779db8575533695eGreg Clayton // Scope for locker below... 150444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 151444fe998bf707bd076a70c3a779db8575533695eGreg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 152444fe998bf707bd076a70c3a779db8575533695eGreg Clayton GetModuleCollection().push_back(this); 153444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 154444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 155f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES)); 156444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (log) 157444fe998bf707bd076a70c3a779db8575533695eGreg Clayton log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", 158444fe998bf707bd076a70c3a779db8575533695eGreg Clayton this, 159444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_arch.GetArchitectureName(), 160444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_file.GetDirectory().AsCString(""), 161444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_file.GetFilename().AsCString(""), 162444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_name.IsEmpty() ? "" : "(", 163444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 164444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_name.IsEmpty() ? "" : ")"); 165444fe998bf707bd076a70c3a779db8575533695eGreg Clayton} 166444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1673508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModule::Module(const FileSpec& file_spec, 1683508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const ArchSpec& arch, 1693508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const ConstString *object_name, 1703508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton off_t object_offset) : 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mutex (Mutex::eMutexTypeRecursive), 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time (file_spec.GetModificationTime()), 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arch (arch), 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_uuid (), 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file (file_spec), 17624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_platform_file(), 1773508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_symfile_spec (), 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name (), 179b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_object_offset (object_offset), 180e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_objfile_sp (), 181236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_symfile_ap (), 182b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast (), 183964deba8853eb794e59263322b59b09b43669618Greg Clayton m_source_mappings (), 184236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile (false), 185236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor (false), 186236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid (false), 187b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast (false), 188df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_is_dynamic_loader_module (false), 189cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton m_file_has_changed (false), 190cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton m_first_file_changed_log (false) 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 192899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 193899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 194899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 195899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton GetModuleCollection().push_back(this); 196899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 197899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_name) 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = *object_name; 200f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES)); 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 204940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module() 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 214899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 215899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 216899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 217899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection &modules = GetModuleCollection(); 218899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator end = modules.end(); 219899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator pos = std::find(modules.begin(), end, this); 220f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton assert (pos != end); 221f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton modules.erase(pos); 222899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 223f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES)); 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')", 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 227940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 233b01000fd063629facd45044f137446fb748ee179Greg Clayton // Release any auto pointers before we start tearing down our member 234b01000fd063629facd45044f137446fb748ee179Greg Clayton // variables since the object file and symbol files might need to make 235b01000fd063629facd45044f137446fb748ee179Greg Clayton // function calls back into this module object. The ordering is important 236b01000fd063629facd45044f137446fb748ee179Greg Clayton // here because symbol files can require the module object file. So we tear 237b01000fd063629facd45044f137446fb748ee179Greg Clayton // down the symbol file first, then the object file. 238b01000fd063629facd45044f137446fb748ee179Greg Clayton m_symfile_ap.reset(); 239e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_objfile_sp.reset(); 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2426c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonObjectFile * 2436c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonModule::GetMemoryObjectFile (const lldb::ProcessSP &process_sp, lldb::addr_t header_addr, Error &error) 2446c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton{ 2456c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (m_objfile_sp) 2466c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2476c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorString ("object file already exists"); 2486c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2496c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton else 2506c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2516c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton Mutex::Locker locker (m_mutex); 2526c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (process_sp) 2536c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2546c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton m_did_load_objfile = true; 2556c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton std::auto_ptr<DataBufferHeap> data_ap (new DataBufferHeap (512, 0)); 2566c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton Error readmem_error; 2576c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton const size_t bytes_read = process_sp->ReadMemory (header_addr, 2586c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton data_ap->GetBytes(), 2596c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton data_ap->GetByteSize(), 2606c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton readmem_error); 2616c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (bytes_read == 512) 2626c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2636c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton DataBufferSP data_sp(data_ap.release()); 2646c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton m_objfile_sp = ObjectFile::FindPlugin(shared_from_this(), process_sp, header_addr, data_sp); 2656c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (m_objfile_sp) 2666c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 267808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton StreamString s; 2685f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf("0x%16.16" PRIx64, header_addr); 269808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton m_object_name.SetCString (s.GetData()); 270808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton 271808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton // Once we get the object file, update our module with the object file's 2726c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton // architecture since it might differ in vendor/os if some parts were 2736c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton // unknown. 2746c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton m_objfile_sp->GetArchitecture (m_arch); 2756c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2766c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton else 2776c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2786c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorString ("unable to find suitable object file plug-in"); 2796c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2806c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2816c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton else 2826c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2836c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorStringWithFormat ("unable to read header from memory: %s", readmem_error.AsCString()); 2846c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2856c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2866c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton else 2876c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2886c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorString ("invalid process"); 2896c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2906c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2916c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton return m_objfile_sp.get(); 2926c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton} 2936c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2950467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID& 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID() 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 299236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_parse_uuid == false) 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile * obj_file = GetObjectFile (); 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner obj_file->GetUUID(&m_uuid); 306236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid = true; 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_uuid; 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 312b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext & 313b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext () 314b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 315b01000fd063629facd45044f137446fb748ee179Greg Clayton Mutex::Locker locker (m_mutex); 316b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_did_init_ast == false) 317b01000fd063629facd45044f137446fb748ee179Greg Clayton { 318b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjectFile * objfile = GetObjectFile(); 319395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton ArchSpec object_arch; 320395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (objfile && objfile->GetArchitecture(object_arch)) 321b01000fd063629facd45044f137446fb748ee179Greg Clayton { 322b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast = true; 3231b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda 3241b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda // LLVM wants this to be set to iOS or MacOSX; if we're working on 3251b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda // a bare-boards type image, change the triple for llvm's benefit. 3261b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda if (object_arch.GetTriple().getVendor() == llvm::Triple::Apple 3271b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda && object_arch.GetTriple().getOS() == llvm::Triple::UnknownOS) 3281b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda { 3291b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda if (object_arch.GetTriple().getArch() == llvm::Triple::arm || 3301b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda object_arch.GetTriple().getArch() == llvm::Triple::thumb) 3311b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda { 3321b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda object_arch.GetTriple().setOS(llvm::Triple::IOS); 3331b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda } 3341b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda else 3351b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda { 3361b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda object_arch.GetTriple().setOS(llvm::Triple::MacOSX); 3371b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda } 3381b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda } 339395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton m_ast.SetArchitecture (object_arch); 340b01000fd063629facd45044f137446fb748ee179Greg Clayton } 341b01000fd063629facd45044f137446fb748ee179Greg Clayton } 342b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast; 343b01000fd063629facd45044f137446fb748ee179Greg Clayton} 344b01000fd063629facd45044f137446fb748ee179Greg Clayton 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols() 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 34936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_comp_units = GetNumCompileUnits(); 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_comp_units == 0) 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35302e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton SymbolContext sc; 35413d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc.module_sp = shared_from_this(); 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t cu_idx = 0; cu_idx < num_comp_units; cu_idx++) 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get(); 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit) 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseCompileUnitFunctions(sc); 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx) 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseFunctionBlocks(sc); 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse the variables for this function and all its blocks 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse all types for this compile unit 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseTypes(sc); 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc) 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38613d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc->module_sp = shared_from_this(); 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3893508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModuleSP 390c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule::CalculateSymbolContextModule () 391c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{ 3923508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton return shared_from_this(); 393c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton} 394c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s) 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3987e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda s->Printf(", Module{%p}", this); 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits() 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this); 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->GetNumCompileUnits(); 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 41336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonModule::GetCompileUnitAtIndex (size_t index) 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 41636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_comp_units = GetNumCompileUnits (); 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompUnitSP cu_sp; 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index < num_comp_units) 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu_sp = symbols->GetCompileUnitAtIndex(index); 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return cu_sp; 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr) 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 4325f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%" PRIx64 ")", vm_addr); 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList()); 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved_flags = 0; 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 445a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton // Clear the result symbol context in case we don't find anything, but don't clear the target 446a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton sc.Clear(false); 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the section from the section/offset address. 4493508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SectionSP section_sp (so_addr.GetSection()); 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure the section matches this module before we try and match anything 4523508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (section_sp && section_sp->GetModule().get() == this) 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If the section offset based address resolved itself, then this 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is the right module. 45613d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc.module_sp = shared_from_this(); 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextModule; 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Resolve the compile unit, function, block, line table or line 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // entry if requested. 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (resolve_scope & eSymbolContextCompUnit || 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextFunction || 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextBlock || 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextLineEntry ) 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc); 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 471bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham // Resolve the symbol if requested, but don't re-look it up if we've already found it. 472bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol)) 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = ofile->GetSymtab(); 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (so_addr.IsSectionOffset()) 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress()); 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextSymbol; 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved_flags; 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 494537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath 495537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton( 496537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton const char *file_path, 497537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t line, 498537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton bool check_inlines, 499537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t resolve_scope, 500537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton SymbolContextList& sc_list 501537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton) 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 503537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec file_spec(file_path, false); 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list); 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)", 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory().AsCString(""), 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory() ? "/" : "", 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetFilename().AsCString(""), 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line, 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner check_inlines ? "yes" : "no", 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope); 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t initial_count = sc_list.GetSize(); 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list); 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_count; 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 53136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonModule::FindGlobalVariables (const ConstString &name, 53236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const ClangNamespaceDecl *namespace_decl, 53336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton bool append, 53436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t max_matches, 53536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton VariableList& variables) 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 5390fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables); 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 54236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton 54336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 54436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonModule::FindGlobalVariables (const RegularExpression& regex, 54536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton bool append, 54636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t max_matches, 54736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton VariableList& variables) 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindGlobalVariables(regex, append, max_matches, variables); 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 556801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonModule::FindCompileUnits (const FileSpec &path, 557801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton bool append, 558801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContextList &sc_list) 559801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{ 560801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (!append) 561801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc_list.Clear(); 562801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 56336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t start_size = sc_list.GetSize(); 56436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_compile_units = GetNumCompileUnits(); 565801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContext sc; 56613d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc.module_sp = shared_from_this(); 567801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const bool compare_directory = path.GetDirectory(); 56836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t i=0; i<num_compile_units; ++i) 569801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 570801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc.comp_unit = GetCompileUnitAtIndex(i).get(); 571c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton if (sc.comp_unit) 572c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton { 573c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton if (FileSpec::Equal (*sc.comp_unit, path, compare_directory)) 574c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton sc_list.Append(sc); 575c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton } 576801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 577801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton return sc_list.GetSize() - start_size; 578801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton} 579801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 58036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 5813e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindFunctions (const ConstString &name, 5823e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan const ClangNamespaceDecl *namespace_decl, 58336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint32_t name_type_mask, 584302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_symbols, 585302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_inlines, 58628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 58728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 58928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 59028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 59128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 59236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t start_size = sc_list.GetSize(); 59328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 59428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Find all the functions (not symbols, but debug information functions... 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 597302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list); 59828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 59928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 60028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 60128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 60228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 60328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 60428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 60528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 60628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 60728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 60828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 60928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 61036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_matches = symbol_indexes.size(); 61128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 61228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 613889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const bool merge_symbol_into_function = true; 61428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 61536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t i=0; i<num_matches; i++) 61628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 61728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 618889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 61928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 62028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 62128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 62228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 62328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 62428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 62828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex, 629302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_symbols, 630302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_inlines, 63128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 63228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 63428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 63528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 63628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 63736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t start_size = sc_list.GetSize(); 63828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 641302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan symbols->FindFunctions(regex, include_inlines, append, sc_list); 64228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 64328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 64428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 64528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 64628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 64728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 64828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 64928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 65028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 65128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 65228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 65336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_matches = symbol_indexes.size(); 65428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 65528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 656889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const bool merge_symbol_into_function = true; 65728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 65836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t i=0; i<num_matches; i++) 65928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 66028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 661889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 66228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 66328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 66428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 66528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 66628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 66728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 671dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypes_Impl (const SymbolContext& sc, 672dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ConstString &name, 673dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ClangNamespaceDecl *namespace_decl, 674dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton bool append, 67536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t max_matches, 676dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton TypeList& types) 6777aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{ 6787aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 6797aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (sc.module_sp.get() == NULL || sc.module_sp.get() == this) 6807aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton { 6817aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton SymbolVendor *symbols = GetSymbolVendor (); 6827aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (symbols) 6830fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types); 6847aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton } 6857aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton return 0; 6867aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton} 6877aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton 68836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 689dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypesInNamespace (const SymbolContext& sc, 690dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ConstString &type_name, 691dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ClangNamespaceDecl *namespace_decl, 69236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t max_matches, 693dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton TypeList& type_list) 694979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 695dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const bool append = true; 696dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return FindTypes_Impl(sc, type_name, namespace_decl, append, max_matches, type_list); 697979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 698979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 6990b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Claytonlldb::TypeSP 7000b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg ClaytonModule::FindFirstType (const SymbolContext& sc, 7010b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton const ConstString &name, 7020b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton bool exact_match) 7030b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton{ 7040b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton TypeList type_list; 70536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_matches = FindTypes (sc, name, exact_match, 1, type_list); 7060b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton if (num_matches) 7070b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton return type_list.GetTypeAtIndex(0); 7080b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton return TypeSP(); 7090b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton} 7100b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton 7110b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton 71236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 713dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypes (const SymbolContext& sc, 714dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ConstString &name, 715dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton bool exact_match, 71636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t max_matches, 717dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton TypeList& types) 718979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 71936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_matches = 0; 720dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const char *type_name_cstr = name.GetCString(); 721dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton std::string type_scope; 722dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton std::string type_basename; 723dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const bool append = true; 724b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton TypeClass type_class = eTypeClassAny; 725b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton if (Type::GetTypeScopeAndBasename (type_name_cstr, type_scope, type_basename, type_class)) 726979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 727dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // Check if "name" starts with "::" which means the qualified type starts 728dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // from the root namespace and implies and exact match. The typenames we 729dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // get back from clang do not start with "::" so we need to strip this off 730dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // in order to get the qualfied names to match 731dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 732dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (type_scope.size() >= 2 && type_scope[0] == ':' && type_scope[1] == ':') 733dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 734dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton type_scope.erase(0,2); 735dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton exact_match = true; 736dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 737dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton ConstString type_basename_const_str (type_basename.c_str()); 738dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (FindTypes_Impl(sc, type_basename_const_str, NULL, append, max_matches, types)) 739dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 740b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton types.RemoveMismatchedTypes (type_scope, type_basename, type_class, exact_match); 741dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton num_matches = types.GetSize(); 742dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 743979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 744979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata else 745dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 746dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // The type is not in a namespace/class scope, just search for it by basename 747b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton if (type_class != eTypeClassAny) 748b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton { 749b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton // The "type_name_cstr" will have been modified if we have a valid type class 750b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton // prefix (like "struct", "class", "union", "typedef" etc). 751b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton num_matches = FindTypes_Impl(sc, ConstString(type_name_cstr), NULL, append, max_matches, types); 752b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton types.RemoveMismatchedTypes (type_class); 753b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton num_matches = types.GetSize(); 754b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton } 755b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton else 756b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton { 757b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton num_matches = FindTypes_Impl(sc, name, NULL, append, max_matches, types); 758b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton } 759dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 760dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 761dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return num_matches; 762979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 763979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 764979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor* 766188091899842b140313b54e097f16efbe165c998Greg ClaytonModule::GetSymbolVendor (bool can_create, lldb_private::Stream *feedback_strm) 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 769236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_symbol_vendor == false && can_create) 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *obj_file = GetObjectFile (); 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 775188091899842b140313b54e097f16efbe165c998Greg Clayton m_symfile_ap.reset(SymbolVendor::FindPlugin(shared_from_this(), feedback_strm)); 776236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor = true; 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_symfile_ap.get(); 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name) 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Container objects whose paths do not specify a file directly can call 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // this function to correct the file and object names. 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file = file; 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time = file.GetModificationTime(); 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = object_name; 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec& 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_arch; 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 79975d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::GetDescription (Stream *s, lldb::DescriptionLevel level) 8007826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{ 8017826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice Mutex::Locker locker (m_mutex); 8027826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 80375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (level >= eDescriptionLevelFull) 80475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 80575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (m_arch.IsValid()) 80675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->Printf("(%s) ", m_arch.GetArchitectureName()); 80775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 8087826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 80975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (level == eDescriptionLevelBrief) 81075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 81175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton const char *filename = m_file.GetFilename().GetCString(); 81275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (filename) 81375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->PutCString (filename); 81475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 81575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton else 81675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 81775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton char path[PATH_MAX]; 81875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (m_file.GetPath(path, sizeof(path))) 81975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->PutCString(path); 82075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 82149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 82249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton const char *object_name = m_object_name.GetCString(); 82349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton if (object_name) 82449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton s->Printf("(%s)", object_name); 8257826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice} 8267826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 8277826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid 82875d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportError (const char *format, ...) 82975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 830df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format && format[0]) 831df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 832df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton StreamString strm; 833df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("error: "); 834df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetDescription(&strm, lldb::eDescriptionLevelBrief); 8357129913a93594dc4d7b4e417212a366768337852Greg Clayton strm.PutChar (' '); 836df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 837df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 838df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PrintfVarArg(format, args); 839df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 840df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 841df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const int format_len = strlen(format); 842df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format_len > 0) 843df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 844df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const char last_char = format[format_len-1]; 845df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (last_char != '\n' || last_char != '\r') 846df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.EOL(); 847df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 848df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); 849df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 850df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 851df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton} 852df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 853cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Claytonbool 854cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg ClaytonModule::FileHasChanged () const 855cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton{ 856cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton if (m_file_has_changed == false) 857cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton m_file_has_changed = (m_file.GetModificationTime() != m_mod_time); 858cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton return m_file_has_changed; 859cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton} 860cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton 861df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonvoid 862df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::ReportErrorIfModifyDetected (const char *format, ...) 863df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{ 864cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton if (m_first_file_changed_log == false) 865df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 866cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton if (FileHasChanged ()) 867df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 868cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton m_first_file_changed_log = true; 869cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton if (format) 870df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 871cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton StreamString strm; 872cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton strm.PutCString("error: the object file "); 873cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton GetDescription(&strm, lldb::eDescriptionLevelFull); 874cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton strm.PutCString (" has been modified\n"); 875cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton 876cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton va_list args; 877cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton va_start (args, format); 878cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton strm.PrintfVarArg(format, args); 879cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton va_end (args); 880cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton 881cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton const int format_len = strlen(format); 882cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton if (format_len > 0) 883cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton { 884cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton const char last_char = format[format_len-1]; 885cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton if (last_char != '\n' || last_char != '\r') 886cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton strm.EOL(); 887cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton } 888cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n"); 889cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); 890df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 891df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 892df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 89375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 89475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 89575d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 89675d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportWarning (const char *format, ...) 89775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 898df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format && format[0]) 899df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 900df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton StreamString strm; 901df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("warning: "); 9027129913a93594dc4d7b4e417212a366768337852Greg Clayton GetDescription(&strm, lldb::eDescriptionLevelFull); 9037129913a93594dc4d7b4e417212a366768337852Greg Clayton strm.PutChar (' '); 904df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 905df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 906df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 907df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PrintfVarArg(format, args); 908df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 909df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 910df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const int format_len = strlen(format); 911df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format_len > 0) 912df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 913df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const char last_char = format[format_len-1]; 914df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (last_char != '\n' || last_char != '\r') 915df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.EOL(); 916df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 917df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str()); 918df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 91975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 92075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 92175d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 92275d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::LogMessage (Log *log, const char *format, ...) 92375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 92475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (log) 92575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 92675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton StreamString log_message; 9277129913a93594dc4d7b4e417212a366768337852Greg Clayton GetDescription(&log_message, lldb::eDescriptionLevelFull); 92875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log_message.PutCString (": "); 92975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_list args; 93075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_start (args, format); 93175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log_message.PrintfVarArg (format, args); 93275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_end (args); 93375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log->PutCString(log_message.GetString().c_str()); 93475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 93575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 93675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 93773a35715708b65b1d96c1c8f439548bb0990df08Greg Claytonvoid 93873a35715708b65b1d96c1c8f439548bb0990df08Greg ClaytonModule::LogMessageVerboseBacktrace (Log *log, const char *format, ...) 93973a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton{ 94073a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton if (log) 94173a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton { 94273a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton StreamString log_message; 94373a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton GetDescription(&log_message, lldb::eDescriptionLevelFull); 94473a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton log_message.PutCString (": "); 94573a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton va_list args; 94673a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton va_start (args, format); 94773a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton log_message.PrintfVarArg (format, args); 94873a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton va_end (args); 94973a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton if (log->GetVerbose()) 95073a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton Host::Backtrace (log_message, 1024); 95173a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton log->PutCString(log_message.GetString().c_str()); 95273a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton } 95373a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton} 95473a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton 95575d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s) 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 9593fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Indent(); 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("Module %s/%s%s%s%s\n", 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(), 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(), 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? "(" : "", 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? m_object_name.GetCString() : "", 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? ")" : ""); 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentMore(); 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner objfile->Dump(s); 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->Dump(s); 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentLess(); 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList* 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList () 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &symbols->GetTypeList(); 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_object_name; 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile() 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 1002236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_objfile == false) 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1004236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile = true; 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString("")); 1007cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton DataBufferSP data_sp; 1008cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t data_offset = 0; 1009cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton m_objfile_sp = ObjectFile::FindPlugin (shared_from_this(), 10103508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton &m_file, 10113508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_object_offset, 10123508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_file.GetByteSize(), 1013cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton data_sp, 1014cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton data_offset); 10156a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (m_objfile_sp) 10166a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton { 10176a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // Once we get the object file, update our module with the object file's 10186a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // architecture since it might differ in vendor/os if some parts were 10196a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // unknown. 10206a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton m_objfile_sp->GetArchitecture (m_arch); 10216a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton } 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1023e40b6424d9e49306392bec4b44060da36414c382Greg Clayton return m_objfile_sp.get(); 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol * 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type) 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)", 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile(); 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 10397c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny); 104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list) 104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t num_indices = symbol_indexes.size(); 105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_indices > 0) 105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc; 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateSymbolContext (&sc); 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i = 0; i < num_indices; i++) 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]); 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Append (sc); 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 10642fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg ClaytonModule::FindFunctionSymbols (const ConstString &name, 10652fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton uint32_t name_type_mask, 10662fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton SymbolContextList& sc_list) 10672fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton{ 10682fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton Timer scoped_timer(__PRETTY_FUNCTION__, 10692fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton "Module::FindSymbolsFunctions (name = %s, mask = 0x%8.8x)", 10702fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton name.AsCString(), 10712fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton name_type_mask); 10722fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton ObjectFile *objfile = GetObjectFile (); 10732fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton if (objfile) 10742fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton { 10752fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton Symtab *symtab = objfile->GetSymtab(); 10762fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton if (symtab) 10772fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton return symtab->FindFunctionSymbols (name, name_type_mask, sc_list); 10782fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton } 10792fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton return 0; 10802fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton} 10812fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton 10822fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Claytonsize_t 1083aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean CallananModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list) 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsWithNameAndType (name = %s, type = %i)", 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes); 110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression ®ex, SymbolType symbol_type, SymbolContextList &sc_list) 111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)", 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText(), 111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 11267c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue & 113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const 113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mod_time; 113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 11397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 11407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable () 11417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 11427508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (GetObjectFile() == NULL) 11437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return false; 11447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham else 11457508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return GetObjectFile()->IsExecutable(); 11467508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 11477508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 114851b11e06de746667396f56b303d1867f007baf8bJim Inghambool 114951b11e06de746667396f56b303d1867f007baf8bJim InghamModule::IsLoadedInTarget (Target *target) 115051b11e06de746667396f56b303d1867f007baf8bJim Ingham{ 115151b11e06de746667396f56b303d1867f007baf8bJim Ingham ObjectFile *obj_file = GetObjectFile(); 115251b11e06de746667396f56b303d1867f007baf8bJim Ingham if (obj_file) 115351b11e06de746667396f56b303d1867f007baf8bJim Ingham { 115451b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionList *sections = obj_file->GetSectionList(); 115551b11e06de746667396f56b303d1867f007baf8bJim Ingham if (sections != NULL) 115651b11e06de746667396f56b303d1867f007baf8bJim Ingham { 115751b11e06de746667396f56b303d1867f007baf8bJim Ingham size_t num_sections = sections->GetSize(); 115851b11e06de746667396f56b303d1867f007baf8bJim Ingham for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++) 115951b11e06de746667396f56b303d1867f007baf8bJim Ingham { 116051b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionSP section_sp = sections->GetSectionAtIndex(sect_idx); 116151b11e06de746667396f56b303d1867f007baf8bJim Ingham if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS) 116251b11e06de746667396f56b303d1867f007baf8bJim Ingham { 116351b11e06de746667396f56b303d1867f007baf8bJim Ingham return true; 116451b11e06de746667396f56b303d1867f007baf8bJim Ingham } 116551b11e06de746667396f56b303d1867f007baf8bJim Ingham } 116651b11e06de746667396f56b303d1867f007baf8bJim Ingham } 116751b11e06de746667396f56b303d1867f007baf8bJim Ingham } 116851b11e06de746667396f56b303d1867f007baf8bJim Ingham return false; 116951b11e06de746667396f56b303d1867f007baf8bJim Ingham} 1170146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata 1171146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granatabool 1172146d9522c95c0c8c5409539813b55e08b99196eeEnrico GranataModule::LoadScriptingResourceInTarget (Target *target, Error& error) 1173146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata{ 1174146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata if (!target) 1175146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata { 1176146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata error.SetErrorString("invalid destination Target"); 1177146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata return false; 1178146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata } 1179146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata 1180d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton Debugger &debugger = target->GetDebugger(); 1181d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton const ScriptLanguage script_language = debugger.GetScriptLanguage(); 1182d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (script_language != eScriptLanguageNone) 1183146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata { 1184d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 1185d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton PlatformSP platform_sp(target->GetPlatform()); 1186d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 1187d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (!platform_sp) 1188d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton { 1189d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton error.SetErrorString("invalid Platform"); 1190d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton return false; 1191d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton } 1192146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata 1193146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata ScriptInterpreter *script_interpreter = debugger.GetCommandInterpreter().GetScriptInterpreter(); 1194146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata if (script_interpreter) 1195146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata { 1196d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton FileSpecList file_specs = platform_sp->LocateExecutableScriptingResources (target, 1197d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton *this); 1198d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 1199d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 1200d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton const uint32_t num_specs = file_specs.GetSize(); 1201d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (num_specs) 1202d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton { 1203d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton for (uint32_t i=0; i<num_specs; ++i) 1204d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton { 1205d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton FileSpec scripting_fspec (file_specs.GetFileSpecAtIndex(i)); 1206d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (scripting_fspec && scripting_fspec.Exists()) 1207d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton { 1208d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 1209d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton StreamString scripting_stream; 1210d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton scripting_fspec.Dump(&scripting_stream); 1211d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton const bool can_reload = false; 1212d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton const bool init_lldb_globals = false; 1213d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton bool did_load = script_interpreter->LoadScriptingModule(scripting_stream.GetData(), can_reload, init_lldb_globals, error); 1214d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (!did_load) 1215d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton return false; 1216d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton } 1217d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton } 1218d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton } 1219146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata } 1220146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata else 1221146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata { 1222146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata error.SetErrorString("invalid ScriptInterpreter"); 1223146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata return false; 1224146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata } 1225146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata } 1226146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata return true; 1227146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata} 1228146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata 1229146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granatabool 12307508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch) 12317508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 1232940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (!m_arch.IsValid()) 12337508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 12347508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham m_arch = new_arch; 12357508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return true; 1236940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 123740e278caddf5442776f9408f20d757cc85fe630aSean Callanan return m_arch.IsExactMatch(new_arch); 12387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 12397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 1240b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonbool 1241b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonModule::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed) 1242b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 12439ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton size_t num_loaded_sections = 0; 12449ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton ObjectFile *objfile = GetObjectFile(); 12459ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton if (objfile) 1246b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 12479ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton SectionList *section_list = objfile->GetSectionList (); 1248b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (section_list) 1249b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1250b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const size_t num_sections = section_list->GetSize(); 1251b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton size_t sect_idx = 0; 1252b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) 1253b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1254b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Iterate through the object file sections to find the 1255b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // first section that starts of file offset zero and that 1256b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // has bytes in the file... 1257545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx)); 12589ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton // Only load non-thread specific sections when given a slide 1259545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton if (section_sp && !section_sp->IsThreadSpecific()) 1260b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1261545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() + offset)) 12629ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton ++num_loaded_sections; 1263b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 1264b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 1265b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 1266b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 12679ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton changed = num_loaded_sections > 0; 12689ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton return num_loaded_sections > 0; 1269b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 1270b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 1271444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1272444fe998bf707bd076a70c3a779db8575533695eGreg Claytonbool 1273444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonModule::MatchesModuleSpec (const ModuleSpec &module_ref) 1274444fe998bf707bd076a70c3a779db8575533695eGreg Clayton{ 1275444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const UUID &uuid = module_ref.GetUUID(); 1276444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1277444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (uuid.IsValid()) 1278444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 1279444fe998bf707bd076a70c3a779db8575533695eGreg Clayton // If the UUID matches, then nothing more needs to match... 1280444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (uuid == GetUUID()) 1281444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return true; 1282444fe998bf707bd076a70c3a779db8575533695eGreg Clayton else 1283444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1284444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1285444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1286444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const FileSpec &file_spec = module_ref.GetFileSpec(); 1287444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (file_spec) 1288444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 1289444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (!FileSpec::Equal (file_spec, m_file, file_spec.GetDirectory())) 1290444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1291444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1292444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1293444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const FileSpec &platform_file_spec = module_ref.GetPlatformFileSpec(); 1294444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (platform_file_spec) 1295444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 129658aa7152a7df8c9825c63026ec35c24759de948bGreg Clayton if (!FileSpec::Equal (platform_file_spec, GetPlatformFileSpec (), platform_file_spec.GetDirectory())) 1297444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1298444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1299444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1300444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const ArchSpec &arch = module_ref.GetArchitecture(); 1301444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (arch.IsValid()) 1302444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 130340e278caddf5442776f9408f20d757cc85fe630aSean Callanan if (!m_arch.IsCompatibleMatch(arch)) 1304444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1305444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1306444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1307444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const ConstString &object_name = module_ref.GetObjectName(); 1308444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (object_name) 1309444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 1310444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (object_name != GetObjectName()) 1311444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1312444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1313444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return true; 1314444fe998bf707bd076a70c3a779db8575533695eGreg Clayton} 1315444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1316964deba8853eb794e59263322b59b09b43669618Greg Claytonbool 1317964deba8853eb794e59263322b59b09b43669618Greg ClaytonModule::FindSourceFile (const FileSpec &orig_spec, FileSpec &new_spec) const 1318964deba8853eb794e59263322b59b09b43669618Greg Clayton{ 1319964deba8853eb794e59263322b59b09b43669618Greg Clayton Mutex::Locker locker (m_mutex); 1320964deba8853eb794e59263322b59b09b43669618Greg Clayton return m_source_mappings.FindFile (orig_spec, new_spec); 1321964deba8853eb794e59263322b59b09b43669618Greg Clayton} 1322964deba8853eb794e59263322b59b09b43669618Greg Clayton 13232418fddf2e200c827da5bc6c855f3d4971b2d867Greg Claytonbool 13242418fddf2e200c827da5bc6c855f3d4971b2d867Greg ClaytonModule::RemapSourceFile (const char *path, std::string &new_path) const 13252418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton{ 13262418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton Mutex::Locker locker (m_mutex); 13272418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton return m_source_mappings.RemapPath(path, new_path); 13282418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton} 13292418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton 1330ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granatauint32_t 1331ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico GranataModule::GetVersion (uint32_t *versions, uint32_t num_versions) 1332ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata{ 1333ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata ObjectFile *obj_file = GetObjectFile(); 1334ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata if (obj_file) 1335ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata return obj_file->GetVersion (versions, num_versions); 1336ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata 1337ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata if (versions && num_versions) 1338ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata { 1339ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata for (uint32_t i=0; i<num_versions; ++i) 1340ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata versions[i] = UINT32_MAX; 1341ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata } 1342ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata return 0; 1343ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata} 1344