Module.cpp revision 0467c78e9a75eff9ec33d3c1f39fa83e1c5d9241
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" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Module(const FileSpec& file_spec, const ArchSpec& arch, const ConstString *object_name, off_t object_offset) : 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mutex (Mutex::eMutexTypeRecursive), 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time (file_spec.GetModificationTime()), 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arch (arch), 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_uuid (), 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file (file_spec), 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name (), 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_objfile_ap (), 31236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_symfile_ap (), 32b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast (), 33236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile (false), 34236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor (false), 35236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid (false), 36b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast (false), 37236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_is_dynamic_loader_module (false) 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_name) 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = *object_name; 41e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arch.AsCString(), 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module() 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 55e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')", 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arch.AsCString(), 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 65b01000fd063629facd45044f137446fb748ee179Greg Clayton // Release any auto pointers before we start tearing down our member 66b01000fd063629facd45044f137446fb748ee179Greg Clayton // variables since the object file and symbol files might need to make 67b01000fd063629facd45044f137446fb748ee179Greg Clayton // function calls back into this module object. The ordering is important 68b01000fd063629facd45044f137446fb748ee179Greg Clayton // here because symbol files can require the module object file. So we tear 69b01000fd063629facd45044f137446fb748ee179Greg Clayton // down the symbol file first, then the object file. 70b01000fd063629facd45044f137446fb748ee179Greg Clayton m_symfile_ap.reset(); 71b01000fd063629facd45044f137446fb748ee179Greg Clayton m_objfile_ap.reset(); 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModuleSP 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSP () 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ModuleList::GetModuleSP (this); 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 810467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID& 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID() 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 85236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_parse_uuid == false) 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile * obj_file = GetObjectFile (); 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner obj_file->GetUUID(&m_uuid); 92236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid = true; 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_uuid; 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext & 99b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext () 100b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 101b01000fd063629facd45044f137446fb748ee179Greg Clayton Mutex::Locker locker (m_mutex); 102b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_did_init_ast == false) 103b01000fd063629facd45044f137446fb748ee179Greg Clayton { 104b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjectFile * objfile = GetObjectFile(); 105b01000fd063629facd45044f137446fb748ee179Greg Clayton ConstString target_triple; 106b01000fd063629facd45044f137446fb748ee179Greg Clayton if (objfile && objfile->GetTargetTriple(target_triple)) 107b01000fd063629facd45044f137446fb748ee179Greg Clayton { 108b01000fd063629facd45044f137446fb748ee179Greg Clayton m_did_init_ast = true; 109b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast.SetTargetTriple (target_triple.AsCString()); 110b01000fd063629facd45044f137446fb748ee179Greg Clayton } 111b01000fd063629facd45044f137446fb748ee179Greg Clayton } 112b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast; 113b01000fd063629facd45044f137446fb748ee179Greg Clayton} 114b01000fd063629facd45044f137446fb748ee179Greg Clayton 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols() 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits(); 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_comp_units == 0) 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TargetSP null_target; 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc(null_target, GetSP()); 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t cu_idx; 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++) 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get(); 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit) 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseCompileUnitFunctions(sc); 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t func_idx; 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx) 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseFunctionBlocks(sc); 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse the variables for this function and all its blocks 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse all types for this compile unit 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseTypes(sc); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc) 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc->module_sp = GetSP(); 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s) 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(", Module{0x%8.8x}", this); 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits() 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this); 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->GetNumCompileUnits(); 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetCompileUnitAtIndex (uint32_t index) 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits (); 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompUnitSP cu_sp; 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index < num_comp_units) 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu_sp = symbols->GetCompileUnitAtIndex(index); 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return cu_sp; 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//CompUnitSP 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindCompUnit(lldb::user_id_t uid) 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CompUnitSP cu_sp; 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolVendor *symbols = GetSymbolVendor (); 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (symbols) 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// cu_sp = symbols->FindCompUnit(uid); 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return cu_sp; 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr) 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList()); 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved_flags = 0; 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the result symbol context in case we don't find anything 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.Clear(); 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the section from the section/offset address. 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Section *section = so_addr.GetSection(); 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure the section matches this module before we try and match anything 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (section && section->GetModule() == this) 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If the section offset based address resolved itself, then this 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is the right module. 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.module_sp = GetSP(); 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextModule; 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Resolve the compile unit, function, block, line table or line 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // entry if requested. 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (resolve_scope & eSymbolContextCompUnit || 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextFunction || 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextBlock || 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextLineEntry ) 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc); 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 247bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham // Resolve the symbol if requested, but don't re-look it up if we've already found it. 248bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol)) 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = ofile->GetSymtab(); 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (so_addr.IsSectionOffset()) 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress()); 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextSymbol; 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved_flags; 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 270537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath 271537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton( 272537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton const char *file_path, 273537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t line, 274537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton bool check_inlines, 275537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t resolve_scope, 276537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton SymbolContextList& sc_list 277537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton) 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 279537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec file_spec(file_path, false); 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list); 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)", 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory().AsCString(""), 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory() ? "/" : "", 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetFilename().AsCString(""), 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line, 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner check_inlines ? "yes" : "no", 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope); 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t initial_count = sc_list.GetSize(); 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list); 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_count; 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const ConstString &name, bool append, uint32_t max_matches, VariableList& variables) 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindGlobalVariables(name, append, max_matches, variables); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindGlobalVariables(regex, append, max_matches, variables); 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 32428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const ConstString &name, 32528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton uint32_t name_type_mask, 32628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool include_symbols, 32728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 32828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 33128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 33228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 33328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t start_size = sc_list.GetSize(); 33428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 33528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Find all the functions (not symbols, but debug information functions... 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 33828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symbols->FindFunctions(name, name_type_mask, append, sc_list); 33928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 34028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 34128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 34228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 34328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 34428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 34528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 34628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 34728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 34828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 34928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 35028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 35128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t num_matches = symbol_indexes.size(); 35228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 35328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 35428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 35528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton for (uint32_t i=0; i<num_matches; i++) 35628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 35728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 35828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.AppendIfUnique (sc); 35928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 36028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 36128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 36228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 36328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 36428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 36828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex, 36928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool include_symbols, 37028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool append, 37128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContextList& sc_list) 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (!append) 37428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.Clear(); 37528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 37628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t start_size = sc_list.GetSize(); 37728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindFunctions(regex, append, sc_list); 38128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton // Now check our symbol table for symbols that are code symbols if requested 38228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (include_symbols) 38328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 38428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton ObjectFile *objfile = GetObjectFile(); 38528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (objfile) 38628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 38728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton Symtab *symtab = objfile->GetSymtab(); 38828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (symtab) 38928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 39028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton std::vector<uint32_t> symbol_indexes; 39128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 39228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const uint32_t num_matches = symbol_indexes.size(); 39328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (num_matches) 39428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 39528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton SymbolContext sc(this); 39628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton for (uint32_t i=0; i<num_matches; i++) 39728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 39828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 39928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list.AppendIfUnique (sc); 40028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 40128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 40228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 40328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 40428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 40528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return sc_list.GetSize() - start_size; 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4087aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Claytonuint32_t 4097aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg ClaytonModule::FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types) 4107aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{ 4117aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 4127aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (sc.module_sp.get() == NULL || sc.module_sp.get() == this) 4137aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton { 4147aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton SymbolVendor *symbols = GetSymbolVendor (); 4157aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (symbols) 4167aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton return symbols->FindTypes(sc, name, append, max_matches, types); 4177aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton } 4187aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton return 0; 4197aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton} 4207aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types) 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Timer scoped_timer(__PRETTY_FUNCTION__); 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolVendor *symbols = GetSymbolVendor (); 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (symbols) 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types); 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return 0; 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor* 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSymbolVendor (bool can_create) 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 436236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_symbol_vendor == false && can_create) 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *obj_file = GetObjectFile (); 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_symfile_ap.reset(SymbolVendor::FindPlugin(this)); 443236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor = true; 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_symfile_ap.get(); 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst FileSpec & 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetFileSpec () const 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_file; 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name) 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Container objects whose paths do not specify a file directly can call 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // this function to correct the file and object names. 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file = file; 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time = file.GetModificationTime(); 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = object_name; 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec& 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_arch; 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 4727826c8894803dc729f29789ebc038956a94d3e7aCaroline TiceModule::GetDescription (Stream *s) 4737826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{ 4747826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice Mutex::Locker locker (m_mutex); 4757826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 47649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton if (m_arch.IsValid()) 47749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton s->Printf("(%s) ", m_arch.AsCString()); 4787826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 47949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton char path[PATH_MAX]; 48049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton if (m_file.GetPath(path, sizeof(path))) 48149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton s->PutCString(path); 48249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 48349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton const char *object_name = m_object_name.GetCString(); 48449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton if (object_name) 48549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton s->Printf("(%s)", object_name); 4867826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice} 4877826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 4887826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s) 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 4923fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Indent(); 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("Module %s/%s%s%s%s\n", 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(), 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(), 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? "(" : "", 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? m_object_name.GetCString() : "", 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? ")" : ""); 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentMore(); 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner objfile->Dump(s); 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->Dump(s); 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentLess(); 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList* 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList () 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &symbols->GetTypeList(); 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_object_name; 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile() 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 535236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_objfile == false) 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 537236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile = true; 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString("")); 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_objfile_ap.reset(ObjectFile::FindPlugin(this, &m_file, 0, m_file.GetByteSize())); 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_objfile_ap.get(); 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol * 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type) 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)", 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile(); 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 5587c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny); 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list) 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t num_indices = symbol_indexes.size(); 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_indices > 0) 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc; 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateSymbolContext (&sc); 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i = 0; i < num_indices; i++) 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]); 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Append (sc); 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list) 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsWithNameAndType (name = %s, type = %i)", 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes); 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression ®ex, SymbolType symbol_type, SymbolContextList &sc_list) 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)", 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText(), 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 6267c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue & 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mod_time; 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 6397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 6407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable () 6417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 6427508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (GetObjectFile() == NULL) 6437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return false; 6447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham else 6457508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return GetObjectFile()->IsExecutable(); 6467508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 6477508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 6487508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 6497508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch) 6507508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 6517508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (m_arch == new_arch) 6527508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return true; 6537508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham else if (!m_arch.IsValid()) 6547508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 6557508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham m_arch = new_arch; 6567508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return true; 6577508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 6587508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham else 6597508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 6607508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return false; 6617508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 6627508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 6637508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 6647508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 665