Module.cpp revision a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9
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" 32296b06d325413723f5aac5988eed977b278a7807Greg Clayton#include "lldb/Target/CPPLanguageRuntime.h" 33296b06d325413723f5aac5988eed977b278a7807Greg Clayton#include "lldb/Target/ObjCLanguageRuntime.h" 34b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Process.h" 35b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Target.h" 36a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain#include "lldb/Symbol/SymbolFile.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// Shared pointers to modules track module lifetimes in 42899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// targets and in the global module, but this collection 43899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// will track all module objects that are still alive 44899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytontypedef std::vector<Module *> ModuleCollection; 45899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 46899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonstatic ModuleCollection & 47899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonGetModuleCollection() 48899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 49b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // This module collection needs to live past any module, so we could either make it a 50b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // shared pointer in each module or just leak is. Since it is only an empty vector by 51b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // the time all the modules have gone away, we just leak it for now. If we decide this 52b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // is a big problem we can introduce a Finalize method that will tear everything down in 53b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // a predictable order. 54b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham 55b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham static ModuleCollection *g_module_collection = NULL; 56b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham if (g_module_collection == NULL) 57b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham g_module_collection = new ModuleCollection(); 58b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham 59b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham return *g_module_collection; 60899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 61899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 62c149c8b3a88e5c8a94febdf956551e378c531797Greg ClaytonMutex * 63899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocationModuleCollectionMutex() 64899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 65c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // NOTE: The mutex below must be leaked since the global module list in 66c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // the ModuleList class will get torn at some point, and we can't know 67c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // if it will tear itself down before the "g_module_collection_mutex" below 68c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton // will. So we leak a Mutex object below to safeguard against that 69c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton 70c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton static Mutex *g_module_collection_mutex = NULL; 71c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton if (g_module_collection_mutex == NULL) 72c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton g_module_collection_mutex = new Mutex (Mutex::eMutexTypeRecursive); // NOTE: known leak 73c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton return g_module_collection_mutex; 74899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 75899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 76899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonsize_t 77899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetNumberAllocatedModules () 78899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 79899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 80899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return GetModuleCollection().size(); 81899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 82899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 83899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule * 84899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocatedModuleAtIndex (size_t idx) 85899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 86899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 87899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection &modules = GetModuleCollection(); 88899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton if (idx < modules.size()) 89899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return modules[idx]; 90899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return NULL; 91899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 9208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#if 0 93899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 9408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// These functions help us to determine if modules are still loaded, yet don't require that 9508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// you have a command interpreter and can easily be called from an external debugger. 9608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Claytonnamespace lldb { 97899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 9808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton void 9908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton ClearModuleInfo (void) 10008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 101860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton const bool mandatory = true; 102860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton ModuleList::RemoveOrphanSharedModules(mandatory); 10308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 10408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 10508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton void 10608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton DumpModuleInfo (void) 10708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 10808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton Mutex::Locker locker (Module::GetAllocationModuleCollectionMutex()); 10908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton ModuleCollection &modules = GetModuleCollection(); 11008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton const size_t count = modules.size(); 1115f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea printf ("%s: %" PRIu64 " modules:\n", __PRETTY_FUNCTION__, (uint64_t)count); 11208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton for (size_t i=0; i<count; ++i) 11308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton { 11408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 11508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton StreamString strm; 11608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton Module *module = modules[i]; 11708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton const bool in_shared_module_list = ModuleList::ModuleIsInCache (module); 11808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton module->GetDescription(&strm, eDescriptionLevelFull); 11908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton printf ("%p: shared = %i, ref_count = %3u, module = %s\n", 12008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton module, 12108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton in_shared_module_list, 12208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton (uint32_t)module->use_count(), 12308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton strm.GetString().c_str()); 12408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 12508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton } 12608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton} 12708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton 12808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#endif 129f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton 130444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonModule::Module (const ModuleSpec &module_spec) : 131444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_mutex (Mutex::eMutexTypeRecursive), 132444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_mod_time (module_spec.GetFileSpec().GetModificationTime()), 133444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_arch (module_spec.GetArchitecture()), 134444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_uuid (), 135444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_file (module_spec.GetFileSpec()), 136444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_platform_file(module_spec.GetPlatformFileSpec()), 137444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_symfile_spec (module_spec.GetSymbolFileSpec()), 138444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_name (module_spec.GetObjectName()), 139444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_offset (module_spec.GetObjectOffset()), 1400e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton m_object_mod_time (module_spec.GetObjectModificationTime()), 141444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_objfile_sp (), 142444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_symfile_ap (), 143444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_ast (), 144964deba8853eb794e59263322b59b09b43669618Greg Clayton m_source_mappings (), 145444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_did_load_objfile (false), 146444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_did_load_symbol_vendor (false), 147444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_did_parse_uuid (false), 148444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_did_init_ast (false), 149444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_is_dynamic_loader_module (false), 150cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton m_file_has_changed (false), 151cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton m_first_file_changed_log (false) 152444fe998bf707bd076a70c3a779db8575533695eGreg Clayton{ 153444fe998bf707bd076a70c3a779db8575533695eGreg Clayton // Scope for locker below... 154444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 155444fe998bf707bd076a70c3a779db8575533695eGreg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 156444fe998bf707bd076a70c3a779db8575533695eGreg Clayton GetModuleCollection().push_back(this); 157444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 158444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 159952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES)); 160444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (log) 16197a19b21dacd9063bb5475812df7781777262198Greg Clayton log->Printf ("%p Module::Module((%s) '%s%s%s%s')", 162444fe998bf707bd076a70c3a779db8575533695eGreg Clayton this, 163444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_arch.GetArchitectureName(), 16497a19b21dacd9063bb5475812df7781777262198Greg Clayton m_file.GetPath().c_str(), 165444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_name.IsEmpty() ? "" : "(", 166444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 167444fe998bf707bd076a70c3a779db8575533695eGreg Clayton m_object_name.IsEmpty() ? "" : ")"); 168444fe998bf707bd076a70c3a779db8575533695eGreg Clayton} 169444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1703508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModule::Module(const FileSpec& file_spec, 1713508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const ArchSpec& arch, 1723508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const ConstString *object_name, 1730e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton off_t object_offset, 1740e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton const TimeValue *object_mod_time_ptr) : 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mutex (Mutex::eMutexTypeRecursive), 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time (file_spec.GetModificationTime()), 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arch (arch), 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_uuid (), 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file (file_spec), 18024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_platform_file(), 1813508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_symfile_spec (), 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name (), 183b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_object_offset (object_offset), 1840e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton m_object_mod_time (), 185e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_objfile_sp (), 186236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_symfile_ap (), 187b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast (), 188964deba8853eb794e59263322b59b09b43669618Greg Clayton m_source_mappings (), 189236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile (false), 190236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor (false), 191236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid (false), 192b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast (false), 193df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton m_is_dynamic_loader_module (false), 194cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton m_file_has_changed (false), 195cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton m_first_file_changed_log (false) 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 197899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 198899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 199899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 200899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton GetModuleCollection().push_back(this); 201899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 202899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_name) 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = *object_name; 2050e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton 2060e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton if (object_mod_time_ptr) 2070e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton m_object_mod_time = *object_mod_time_ptr; 2080e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton 209952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES)); 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 21197a19b21dacd9063bb5475812df7781777262198Greg Clayton log->Printf ("%p Module::Module((%s) '%s%s%s%s')", 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 213940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 21497a19b21dacd9063bb5475812df7781777262198Greg Clayton m_file.GetPath().c_str(), 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module() 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 222a8aa5aba2497ba4e49295b6c2acb68975ed8406eGreg Clayton // Lock our module down while we tear everything down to make sure 223a8aa5aba2497ba4e49295b6c2acb68975ed8406eGreg Clayton // we don't get any access to the module while it is being destroyed 224a8aa5aba2497ba4e49295b6c2acb68975ed8406eGreg Clayton Mutex::Locker locker (m_mutex); 225899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 226899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 227899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 228899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection &modules = GetModuleCollection(); 229899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator end = modules.end(); 230899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator pos = std::find(modules.begin(), end, this); 231f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton assert (pos != end); 232f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton modules.erase(pos); 233899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 234952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES)); 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 23697a19b21dacd9063bb5475812df7781777262198Greg Clayton log->Printf ("%p Module::~Module((%s) '%s%s%s%s')", 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 238940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 23997a19b21dacd9063bb5475812df7781777262198Greg Clayton m_file.GetPath().c_str(), 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 243b01000fd063629facd45044f137446fb748ee179Greg Clayton // Release any auto pointers before we start tearing down our member 244b01000fd063629facd45044f137446fb748ee179Greg Clayton // variables since the object file and symbol files might need to make 245b01000fd063629facd45044f137446fb748ee179Greg Clayton // function calls back into this module object. The ordering is important 246b01000fd063629facd45044f137446fb748ee179Greg Clayton // here because symbol files can require the module object file. So we tear 247b01000fd063629facd45044f137446fb748ee179Greg Clayton // down the symbol file first, then the object file. 248a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain m_unified_sections_ap.reset(); 249b01000fd063629facd45044f137446fb748ee179Greg Clayton m_symfile_ap.reset(); 250e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_objfile_sp.reset(); 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2536c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonObjectFile * 2546c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonModule::GetMemoryObjectFile (const lldb::ProcessSP &process_sp, lldb::addr_t header_addr, Error &error) 2556c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton{ 2566c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (m_objfile_sp) 2576c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2586c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorString ("object file already exists"); 2596c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2606c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton else 2616c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2626c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton Mutex::Locker locker (m_mutex); 2636c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (process_sp) 2646c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2656c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton m_did_load_objfile = true; 266102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<DataBufferHeap> data_ap (new DataBufferHeap (512, 0)); 2676c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton Error readmem_error; 2686c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton const size_t bytes_read = process_sp->ReadMemory (header_addr, 2696c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton data_ap->GetBytes(), 2706c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton data_ap->GetByteSize(), 2716c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton readmem_error); 2726c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (bytes_read == 512) 2736c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2746c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton DataBufferSP data_sp(data_ap.release()); 2756c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton m_objfile_sp = ObjectFile::FindPlugin(shared_from_this(), process_sp, header_addr, data_sp); 2766c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (m_objfile_sp) 2776c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 278808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton StreamString s; 2795f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf("0x%16.16" PRIx64, header_addr); 280808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton m_object_name.SetCString (s.GetData()); 281808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton 282808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton // Once we get the object file, update our module with the object file's 2836c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton // architecture since it might differ in vendor/os if some parts were 2846c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton // unknown. 2856c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton m_objfile_sp->GetArchitecture (m_arch); 2866c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2876c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton else 2886c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2896c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorString ("unable to find suitable object file plug-in"); 2906c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2916c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2926c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton else 2936c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2946c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorStringWithFormat ("unable to read header from memory: %s", readmem_error.AsCString()); 2956c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2966c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 2976c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton else 2986c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton { 2996c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorString ("invalid process"); 3006c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 3016c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton } 3026c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton return m_objfile_sp.get(); 3036c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton} 3046c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3060467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID& 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID() 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 310236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_parse_uuid == false) 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile * obj_file = GetObjectFile (); 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner obj_file->GetUUID(&m_uuid); 317236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid = true; 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_uuid; 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 323b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext & 324b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext () 325b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 326b01000fd063629facd45044f137446fb748ee179Greg Clayton Mutex::Locker locker (m_mutex); 327b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_did_init_ast == false) 328b01000fd063629facd45044f137446fb748ee179Greg Clayton { 329b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjectFile * objfile = GetObjectFile(); 330395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton ArchSpec object_arch; 331395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (objfile && objfile->GetArchitecture(object_arch)) 332b01000fd063629facd45044f137446fb748ee179Greg Clayton { 333b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast = true; 3341b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda 3351b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda // LLVM wants this to be set to iOS or MacOSX; if we're working on 3361b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda // a bare-boards type image, change the triple for llvm's benefit. 3371b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda if (object_arch.GetTriple().getVendor() == llvm::Triple::Apple 3381b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda && object_arch.GetTriple().getOS() == llvm::Triple::UnknownOS) 3391b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda { 3401b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda if (object_arch.GetTriple().getArch() == llvm::Triple::arm || 3411b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda object_arch.GetTriple().getArch() == llvm::Triple::thumb) 3421b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda { 3431b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda object_arch.GetTriple().setOS(llvm::Triple::IOS); 3441b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda } 3451b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda else 3461b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda { 3471b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda object_arch.GetTriple().setOS(llvm::Triple::MacOSX); 3481b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda } 3491b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda } 350395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton m_ast.SetArchitecture (object_arch); 351b01000fd063629facd45044f137446fb748ee179Greg Clayton } 352b01000fd063629facd45044f137446fb748ee179Greg Clayton } 353b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast; 354b01000fd063629facd45044f137446fb748ee179Greg Clayton} 355b01000fd063629facd45044f137446fb748ee179Greg Clayton 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols() 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 36036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_comp_units = GetNumCompileUnits(); 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_comp_units == 0) 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36402e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton SymbolContext sc; 36513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc.module_sp = shared_from_this(); 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t cu_idx = 0; cu_idx < num_comp_units; cu_idx++) 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get(); 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit) 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseCompileUnitFunctions(sc); 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx) 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseFunctionBlocks(sc); 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse the variables for this function and all its blocks 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse all types for this compile unit 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseTypes(sc); 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc) 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39713d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc->module_sp = shared_from_this(); 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4003508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModuleSP 401c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule::CalculateSymbolContextModule () 402c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{ 4033508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton return shared_from_this(); 404c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton} 405c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s) 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4097e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda s->Printf(", Module{%p}", this); 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits() 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this); 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->GetNumCompileUnits(); 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 42436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonModule::GetCompileUnitAtIndex (size_t index) 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 42736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_comp_units = GetNumCompileUnits (); 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompUnitSP cu_sp; 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index < num_comp_units) 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu_sp = symbols->GetCompileUnitAtIndex(index); 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return cu_sp; 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr) 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 4435f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%" PRIx64 ")", vm_addr); 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList()); 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved_flags = 0; 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 456a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton // Clear the result symbol context in case we don't find anything, but don't clear the target 457a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton sc.Clear(false); 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the section from the section/offset address. 4603508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SectionSP section_sp (so_addr.GetSection()); 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure the section matches this module before we try and match anything 4633508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (section_sp && section_sp->GetModule().get() == this) 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If the section offset based address resolved itself, then this 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is the right module. 46713d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc.module_sp = shared_from_this(); 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextModule; 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Resolve the compile unit, function, block, line table or line 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // entry if requested. 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (resolve_scope & eSymbolContextCompUnit || 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextFunction || 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextBlock || 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextLineEntry ) 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc); 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 482bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham // Resolve the symbol if requested, but don't re-look it up if we've already found it. 483bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol)) 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 485a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain SymbolVendor* sym_vendor = GetSymbolVendor(); 486a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (sym_vendor) 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 488a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain Symtab *symtab = sym_vendor->GetSymtab(); 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (so_addr.IsSectionOffset()) 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress()); 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextSymbol; 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved_flags; 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 505537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath 506537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton( 507537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton const char *file_path, 508537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t line, 509537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton bool check_inlines, 510537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t resolve_scope, 511537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton SymbolContextList& sc_list 512537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton) 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 514537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec file_spec(file_path, false); 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list); 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 52397a19b21dacd9063bb5475812df7781777262198Greg Clayton "Module::ResolveSymbolContextForFilePath (%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)", 52497a19b21dacd9063bb5475812df7781777262198Greg Clayton file_spec.GetPath().c_str(), 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line, 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner check_inlines ? "yes" : "no", 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope); 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t initial_count = sc_list.GetSize(); 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list); 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_count; 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 54036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonModule::FindGlobalVariables (const ConstString &name, 54136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const ClangNamespaceDecl *namespace_decl, 54236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton bool append, 54336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t max_matches, 54436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton VariableList& variables) 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 5480fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables); 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 55136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton 55236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 55336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonModule::FindGlobalVariables (const RegularExpression& regex, 55436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton bool append, 55536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t max_matches, 55636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton VariableList& variables) 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindGlobalVariables(regex, append, max_matches, variables); 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 565801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonModule::FindCompileUnits (const FileSpec &path, 566801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton bool append, 567801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContextList &sc_list) 568801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{ 569801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (!append) 570801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc_list.Clear(); 571801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 57236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t start_size = sc_list.GetSize(); 57336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_compile_units = GetNumCompileUnits(); 574801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContext sc; 57513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton sc.module_sp = shared_from_this(); 576801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const bool compare_directory = path.GetDirectory(); 57736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t i=0; i<num_compile_units; ++i) 578801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 579801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc.comp_unit = GetCompileUnitAtIndex(i).get(); 580c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton if (sc.comp_unit) 581c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton { 582c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton if (FileSpec::Equal (*sc.comp_unit, path, compare_directory)) 583c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton sc_list.Append(sc); 584c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton } 585801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 586801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton return sc_list.GetSize() - start_size; 587801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton} 588801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 58936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 5903e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindFunctions (const ConstString &name, 5913e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan const ClangNamespaceDecl *namespace_decl, 59236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint32_t name_type_mask, 593302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_symbols, 594302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_inlines, 59528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 59628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 59828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 59928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 60028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 601296b06d325413723f5aac5988eed977b278a7807Greg Clayton const size_t old_size = sc_list.GetSize(); 60228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 60328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Find all the functions (not symbols, but debug information functions... 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 605296b06d325413723f5aac5988eed977b278a7807Greg Clayton 606296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (name_type_mask & eFunctionNameTypeAuto) 60728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 608296b06d325413723f5aac5988eed977b278a7807Greg Clayton ConstString lookup_name; 609296b06d325413723f5aac5988eed977b278a7807Greg Clayton uint32_t lookup_name_type_mask = 0; 610296b06d325413723f5aac5988eed977b278a7807Greg Clayton bool match_name_after_lookup = false; 611296b06d325413723f5aac5988eed977b278a7807Greg Clayton Module::PrepareForFunctionNameLookup (name, 612296b06d325413723f5aac5988eed977b278a7807Greg Clayton name_type_mask, 613296b06d325413723f5aac5988eed977b278a7807Greg Clayton lookup_name, 614296b06d325413723f5aac5988eed977b278a7807Greg Clayton lookup_name_type_mask, 615296b06d325413723f5aac5988eed977b278a7807Greg Clayton match_name_after_lookup); 616296b06d325413723f5aac5988eed977b278a7807Greg Clayton 617296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (symbols) 618a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 619296b06d325413723f5aac5988eed977b278a7807Greg Clayton symbols->FindFunctions(lookup_name, 620296b06d325413723f5aac5988eed977b278a7807Greg Clayton namespace_decl, 621296b06d325413723f5aac5988eed977b278a7807Greg Clayton lookup_name_type_mask, 622296b06d325413723f5aac5988eed977b278a7807Greg Clayton include_inlines, 623296b06d325413723f5aac5988eed977b278a7807Greg Clayton append, 624296b06d325413723f5aac5988eed977b278a7807Greg Clayton sc_list); 625296b06d325413723f5aac5988eed977b278a7807Greg Clayton 626a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // Now check our symbol table for symbols that are code symbols if requested 627a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (include_symbols) 62828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 629a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain Symtab *symtab = symbols->GetSymtab(); 630296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (symtab) 631296b06d325413723f5aac5988eed977b278a7807Greg Clayton symtab->FindFunctionSymbols(lookup_name, lookup_name_type_mask, sc_list); 632296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 633296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 634296b06d325413723f5aac5988eed977b278a7807Greg Clayton 635296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (match_name_after_lookup) 636296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 637296b06d325413723f5aac5988eed977b278a7807Greg Clayton SymbolContext sc; 638296b06d325413723f5aac5988eed977b278a7807Greg Clayton size_t i = old_size; 639296b06d325413723f5aac5988eed977b278a7807Greg Clayton while (i<sc_list.GetSize()) 640296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 641296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (sc_list.GetContextAtIndex(i, sc)) 64228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 643296b06d325413723f5aac5988eed977b278a7807Greg Clayton const char *func_name = sc.GetFunctionName().GetCString(); 644296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (func_name && strstr (func_name, name.GetCString()) == NULL) 64528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 646296b06d325413723f5aac5988eed977b278a7807Greg Clayton // Remove the current context 647296b06d325413723f5aac5988eed977b278a7807Greg Clayton sc_list.RemoveContextAtIndex(i); 648296b06d325413723f5aac5988eed977b278a7807Greg Clayton // Don't increment i and continue in the loop 649296b06d325413723f5aac5988eed977b278a7807Greg Clayton continue; 65028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 65128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 652296b06d325413723f5aac5988eed977b278a7807Greg Clayton ++i; 65328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 65428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 65528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 656296b06d325413723f5aac5988eed977b278a7807Greg Clayton else 657296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 658296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (symbols) 659a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 660296b06d325413723f5aac5988eed977b278a7807Greg Clayton symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list); 661296b06d325413723f5aac5988eed977b278a7807Greg Clayton 662a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // Now check our symbol table for symbols that are code symbols if requested 663a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (include_symbols) 664296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 665a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain Symtab *symtab = symbols->GetSymtab(); 666296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (symtab) 667296b06d325413723f5aac5988eed977b278a7807Greg Clayton symtab->FindFunctionSymbols(name, name_type_mask, sc_list); 668296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 669296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 670296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 671296b06d325413723f5aac5988eed977b278a7807Greg Clayton 672296b06d325413723f5aac5988eed977b278a7807Greg Clayton return sc_list.GetSize() - old_size; 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 67628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex, 677302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_symbols, 678302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_inlines, 67928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 68028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 68228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 68328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 68428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 68536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t start_size = sc_list.GetSize(); 68628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 68928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 690a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain symbols->FindFunctions(regex, include_inlines, append, sc_list); 691a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 692a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // Now check our symbol table for symbols that are code symbols if requested 693a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (include_symbols) 69428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 695a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain Symtab *symtab = symbols->GetSymtab(); 69628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 69728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 69828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 6994f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeAny, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 70036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_matches = symbol_indexes.size(); 70128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 70228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 70328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 704ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton const size_t end_functions_added_index = sc_list.GetSize(); 705ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton size_t num_functions_added_to_sc_list = end_functions_added_index - start_size; 706ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (num_functions_added_to_sc_list == 0) 70728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 708ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // No functions were added, just symbols, so we can just append them 709ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton for (size_t i=0; i<num_matches; ++i) 710ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton { 711ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 712ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton SymbolType sym_type = sc.symbol->GetType(); 713ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (sc.symbol && (sym_type == eSymbolTypeCode || 714ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton sym_type == eSymbolTypeResolver)) 715ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton sc_list.Append(sc); 716ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 717ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 718ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton else 719ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton { 720ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton typedef std::map<lldb::addr_t, uint32_t> FileAddrToIndexMap; 721ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton FileAddrToIndexMap file_addr_to_index; 722ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton for (size_t i=start_size; i<end_functions_added_index; ++i) 723ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton { 724ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton const SymbolContext &sc = sc_list[i]; 725ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (sc.block) 726ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton continue; 727ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton file_addr_to_index[sc.function->GetAddressRange().GetBaseAddress().GetFileAddress()] = i; 728ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 729ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton 730ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton FileAddrToIndexMap::const_iterator end = file_addr_to_index.end(); 731ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // Functions were added so we need to merge symbols into any 732ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // existing function symbol contexts 733ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton for (size_t i=start_size; i<num_matches; ++i) 734ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton { 735ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 736ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton SymbolType sym_type = sc.symbol->GetType(); 737ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (sc.symbol && (sym_type == eSymbolTypeCode || 738ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton sym_type == eSymbolTypeResolver)) 739ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton { 740ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton FileAddrToIndexMap::const_iterator pos = file_addr_to_index.find(sc.symbol->GetAddress().GetFileAddress()); 741ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (pos == end) 742ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton sc_list.Append(sc); 743ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton else 744ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton sc_list[pos->second].symbol = sc.symbol; 745ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 746ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 74728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 74828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 74928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 75028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 75128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 75228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 756dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypes_Impl (const SymbolContext& sc, 757dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ConstString &name, 758dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ClangNamespaceDecl *namespace_decl, 759dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton bool append, 76036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t max_matches, 761dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton TypeList& types) 7627aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{ 7637aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 7647aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (sc.module_sp.get() == NULL || sc.module_sp.get() == this) 7657aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton { 7667aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton SymbolVendor *symbols = GetSymbolVendor (); 7677aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (symbols) 7680fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types); 7697aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton } 7707aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton return 0; 7717aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton} 7727aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton 77336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 774dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypesInNamespace (const SymbolContext& sc, 775dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ConstString &type_name, 776dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ClangNamespaceDecl *namespace_decl, 77736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t max_matches, 778dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton TypeList& type_list) 779979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 780dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const bool append = true; 781dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return FindTypes_Impl(sc, type_name, namespace_decl, append, max_matches, type_list); 782979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 783979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 7840b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Claytonlldb::TypeSP 7850b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg ClaytonModule::FindFirstType (const SymbolContext& sc, 7860b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton const ConstString &name, 7870b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton bool exact_match) 7880b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton{ 7890b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton TypeList type_list; 79036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_matches = FindTypes (sc, name, exact_match, 1, type_list); 7910b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton if (num_matches) 7920b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton return type_list.GetTypeAtIndex(0); 7930b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton return TypeSP(); 7940b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton} 7950b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton 7960b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton 79736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 798dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypes (const SymbolContext& sc, 799dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const ConstString &name, 800dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton bool exact_match, 80136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t max_matches, 802dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton TypeList& types) 803979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 80436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_matches = 0; 805dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const char *type_name_cstr = name.GetCString(); 806dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton std::string type_scope; 807dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton std::string type_basename; 808dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const bool append = true; 809b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton TypeClass type_class = eTypeClassAny; 810b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton if (Type::GetTypeScopeAndBasename (type_name_cstr, type_scope, type_basename, type_class)) 811979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 812dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // Check if "name" starts with "::" which means the qualified type starts 813dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // from the root namespace and implies and exact match. The typenames we 814dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // get back from clang do not start with "::" so we need to strip this off 815dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // in order to get the qualfied names to match 816dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 817dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (type_scope.size() >= 2 && type_scope[0] == ':' && type_scope[1] == ':') 818dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 819dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton type_scope.erase(0,2); 820dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton exact_match = true; 821dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 822dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton ConstString type_basename_const_str (type_basename.c_str()); 823dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (FindTypes_Impl(sc, type_basename_const_str, NULL, append, max_matches, types)) 824dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 825b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton types.RemoveMismatchedTypes (type_scope, type_basename, type_class, exact_match); 826dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton num_matches = types.GetSize(); 827dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 828979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 829979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata else 830dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 831dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton // The type is not in a namespace/class scope, just search for it by basename 832b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton if (type_class != eTypeClassAny) 833b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton { 834b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton // The "type_name_cstr" will have been modified if we have a valid type class 835b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton // prefix (like "struct", "class", "union", "typedef" etc). 836b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton num_matches = FindTypes_Impl(sc, ConstString(type_name_cstr), NULL, append, max_matches, types); 837b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton types.RemoveMismatchedTypes (type_class); 838b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton num_matches = types.GetSize(); 839b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton } 840b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton else 841b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton { 842b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton num_matches = FindTypes_Impl(sc, name, NULL, append, max_matches, types); 843b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton } 844dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 845dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 846dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return num_matches; 847979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 848979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 849979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor* 851188091899842b140313b54e097f16efbe165c998Greg ClaytonModule::GetSymbolVendor (bool can_create, lldb_private::Stream *feedback_strm) 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 854236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_symbol_vendor == false && can_create) 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *obj_file = GetObjectFile (); 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 860188091899842b140313b54e097f16efbe165c998Greg Clayton m_symfile_ap.reset(SymbolVendor::FindPlugin(shared_from_this(), feedback_strm)); 861236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor = true; 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_symfile_ap.get(); 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name) 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Container objects whose paths do not specify a file directly can call 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // this function to correct the file and object names. 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file = file; 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time = file.GetModificationTime(); 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = object_name; 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec& 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_arch; 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88397a19b21dacd9063bb5475812df7781777262198Greg Claytonstd::string 88497a19b21dacd9063bb5475812df7781777262198Greg ClaytonModule::GetSpecificationDescription () const 88597a19b21dacd9063bb5475812df7781777262198Greg Clayton{ 88697a19b21dacd9063bb5475812df7781777262198Greg Clayton std::string spec(GetFileSpec().GetPath()); 88797a19b21dacd9063bb5475812df7781777262198Greg Clayton if (m_object_name) 88897a19b21dacd9063bb5475812df7781777262198Greg Clayton { 88997a19b21dacd9063bb5475812df7781777262198Greg Clayton spec += '('; 89097a19b21dacd9063bb5475812df7781777262198Greg Clayton spec += m_object_name.GetCString(); 89197a19b21dacd9063bb5475812df7781777262198Greg Clayton spec += ')'; 89297a19b21dacd9063bb5475812df7781777262198Greg Clayton } 89397a19b21dacd9063bb5475812df7781777262198Greg Clayton return spec; 89497a19b21dacd9063bb5475812df7781777262198Greg Clayton} 89597a19b21dacd9063bb5475812df7781777262198Greg Clayton 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 89775d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::GetDescription (Stream *s, lldb::DescriptionLevel level) 8987826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{ 8997826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice Mutex::Locker locker (m_mutex); 9007826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 90175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (level >= eDescriptionLevelFull) 90275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 90375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (m_arch.IsValid()) 90475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->Printf("(%s) ", m_arch.GetArchitectureName()); 90575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 9067826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 90775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (level == eDescriptionLevelBrief) 90875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 90975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton const char *filename = m_file.GetFilename().GetCString(); 91075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (filename) 91175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->PutCString (filename); 91275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 91375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton else 91475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 91575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton char path[PATH_MAX]; 91675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (m_file.GetPath(path, sizeof(path))) 91775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->PutCString(path); 91875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 91949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 92049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton const char *object_name = m_object_name.GetCString(); 92149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton if (object_name) 92249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton s->Printf("(%s)", object_name); 9237826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice} 9247826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 9257826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid 92675d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportError (const char *format, ...) 92775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 928df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format && format[0]) 929df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 930df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton StreamString strm; 931df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("error: "); 932df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetDescription(&strm, lldb::eDescriptionLevelBrief); 9337129913a93594dc4d7b4e417212a366768337852Greg Clayton strm.PutChar (' '); 934df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 935df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 936df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PrintfVarArg(format, args); 937df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 938df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 939df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const int format_len = strlen(format); 940df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format_len > 0) 941df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 942df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const char last_char = format[format_len-1]; 943df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (last_char != '\n' || last_char != '\r') 944df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.EOL(); 945df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 946df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); 947df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 948df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 949df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton} 950df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 951cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Claytonbool 952cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg ClaytonModule::FileHasChanged () const 953cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton{ 954cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton if (m_file_has_changed == false) 955cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton m_file_has_changed = (m_file.GetModificationTime() != m_mod_time); 956cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton return m_file_has_changed; 957cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton} 958cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton 959df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonvoid 960df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::ReportErrorIfModifyDetected (const char *format, ...) 961df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{ 962cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton if (m_first_file_changed_log == false) 963df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 964cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton if (FileHasChanged ()) 965df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 966cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton m_first_file_changed_log = true; 967cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton if (format) 968df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 969cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton StreamString strm; 970cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton strm.PutCString("error: the object file "); 971cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton GetDescription(&strm, lldb::eDescriptionLevelFull); 972cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton strm.PutCString (" has been modified\n"); 973cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton 974cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton va_list args; 975cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton va_start (args, format); 976cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton strm.PrintfVarArg(format, args); 977cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton va_end (args); 978cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton 979cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton const int format_len = strlen(format); 980cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton if (format_len > 0) 981cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton { 982cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton const char last_char = format[format_len-1]; 983cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton if (last_char != '\n' || last_char != '\r') 984cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton strm.EOL(); 985cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton } 986cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n"); 987cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str()); 988df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 989df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 990df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 99175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 99275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 99375d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 99475d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportWarning (const char *format, ...) 99575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 996df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format && format[0]) 997df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 998df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton StreamString strm; 999df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PutCString("warning: "); 10007129913a93594dc4d7b4e417212a366768337852Greg Clayton GetDescription(&strm, lldb::eDescriptionLevelFull); 10017129913a93594dc4d7b4e417212a366768337852Greg Clayton strm.PutChar (' '); 1002df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 1003df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 1004df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 1005df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.PrintfVarArg(format, args); 1006df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 1007df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 1008df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const int format_len = strlen(format); 1009df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (format_len > 0) 1010df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 1011df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const char last_char = format[format_len-1]; 1012df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton if (last_char != '\n' || last_char != '\r') 1013df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton strm.EOL(); 1014df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 1015df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str()); 1016df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 101775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 101875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 101975d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 102075d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::LogMessage (Log *log, const char *format, ...) 102175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 102275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (log) 102375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 102475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton StreamString log_message; 10257129913a93594dc4d7b4e417212a366768337852Greg Clayton GetDescription(&log_message, lldb::eDescriptionLevelFull); 102675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log_message.PutCString (": "); 102775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_list args; 102875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_start (args, format); 102975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log_message.PrintfVarArg (format, args); 103075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_end (args); 103175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log->PutCString(log_message.GetString().c_str()); 103275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 103375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 103475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 103573a35715708b65b1d96c1c8f439548bb0990df08Greg Claytonvoid 103673a35715708b65b1d96c1c8f439548bb0990df08Greg ClaytonModule::LogMessageVerboseBacktrace (Log *log, const char *format, ...) 103773a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton{ 103873a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton if (log) 103973a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton { 104073a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton StreamString log_message; 104173a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton GetDescription(&log_message, lldb::eDescriptionLevelFull); 104273a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton log_message.PutCString (": "); 104373a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton va_list args; 104473a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton va_start (args, format); 104573a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton log_message.PrintfVarArg (format, args); 104673a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton va_end (args); 104773a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton if (log->GetVerbose()) 104873a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton Host::Backtrace (log_message, 1024); 104973a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton log->PutCString(log_message.GetString().c_str()); 105073a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton } 105173a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton} 105273a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton 105375d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s) 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 10573fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Indent(); 105997a19b21dacd9063bb5475812df7781777262198Greg Clayton s->Printf("Module %s%s%s%s\n", 106097a19b21dacd9063bb5475812df7781777262198Greg Clayton m_file.GetPath().c_str(), 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? "(" : "", 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? m_object_name.GetCString() : "", 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? ")" : ""); 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentMore(); 1066a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner objfile->Dump(s); 107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->Dump(s); 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentLess(); 107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList* 108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList () 108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &symbols->GetTypeList(); 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const 109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_object_name; 109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile() 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 1098236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_objfile == false) 109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1100236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile = true; 110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString("")); 1103cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton DataBufferSP data_sp; 1104cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t data_offset = 0; 1105cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton m_objfile_sp = ObjectFile::FindPlugin (shared_from_this(), 11063508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton &m_file, 11073508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_object_offset, 11083508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_file.GetByteSize(), 1109cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton data_sp, 1110cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton data_offset); 11116a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (m_objfile_sp) 11126a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton { 1113a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // Once we get the object file, update our module with the object file's 1114a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // architecture since it might differ in vendor/os if some parts were 1115a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // unknown. 11166a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton m_objfile_sp->GetArchitecture (m_arch); 1117a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 1118a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // Populate m_unified_sections_ap with sections from objfile. 1119a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain SectionList *section_list = m_objfile_sp->GetSectionList(); 1120a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (section_list) 1121a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 1122a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain m_unified_sections_ap.reset(new SectionList()); 1123a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain section_list->Copy (m_unified_sections_ap.get()); 1124a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain m_unified_sections_ap->Finalize(); 1125a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 11266a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton } 112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1128e40b6424d9e49306392bec4b44060da36414c382Greg Clayton return m_objfile_sp.get(); 112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1131a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael SartainSectionList * 1132a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael SartainModule::GetUnifiedSectionList() 1133a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain{ 1134a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return m_unified_sections_ap.get(); 1135a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain} 113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol * 113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type) 113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)", 114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 1144a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain SymbolVendor* sym_vendor = GetSymbolVendor(); 1145a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (sym_vendor) 114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1147a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain Symtab *symtab = sym_vendor->GetSymtab(); 114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 11497c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny); 115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list) 115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t num_indices = symbol_indexes.size(); 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_indices > 0) 116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc; 116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateSymbolContext (&sc); 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i = 0; i < num_indices; i++) 116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]); 116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Append (sc); 116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 11742fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg ClaytonModule::FindFunctionSymbols (const ConstString &name, 11752fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton uint32_t name_type_mask, 11762fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton SymbolContextList& sc_list) 11772fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton{ 11782fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton Timer scoped_timer(__PRETTY_FUNCTION__, 11792fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton "Module::FindSymbolsFunctions (name = %s, mask = 0x%8.8x)", 11802fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton name.AsCString(), 11812fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton name_type_mask); 1182a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain SymbolVendor* sym_vendor = GetSymbolVendor(); 1183a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (sym_vendor) 11842fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton { 1185a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain Symtab *symtab = sym_vendor->GetSymtab(); 11862fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton if (symtab) 11872fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton return symtab->FindFunctionSymbols (name, name_type_mask, sc_list); 11882fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton } 11892fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton return 0; 11902fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton} 11912fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton 11922fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Claytonsize_t 1193aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean CallananModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list) 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsWithNameAndType (name = %s, type = %i)", 120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 1204a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain SymbolVendor* sym_vendor = GetSymbolVendor(); 1205a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (sym_vendor) 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1207a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain Symtab *symtab = sym_vendor->GetSymtab(); 120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes); 121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression ®ex, SymbolType symbol_type, SymbolContextList &sc_list) 122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)", 122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText(), 122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 1229a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain SymbolVendor* sym_vendor = GetSymbolVendor(); 1230a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (sym_vendor) 123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1232a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain Symtab *symtab = sym_vendor->GetSymtab(); 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 12367c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 124381a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Claytonvoid 124481a96aa6242f7b559770f5dc62316253cb8cb0d4Greg ClaytonModule::SetSymbolFileFileSpec (const FileSpec &file) 124581a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton{ 1246a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // Remove any sections in the unified section list that come from the current symbol vendor. 1247a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (m_symfile_ap) 1248a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 1249a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain SectionList *section_list = GetUnifiedSectionList(); 1250a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain SymbolFile *symbol_file = m_symfile_ap->GetSymbolFile(); 1251a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (section_list && symbol_file) 1252a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 1253a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain ObjectFile *obj_file = symbol_file->GetObjectFile(); 1254a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (obj_file) 1255a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 1256a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain size_t num_sections = section_list->GetNumSections (0); 1257a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain for (size_t idx = num_sections; idx > 0; --idx) 1258a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 1259a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain lldb::SectionSP section_sp (section_list->GetSectionAtIndex (idx - 1)); 1260a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (section_sp->GetObjectFile() == obj_file) 1261a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 1262a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain m_unified_sections_ap->DeleteSection (idx - 1); 1263a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 1264a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 1265a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain m_unified_sections_ap->Finalize(); 1266a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 1267a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 1268a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 1269a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 127081a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton m_symfile_spec = file; 127181a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton m_symfile_ap.reset(); 127281a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton m_did_load_symbol_vendor = false; 127381a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton} 127481a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton 12757508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 12767508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable () 12777508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 12787508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (GetObjectFile() == NULL) 12797508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return false; 12807508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham else 12817508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return GetObjectFile()->IsExecutable(); 12827508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 12837508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 128451b11e06de746667396f56b303d1867f007baf8bJim Inghambool 128551b11e06de746667396f56b303d1867f007baf8bJim InghamModule::IsLoadedInTarget (Target *target) 128651b11e06de746667396f56b303d1867f007baf8bJim Ingham{ 128751b11e06de746667396f56b303d1867f007baf8bJim Ingham ObjectFile *obj_file = GetObjectFile(); 128851b11e06de746667396f56b303d1867f007baf8bJim Ingham if (obj_file) 128951b11e06de746667396f56b303d1867f007baf8bJim Ingham { 129051b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionList *sections = obj_file->GetSectionList(); 129151b11e06de746667396f56b303d1867f007baf8bJim Ingham if (sections != NULL) 129251b11e06de746667396f56b303d1867f007baf8bJim Ingham { 129351b11e06de746667396f56b303d1867f007baf8bJim Ingham size_t num_sections = sections->GetSize(); 129451b11e06de746667396f56b303d1867f007baf8bJim Ingham for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++) 129551b11e06de746667396f56b303d1867f007baf8bJim Ingham { 129651b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionSP section_sp = sections->GetSectionAtIndex(sect_idx); 129751b11e06de746667396f56b303d1867f007baf8bJim Ingham if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS) 129851b11e06de746667396f56b303d1867f007baf8bJim Ingham { 129951b11e06de746667396f56b303d1867f007baf8bJim Ingham return true; 130051b11e06de746667396f56b303d1867f007baf8bJim Ingham } 130151b11e06de746667396f56b303d1867f007baf8bJim Ingham } 130251b11e06de746667396f56b303d1867f007baf8bJim Ingham } 130351b11e06de746667396f56b303d1867f007baf8bJim Ingham } 130451b11e06de746667396f56b303d1867f007baf8bJim Ingham return false; 130551b11e06de746667396f56b303d1867f007baf8bJim Ingham} 1306146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata 1307146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granatabool 130802af494c397d62f22bea65d36ad47080b6adc8afEnrico GranataModule::LoadScriptingResourceInTarget (Target *target, Error& error, Stream* feedback_stream) 1309146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata{ 1310146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata if (!target) 1311146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata { 1312146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata error.SetErrorString("invalid destination Target"); 1313146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata return false; 1314146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata } 1315146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata 131607e3124bfa7b1b8d782689a625e13f95402c389aEnrico Granata LoadScriptFromSymFile shoud_load = target->TargetProperties::GetLoadScriptFromSymbolFile(); 13171d3db0a71f507df5158eb160aaceefb6dd5f38c2Enrico Granata 1318d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton Debugger &debugger = target->GetDebugger(); 1319d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton const ScriptLanguage script_language = debugger.GetScriptLanguage(); 1320d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (script_language != eScriptLanguageNone) 1321146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata { 1322d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 1323d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton PlatformSP platform_sp(target->GetPlatform()); 1324d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 1325d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (!platform_sp) 1326d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton { 1327d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton error.SetErrorString("invalid Platform"); 1328d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton return false; 1329d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton } 1330146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata 1331986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton FileSpecList file_specs = platform_sp->LocateExecutableScriptingResources (target, 1332986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton *this); 1333986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton 1334986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton 1335986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton const uint32_t num_specs = file_specs.GetSize(); 1336986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton if (num_specs) 1337146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata { 1338986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton ScriptInterpreter *script_interpreter = debugger.GetCommandInterpreter().GetScriptInterpreter(); 1339986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton if (script_interpreter) 1340d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton { 1341d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton for (uint32_t i=0; i<num_specs; ++i) 1342d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton { 1343d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton FileSpec scripting_fspec (file_specs.GetFileSpecAtIndex(i)); 1344d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (scripting_fspec && scripting_fspec.Exists()) 1345d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton { 134607e3124bfa7b1b8d782689a625e13f95402c389aEnrico Granata if (shoud_load == eLoadScriptFromSymFileFalse) 134707e3124bfa7b1b8d782689a625e13f95402c389aEnrico Granata return false; 134807e3124bfa7b1b8d782689a625e13f95402c389aEnrico Granata if (shoud_load == eLoadScriptFromSymFileWarn) 13491d3db0a71f507df5158eb160aaceefb6dd5f38c2Enrico Granata { 135007e3124bfa7b1b8d782689a625e13f95402c389aEnrico Granata if (feedback_stream) 1351b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham feedback_stream->Printf("warning: '%s' contains a debug script. To run this script in " 1352b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham "this debug session:\n\n command script import \"%s\"\n\n" 1353b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham "To run all discovered debug scripts in this session:\n\n" 1354b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham " settings set target.load-script-from-symbol-file true\n", 1355b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham GetFileSpec().GetFileNameStrippingExtension().GetCString(), 1356b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham scripting_fspec.GetPath().c_str()); 13571d3db0a71f507df5158eb160aaceefb6dd5f38c2Enrico Granata return false; 13581d3db0a71f507df5158eb160aaceefb6dd5f38c2Enrico Granata } 1359d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton StreamString scripting_stream; 1360d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton scripting_fspec.Dump(&scripting_stream); 136166068824402d94de2abe81c7e4472a4754572489Enrico Granata const bool can_reload = true; 1362d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton const bool init_lldb_globals = false; 1363b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham bool did_load = script_interpreter->LoadScriptingModule(scripting_stream.GetData(), 1364b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham can_reload, 1365b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham init_lldb_globals, 1366b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham error); 1367d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (!did_load) 1368d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton return false; 1369d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton } 1370d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton } 1371d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton } 1372986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton else 1373986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton { 1374986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton error.SetErrorString("invalid ScriptInterpreter"); 1375986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton return false; 1376986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton } 1377146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata } 1378146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata } 1379146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata return true; 1380146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata} 1381146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata 1382146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granatabool 13837508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch) 13847508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 1385940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (!m_arch.IsValid()) 13867508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 13877508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham m_arch = new_arch; 13887508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return true; 1389940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 139040e278caddf5442776f9408f20d757cc85fe630aSean Callanan return m_arch.IsExactMatch(new_arch); 13917508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 13927508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 1393b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonbool 1394b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonModule::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed) 1395b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 13969ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton size_t num_loaded_sections = 0; 13979ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton ObjectFile *objfile = GetObjectFile(); 13989ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton if (objfile) 1399b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 14009ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton SectionList *section_list = objfile->GetSectionList (); 1401b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (section_list) 1402b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1403b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const size_t num_sections = section_list->GetSize(); 1404b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton size_t sect_idx = 0; 1405b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) 1406b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1407b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Iterate through the object file sections to find the 1408b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // first section that starts of file offset zero and that 1409b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // has bytes in the file... 1410545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx)); 14119ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton // Only load non-thread specific sections when given a slide 1412545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton if (section_sp && !section_sp->IsThreadSpecific()) 1413b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 1414545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() + offset)) 14159ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton ++num_loaded_sections; 1416b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 1417b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 1418b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 1419b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 14209ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton changed = num_loaded_sections > 0; 14219ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton return num_loaded_sections > 0; 1422b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 1423b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 1424444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1425444fe998bf707bd076a70c3a779db8575533695eGreg Claytonbool 1426444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonModule::MatchesModuleSpec (const ModuleSpec &module_ref) 1427444fe998bf707bd076a70c3a779db8575533695eGreg Clayton{ 1428444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const UUID &uuid = module_ref.GetUUID(); 1429444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1430444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (uuid.IsValid()) 1431444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 1432444fe998bf707bd076a70c3a779db8575533695eGreg Clayton // If the UUID matches, then nothing more needs to match... 1433444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (uuid == GetUUID()) 1434444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return true; 1435444fe998bf707bd076a70c3a779db8575533695eGreg Clayton else 1436444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1437444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1438444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1439444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const FileSpec &file_spec = module_ref.GetFileSpec(); 1440444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (file_spec) 1441444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 1442444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (!FileSpec::Equal (file_spec, m_file, file_spec.GetDirectory())) 1443444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1444444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1445444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1446444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const FileSpec &platform_file_spec = module_ref.GetPlatformFileSpec(); 1447444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (platform_file_spec) 1448444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 144958aa7152a7df8c9825c63026ec35c24759de948bGreg Clayton if (!FileSpec::Equal (platform_file_spec, GetPlatformFileSpec (), platform_file_spec.GetDirectory())) 1450444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1451444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1452444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1453444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const ArchSpec &arch = module_ref.GetArchitecture(); 1454444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (arch.IsValid()) 1455444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 145640e278caddf5442776f9408f20d757cc85fe630aSean Callanan if (!m_arch.IsCompatibleMatch(arch)) 1457444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1458444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1459444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1460444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const ConstString &object_name = module_ref.GetObjectName(); 1461444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (object_name) 1462444fe998bf707bd076a70c3a779db8575533695eGreg Clayton { 1463444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (object_name != GetObjectName()) 1464444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return false; 1465444fe998bf707bd076a70c3a779db8575533695eGreg Clayton } 1466444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return true; 1467444fe998bf707bd076a70c3a779db8575533695eGreg Clayton} 1468444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 1469964deba8853eb794e59263322b59b09b43669618Greg Claytonbool 1470964deba8853eb794e59263322b59b09b43669618Greg ClaytonModule::FindSourceFile (const FileSpec &orig_spec, FileSpec &new_spec) const 1471964deba8853eb794e59263322b59b09b43669618Greg Clayton{ 1472964deba8853eb794e59263322b59b09b43669618Greg Clayton Mutex::Locker locker (m_mutex); 1473964deba8853eb794e59263322b59b09b43669618Greg Clayton return m_source_mappings.FindFile (orig_spec, new_spec); 1474964deba8853eb794e59263322b59b09b43669618Greg Clayton} 1475964deba8853eb794e59263322b59b09b43669618Greg Clayton 14762418fddf2e200c827da5bc6c855f3d4971b2d867Greg Claytonbool 14772418fddf2e200c827da5bc6c855f3d4971b2d867Greg ClaytonModule::RemapSourceFile (const char *path, std::string &new_path) const 14782418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton{ 14792418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton Mutex::Locker locker (m_mutex); 14802418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton return m_source_mappings.RemapPath(path, new_path); 14812418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton} 14822418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton 1483ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granatauint32_t 1484ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico GranataModule::GetVersion (uint32_t *versions, uint32_t num_versions) 1485ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata{ 1486ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata ObjectFile *obj_file = GetObjectFile(); 1487ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata if (obj_file) 1488ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata return obj_file->GetVersion (versions, num_versions); 1489ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata 1490ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata if (versions && num_versions) 1491ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata { 1492ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata for (uint32_t i=0; i<num_versions; ++i) 1493ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata versions[i] = UINT32_MAX; 1494ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata } 1495ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata return 0; 1496ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata} 1497296b06d325413723f5aac5988eed977b278a7807Greg Clayton 1498296b06d325413723f5aac5988eed977b278a7807Greg Claytonvoid 1499296b06d325413723f5aac5988eed977b278a7807Greg ClaytonModule::PrepareForFunctionNameLookup (const ConstString &name, 1500296b06d325413723f5aac5988eed977b278a7807Greg Clayton uint32_t name_type_mask, 1501296b06d325413723f5aac5988eed977b278a7807Greg Clayton ConstString &lookup_name, 1502296b06d325413723f5aac5988eed977b278a7807Greg Clayton uint32_t &lookup_name_type_mask, 1503296b06d325413723f5aac5988eed977b278a7807Greg Clayton bool &match_name_after_lookup) 1504296b06d325413723f5aac5988eed977b278a7807Greg Clayton{ 1505296b06d325413723f5aac5988eed977b278a7807Greg Clayton const char *name_cstr = name.GetCString(); 1506296b06d325413723f5aac5988eed977b278a7807Greg Clayton lookup_name_type_mask = eFunctionNameTypeNone; 1507296b06d325413723f5aac5988eed977b278a7807Greg Clayton match_name_after_lookup = false; 1508296b06d325413723f5aac5988eed977b278a7807Greg Clayton const char *base_name_start = NULL; 1509296b06d325413723f5aac5988eed977b278a7807Greg Clayton const char *base_name_end = NULL; 1510296b06d325413723f5aac5988eed977b278a7807Greg Clayton 1511296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (name_type_mask & eFunctionNameTypeAuto) 1512296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 1513296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (CPPLanguageRuntime::IsCPPMangledName (name_cstr)) 1514296b06d325413723f5aac5988eed977b278a7807Greg Clayton lookup_name_type_mask = eFunctionNameTypeFull; 1515296b06d325413723f5aac5988eed977b278a7807Greg Clayton else if (ObjCLanguageRuntime::IsPossibleObjCMethodName (name_cstr)) 1516296b06d325413723f5aac5988eed977b278a7807Greg Clayton lookup_name_type_mask = eFunctionNameTypeFull; 1517296b06d325413723f5aac5988eed977b278a7807Greg Clayton else 1518296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 1519296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (ObjCLanguageRuntime::IsPossibleObjCSelector(name_cstr)) 1520296b06d325413723f5aac5988eed977b278a7807Greg Clayton lookup_name_type_mask |= eFunctionNameTypeSelector; 1521296b06d325413723f5aac5988eed977b278a7807Greg Clayton 152283d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton CPPLanguageRuntime::MethodName cpp_method (name); 152383d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton llvm::StringRef basename (cpp_method.GetBasename()); 152483d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton if (basename.empty()) 152583d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton { 152683d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton if (CPPLanguageRuntime::StripNamespacesFromVariableName (name_cstr, base_name_start, base_name_end)) 152783d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton lookup_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase); 152883d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton } 152983d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton else 153083d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton { 153183d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton base_name_start = basename.data(); 153283d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton base_name_end = base_name_start + basename.size(); 1533296b06d325413723f5aac5988eed977b278a7807Greg Clayton lookup_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase); 153483d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton } 1535296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 1536296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 1537296b06d325413723f5aac5988eed977b278a7807Greg Clayton else 1538296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 1539296b06d325413723f5aac5988eed977b278a7807Greg Clayton lookup_name_type_mask = name_type_mask; 1540296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (lookup_name_type_mask & eFunctionNameTypeMethod || name_type_mask & eFunctionNameTypeBase) 1541296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 1542296b06d325413723f5aac5988eed977b278a7807Greg Clayton // If they've asked for a CPP method or function name and it can't be that, we don't 1543296b06d325413723f5aac5988eed977b278a7807Greg Clayton // even need to search for CPP methods or names. 154483d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton CPPLanguageRuntime::MethodName cpp_method (name); 154583d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton if (cpp_method.IsValid()) 1546296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 154783d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton llvm::StringRef basename (cpp_method.GetBasename()); 154883d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton base_name_start = basename.data(); 154983d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton base_name_end = base_name_start + basename.size(); 155083d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton 155183d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton if (!cpp_method.GetQualifiers().empty()) 155283d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton { 155383d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton // There is a "const" or other qualifer following the end of the fucntion parens, 155483d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton // this can't be a eFunctionNameTypeBase 155583d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton lookup_name_type_mask &= ~(eFunctionNameTypeBase); 155683d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton if (lookup_name_type_mask == eFunctionNameTypeNone) 155783d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton return; 155883d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton } 155983d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton } 156083d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton else 156183d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton { 156283d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton if (!CPPLanguageRuntime::StripNamespacesFromVariableName (name_cstr, base_name_start, base_name_end)) 156383d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton { 156483d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton lookup_name_type_mask &= ~(eFunctionNameTypeMethod | eFunctionNameTypeBase); 156583d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton if (lookup_name_type_mask == eFunctionNameTypeNone) 156683d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton return; 156783d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton } 1568296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 1569296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 1570296b06d325413723f5aac5988eed977b278a7807Greg Clayton 1571296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (lookup_name_type_mask & eFunctionNameTypeSelector) 1572296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 1573296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (!ObjCLanguageRuntime::IsPossibleObjCSelector(name_cstr)) 1574296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 1575296b06d325413723f5aac5988eed977b278a7807Greg Clayton lookup_name_type_mask &= ~(eFunctionNameTypeSelector); 1576296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (lookup_name_type_mask == eFunctionNameTypeNone) 1577296b06d325413723f5aac5988eed977b278a7807Greg Clayton return; 1578296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 1579296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 1580296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 1581296b06d325413723f5aac5988eed977b278a7807Greg Clayton 1582296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (base_name_start && 1583296b06d325413723f5aac5988eed977b278a7807Greg Clayton base_name_end && 1584296b06d325413723f5aac5988eed977b278a7807Greg Clayton base_name_start != name_cstr && 1585296b06d325413723f5aac5988eed977b278a7807Greg Clayton base_name_start < base_name_end) 1586296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 1587296b06d325413723f5aac5988eed977b278a7807Greg Clayton // The name supplied was a partial C++ path like "a::count". In this case we want to do a 1588296b06d325413723f5aac5988eed977b278a7807Greg Clayton // lookup on the basename "count" and then make sure any matching results contain "a::count" 1589296b06d325413723f5aac5988eed977b278a7807Greg Clayton // so that it would match "b::a::count" and "a::count". This is why we set "match_name_after_lookup" 1590296b06d325413723f5aac5988eed977b278a7807Greg Clayton // to true 1591296b06d325413723f5aac5988eed977b278a7807Greg Clayton lookup_name.SetCStringWithLength(base_name_start, base_name_end - base_name_start); 1592296b06d325413723f5aac5988eed977b278a7807Greg Clayton match_name_after_lookup = true; 1593296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 1594296b06d325413723f5aac5988eed977b278a7807Greg Clayton else 1595296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 1596296b06d325413723f5aac5988eed977b278a7807Greg Clayton // The name is already correct, just use the exact name as supplied, and we won't need 1597296b06d325413723f5aac5988eed977b278a7807Greg Clayton // to check if any matches contain "name" 1598296b06d325413723f5aac5988eed977b278a7807Greg Clayton lookup_name = name; 1599296b06d325413723f5aac5988eed977b278a7807Greg Clayton match_name_after_lookup = false; 1600296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 1601296b06d325413723f5aac5988eed977b278a7807Greg Clayton}