AddressResolverName.cpp revision 952e9dc874944fcdbbb224f3ec4fc2c859376f64
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- AddressResolverName.cpp ---------------------------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Core/AddressResolverName.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Project includes
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Core/Log.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Core/Module.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Core/StreamString.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Symbol/ClangNamespaceDecl.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Symbol/Function.h"
18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "lldb/Symbol/SymbolContext.h"
195e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "lldb/Symbol/Symbol.h"
205e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "lldb/lldb-private-log.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace lldb;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace lldb_private;
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AddressResolverName::AddressResolverName
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const char *func_name,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddressResolver::MatchType type
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)) :
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddressResolver (),
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_func_name (func_name),
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_class_name (NULL),
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_regex (),
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_match_type (type)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (m_match_type == AddressResolver::Regexp)
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!m_regex.Compile (m_func_name.AsCString()))
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (log)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                log->Warning ("function name regexp: \"%s\" did not compile.", m_func_name.AsCString());
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AddressResolverName::AddressResolverName
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegularExpression &func_regex
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)) :
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddressResolver (),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_func_name (NULL),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_class_name (NULL),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_regex (func_regex),
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_match_type (AddressResolver::Regexp)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AddressResolverName::AddressResolverName
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *class_name,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *method,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddressResolver::MatchType type
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)) :
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddressResolver (),
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_func_name (method),
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_class_name (class_name),
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_regex (),
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_match_type (type)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AddressResolverName::~AddressResolverName ()
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FIXME: Right now we look at the module level, and call the module's "FindFunctions".
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Greg says he will add function tables, maybe at the CompileUnit level to accelerate function
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// lookup.  At that point, we should switch the depth to CompileUnit, and look in these tables.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Searcher::CallbackReturn
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AddressResolverName::SearchCallback
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SearchFilter &filter,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SymbolContext &context,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Address *addr,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool containing
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles))
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SymbolContextList func_list;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SymbolContextList sym_list;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool skip_prologue = true;
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    uint32_t i;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SymbolContext sc;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Address func_addr;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (m_class_name)
104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (log)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            log->Warning ("Class/method function specification not supported yet.\n");
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return Searcher::eCallbackReturnStop;
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool include_symbols = false;
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const bool include_inlines = true;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool append = false;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (m_match_type)
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    {
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case AddressResolver::Exact:
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if (context.module_sp)
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        {
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            context.module_sp->FindSymbolsWithNameAndType (m_func_name,
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                           eSymbolTypeCode,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                           sym_list);
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            context.module_sp->FindFunctions (m_func_name,
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                              NULL,
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector,
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                              include_symbols,
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                              include_inlines,
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                              append,
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                              func_list);
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        }
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case AddressResolver::Regexp:
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (context.module_sp)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            context.module_sp->FindSymbolsMatchingRegExAndType (m_regex,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                eSymbolTypeCode,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                sym_list);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            context.module_sp->FindFunctions (m_regex,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              include_symbols,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              include_inlines,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              append,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              func_list);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case AddressResolver::Glob:
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (log)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            log->Warning ("glob is not supported yet.");
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Remove any duplicates between the funcion list and the symbol list
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (func_list.GetSize())
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        for (i = 0; i < func_list.GetSize(); i++)
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        {
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            if (func_list.GetContextAtIndex(i, sc) == false)
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                continue;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            if (sc.function == NULL)
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                continue;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uint32_t j = 0;
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            while (j < sym_list.GetSize())
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SymbolContext symbol_sc;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (sym_list.GetContextAtIndex(j, symbol_sc))
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                {
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    if (symbol_sc.symbol && symbol_sc.symbol->ValueIsAddress())
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    {
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        if (sc.function->GetAddressRange().GetBaseAddress() == symbol_sc.symbol->GetAddress())
170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                        {
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            sym_list.RemoveContextAtIndex(j);
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            continue;   // Don't increment j
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        }
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    }
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                }
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                j++;
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            }
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        }
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        for (i = 0; i < func_list.GetSize(); i++)
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        {
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            if (func_list.GetContextAtIndex(i, sc))
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (sc.function)
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                {
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    func_addr = sc.function->GetAddressRange().GetBaseAddress();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    addr_t byte_size = sc.function->GetAddressRange().GetByteSize();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (skip_prologue)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const uint32_t prologue_byte_size = sc.function->GetPrologueByteSize();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        if (prologue_byte_size)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            func_addr.SetOffset (func_addr.GetOffset() + prologue_byte_size);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            byte_size -= prologue_byte_size;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        }
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    }
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (filter.AddressPasses (func_addr))
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    {
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        AddressRange new_range (func_addr, byte_size);
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        m_address_ranges.push_back (new_range);
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    }
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                }
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            }
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (i = 0; i < sym_list.GetSize(); i++)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if (sym_list.GetContextAtIndex(i, sc))
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        {
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            if (sc.symbol && sc.symbol->ValueIsAddress())
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            {
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                func_addr = sc.symbol->GetAddress();
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                addr_t byte_size = sc.symbol->GetByteSize();
2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                if (skip_prologue)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                {
2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    const uint32_t prologue_byte_size = sc.symbol->GetPrologueByteSize();
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    if (prologue_byte_size)
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    {
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        func_addr.SetOffset (func_addr.GetOffset() + prologue_byte_size);
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        byte_size -= prologue_byte_size;
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    }
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                }
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                if (filter.AddressPasses (func_addr))
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    AddressRange new_range (func_addr, byte_size);
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    m_address_ranges.push_back (new_range);
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                }
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            }
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return Searcher::eCallbackReturnContinue;
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)Searcher::Depth
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)AddressResolverName::GetDepth()
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return Searcher::eDepthModule;
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)AddressResolverName::GetDescription (Stream *s)
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    s->PutCString("Address by function name: ");
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (m_match_type == AddressResolver::Regexp)
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        s->Printf("'%s' (regular expression)", m_regex.GetText());
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        s->Printf("'%s'", m_func_name.AsCString());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)