1 //===-- Module.cpp ----------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Core/Module.h" 11 #include "lldb/Core/Log.h" 12 #include "lldb/Core/ModuleList.h" 13 #include "lldb/Core/RegularExpression.h" 14 #include "lldb/Core/Timer.h" 15 #include "lldb/lldb-private-log.h" 16 #include "lldb/Symbol/ObjectFile.h" 17 #include "lldb/Symbol/SymbolContext.h" 18 #include "lldb/Symbol/SymbolVendor.h" 19 20 using namespace lldb; 21 using namespace lldb_private; 22 23 // Shared pointers to modules track module lifetimes in 24 // targets and in the global module, but this collection 25 // will track all module objects that are still alive 26 typedef std::vector<Module *> ModuleCollection; 27 28 static ModuleCollection & 29 GetModuleCollection() 30 { 31 static ModuleCollection g_module_collection; 32 return g_module_collection; 33 } 34 35 Mutex & 36 Module::GetAllocationModuleCollectionMutex() 37 { 38 static Mutex g_module_collection_mutex(Mutex::eMutexTypeRecursive); 39 return g_module_collection_mutex; 40 } 41 42 size_t 43 Module::GetNumberAllocatedModules () 44 { 45 Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 46 return GetModuleCollection().size(); 47 } 48 49 Module * 50 Module::GetAllocatedModuleAtIndex (size_t idx) 51 { 52 Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 53 ModuleCollection &modules = GetModuleCollection(); 54 if (idx < modules.size()) 55 return modules[idx]; 56 return NULL; 57 } 58 59 60 61 62 Module::Module(const FileSpec& file_spec, const ArchSpec& arch, const ConstString *object_name, off_t object_offset) : 63 m_mutex (Mutex::eMutexTypeRecursive), 64 m_mod_time (file_spec.GetModificationTime()), 65 m_arch (arch), 66 m_uuid (), 67 m_file (file_spec), 68 m_platform_file(), 69 m_object_name (), 70 m_object_offset (object_offset), 71 m_objfile_sp (), 72 m_symfile_ap (), 73 m_ast (), 74 m_did_load_objfile (false), 75 m_did_load_symbol_vendor (false), 76 m_did_parse_uuid (false), 77 m_did_init_ast (false), 78 m_is_dynamic_loader_module (false) 79 { 80 // Scope for locker below... 81 { 82 Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 83 GetModuleCollection().push_back(this); 84 } 85 86 if (object_name) 87 m_object_name = *object_name; 88 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 89 if (log) 90 log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", 91 this, 92 m_arch.GetArchitectureName(), 93 m_file.GetDirectory().AsCString(""), 94 m_file.GetFilename().AsCString(""), 95 m_object_name.IsEmpty() ? "" : "(", 96 m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 97 m_object_name.IsEmpty() ? "" : ")"); 98 } 99 100 Module::~Module() 101 { 102 // Scope for locker below... 103 { 104 Mutex::Locker locker (GetAllocationModuleCollectionMutex()); 105 ModuleCollection &modules = GetModuleCollection(); 106 ModuleCollection::iterator end = modules.end(); 107 ModuleCollection::iterator pos = std::find(modules.begin(), end, this); 108 if (pos != end) 109 modules.erase(pos); 110 } 111 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 112 if (log) 113 log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')", 114 this, 115 m_arch.GetArchitectureName(), 116 m_file.GetDirectory().AsCString(""), 117 m_file.GetFilename().AsCString(""), 118 m_object_name.IsEmpty() ? "" : "(", 119 m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 120 m_object_name.IsEmpty() ? "" : ")"); 121 // Release any auto pointers before we start tearing down our member 122 // variables since the object file and symbol files might need to make 123 // function calls back into this module object. The ordering is important 124 // here because symbol files can require the module object file. So we tear 125 // down the symbol file first, then the object file. 126 m_symfile_ap.reset(); 127 m_objfile_sp.reset(); 128 } 129 130 131 const lldb_private::UUID& 132 Module::GetUUID() 133 { 134 Mutex::Locker locker (m_mutex); 135 if (m_did_parse_uuid == false) 136 { 137 ObjectFile * obj_file = GetObjectFile (); 138 139 if (obj_file != NULL) 140 { 141 obj_file->GetUUID(&m_uuid); 142 m_did_parse_uuid = true; 143 } 144 } 145 return m_uuid; 146 } 147 148 ClangASTContext & 149 Module::GetClangASTContext () 150 { 151 Mutex::Locker locker (m_mutex); 152 if (m_did_init_ast == false) 153 { 154 ObjectFile * objfile = GetObjectFile(); 155 ArchSpec object_arch; 156 if (objfile && objfile->GetArchitecture(object_arch)) 157 { 158 m_did_init_ast = true; 159 m_ast.SetArchitecture (object_arch); 160 } 161 } 162 return m_ast; 163 } 164 165 void 166 Module::ParseAllDebugSymbols() 167 { 168 Mutex::Locker locker (m_mutex); 169 uint32_t num_comp_units = GetNumCompileUnits(); 170 if (num_comp_units == 0) 171 return; 172 173 SymbolContext sc; 174 sc.module_sp = this; 175 uint32_t cu_idx; 176 SymbolVendor *symbols = GetSymbolVendor (); 177 178 for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++) 179 { 180 sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get(); 181 if (sc.comp_unit) 182 { 183 sc.function = NULL; 184 symbols->ParseVariablesForContext(sc); 185 186 symbols->ParseCompileUnitFunctions(sc); 187 188 uint32_t func_idx; 189 for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx) 190 { 191 symbols->ParseFunctionBlocks(sc); 192 193 // Parse the variables for this function and all its blocks 194 symbols->ParseVariablesForContext(sc); 195 } 196 197 198 // Parse all types for this compile unit 199 sc.function = NULL; 200 symbols->ParseTypes(sc); 201 } 202 } 203 } 204 205 void 206 Module::CalculateSymbolContext(SymbolContext* sc) 207 { 208 sc->module_sp = this; 209 } 210 211 Module * 212 Module::CalculateSymbolContextModule () 213 { 214 return this; 215 } 216 217 void 218 Module::DumpSymbolContext(Stream *s) 219 { 220 s->Printf(", Module{%p}", this); 221 } 222 223 uint32_t 224 Module::GetNumCompileUnits() 225 { 226 Mutex::Locker locker (m_mutex); 227 Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this); 228 SymbolVendor *symbols = GetSymbolVendor (); 229 if (symbols) 230 return symbols->GetNumCompileUnits(); 231 return 0; 232 } 233 234 CompUnitSP 235 Module::GetCompileUnitAtIndex (uint32_t index) 236 { 237 Mutex::Locker locker (m_mutex); 238 uint32_t num_comp_units = GetNumCompileUnits (); 239 CompUnitSP cu_sp; 240 241 if (index < num_comp_units) 242 { 243 SymbolVendor *symbols = GetSymbolVendor (); 244 if (symbols) 245 cu_sp = symbols->GetCompileUnitAtIndex(index); 246 } 247 return cu_sp; 248 } 249 250 bool 251 Module::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr) 252 { 253 Mutex::Locker locker (m_mutex); 254 Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr); 255 ObjectFile* ofile = GetObjectFile(); 256 if (ofile) 257 return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList()); 258 return false; 259 } 260 261 uint32_t 262 Module::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 263 { 264 Mutex::Locker locker (m_mutex); 265 uint32_t resolved_flags = 0; 266 267 // Clear the result symbol context in case we don't find anything 268 sc.Clear(); 269 270 // Get the section from the section/offset address. 271 const Section *section = so_addr.GetSection(); 272 273 // Make sure the section matches this module before we try and match anything 274 if (section && section->GetModule() == this) 275 { 276 // If the section offset based address resolved itself, then this 277 // is the right module. 278 sc.module_sp = this; 279 resolved_flags |= eSymbolContextModule; 280 281 // Resolve the compile unit, function, block, line table or line 282 // entry if requested. 283 if (resolve_scope & eSymbolContextCompUnit || 284 resolve_scope & eSymbolContextFunction || 285 resolve_scope & eSymbolContextBlock || 286 resolve_scope & eSymbolContextLineEntry ) 287 { 288 SymbolVendor *symbols = GetSymbolVendor (); 289 if (symbols) 290 resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc); 291 } 292 293 // Resolve the symbol if requested, but don't re-look it up if we've already found it. 294 if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol)) 295 { 296 ObjectFile* ofile = GetObjectFile(); 297 if (ofile) 298 { 299 Symtab *symtab = ofile->GetSymtab(); 300 if (symtab) 301 { 302 if (so_addr.IsSectionOffset()) 303 { 304 sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress()); 305 if (sc.symbol) 306 resolved_flags |= eSymbolContextSymbol; 307 } 308 } 309 } 310 } 311 } 312 return resolved_flags; 313 } 314 315 uint32_t 316 Module::ResolveSymbolContextForFilePath 317 ( 318 const char *file_path, 319 uint32_t line, 320 bool check_inlines, 321 uint32_t resolve_scope, 322 SymbolContextList& sc_list 323 ) 324 { 325 FileSpec file_spec(file_path, false); 326 return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list); 327 } 328 329 uint32_t 330 Module::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 331 { 332 Mutex::Locker locker (m_mutex); 333 Timer scoped_timer(__PRETTY_FUNCTION__, 334 "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)", 335 file_spec.GetDirectory().AsCString(""), 336 file_spec.GetDirectory() ? "/" : "", 337 file_spec.GetFilename().AsCString(""), 338 line, 339 check_inlines ? "yes" : "no", 340 resolve_scope); 341 342 const uint32_t initial_count = sc_list.GetSize(); 343 344 SymbolVendor *symbols = GetSymbolVendor (); 345 if (symbols) 346 symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list); 347 348 return sc_list.GetSize() - initial_count; 349 } 350 351 352 uint32_t 353 Module::FindGlobalVariables(const ConstString &name, bool append, uint32_t max_matches, VariableList& variables) 354 { 355 SymbolVendor *symbols = GetSymbolVendor (); 356 if (symbols) 357 return symbols->FindGlobalVariables(name, append, max_matches, variables); 358 return 0; 359 } 360 uint32_t 361 Module::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 362 { 363 SymbolVendor *symbols = GetSymbolVendor (); 364 if (symbols) 365 return symbols->FindGlobalVariables(regex, append, max_matches, variables); 366 return 0; 367 } 368 369 uint32_t 370 Module::FindCompileUnits (const FileSpec &path, 371 bool append, 372 SymbolContextList &sc_list) 373 { 374 if (!append) 375 sc_list.Clear(); 376 377 const uint32_t start_size = sc_list.GetSize(); 378 const uint32_t num_compile_units = GetNumCompileUnits(); 379 SymbolContext sc; 380 sc.module_sp = this; 381 const bool compare_directory = path.GetDirectory(); 382 for (uint32_t i=0; i<num_compile_units; ++i) 383 { 384 sc.comp_unit = GetCompileUnitAtIndex(i).get(); 385 if (FileSpec::Equal (*sc.comp_unit, path, compare_directory)) 386 sc_list.Append(sc); 387 } 388 return sc_list.GetSize() - start_size; 389 } 390 391 uint32_t 392 Module::FindFunctions (const ConstString &name, 393 uint32_t name_type_mask, 394 bool include_symbols, 395 bool append, 396 SymbolContextList& sc_list) 397 { 398 if (!append) 399 sc_list.Clear(); 400 401 const uint32_t start_size = sc_list.GetSize(); 402 403 // Find all the functions (not symbols, but debug information functions... 404 SymbolVendor *symbols = GetSymbolVendor (); 405 if (symbols) 406 symbols->FindFunctions(name, name_type_mask, append, sc_list); 407 408 // Now check our symbol table for symbols that are code symbols if requested 409 if (include_symbols) 410 { 411 ObjectFile *objfile = GetObjectFile(); 412 if (objfile) 413 { 414 Symtab *symtab = objfile->GetSymtab(); 415 if (symtab) 416 { 417 std::vector<uint32_t> symbol_indexes; 418 symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 419 const uint32_t num_matches = symbol_indexes.size(); 420 if (num_matches) 421 { 422 const bool merge_symbol_into_function = true; 423 SymbolContext sc(this); 424 for (uint32_t i=0; i<num_matches; i++) 425 { 426 sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 427 sc_list.AppendIfUnique (sc, merge_symbol_into_function); 428 } 429 } 430 } 431 } 432 } 433 return sc_list.GetSize() - start_size; 434 } 435 436 uint32_t 437 Module::FindFunctions (const RegularExpression& regex, 438 bool include_symbols, 439 bool append, 440 SymbolContextList& sc_list) 441 { 442 if (!append) 443 sc_list.Clear(); 444 445 const uint32_t start_size = sc_list.GetSize(); 446 447 SymbolVendor *symbols = GetSymbolVendor (); 448 if (symbols) 449 symbols->FindFunctions(regex, append, sc_list); 450 // Now check our symbol table for symbols that are code symbols if requested 451 if (include_symbols) 452 { 453 ObjectFile *objfile = GetObjectFile(); 454 if (objfile) 455 { 456 Symtab *symtab = objfile->GetSymtab(); 457 if (symtab) 458 { 459 std::vector<uint32_t> symbol_indexes; 460 symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 461 const uint32_t num_matches = symbol_indexes.size(); 462 if (num_matches) 463 { 464 const bool merge_symbol_into_function = true; 465 SymbolContext sc(this); 466 for (uint32_t i=0; i<num_matches; i++) 467 { 468 sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); 469 sc_list.AppendIfUnique (sc, merge_symbol_into_function); 470 } 471 } 472 } 473 } 474 } 475 return sc_list.GetSize() - start_size; 476 } 477 478 uint32_t 479 Module::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types) 480 { 481 Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 482 if (sc.module_sp.get() == NULL || sc.module_sp.get() == this) 483 { 484 SymbolVendor *symbols = GetSymbolVendor (); 485 if (symbols) 486 return symbols->FindTypes(sc, name, append, max_matches, types); 487 } 488 return 0; 489 } 490 491 // depending on implementation details, type lookup might fail because of 492 // embedded spurious namespace:: prefixes. this call strips them, paying 493 // attention to the fact that a type might have namespace'd type names as 494 // arguments to templates, and those must not be stripped off 495 static const char* 496 StripTypeName(const char* name_cstr) 497 { 498 const char* skip_namespace = strstr(name_cstr, "::"); 499 const char* template_arg_char = strchr(name_cstr, '<'); 500 while (skip_namespace != NULL) 501 { 502 if (template_arg_char != NULL && 503 skip_namespace > template_arg_char) // but namespace'd template arguments are still good to go 504 break; 505 name_cstr = skip_namespace+2; 506 skip_namespace = strstr(name_cstr, "::"); 507 } 508 return name_cstr; 509 } 510 511 uint32_t 512 Module::FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types) 513 { 514 uint32_t retval = FindTypes_Impl(sc, name, append, max_matches, types); 515 516 if (retval == 0) 517 { 518 const char *stripped = StripTypeName(name.GetCString()); 519 return FindTypes_Impl(sc, ConstString(stripped), append, max_matches, types); 520 } 521 else 522 return retval; 523 524 } 525 526 //uint32_t 527 //Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types) 528 //{ 529 // Timer scoped_timer(__PRETTY_FUNCTION__); 530 // SymbolVendor *symbols = GetSymbolVendor (); 531 // if (symbols) 532 // return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types); 533 // return 0; 534 // 535 //} 536 537 SymbolVendor* 538 Module::GetSymbolVendor (bool can_create) 539 { 540 Mutex::Locker locker (m_mutex); 541 if (m_did_load_symbol_vendor == false && can_create) 542 { 543 ObjectFile *obj_file = GetObjectFile (); 544 if (obj_file != NULL) 545 { 546 Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 547 m_symfile_ap.reset(SymbolVendor::FindPlugin(this)); 548 m_did_load_symbol_vendor = true; 549 } 550 } 551 return m_symfile_ap.get(); 552 } 553 554 void 555 Module::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name) 556 { 557 // Container objects whose paths do not specify a file directly can call 558 // this function to correct the file and object names. 559 m_file = file; 560 m_mod_time = file.GetModificationTime(); 561 m_object_name = object_name; 562 } 563 564 const ArchSpec& 565 Module::GetArchitecture () const 566 { 567 return m_arch; 568 } 569 570 void 571 Module::GetDescription (Stream *s) 572 { 573 Mutex::Locker locker (m_mutex); 574 575 if (m_arch.IsValid()) 576 s->Printf("(%s) ", m_arch.GetArchitectureName()); 577 578 char path[PATH_MAX]; 579 if (m_file.GetPath(path, sizeof(path))) 580 s->PutCString(path); 581 582 const char *object_name = m_object_name.GetCString(); 583 if (object_name) 584 s->Printf("(%s)", object_name); 585 } 586 587 void 588 Module::Dump(Stream *s) 589 { 590 Mutex::Locker locker (m_mutex); 591 //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 592 s->Indent(); 593 s->Printf("Module %s/%s%s%s%s\n", 594 m_file.GetDirectory().AsCString(), 595 m_file.GetFilename().AsCString(), 596 m_object_name ? "(" : "", 597 m_object_name ? m_object_name.GetCString() : "", 598 m_object_name ? ")" : ""); 599 600 s->IndentMore(); 601 ObjectFile *objfile = GetObjectFile (); 602 603 if (objfile) 604 objfile->Dump(s); 605 606 SymbolVendor *symbols = GetSymbolVendor (); 607 608 if (symbols) 609 symbols->Dump(s); 610 611 s->IndentLess(); 612 } 613 614 615 TypeList* 616 Module::GetTypeList () 617 { 618 SymbolVendor *symbols = GetSymbolVendor (); 619 if (symbols) 620 return &symbols->GetTypeList(); 621 return NULL; 622 } 623 624 const ConstString & 625 Module::GetObjectName() const 626 { 627 return m_object_name; 628 } 629 630 ObjectFile * 631 Module::GetObjectFile() 632 { 633 Mutex::Locker locker (m_mutex); 634 if (m_did_load_objfile == false) 635 { 636 m_did_load_objfile = true; 637 Timer scoped_timer(__PRETTY_FUNCTION__, 638 "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString("")); 639 m_objfile_sp = ObjectFile::FindPlugin(this, &m_file, m_object_offset, m_file.GetByteSize()); 640 if (m_objfile_sp) 641 { 642 // Once we get the object file, update our module with the object file's 643 // architecture since it might differ in vendor/os if some parts were 644 // unknown. 645 m_objfile_sp->GetArchitecture (m_arch); 646 } 647 } 648 return m_objfile_sp.get(); 649 } 650 651 652 const Symbol * 653 Module::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type) 654 { 655 Timer scoped_timer(__PRETTY_FUNCTION__, 656 "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)", 657 name.AsCString(), 658 symbol_type); 659 ObjectFile *objfile = GetObjectFile(); 660 if (objfile) 661 { 662 Symtab *symtab = objfile->GetSymtab(); 663 if (symtab) 664 return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny); 665 } 666 return NULL; 667 } 668 void 669 Module::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list) 670 { 671 // No need to protect this call using m_mutex all other method calls are 672 // already thread safe. 673 674 size_t num_indices = symbol_indexes.size(); 675 if (num_indices > 0) 676 { 677 SymbolContext sc; 678 CalculateSymbolContext (&sc); 679 for (size_t i = 0; i < num_indices; i++) 680 { 681 sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]); 682 if (sc.symbol) 683 sc_list.Append (sc); 684 } 685 } 686 } 687 688 size_t 689 Module::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list) 690 { 691 // No need to protect this call using m_mutex all other method calls are 692 // already thread safe. 693 694 695 Timer scoped_timer(__PRETTY_FUNCTION__, 696 "Module::FindSymbolsWithNameAndType (name = %s, type = %i)", 697 name.AsCString(), 698 symbol_type); 699 const size_t initial_size = sc_list.GetSize(); 700 ObjectFile *objfile = GetObjectFile (); 701 if (objfile) 702 { 703 Symtab *symtab = objfile->GetSymtab(); 704 if (symtab) 705 { 706 std::vector<uint32_t> symbol_indexes; 707 symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes); 708 SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 709 } 710 } 711 return sc_list.GetSize() - initial_size; 712 } 713 714 size_t 715 Module::FindSymbolsMatchingRegExAndType (const RegularExpression ®ex, SymbolType symbol_type, SymbolContextList &sc_list) 716 { 717 // No need to protect this call using m_mutex all other method calls are 718 // already thread safe. 719 720 Timer scoped_timer(__PRETTY_FUNCTION__, 721 "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)", 722 regex.GetText(), 723 symbol_type); 724 const size_t initial_size = sc_list.GetSize(); 725 ObjectFile *objfile = GetObjectFile (); 726 if (objfile) 727 { 728 Symtab *symtab = objfile->GetSymtab(); 729 if (symtab) 730 { 731 std::vector<uint32_t> symbol_indexes; 732 symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 733 SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 734 } 735 } 736 return sc_list.GetSize() - initial_size; 737 } 738 739 const TimeValue & 740 Module::GetModificationTime () const 741 { 742 return m_mod_time; 743 } 744 745 bool 746 Module::IsExecutable () 747 { 748 if (GetObjectFile() == NULL) 749 return false; 750 else 751 return GetObjectFile()->IsExecutable(); 752 } 753 754 bool 755 Module::IsLoadedInTarget (Target *target) 756 { 757 ObjectFile *obj_file = GetObjectFile(); 758 if (obj_file) 759 { 760 SectionList *sections = obj_file->GetSectionList(); 761 if (sections != NULL) 762 { 763 size_t num_sections = sections->GetSize(); 764 for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++) 765 { 766 SectionSP section_sp = sections->GetSectionAtIndex(sect_idx); 767 if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS) 768 { 769 return true; 770 } 771 } 772 } 773 } 774 return false; 775 } 776 bool 777 Module::SetArchitecture (const ArchSpec &new_arch) 778 { 779 if (!m_arch.IsValid()) 780 { 781 m_arch = new_arch; 782 return true; 783 } 784 return m_arch == new_arch; 785 } 786 787