124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SymbolContext.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/Symbol/SymbolContext.h"
1112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
1265ec724a14127c348da23341e9f4a440758d01c6Sean Callanan#include "lldb/Core/Log.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h"
15df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton#include "lldb/Host/Host.h"
16f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton#include "lldb/Interpreter/Args.h"
17b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton#include "lldb/Symbol/Block.h"
18b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton#include "lldb/Symbol/ClangASTContext.h"
1912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton#include "lldb/Symbol/CompileUnit.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Symbol.h"
223d790bb732bd4cf014524f62e96d27356633f531Greg Clayton#include "lldb/Symbol/SymbolFile.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
2412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton#include "lldb/Target/Target.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolContext::SymbolContext() :
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    target_sp   (),
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    module_sp   (),
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    comp_unit   (NULL),
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    function    (NULL),
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    block       (NULL),
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    line_entry  (),
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    symbol      (NULL)
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolContext::SymbolContext(const ModuleSP& m, CompileUnit *cu, Function *f, Block *b, LineEntry *le, Symbol *s) :
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    target_sp   (),
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    module_sp   (m),
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    comp_unit   (cu),
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    function    (f),
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    block       (b),
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    line_entry  (),
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    symbol      (s)
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (le)
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        line_entry = *le;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolContext::SymbolContext(const TargetSP &t, const ModuleSP& m, CompileUnit *cu, Function *f, Block *b, LineEntry *le, Symbol *s) :
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    target_sp   (t),
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    module_sp   (m),
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    comp_unit   (cu),
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    function    (f),
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    block       (b),
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    line_entry  (),
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    symbol      (s)
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (le)
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        line_entry = *le;
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolContext::SymbolContext(const SymbolContext& rhs) :
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    target_sp   (rhs.target_sp),
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    module_sp   (rhs.module_sp),
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    comp_unit   (rhs.comp_unit),
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    function    (rhs.function),
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    block       (rhs.block),
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    line_entry  (rhs.line_entry),
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    symbol      (rhs.symbol)
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolContext::SymbolContext (SymbolContextScope *sc_scope) :
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    target_sp   (),
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    module_sp   (),
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    comp_unit   (NULL),
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    function    (NULL),
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    block       (NULL),
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    line_entry  (),
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    symbol      (NULL)
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    sc_scope->CalculateSymbolContext (this);
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
906e0101c86555a06b3bd4cb6104b35abfae0b0057Greg ClaytonSymbolContext::~SymbolContext ()
916e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton{
926e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton}
936e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst SymbolContext&
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolContext::operator= (const SymbolContext& rhs)
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (this != &rhs)
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        target_sp   = rhs.target_sp;
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        module_sp   = rhs.module_sp;
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        comp_unit   = rhs.comp_unit;
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        function    = rhs.function;
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        block       = rhs.block;
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        line_entry  = rhs.line_entry;
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbol      = rhs.symbol;
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
111a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg ClaytonSymbolContext::Clear(bool clear_target)
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
113a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton    if (clear_target)
114a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton        target_sp.reset();
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    module_sp.reset();
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    comp_unit   = NULL;
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    function    = NULL;
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    block       = NULL;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    line_entry.Clear();
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    symbol      = NULL;
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123fb81642e03567a3413d94cdb632b6005a0ad4273Greg Claytonbool
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolContext::DumpStopContext
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Stream *s,
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ExecutionContextScope *exe_scope,
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Address &addr,
12972b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton    bool show_fullpaths,
13033ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    bool show_module,
13133ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    bool show_inlined_frames
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) const
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
134fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton    bool dumped_something = false;
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (show_module && module_sp)
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13772b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton        if (show_fullpaths)
13872b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton            *s << module_sp->GetFileSpec();
13972b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton        else
14072b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton            *s << module_sp->GetFileSpec().GetFilename();
14172b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton        s->PutChar('`');
142fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        dumped_something = true;
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (function != NULL)
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1472f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton        SymbolContext inline_parent_sc;
1482f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton        Address inline_parent_addr;
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (function->GetMangled().GetName())
150fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        {
151fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton            dumped_something = true;
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            function->GetMangled().GetName().Dump(s);
153fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        }
1542f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton
1552e3d6f2ebd22252b0468e95565b3b42e9fcaf008Greg Clayton        if (addr.IsValid())
1562e3d6f2ebd22252b0468e95565b3b42e9fcaf008Greg Clayton        {
1572e3d6f2ebd22252b0468e95565b3b42e9fcaf008Greg Clayton            const addr_t function_offset = addr.GetOffset() - function->GetAddressRange().GetBaseAddress().GetOffset();
1582e3d6f2ebd22252b0468e95565b3b42e9fcaf008Greg Clayton            if (function_offset)
159fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton            {
160fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton                dumped_something = true;
1615f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                s->Printf(" + %" PRIu64, function_offset);
162fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton            }
1632e3d6f2ebd22252b0468e95565b3b42e9fcaf008Greg Clayton        }
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1652f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton        if (GetParentOfInlinedScope (addr, inline_parent_sc, inline_parent_addr))
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
167fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton            dumped_something = true;
1682f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            Block *inlined_block = block->GetContainingInlinedBlock();
1692f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            const InlineFunctionInfo* inlined_block_info = inlined_block->GetInlinedFunctionInfo();
1702f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            s->Printf (" [inlined] %s", inlined_block_info->GetName().GetCString());
1712f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton
1722f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            lldb_private::AddressRange block_range;
1732f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            if (inlined_block->GetRangeContainingAddress(addr, block_range))
1742f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            {
1752f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton                const addr_t inlined_function_offset = addr.GetOffset() - block_range.GetBaseAddress().GetOffset();
1762f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton                if (inlined_function_offset)
1772f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton                {
1785f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    s->Printf(" + %" PRIu64, inlined_function_offset);
1792f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton                }
1802f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            }
1812f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            const Declaration &call_site = inlined_block_info->GetCallSite();
1822f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            if (call_site.IsValid())
1832f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            {
1842f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton                s->PutCString(" at ");
1852f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton                call_site.DumpStopContext (s, show_fullpaths);
1862f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            }
1872f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            if (show_inlined_frames)
1882f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            {
1892f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton                s->EOL();
1902f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton                s->Indent();
1912f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton                return inline_parent_sc.DumpStopContext (s, exe_scope, inline_parent_addr, show_fullpaths, show_module, show_inlined_frames);
1922f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            }
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (line_entry.IsValid())
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
198fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton                dumped_something = true;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s->PutCString(" at ");
20072b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton                if (line_entry.DumpStopContext(s, show_fullpaths))
2017dd98df0d69447d3f42b8044b7cda2c089aea653Greg Clayton                    dumped_something = true;
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (symbol != NULL)
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
207fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        if (symbol->GetMangled().GetName())
208fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        {
209fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton            dumped_something = true;
2100fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton            if (symbol->GetType() == eSymbolTypeTrampoline)
2110fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                s->PutCString("symbol stub for: ");
212fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton            symbol->GetMangled().GetName().Dump(s);
213fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        }
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2150c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton        if (addr.IsValid() && symbol->ValueIsAddress())
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2170c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton            const addr_t symbol_offset = addr.GetOffset() - symbol->GetAddress().GetOffset();
218704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton            if (symbol_offset)
219fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton            {
220fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton                dumped_something = true;
2215f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                s->Printf(" + %" PRIu64, symbol_offset);
222fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton            }
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2252e3d6f2ebd22252b0468e95565b3b42e9fcaf008Greg Clayton    else if (addr.IsValid())
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        addr.Dump(s, exe_scope, Address::DumpStyleModuleWithFileAddress);
228fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton        dumped_something = true;
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
230fb81642e03567a3413d94cdb632b6005a0ad4273Greg Clayton    return dumped_something;
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
234eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg ClaytonSymbolContext::GetDescription(Stream *s, lldb::DescriptionLevel level, Target *target) const
23512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{
23612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    if (module_sp)
23712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    {
238c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton        s->Indent("     Module: file = \"");
23912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        module_sp->GetFileSpec().Dump(s);
240c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton        *s << '"';
241c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton        if (module_sp->GetArchitecture().IsValid())
242940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton            s->Printf (", arch = \"%s\"", module_sp->GetArchitecture().GetArchitectureName());
24312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        s->EOL();
24412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    }
24512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
24612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    if (comp_unit != NULL)
24712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    {
24812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        s->Indent("CompileUnit: ");
24912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        comp_unit->GetDescription (s, level);
25012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        s->EOL();
25112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    }
25212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
25312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    if (function != NULL)
25412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    {
25512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        s->Indent("   Function: ");
256eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        function->GetDescription (s, level, target);
25712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        s->EOL();
25812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
25912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        Type *func_type = function->GetType();
26012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        if (func_type)
26112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        {
26212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton            s->Indent("   FuncType: ");
26312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton            func_type->GetDescription (s, level, false);
26412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton            s->EOL();
26512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        }
26612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    }
26712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
26812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    if (block != NULL)
26912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    {
27012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        std::vector<Block *> blocks;
27112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        blocks.push_back (block);
27212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        Block *parent_block = block->GetParent();
27312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
27412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        while (parent_block)
27512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        {
27612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton            blocks.push_back (parent_block);
27712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton            parent_block = parent_block->GetParent();
27812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        }
27912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        std::vector<Block *>::reverse_iterator pos;
28012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        std::vector<Block *>::reverse_iterator begin = blocks.rbegin();
28112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        std::vector<Block *>::reverse_iterator end = blocks.rend();
28212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        for (pos = begin; pos != end; ++pos)
28312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        {
28412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton            if (pos == begin)
28512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                s->Indent("     Blocks: ");
28612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton            else
28712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                s->Indent("             ");
288eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton            (*pos)->GetDescription(s, function, level, target);
28912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton            s->EOL();
29012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        }
29112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    }
29212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
29312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    if (line_entry.IsValid())
29412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    {
29512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        s->Indent("  LineEntry: ");
296eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        line_entry.GetDescription (s, level, comp_unit, target, false);
29712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        s->EOL();
29812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    }
29912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
30012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    if (symbol != NULL)
30112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    {
30212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        s->Indent("     Symbol: ");
303eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        symbol->GetDescription(s, level, target);
30412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        s->EOL();
30512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    }
30612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton}
30712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
30833ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Claytonuint32_t
30933ed170599d41fe407a4dcf5f0875c75e1ad1375Greg ClaytonSymbolContext::GetResolvedMask () const
31033ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton{
31133ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    uint32_t resolved_mask = 0;
31233ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    if (target_sp)              resolved_mask |= eSymbolContextTarget;
31333ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    if (module_sp)              resolved_mask |= eSymbolContextModule;
31433ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    if (comp_unit)              resolved_mask |= eSymbolContextCompUnit;
31533ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    if (function)               resolved_mask |= eSymbolContextFunction;
31633ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    if (block)                  resolved_mask |= eSymbolContextBlock;
31733ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    if (line_entry.IsValid())   resolved_mask |= eSymbolContextLineEntry;
31833ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    if (symbol)                 resolved_mask |= eSymbolContextSymbol;
31933ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    return resolved_mask;
32033ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton}
32112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
32212bec71b323dc520f0e985a86e09c4712559e115Greg Claytonvoid
323eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg ClaytonSymbolContext::Dump(Stream *s, Target *target) const
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    *s << (void *)this << ": ";
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutCString("SymbolContext");
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentMore();
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentMore();
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
33212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    *s << "Module       = " << (void *)module_sp.get() << ' ';
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (module_sp)
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        module_sp->GetFileSpec().Dump(s);
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    *s << "CompileUnit  = " << (void *)comp_unit;
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit != NULL)
339cff44fd1b87eb9e0f94a873c585e48749f42154bJohnny Chen        *s << " {0x" << comp_unit->GetID() << "} " << *(static_cast<FileSpec*> (comp_unit));
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
34212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    *s << "Function     = " << (void *)function;
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (function != NULL)
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
34512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        *s << " {0x" << function->GetID() << "} " << function->GetType()->GetName() << ", address-range = ";
346eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        function->GetAddressRange().Dump(s, target, Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress);
34712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        s->EOL();
34812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        s->Indent();
34912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        Type* func_type = function->GetType();
35012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        if (func_type)
35112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        {
35212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton            *s << "        Type = ";
35312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton            func_type->Dump (s, false);
35412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        }
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
35812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    *s << "Block        = " << (void *)block;
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (block != NULL)
36012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        *s << " {0x" << block->GetID() << '}';
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Dump the block and pass it a negative depth to we print all the parent blocks
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //if (block != NULL)
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //  block->Dump(s, function->GetFileAddress(), INT_MIN);
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
36612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    *s << "LineEntry    = ";
367eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton    line_entry.Dump (s, target, true, Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress, true);
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
37012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    *s << "Symbol       = " << (void *)symbol;
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbol != NULL && symbol->GetMangled())
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << ' ' << symbol->GetMangled().GetName().AsCString();
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentLess();
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentLess();
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator== (const SymbolContext& lhs, const SymbolContext& rhs)
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return  lhs.function == rhs.function
38228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            && lhs.symbol == rhs.symbol
38328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            && lhs.module_sp.get() == rhs.module_sp.get()
38428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            && lhs.comp_unit == rhs.comp_unit
38528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            && lhs.target_sp.get() == rhs.target_sp.get()
38628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            && LineEntry::Compare(lhs.line_entry, rhs.line_entry) == 0;
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator!= (const SymbolContext& lhs, const SymbolContext& rhs)
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return  lhs.function != rhs.function
393889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton            || lhs.symbol != rhs.symbol
394889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton            || lhs.module_sp.get() != rhs.module_sp.get()
395889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton            || lhs.comp_unit != rhs.comp_unit
396889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton            || lhs.target_sp.get() != rhs.target_sp.get()
397889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton            || LineEntry::Compare(lhs.line_entry, rhs.line_entry) != 0;
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
401ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg ClaytonSymbolContext::GetAddressRange (uint32_t scope,
402ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton                                uint32_t range_idx,
403ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton                                bool use_inline_block_range,
404ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton                                AddressRange &range) const
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if ((scope & eSymbolContextLineEntry) && line_entry.IsValid())
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        range = line_entry.range;
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
411ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton
412ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    if ((scope & eSymbolContextBlock) && (block != NULL))
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
414ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton        if (use_inline_block_range)
415ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton        {
416ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton            Block *inline_block = block->GetContainingInlinedBlock();
417ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton            if (inline_block)
418ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton                return inline_block->GetRangeAtIndex (range_idx, range);
419ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton        }
420ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton        else
421ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton        {
422ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton            return block->GetRangeAtIndex (range_idx, range);
423ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton        }
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
426ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    if ((scope & eSymbolContextFunction) && (function != NULL))
427ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    {
428ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton        if (range_idx == 0)
429ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton        {
430ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton            range = function->GetAddressRange();
431ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton            return true;
432ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton        }
433ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    }
434ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton
4359f69f982142c1c6d4dbece98879eaf746e66728bGreg Clayton    if ((scope & eSymbolContextSymbol) && (symbol != NULL))
436ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    {
437ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton        if (range_idx == 0)
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4390c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton            if (symbol->ValueIsAddress())
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4410c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton                range.GetBaseAddress() = symbol->GetAddress();
4420c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton                range.SetByteSize (symbol->GetByteSize());
4439f69f982142c1c6d4dbece98879eaf746e66728bGreg Clayton                return true;
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    range.Clear();
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45123b8abbe214c252028f6e09f79169529c846409dGreg Claytonbool
4522f57db09a49f2a05a620b8163bbe1e748a46ec73Greg ClaytonSymbolContext::GetParentOfInlinedScope (const Address &curr_frame_pc,
4532f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton                                        SymbolContext &next_frame_sc,
4542f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton                                        Address &next_frame_pc) const
45523b8abbe214c252028f6e09f79169529c846409dGreg Clayton{
456a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton    next_frame_sc.Clear(false);
4572f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton    next_frame_pc.Clear();
45823b8abbe214c252028f6e09f79169529c846409dGreg Clayton
45923b8abbe214c252028f6e09f79169529c846409dGreg Clayton    if (block)
46023b8abbe214c252028f6e09f79169529c846409dGreg Clayton    {
46123b8abbe214c252028f6e09f79169529c846409dGreg Clayton        //const addr_t curr_frame_file_addr = curr_frame_pc.GetFileAddress();
4622f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton
4632f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton        // In order to get the parent of an inlined function we first need to
4642f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton        // see if we are in an inlined block as "this->block" could be an
4652f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton        // inlined block, or a parent of "block" could be. So lets check if
4662f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton        // this block or one of this blocks parents is an inlined function.
4672f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton        Block *curr_inlined_block = block->GetContainingInlinedBlock();
4682f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton        if (curr_inlined_block)
46923b8abbe214c252028f6e09f79169529c846409dGreg Clayton        {
4702f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            // "this->block" is contained in an inline function block, so to
4712f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            // get the scope above the inlined block, we get the parent of the
4722f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            // inlined block itself
4732f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            Block *next_frame_block = curr_inlined_block->GetParent();
4742f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            // Now calculate the symbol context of the containing block
4752f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            next_frame_block->CalculateSymbolContext (&next_frame_sc);
4762f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton
4772f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            // If we get here we weren't able to find the return line entry using the nesting of the blocks and
4782f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton            // the line table.  So just use the call site info from our inlined block.
4792f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton
48023b8abbe214c252028f6e09f79169529c846409dGreg Clayton            AddressRange range;
4810c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton            if (curr_inlined_block->GetRangeContainingAddress (curr_frame_pc, range))
4820c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton            {
4830c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                // To see there this new frame block it, we need to look at the
4840c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                // call site information from
4850c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                const InlineFunctionInfo* curr_inlined_block_inlined_info = curr_inlined_block->GetInlinedFunctionInfo();
4860c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                next_frame_pc = range.GetBaseAddress();
4870c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                next_frame_sc.line_entry.range.GetBaseAddress() = next_frame_pc;
4880c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                next_frame_sc.line_entry.file = curr_inlined_block_inlined_info->GetCallSite().GetFile();
4890c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                next_frame_sc.line_entry.line = curr_inlined_block_inlined_info->GetCallSite().GetLine();
4900c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                next_frame_sc.line_entry.column = curr_inlined_block_inlined_info->GetCallSite().GetColumn();
4910c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                return true;
4920c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton            }
4930c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton            else
4940c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton            {
495952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton                Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SYMBOLS));
4960c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton
4970c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                if (log)
4980c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                {
4995f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    log->Printf ("warning: inlined block 0x%8.8" PRIx64 " doesn't have a range that contains file address 0x%" PRIx64,
5000c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                                 curr_inlined_block->GetID(), curr_frame_pc.GetFileAddress());
5010c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                }
5020c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
5030c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                else
5040c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                {
5053d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                    ObjectFile *objfile = NULL;
5063d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                    if (module_sp)
5073d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                    {
5083d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                        SymbolVendor *symbol_vendor = module_sp->GetSymbolVendor();
5093d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                        if (symbol_vendor)
5103d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                        {
5113d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                            SymbolFile *symbol_file = symbol_vendor->GetSymbolFile();
5123d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                            if (symbol_file)
5133d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                                objfile = symbol_file->GetObjectFile();
5143d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                        }
5153d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                    }
5163d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                    if (objfile)
5173d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                    {
518df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                        Host::SystemLog (Host::eSystemLogWarning,
51997a19b21dacd9063bb5475812df7781777262198Greg Clayton                                         "warning: inlined block 0x%8.8" PRIx64 " doesn't have a range that contains file address 0x%" PRIx64 " in %s\n",
520df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                                         curr_inlined_block->GetID(),
521df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                                         curr_frame_pc.GetFileAddress(),
52297a19b21dacd9063bb5475812df7781777262198Greg Clayton                                         objfile->GetFileSpec().GetPath().c_str());
5233d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                    }
5243d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                    else
5253d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                    {
526df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                        Host::SystemLog (Host::eSystemLogWarning,
5275f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                                         "warning: inlined block 0x%8.8" PRIx64 " doesn't have a range that contains file address 0x%" PRIx64 "\n",
528df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                                         curr_inlined_block->GetID(),
529df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                                         curr_frame_pc.GetFileAddress());
5303d790bb732bd4cf014524f62e96d27356633f531Greg Clayton                    }
5310c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton                }
5320c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton#endif
5330c463155f7c1dab6da414dafe93b4b8fd21b7a68Greg Clayton            }
53423b8abbe214c252028f6e09f79169529c846409dGreg Clayton        }
53523b8abbe214c252028f6e09f79169529c846409dGreg Clayton    }
53623b8abbe214c252028f6e09f79169529c846409dGreg Clayton
53723b8abbe214c252028f6e09f79169529c846409dGreg Clayton    return false;
53823b8abbe214c252028f6e09f79169529c846409dGreg Clayton}
53923b8abbe214c252028f6e09f79169529c846409dGreg Clayton
540b3a1a2bba41281ba56a99fe64887a8a04760784cGreg ClaytonBlock *
541b3a1a2bba41281ba56a99fe64887a8a04760784cGreg ClaytonSymbolContext::GetFunctionBlock ()
542b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton{
543b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    if (function)
544b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    {
545b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        if (block)
546b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        {
547b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // If this symbol context has a block, check to see if this block
548b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // is itself, or is contained within a block with inlined function
549b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // information. If so, then the inlined block is the block that
550b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // defines the function.
551b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            Block *inlined_block = block->GetContainingInlinedBlock();
552b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            if (inlined_block)
553b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                return inlined_block;
554b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
555b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // The block in this symbol context is not inside an inlined
556b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // block, so the block that defines the function is the function's
557b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // top level block, which is returned below.
558b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        }
559b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
560b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        // There is no block information in this symbol context, so we must
561b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        // assume that the block that is desired is the top level block of
562b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        // the function itself.
563b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        return &function->GetBlock(true);
564b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    }
565b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    return NULL;
566b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton}
567b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
568b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Claytonbool
569b3a1a2bba41281ba56a99fe64887a8a04760784cGreg ClaytonSymbolContext::GetFunctionMethodInfo (lldb::LanguageType &language,
570b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                                      bool &is_instance_method,
571b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                                      ConstString &language_object_name)
572b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
573b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
574b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton{
575b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    Block *function_block = GetFunctionBlock ();
576b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    if (function_block)
577b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    {
578b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        clang::DeclContext *decl_context = function_block->GetClangDeclContext();
579b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
580b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        if (decl_context)
581b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        {
582b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            return ClangASTContext::GetClassMethodInfoForDeclContext (decl_context,
583b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                                                                      language,
584b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                                                                      is_instance_method,
585b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                                                                      language_object_name);
586b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        }
587b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    }
588b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    language = eLanguageTypeUnknown;
589b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    is_instance_method = false;
590b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    language_object_name.Clear();
591b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    return false;
592b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton}
593b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
594b3a1a2bba41281ba56a99fe64887a8a04760784cGreg ClaytonConstString
59523a51623e0e866225d959506796e3d75de3a08e3Greg ClaytonSymbolContext::GetFunctionName (Mangled::NamePreference preference) const
596a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham{
597a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    if (function)
598a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    {
599a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham        if (block)
600a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham        {
601dc90162225573319cc1bf5076059a09509b73ac7Jim Ingham            Block *inlined_block = block->GetContainingInlinedBlock();
602dc90162225573319cc1bf5076059a09509b73ac7Jim Ingham
603dc90162225573319cc1bf5076059a09509b73ac7Jim Ingham            if (inlined_block)
604dc90162225573319cc1bf5076059a09509b73ac7Jim Ingham            {
605dc90162225573319cc1bf5076059a09509b73ac7Jim Ingham                const InlineFunctionInfo *inline_info = inlined_block->GetInlinedFunctionInfo();
606dc90162225573319cc1bf5076059a09509b73ac7Jim Ingham                if (inline_info)
607dc90162225573319cc1bf5076059a09509b73ac7Jim Ingham                    return inline_info->GetName();
608dc90162225573319cc1bf5076059a09509b73ac7Jim Ingham            }
609a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham        }
610a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham        return function->GetMangled().GetName(preference);
611a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    }
6120c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton    else if (symbol && symbol->ValueIsAddress())
613a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    {
614a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham        return symbol->GetMangled().GetName(preference);
615a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    }
616a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    else
617a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    {
618a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham        // No function, return an empty string.
619a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham        return ConstString();
620a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham    }
621a7d8951c573b0206ab7f6cff7f9c301e2bc0e28cJim Ingham}
62223b8abbe214c252028f6e09f79169529c846409dGreg Clayton
62323a51623e0e866225d959506796e3d75de3a08e3Greg ClaytonLineEntry
62423a51623e0e866225d959506796e3d75de3a08e3Greg ClaytonSymbolContext::GetFunctionStartLineEntry () const
62523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton{
62623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    LineEntry line_entry;
62723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    Address start_addr;
62823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    if (block)
62923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    {
63023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton        Block *inlined_block = block->GetContainingInlinedBlock();
63123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton        if (inlined_block)
63223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton        {
63323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton            if (inlined_block->GetStartAddress (start_addr))
63423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton            {
63523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton                if (start_addr.CalculateSymbolContextLineEntry (line_entry))
63623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton                    return line_entry;
63723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton            }
63823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton            return LineEntry();
63923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton        }
64023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    }
64123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton
64223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    if (function)
64323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    {
64423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton        if (function->GetAddressRange().GetBaseAddress().CalculateSymbolContextLineEntry(line_entry))
64523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton            return line_entry;
64623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    }
64723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton    return LineEntry();
64823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton}
64923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton
650d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//----------------------------------------------------------------------
651d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//
652d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//  SymbolContextSpecifier
653d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//
654d60d94a5126b93fda98678a68322abc2164073dbJim Ingham//----------------------------------------------------------------------
655d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
6566e0101c86555a06b3bd4cb6104b35abfae0b0057Greg ClaytonSymbolContextSpecifier::SymbolContextSpecifier (const TargetSP &target_sp) :
6576e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    m_target_sp (target_sp),
6586e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    m_module_spec (),
6596e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    m_module_sp (),
6606e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    m_file_spec_ap (),
6616e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    m_start_line (0),
6626e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    m_end_line (0),
6636e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    m_function_spec (),
6646e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    m_class_name (),
6656e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    m_address_range_ap (),
6666e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    m_type (eNothingSpecified)
6676e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton{
6686e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton}
6696e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton
6706e0101c86555a06b3bd4cb6104b35abfae0b0057Greg ClaytonSymbolContextSpecifier::~SymbolContextSpecifier()
6716e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton{
6726e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton}
6736e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton
674d60d94a5126b93fda98678a68322abc2164073dbJim Inghambool
675d60d94a5126b93fda98678a68322abc2164073dbJim InghamSymbolContextSpecifier::AddLineSpecification (uint32_t line_no, SpecificationType type)
676d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{
677d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    bool return_value = true;
678d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    switch (type)
679d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
680d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    case eNothingSpecified:
681d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        Clear();
682d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        break;
683d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    case eLineStartSpecified:
684d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_start_line = line_no;
685d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_type |= eLineStartSpecified;
686d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        break;
687d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    case eLineEndSpecified:
688d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_end_line = line_no;
689d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_type |= eLineEndSpecified;
690d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        break;
691d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    default:
692d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        return_value = false;
693d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        break;
694d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
695d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    return return_value;
696d60d94a5126b93fda98678a68322abc2164073dbJim Ingham}
697d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
698d60d94a5126b93fda98678a68322abc2164073dbJim Inghambool
699d60d94a5126b93fda98678a68322abc2164073dbJim InghamSymbolContextSpecifier::AddSpecification (const char *spec_string, SpecificationType type)
700d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{
701d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    bool return_value = true;
702d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    switch (type)
703d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
704d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    case eNothingSpecified:
705d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        Clear();
706d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        break;
707d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    case eModuleSpecified:
708d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        {
70924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            // See if we can find the Module, if so stick it in the SymbolContext.
710444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            FileSpec module_file_spec(spec_string, false);
711444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            ModuleSpec module_spec (module_file_spec);
712444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            lldb::ModuleSP module_sp (m_target_sp->GetImages().FindFirstModule (module_spec));
713d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            m_type |= eModuleSpecified;
714d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            if (module_sp)
715d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                m_module_sp = module_sp;
716d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            else
717d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                m_module_spec.assign (spec_string);
718d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        }
719d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        break;
720d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    case eFileSpecified:
721d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        // CompUnits can't necessarily be resolved here, since an inlined function might show up in
722d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        // a number of CompUnits.  Instead we just convert to a FileSpec and store it away.
72324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        m_file_spec_ap.reset (new FileSpec (spec_string, false));
724d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_type |= eFileSpecified;
725d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        break;
726d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    case eLineStartSpecified:
727d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_start_line = Args::StringToSInt32(spec_string, 0, 0, &return_value);
728d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        if (return_value)
729d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            m_type |= eLineStartSpecified;
730d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        break;
731d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    case eLineEndSpecified:
732d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_end_line = Args::StringToSInt32(spec_string, 0, 0, &return_value);
733d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        if (return_value)
734d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            m_type |= eLineEndSpecified;
735d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        break;
736d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    case eFunctionSpecified:
737d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_function_spec.assign(spec_string);
738d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_type |= eFunctionSpecified;
739d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        break;
740d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    case eClassOrNamespaceSpecified:
741d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        Clear();
742d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_class_name.assign (spec_string);
743d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_type = eClassOrNamespaceSpecified;
744d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        break;
745d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    case eAddressRangeSpecified:
746d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        // Not specified yet...
747d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        break;
748d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
749d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
750d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    return return_value;
751d60d94a5126b93fda98678a68322abc2164073dbJim Ingham}
752d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
753d60d94a5126b93fda98678a68322abc2164073dbJim Inghamvoid
754d60d94a5126b93fda98678a68322abc2164073dbJim InghamSymbolContextSpecifier::Clear()
755d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{
756d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    m_module_spec.clear();
757d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    m_file_spec_ap.reset();
758d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    m_function_spec.clear();
759d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    m_class_name.clear();
760d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    m_start_line = 0;
761d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    m_end_line = 0;
762d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    m_address_range_ap.reset();
763d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
764d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    m_type = eNothingSpecified;
765d60d94a5126b93fda98678a68322abc2164073dbJim Ingham}
766d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
767d60d94a5126b93fda98678a68322abc2164073dbJim Inghambool
768d60d94a5126b93fda98678a68322abc2164073dbJim InghamSymbolContextSpecifier::SymbolContextMatches(SymbolContext &sc)
769d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{
770d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_type == eNothingSpecified)
771d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        return true;
772d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
773d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_target_sp.get() != sc.target_sp.get())
774d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        return false;
775d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
776d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_type & eModuleSpecified)
777d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
778d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        if (sc.module_sp)
779d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        {
780d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            if (m_module_sp.get() != NULL)
781d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            {
782d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                if (m_module_sp.get() != sc.module_sp.get())
783d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                    return false;
784d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            }
785d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            else
786d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            {
787d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                FileSpec module_file_spec (m_module_spec.c_str(), false);
788d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                if (!FileSpec::Equal (module_file_spec, sc.module_sp->GetFileSpec(), false))
789d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                    return false;
790d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            }
791d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        }
792d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
793d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_type & eFileSpecified)
794d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
795d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        if (m_file_spec_ap.get())
796d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        {
797d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            // If we don't have a block or a comp_unit, then we aren't going to match a source file.
798d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            if (sc.block == NULL && sc.comp_unit == NULL)
799d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                return false;
800d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
801d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            // Check if the block is present, and if so is it inlined:
802d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            bool was_inlined = false;
803d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            if (sc.block != NULL)
804d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            {
805d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                const InlineFunctionInfo *inline_info = sc.block->GetInlinedFunctionInfo();
806d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                if (inline_info != NULL)
807d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                {
808d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                    was_inlined = true;
809d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                    if (!FileSpec::Equal (inline_info->GetDeclaration().GetFile(), *(m_file_spec_ap.get()), false))
810d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                        return false;
811d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                }
812d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            }
813d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
814d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            // Next check the comp unit, but only if the SymbolContext was not inlined.
815d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            if (!was_inlined && sc.comp_unit != NULL)
816d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            {
817d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                if (!FileSpec::Equal (*(sc.comp_unit), *(m_file_spec_ap.get()), false))
818d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                    return false;
819d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            }
820d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        }
821d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
822d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_type & eLineStartSpecified
823d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        || m_type & eLineEndSpecified)
824d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
825d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        if (sc.line_entry.line < m_start_line || sc.line_entry.line > m_end_line)
826d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            return false;
827d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
828d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
829d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_type & eFunctionSpecified)
830d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
831d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        // First check the current block, and if it is inlined, get the inlined function name:
832d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        bool was_inlined = false;
833d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        ConstString func_name(m_function_spec.c_str());
834d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
835d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        if (sc.block != NULL)
836d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        {
837d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            const InlineFunctionInfo *inline_info = sc.block->GetInlinedFunctionInfo();
838d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            if (inline_info != NULL)
839d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            {
840d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                was_inlined = true;
841d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                const Mangled &name = inline_info->GetMangled();
842d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                if (!name.NameMatches (func_name))
843d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                    return false;
844d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            }
845d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        }
846d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        //  If it wasn't inlined, check the name in the function or symbol:
847d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        if (!was_inlined)
848d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        {
849d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            if (sc.function != NULL)
850d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            {
851d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                if (!sc.function->GetMangled().NameMatches(func_name))
852d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                    return false;
853d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            }
854d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            else if (sc.symbol != NULL)
855d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            {
856d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                if (!sc.symbol->GetMangled().NameMatches(func_name))
857d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                    return false;
858d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            }
859d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        }
860d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
861d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
862d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
863d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
864d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    return true;
865d60d94a5126b93fda98678a68322abc2164073dbJim Ingham}
866d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
867d60d94a5126b93fda98678a68322abc2164073dbJim Inghambool
868d60d94a5126b93fda98678a68322abc2164073dbJim InghamSymbolContextSpecifier::AddressMatches(lldb::addr_t addr)
869d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{
870d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_type & eAddressRangeSpecified)
871d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
872d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
873d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
874d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    else
875d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
876d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        Address match_address (addr, NULL);
877d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        SymbolContext sc;
878d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_target_sp->GetImages().ResolveSymbolContextForAddress(match_address, eSymbolContextEverything, sc);
879d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        return SymbolContextMatches(sc);
880d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
881d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    return true;
882d60d94a5126b93fda98678a68322abc2164073dbJim Ingham}
883d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
884d60d94a5126b93fda98678a68322abc2164073dbJim Inghamvoid
885d60d94a5126b93fda98678a68322abc2164073dbJim InghamSymbolContextSpecifier::GetDescription (Stream *s, lldb::DescriptionLevel level) const
886d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{
887d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    char path_str[PATH_MAX + 1];
888d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
889d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_type == eNothingSpecified)
890d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
891d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->Printf ("Nothing specified.\n");
892d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
893d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
894d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_type == eModuleSpecified)
895d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
896d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->Indent();
897d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        if (m_module_sp)
898d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        {
899d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            m_module_sp->GetFileSpec().GetPath (path_str, PATH_MAX);
900d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            s->Printf ("Module: %s\n", path_str);
901d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        }
902d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        else
903d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            s->Printf ("Module: %s\n", m_module_spec.c_str());
904d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
905d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
906d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_type == eFileSpecified  && m_file_spec_ap.get() != NULL)
907d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
908d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_file_spec_ap->GetPath (path_str, PATH_MAX);
909d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->Indent();
910d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->Printf ("File: %s", path_str);
911d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        if (m_type == eLineStartSpecified)
912d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        {
9137e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda            s->Printf (" from line %lu", m_start_line);
914d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            if (m_type == eLineEndSpecified)
9157e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda                s->Printf ("to line %lu", m_end_line);
916d60d94a5126b93fda98678a68322abc2164073dbJim Ingham            else
9177e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda                s->Printf ("to end");
918d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        }
919d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        else if (m_type == eLineEndSpecified)
920d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        {
9217e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda            s->Printf (" from start to line %ld", m_end_line);
922d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        }
923d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->Printf (".\n");
924d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
925d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
926d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_type == eLineStartSpecified)
927d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
928d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->Indent();
9297e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda        s->Printf ("From line %lu", m_start_line);
930d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        if (m_type == eLineEndSpecified)
9317e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda            s->Printf ("to line %lu", m_end_line);
932d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        else
9337e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda            s->Printf ("to end");
934d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->Printf (".\n");
935d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
936d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    else if (m_type == eLineEndSpecified)
937d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
9387e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda        s->Printf ("From start to line %ld.\n", m_end_line);
939d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
940d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
941d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_type == eFunctionSpecified)
942d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
943d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->Indent();
944d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->Printf ("Function: %s.\n", m_function_spec.c_str());
945d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
946d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
947d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_type == eClassOrNamespaceSpecified)
948d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
949d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->Indent();
950d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->Printf ("Class name: %s.\n", m_class_name.c_str());
951d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
952d60d94a5126b93fda98678a68322abc2164073dbJim Ingham
953d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    if (m_type == eAddressRangeSpecified && m_address_range_ap.get() != NULL)
954d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    {
955d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->Indent();
956d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->PutCString ("Address range: ");
957d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        m_address_range_ap->Dump (s, m_target_sp.get(), Address::DumpStyleLoadAddress, Address::DumpStyleFileAddress);
958d60d94a5126b93fda98678a68322abc2164073dbJim Ingham        s->PutCString ("\n");
959d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    }
960d60d94a5126b93fda98678a68322abc2164073dbJim Ingham}
9612e8cb8a7342a2ea672792067d712a794e215a3a7Jim Ingham
96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  SymbolContextList
96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolContextList::SymbolContextList() :
97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_symbol_contexts()
97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolContextList::~SymbolContextList()
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolContextList::Append(const SymbolContext& sc)
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_symbol_contexts.push_back(sc);
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9847dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Claytonvoid
9857dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg ClaytonSymbolContextList::Append (const SymbolContextList& sc_list)
9867dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton{
9877dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    collection::const_iterator pos, end = sc_list.m_symbol_contexts.end();
9887dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    for (pos = sc_list.m_symbol_contexts.begin(); pos != end; ++pos)
9897dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton        m_symbol_contexts.push_back (*pos);
9907dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton}
9917dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton
9927dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton
9937dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Claytonuint32_t
9947dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg ClaytonSymbolContextList::AppendIfUnique (const SymbolContextList& sc_list, bool merge_symbol_into_function)
9957dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton{
9967dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    uint32_t unique_sc_add_count = 0;
9977dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    collection::const_iterator pos, end = sc_list.m_symbol_contexts.end();
9987dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    for (pos = sc_list.m_symbol_contexts.begin(); pos != end; ++pos)
9997dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    {
10007dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton        if (AppendIfUnique (*pos, merge_symbol_into_function))
10017dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton            ++unique_sc_add_count;
10027dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    }
10037dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    return unique_sc_add_count;
10047dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton}
10057dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton
100628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Claytonbool
1007889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg ClaytonSymbolContextList::AppendIfUnique (const SymbolContext& sc, bool merge_symbol_into_function)
100828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton{
1009889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton    collection::iterator pos, end = m_symbol_contexts.end();
101028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    for (pos = m_symbol_contexts.begin(); pos != end; ++pos)
101128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    {
101228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        if (*pos == sc)
101328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            return false;
101428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    }
1015889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton    if (merge_symbol_into_function
1016889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton        && sc.symbol    != NULL
1017889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton        && sc.comp_unit == NULL
1018889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton        && sc.function  == NULL
1019889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton        && sc.block     == NULL
1020889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton        && sc.line_entry.IsValid() == false)
1021889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton    {
10220c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton        if (sc.symbol->ValueIsAddress())
1023889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton        {
1024889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton            for (pos = m_symbol_contexts.begin(); pos != end; ++pos)
1025889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton            {
1026ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                // Don't merge symbols into inlined function symbol contexts
1027ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                if (pos->block && pos->block->GetContainingInlinedBlock())
1028ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                    continue;
1029ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton
1030889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                if (pos->function)
1031889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                {
10320c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton                    if (pos->function->GetAddressRange().GetBaseAddress() == sc.symbol->GetAddress())
1033889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                    {
1034889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        // Do we already have a function with this symbol?
1035889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        if (pos->symbol == sc.symbol)
1036889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                            return false;
1037889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        if (pos->symbol == NULL)
1038889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        {
1039889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                            pos->symbol = sc.symbol;
1040889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                            return false;
1041889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        }
1042889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                    }
1043889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                }
1044889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton            }
1045889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton        }
1046889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton    }
104728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    m_symbol_contexts.push_back(sc);
104828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return true;
104928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton}
105028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
1051ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Claytonbool
1052ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg ClaytonSymbolContextList::MergeSymbolContextIntoFunctionContext (const SymbolContext& symbol_sc,
1053ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                                                          uint32_t start_idx,
1054ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                                                          uint32_t stop_idx)
1055ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton{
1056ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    if (symbol_sc.symbol    != NULL
1057ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton        && symbol_sc.comp_unit == NULL
1058ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton        && symbol_sc.function  == NULL
1059ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton        && symbol_sc.block     == NULL
1060ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton        && symbol_sc.line_entry.IsValid() == false)
1061ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    {
1062ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton        if (symbol_sc.symbol->ValueIsAddress())
1063ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton        {
1064ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton            const size_t end = std::min<size_t>(m_symbol_contexts.size(), stop_idx);
1065ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton            for (size_t i=start_idx; i<end; ++i)
1066ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton            {
1067ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                const SymbolContext &function_sc = m_symbol_contexts[i];
1068ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                // Don't merge symbols into inlined function symbol contexts
1069ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                if (function_sc.block && function_sc.block->GetContainingInlinedBlock())
1070ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                    continue;
1071ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton
1072ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                if (function_sc.function)
1073ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                {
1074ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                    if (function_sc.function->GetAddressRange().GetBaseAddress() == symbol_sc.symbol->GetAddress())
1075ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                    {
1076ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        // Do we already have a function with this symbol?
1077ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        if (function_sc.symbol == symbol_sc.symbol)
1078ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            return true; // Already have a symbol context with this symbol, return true
1079ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton
1080ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        if (function_sc.symbol == NULL)
1081ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        {
1082ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            // We successfully merged this symbol into an existing symbol context
1083ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            m_symbol_contexts[i].symbol = symbol_sc.symbol;
1084ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            return true;
1085ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        }
1086ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                    }
1087ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                }
1088ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton            }
1089ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton        }
1090ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    }
1091ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    return false;
1092ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton}
1093ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton
109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolContextList::Clear()
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_symbol_contexts.clear();
109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1101eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg ClaytonSymbolContextList::Dump(Stream *s, Target *target) const
110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    *s << (void *)this << ": ";
110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutCString("SymbolContextList");
110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentMore();
110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator pos, end = m_symbol_contexts.end();
111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_symbol_contexts.begin(); pos != end; ++pos)
111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
111300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton        //pos->Dump(s, target);
111400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton        pos->GetDescription(s, eDescriptionLevelVerbose, target);
111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentLess();
111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
112036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonSymbolContextList::GetContextAtIndex(size_t idx, SymbolContext& sc) const
112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (idx < m_symbol_contexts.size())
112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc = m_symbol_contexts[idx];
112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1131296b06d325413723f5aac5988eed977b278a7807Greg ClaytonSymbolContextList::GetLastContext(SymbolContext& sc) const
1132296b06d325413723f5aac5988eed977b278a7807Greg Clayton{
1133296b06d325413723f5aac5988eed977b278a7807Greg Clayton    if (!m_symbol_contexts.empty())
1134296b06d325413723f5aac5988eed977b278a7807Greg Clayton    {
1135296b06d325413723f5aac5988eed977b278a7807Greg Clayton        sc = m_symbol_contexts.back();
1136296b06d325413723f5aac5988eed977b278a7807Greg Clayton        return true;
1137296b06d325413723f5aac5988eed977b278a7807Greg Clayton    }
1138296b06d325413723f5aac5988eed977b278a7807Greg Clayton    return false;
1139296b06d325413723f5aac5988eed977b278a7807Greg Clayton}
1140296b06d325413723f5aac5988eed977b278a7807Greg Clayton
1141296b06d325413723f5aac5988eed977b278a7807Greg Claytonbool
114236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonSymbolContextList::RemoveContextAtIndex (size_t idx)
114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (idx < m_symbol_contexts.size())
114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_symbol_contexts.erase(m_symbol_contexts.begin() + idx);
114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolContextList::GetSize() const
115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_symbol_contexts.size();
115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
115752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton
115852c8b6e3205e11e90adc83521c01915fc13626deGreg Claytonuint32_t
115952c8b6e3205e11e90adc83521c01915fc13626deGreg ClaytonSymbolContextList::NumLineEntriesWithLine (uint32_t line) const
116052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton{
116152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    uint32_t match_count = 0;
116236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t size = m_symbol_contexts.size();
116336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    for (size_t idx = 0; idx<size; ++idx)
116452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    {
116552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton        if (m_symbol_contexts[idx].line_entry.line == line)
116652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton            ++match_count;
116752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    }
116852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton    return match_count;
116952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton}
117052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton
11717dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Claytonvoid
11727dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg ClaytonSymbolContextList::GetDescription(Stream *s,
11737dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton                                  lldb::DescriptionLevel level,
11747dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton                                  Target *target) const
11757dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton{
117636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t size = m_symbol_contexts.size();
117736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    for (size_t idx = 0; idx<size; ++idx)
11787dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton        m_symbol_contexts[idx].GetDescription (s, level, target);
11797dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton}
11807dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton
11819a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Claytonbool
11829a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Claytonlldb_private::operator== (const SymbolContextList& lhs, const SymbolContextList& rhs)
11839a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton{
11849a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton    const uint32_t size = lhs.GetSize();
11859a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton    if (size != rhs.GetSize())
11869a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton        return false;
11879a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton
11889a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton    SymbolContext lhs_sc;
11899a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton    SymbolContext rhs_sc;
11909a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton    for (uint32_t i=0; i<size; ++i)
11919a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton    {
11929a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton        lhs.GetContextAtIndex(i, lhs_sc);
11939a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton        rhs.GetContextAtIndex(i, rhs_sc);
11949a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton        if (lhs_sc != rhs_sc)
11959a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton            return false;
11969a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton    }
11979a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton    return true;
11989a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton}
11999a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton
12009a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Claytonbool
12019a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Claytonlldb_private::operator!= (const SymbolContextList& lhs, const SymbolContextList& rhs)
12029a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton{
12039a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton    return !(lhs == rhs);
12049a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton}
12059a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton
1206