Module.cpp revision 75d8c2591f6c56a09338bf4967a41510165a907e
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Module.cpp ----------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h" 1475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton#include "lldb/Core/StreamString.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// Shared pointers to modules track module lifetimes in 25899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// targets and in the global module, but this collection 26899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// will track all module objects that are still alive 27899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytontypedef std::vector<Module *> ModuleCollection; 28899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 29899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonstatic ModuleCollection & 30899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonGetModuleCollection() 31899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 32b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // This module collection needs to live past any module, so we could either make it a 33b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // shared pointer in each module or just leak is. Since it is only an empty vector by 34b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // the time all the modules have gone away, we just leak it for now. If we decide this 35b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // is a big problem we can introduce a Finalize method that will tear everything down in 36b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham // a predictable order. 37b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham 38b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham static ModuleCollection *g_module_collection = NULL; 39b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham if (g_module_collection == NULL) 40b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham g_module_collection = new ModuleCollection(); 41b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham 42b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham return *g_module_collection; 43899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 44899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 45899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonMutex & 46899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocationModuleCollectionMutex() 47899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 48899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton static Mutex g_module_collection_mutex(Mutex::eMutexTypeRecursive); 49899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return g_module_collection_mutex; 50899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 51899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 52899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonsize_t 53899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetNumberAllocatedModules () 54899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 55899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 56899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return GetModuleCollection().size(); 57899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 58899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 59899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule * 60899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocatedModuleAtIndex (size_t idx) 61899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{ 62899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 63899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection &modules = GetModuleCollection(); 64899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton if (idx < modules.size()) 65899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return modules[idx]; 66899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton return NULL; 67899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton} 68899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 69899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 70899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 71899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Module(const FileSpec& file_spec, const ArchSpec& arch, const ConstString *object_name, off_t object_offset) : 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mutex (Mutex::eMutexTypeRecursive), 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time (file_spec.GetModificationTime()), 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arch (arch), 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_uuid (), 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file (file_spec), 7824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_platform_file(), 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name (), 80b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_object_offset (object_offset), 81e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_objfile_sp (), 82236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_symfile_ap (), 83b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast (), 84236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile (false), 85236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor (false), 86236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid (false), 87b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast (false), 88236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_is_dynamic_loader_module (false) 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 90899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 91899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 92899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 93899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton GetModuleCollection().push_back(this); 94899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 95899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_name) 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = *object_name; 98e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 102940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module() 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 112899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton // Scope for locker below... 113899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton { 114899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 115899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection &modules = GetModuleCollection(); 116899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator end = modules.end(); 117899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton ModuleCollection::iterator pos = std::find(modules.begin(), end, this); 118899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton if (pos != end) 119899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton modules.erase(pos); 120899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton } 121e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')", 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 125940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_arch.GetArchitectureName(), 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 131b01000fd063629facd45044f137446fb748ee179Greg Clayton // Release any auto pointers before we start tearing down our member 132b01000fd063629facd45044f137446fb748ee179Greg Clayton // variables since the object file and symbol files might need to make 133b01000fd063629facd45044f137446fb748ee179Greg Clayton // function calls back into this module object. The ordering is important 134b01000fd063629facd45044f137446fb748ee179Greg Clayton // here because symbol files can require the module object file. So we tear 135b01000fd063629facd45044f137446fb748ee179Greg Clayton // down the symbol file first, then the object file. 136b01000fd063629facd45044f137446fb748ee179Greg Clayton m_symfile_ap.reset(); 137e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_objfile_sp.reset(); 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1410467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID& 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID() 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 145236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_parse_uuid == false) 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile * obj_file = GetObjectFile (); 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner obj_file->GetUUID(&m_uuid); 152236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid = true; 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_uuid; 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext & 159b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext () 160b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 161b01000fd063629facd45044f137446fb748ee179Greg Clayton Mutex::Locker locker (m_mutex); 162b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_did_init_ast == false) 163b01000fd063629facd45044f137446fb748ee179Greg Clayton { 164b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjectFile * objfile = GetObjectFile(); 165395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton ArchSpec object_arch; 166395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (objfile && objfile->GetArchitecture(object_arch)) 167b01000fd063629facd45044f137446fb748ee179Greg Clayton { 168b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast = true; 169395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton m_ast.SetArchitecture (object_arch); 170b01000fd063629facd45044f137446fb748ee179Greg Clayton } 171b01000fd063629facd45044f137446fb748ee179Greg Clayton } 172b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast; 173b01000fd063629facd45044f137446fb748ee179Greg Clayton} 174b01000fd063629facd45044f137446fb748ee179Greg Clayton 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols() 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits(); 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_comp_units == 0) 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18302e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton SymbolContext sc; 18402e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton sc.module_sp = this; 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t cu_idx; 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++) 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get(); 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit) 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseCompileUnitFunctions(sc); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t func_idx; 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx) 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseFunctionBlocks(sc); 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse the variables for this function and all its blocks 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse all types for this compile unit 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseTypes(sc); 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc) 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21802e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton sc->module_sp = this; 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 221c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule * 222c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule::CalculateSymbolContextModule () 223c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{ 224c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton return this; 225c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton} 226c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s) 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2307e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda s->Printf(", Module{%p}", this); 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits() 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this); 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->GetNumCompileUnits(); 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetCompileUnitAtIndex (uint32_t index) 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits (); 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompUnitSP cu_sp; 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index < num_comp_units) 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu_sp = symbols->GetCompileUnitAtIndex(index); 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return cu_sp; 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr) 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr); 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList()); 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved_flags = 0; 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the result symbol context in case we don't find anything 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.Clear(); 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the section from the section/offset address. 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Section *section = so_addr.GetSection(); 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure the section matches this module before we try and match anything 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (section && section->GetModule() == this) 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If the section offset based address resolved itself, then this 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is the right module. 28802e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton sc.module_sp = this; 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextModule; 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Resolve the compile unit, function, block, line table or line 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // entry if requested. 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (resolve_scope & eSymbolContextCompUnit || 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextFunction || 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextBlock || 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextLineEntry ) 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc); 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 303bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham // Resolve the symbol if requested, but don't re-look it up if we've already found it. 304bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol)) 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = ofile->GetSymtab(); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (so_addr.IsSectionOffset()) 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress()); 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextSymbol; 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved_flags; 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 326537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath 327537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton( 328537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton const char *file_path, 329537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t line, 330537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton bool check_inlines, 331537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t resolve_scope, 332537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton SymbolContextList& sc_list 333537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton) 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 335537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec file_spec(file_path, false); 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list); 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)", 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory().AsCString(""), 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory() ? "/" : "", 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetFilename().AsCString(""), 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line, 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner check_inlines ? "yes" : "no", 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope); 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t initial_count = sc_list.GetSize(); 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list); 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_count; 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 3633e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindGlobalVariables(const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables) 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 3670fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables); 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindGlobalVariables(regex, append, max_matches, variables); 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 380801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonModule::FindCompileUnits (const FileSpec &path, 381801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton bool append, 382801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContextList &sc_list) 383801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{ 384801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (!append) 385801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc_list.Clear(); 386801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 387801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const uint32_t start_size = sc_list.GetSize(); 388801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const uint32_t num_compile_units = GetNumCompileUnits(); 389801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContext sc; 39002e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton sc.module_sp = this; 391801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const bool compare_directory = path.GetDirectory(); 392801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton for (uint32_t i=0; i<num_compile_units; ++i) 393801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 394801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc.comp_unit = GetCompileUnitAtIndex(i).get(); 395801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (FileSpec::Equal (*sc.comp_unit, path, compare_directory)) 396801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton sc_list.Append(sc); 397801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 398801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton return sc_list.GetSize() - start_size; 399801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton} 400801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 401801417e453f8531ac176cd952200587bf15d9ccfGreg Claytonuint32_t 4023e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindFunctions (const ConstString &name, 4033e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan const ClangNamespaceDecl *namespace_decl, 40428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton uint32_t name_type_mask, 40528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool include_symbols, 40628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 40728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 41028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 41128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 41228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t start_size = sc_list.GetSize(); 41328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 41428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Find all the functions (not symbols, but debug information functions... 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 4170fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan symbols->FindFunctions(name, namespace_decl, name_type_mask, append, sc_list); 41828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 41928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 42028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 42128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 42228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 42328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 42428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 42528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 42628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 42728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 42828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 42928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 43028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t num_matches = symbol_indexes.size(); 43128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 43228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 433889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const bool merge_symbol_into_function = true; 43428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 43528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton for (uint32_t i=0; i<num_matches; i++) 43628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 43728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 438889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 43928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 44028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 44128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 44228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 44328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 44428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 44828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex, 44928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool include_symbols, 45028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 45128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 45428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 45528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 45628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t start_size = sc_list.GetSize(); 45728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 4609935a860350721f6bb32e841d89e1c25c07b98a7Jim Ingham symbols->FindFunctions(regex, append, sc_list); 46128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 46228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 46328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 46428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 46528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 46628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 46728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 46828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 46928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 47028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 47128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 47228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t num_matches = symbol_indexes.size(); 47328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 47428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 475889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const bool merge_symbol_into_function = true; 47628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 47728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton for (uint32_t i=0; i<num_matches; i++) 47828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 47928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 480889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton sc_list.AppendIfUnique (sc, merge_symbol_into_function); 48128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 48228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 48328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 48428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 48528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 48628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4897aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Claytonuint32_t 4900fcec13c6639ab49216fa9447b25888b7bc9ff59Sean CallananModule::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types) 4917aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{ 4927aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 4937aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (sc.module_sp.get() == NULL || sc.module_sp.get() == this) 4947aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton { 4957aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton SymbolVendor *symbols = GetSymbolVendor (); 4967aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (symbols) 4970fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types); 4987aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton } 4997aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton return 0; 5007aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton} 5017aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton 502979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// depending on implementation details, type lookup might fail because of 503979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// embedded spurious namespace:: prefixes. this call strips them, paying 504979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// attention to the fact that a type might have namespace'd type names as 505979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// arguments to templates, and those must not be stripped off 506979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatastatic const char* 507979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataStripTypeName(const char* name_cstr) 508979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 509979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata const char* skip_namespace = strstr(name_cstr, "::"); 510979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata const char* template_arg_char = strchr(name_cstr, '<'); 511979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata while (skip_namespace != NULL) 512979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 513979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (template_arg_char != NULL && 514979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata skip_namespace > template_arg_char) // but namespace'd template arguments are still good to go 515979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 516979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata name_cstr = skip_namespace+2; 517979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata skip_namespace = strstr(name_cstr, "::"); 518979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 519979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return name_cstr; 520979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 521979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 522979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatauint32_t 5233e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindTypes (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types) 524979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 5250fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan uint32_t retval = FindTypes_Impl(sc, name, namespace_decl, append, max_matches, types); 526979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 527979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (retval == 0) 528979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 529979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata const char *stripped = StripTypeName(name.GetCString()); 5300fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return FindTypes_Impl(sc, ConstString(stripped), namespace_decl, append, max_matches, types); 531979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 532979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata else 533979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return retval; 534979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 535979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 536979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types) 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Timer scoped_timer(__PRETTY_FUNCTION__); 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolVendor *symbols = GetSymbolVendor (); 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (symbols) 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types); 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return 0; 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor* 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSymbolVendor (bool can_create) 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 552236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_symbol_vendor == false && can_create) 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *obj_file = GetObjectFile (); 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_symfile_ap.reset(SymbolVendor::FindPlugin(this)); 559236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor = true; 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_symfile_ap.get(); 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name) 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Container objects whose paths do not specify a file directly can call 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // this function to correct the file and object names. 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file = file; 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time = file.GetModificationTime(); 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = object_name; 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec& 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_arch; 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 58275d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::GetDescription (Stream *s, lldb::DescriptionLevel level) 5837826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{ 5847826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice Mutex::Locker locker (m_mutex); 5857826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 58675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (level >= eDescriptionLevelFull) 58775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 58875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (m_arch.IsValid()) 58975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->Printf("(%s) ", m_arch.GetArchitectureName()); 59075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 5917826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 59275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (level == eDescriptionLevelBrief) 59375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 59475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton const char *filename = m_file.GetFilename().GetCString(); 59575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (filename) 59675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->PutCString (filename); 59775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 59875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton else 59975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 60075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton char path[PATH_MAX]; 60175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (m_file.GetPath(path, sizeof(path))) 60275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton s->PutCString(path); 60375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 60449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 60549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton const char *object_name = m_object_name.GetCString(); 60649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton if (object_name) 60749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton s->Printf("(%s)", object_name); 6087826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice} 6097826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 6107826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid 61175d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportError (const char *format, ...) 61275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 61375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton StreamString module_description; 61475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton GetDescription(&module_description, lldb::eDescriptionLevelBrief); 61575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton ::fprintf (stderr, "error: %s ", module_description.GetString().c_str()); 61675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 61775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_list args; 61875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_start (args, format); 61975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton vfprintf (stderr, format, args); 62075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_end (args); 62175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 62275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 62375d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 62475d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportWarning (const char *format, ...) 62575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 62675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton StreamString module_description; 62775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton GetDescription(&module_description, lldb::eDescriptionLevelBrief); 62875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton ::fprintf (stderr, "warning: %s ", module_description.GetString().c_str()); 62975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 63075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_list args; 63175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_start (args, format); 63275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton vfprintf (stderr, format, args); 63375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_end (args); 63475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 63575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 63675d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 63775d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::LogMessage (Log *log, const char *format, ...) 63875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{ 63975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (log) 64075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 64175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton StreamString log_message; 64275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton GetDescription(&log_message, lldb::eDescriptionLevelBrief); 64375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log_message.PutCString (": "); 64475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_list args; 64575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_start (args, format); 64675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log_message.PrintfVarArg (format, args); 64775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton va_end (args); 64875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton log->PutCString(log_message.GetString().c_str()); 64975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 65075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton} 65175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 65275d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s) 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 6563fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Indent(); 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("Module %s/%s%s%s%s\n", 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(), 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(), 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? "(" : "", 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? m_object_name.GetCString() : "", 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? ")" : ""); 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentMore(); 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner objfile->Dump(s); 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->Dump(s); 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentLess(); 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList* 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList () 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &symbols->GetTypeList(); 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_object_name; 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile() 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 699236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_objfile == false) 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 701236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile = true; 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString("")); 704e40b6424d9e49306392bec4b44060da36414c382Greg Clayton m_objfile_sp = ObjectFile::FindPlugin(this, &m_file, m_object_offset, m_file.GetByteSize()); 7056a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (m_objfile_sp) 7066a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton { 7076a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // Once we get the object file, update our module with the object file's 7086a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // architecture since it might differ in vendor/os if some parts were 7096a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // unknown. 7106a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton m_objfile_sp->GetArchitecture (m_arch); 7116a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton } 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 713e40b6424d9e49306392bec4b44060da36414c382Greg Clayton return m_objfile_sp.get(); 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol * 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type) 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)", 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile(); 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 7297c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny); 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list) 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t num_indices = symbol_indexes.size(); 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_indices > 0) 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc; 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateSymbolContext (&sc); 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i = 0; i < num_indices; i++) 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]); 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Append (sc); 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 754aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean CallananModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list) 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsWithNameAndType (name = %s, type = %i)", 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes); 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression ®ex, SymbolType symbol_type, SymbolContextList &sc_list) 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)", 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText(), 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 7977c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue & 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mod_time; 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8097508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 8107508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 8117508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable () 8127508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 8137508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (GetObjectFile() == NULL) 8147508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return false; 8157508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham else 8167508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return GetObjectFile()->IsExecutable(); 8177508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 8187508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 81951b11e06de746667396f56b303d1867f007baf8bJim Inghambool 82051b11e06de746667396f56b303d1867f007baf8bJim InghamModule::IsLoadedInTarget (Target *target) 82151b11e06de746667396f56b303d1867f007baf8bJim Ingham{ 82251b11e06de746667396f56b303d1867f007baf8bJim Ingham ObjectFile *obj_file = GetObjectFile(); 82351b11e06de746667396f56b303d1867f007baf8bJim Ingham if (obj_file) 82451b11e06de746667396f56b303d1867f007baf8bJim Ingham { 82551b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionList *sections = obj_file->GetSectionList(); 82651b11e06de746667396f56b303d1867f007baf8bJim Ingham if (sections != NULL) 82751b11e06de746667396f56b303d1867f007baf8bJim Ingham { 82851b11e06de746667396f56b303d1867f007baf8bJim Ingham size_t num_sections = sections->GetSize(); 82951b11e06de746667396f56b303d1867f007baf8bJim Ingham for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++) 83051b11e06de746667396f56b303d1867f007baf8bJim Ingham { 83151b11e06de746667396f56b303d1867f007baf8bJim Ingham SectionSP section_sp = sections->GetSectionAtIndex(sect_idx); 83251b11e06de746667396f56b303d1867f007baf8bJim Ingham if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS) 83351b11e06de746667396f56b303d1867f007baf8bJim Ingham { 83451b11e06de746667396f56b303d1867f007baf8bJim Ingham return true; 83551b11e06de746667396f56b303d1867f007baf8bJim Ingham } 83651b11e06de746667396f56b303d1867f007baf8bJim Ingham } 83751b11e06de746667396f56b303d1867f007baf8bJim Ingham } 83851b11e06de746667396f56b303d1867f007baf8bJim Ingham } 83951b11e06de746667396f56b303d1867f007baf8bJim Ingham return false; 84051b11e06de746667396f56b303d1867f007baf8bJim Ingham} 8417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 8427508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch) 8437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 844940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (!m_arch.IsValid()) 8457508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 8467508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham m_arch = new_arch; 8477508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return true; 848940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 849940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return m_arch == new_arch; 8507508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 8517508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 852