AddressResolverName.cpp revision 0c31d3d3a4a1d00d53346d8a23b0519f47e55d1f
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===-- AddressResolverName.cpp ---------------------------------*- C++ -*-===// 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 3fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt// The LLVM Compiler Infrastructure 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// This file is distributed under the University of Illinois Open Source 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// License. See LICENSE.TXT for details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===// 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "lldb/Core/AddressResolverName.h" 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Project includes 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "lldb/Core/Log.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "lldb/Core/StreamString.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "lldb/Symbol/ClangNamespaceDecl.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "lldb/lldb-private-log.h" 171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing namespace lldb; 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing namespace lldb_private; 2034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtAddressResolverName::AddressResolverName 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt( 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *func_name, 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt AddressResolver::MatchType type 2561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt) : 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt AddressResolver (), 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt m_func_name (func_name), 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt m_class_name (NULL), 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt m_regex (), 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt m_match_type (type) 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (m_match_type == AddressResolver::Regexp) 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!m_regex.Compile (m_func_name.AsCString())) 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (log) 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log->Warning ("function name regexp: \"%s\" did not compile.", m_func_name.AsCString()); 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtAddressResolverName::AddressResolverName 4561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt( 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt RegularExpression &func_regex 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt) : 4804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt AddressResolver (), 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt m_func_name (NULL), 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt m_class_name (NULL), 511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt m_regex (func_regex), 5204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt m_match_type (AddressResolver::Regexp) 5344c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt{ 545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtAddressResolverName::AddressResolverName 58fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt( 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *class_name, 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *method, 61c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt AddressResolver::MatchType type 62c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt) : 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt AddressResolver (), 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt m_func_name (method), 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt m_class_name (class_name), 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt m_regex (), 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt m_match_type (type) 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 72c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry ShmidtAddressResolverName::~AddressResolverName () 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 74c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// FIXME: Right now we look at the module level, and call the module's "FindFunctions". 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Greg says he will add function tables, maybe at the CompileUnit level to accelerate function 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// lookup. At that point, we should switch the depth to CompileUnit, and look in these tables. 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtSearcher::CallbackReturn 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtAddressResolverName::SearchCallback 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt( 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SearchFilter &filter, 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SymbolContext &context, 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Address *addr, 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool containing 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt) 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SymbolContextList func_list; 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SymbolContextList sym_list; 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool skip_prologue = true; 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt uint32_t i; 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SymbolContext sc; 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Address func_addr; 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (m_class_name) 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (log) 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log->Warning ("Class/method function specification not supported yet.\n"); 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return Searcher::eCallbackReturnStop; 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const bool include_symbols = false; 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const bool include_inlines = true; 1080207e233ee2e741f7b2c124c1366e905ebb634c8Dmitry Shmidt const bool append = false; 1090207e233ee2e741f7b2c124c1366e905ebb634c8Dmitry Shmidt switch (m_match_type) 1100207e233ee2e741f7b2c124c1366e905ebb634c8Dmitry Shmidt { 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case AddressResolver::Exact: 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (context.module_sp) 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt context.module_sp->FindSymbolsWithNameAndType (m_func_name, 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eSymbolTypeCode, 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sym_list); 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt context.module_sp->FindFunctions (m_func_name, 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL, 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector, 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt include_symbols, 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt include_inlines, 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt append, 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt func_list); 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case AddressResolver::Regexp: 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (context.module_sp) 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 13051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt context.module_sp->FindSymbolsMatchingRegExAndType (m_regex, 13151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt eSymbolTypeCode, 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sym_list); 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt context.module_sp->FindFunctions (m_regex, 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt include_symbols, 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt include_inlines, 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt append, 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt func_list); 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case AddressResolver::Glob: 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (log) 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log->Warning ("glob is not supported yet."); 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Remove any duplicates between the funcion list and the symbol list 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (func_list.GetSize()) 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < func_list.GetSize(); i++) 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (func_list.GetContextAtIndex(i, sc) == false) 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sc.function == NULL) 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt uint32_t j = 0; 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (j < sym_list.GetSize()) 15961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { 16061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt SymbolContext symbol_sc; 16161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (sym_list.GetContextAtIndex(j, symbol_sc)) 16261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { 16361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (symbol_sc.symbol && symbol_sc.symbol->ValueIsAddress()) 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sc.function->GetAddressRange().GetBaseAddress() == symbol_sc.symbol->GetAddress()) 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sym_list.RemoveContextAtIndex(j); 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; // Don't increment j 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt j++; 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < func_list.GetSize(); i++) 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (func_list.GetContextAtIndex(i, sc)) 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sc.function) 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt func_addr = sc.function->GetAddressRange().GetBaseAddress(); 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr_t byte_size = sc.function->GetAddressRange().GetByteSize(); 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (skip_prologue) 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const uint32_t prologue_byte_size = sc.function->GetPrologueByteSize(); 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (prologue_byte_size) 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt func_addr.SetOffset (func_addr.GetOffset() + prologue_byte_size); 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt byte_size -= prologue_byte_size; 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 194d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (filter.AddressPasses (func_addr)) 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt AddressRange new_range (func_addr, byte_size); 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt m_address_ranges.push_back (new_range); 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < sym_list.GetSize(); i++) 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sym_list.GetContextAtIndex(i, sc)) 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sc.symbol && sc.symbol->ValueIsAddress()) 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt func_addr = sc.symbol->GetAddress(); 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr_t byte_size = sc.symbol->GetByteSize(); 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (skip_prologue) 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const uint32_t prologue_byte_size = sc.symbol->GetPrologueByteSize(); 21768d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (prologue_byte_size) 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt func_addr.SetOffset (func_addr.GetOffset() + prologue_byte_size); 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt byte_size -= prologue_byte_size; 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (filter.AddressPasses (func_addr)) 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt AddressRange new_range (func_addr, byte_size); 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt m_address_ranges.push_back (new_range); 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return Searcher::eCallbackReturnContinue; 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtSearcher::Depth 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtAddressResolverName::GetDepth() 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return Searcher::eDepthModule; 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtAddressResolverName::GetDescription (Stream *s) 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt s->PutCString("Address by function name: "); 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (m_match_type == AddressResolver::Regexp) 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt s->Printf("'%s' (regular expression)", m_regex.GetText()); 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt s->Printf("'%s'", m_func_name.AsCString()); 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt