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