124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Block.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/Block.h"
11ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton
12ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton#include "lldb/lldb-private-log.h"
13ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton
14ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton#include "lldb/Core/Log.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Section.h"
17ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton#include "lldb/Symbol/Function.h"
18c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan#include "lldb/Symbol/SymbolFile.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2575ccf50c3371d8c8e293af25461705b86fb10a46Greg ClaytonBlock::Block(lldb::user_id_t uid) :
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID(uid),
2775ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_parent_scope (NULL),
2875ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_children (),
2975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_ranges (),
3075ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_inlineInfoSP (),
31b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton    m_variable_list_sp (),
3275ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_parsed_block_info (false),
3375ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_parsed_block_variables (false),
3475ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_parsed_child_blocks (false)
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBlock::~Block ()
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
43eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg ClaytonBlock::GetDescription(Stream *s, Function *function, lldb::DescriptionLevel level, Target *target) const
4412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{
45c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton    *s << "id = " << ((const UserID&)*this);
46c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton
47bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    size_t num_ranges = m_ranges.GetSize();
48bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    if (num_ranges > 0)
4912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    {
5012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
5112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        addr_t base_addr = LLDB_INVALID_ADDRESS;
52eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        if (target)
53eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton            base_addr = function->GetAddressRange().GetBaseAddress().GetLoadAddress(target);
5412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        if (base_addr == LLDB_INVALID_ADDRESS)
5575ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton            base_addr = function->GetAddressRange().GetBaseAddress().GetFileAddress();
5612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
57c67b7d13cffeb2c9454635e8a11d65350bce61adGreg Clayton        s->Printf(", range%s = ", num_ranges > 1 ? "s" : "");
58bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        for (size_t i=0; i<num_ranges; ++i)
59bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        {
60bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            const Range &range = m_ranges.GetEntryRef(i);
61bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            s->AddressRange(base_addr + range.GetRangeBase(), base_addr + range.GetRangeEnd(), 4);
62bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        }
6312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    }
6412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
6512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    if (m_inlineInfoSP.get() != NULL)
661924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    {
671924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        bool show_fullpaths = (level == eDescriptionLevelVerbose);
681924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        m_inlineInfoSP->Dump(s, show_fullpaths);
691924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    }
7012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton}
7112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
7212bec71b323dc520f0e985a86e09c4712559e115Greg Claytonvoid
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBlock::Dump(Stream *s, addr_t base_addr, int32_t depth, bool show_context) const
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (depth < 0)
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7775ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        Block *parent = GetParent();
7875ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        if (parent)
7975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        {
8075ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton            // We have a depth that is less than zero, print our parent blocks
8175ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton            // first
8275ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton            parent->Dump(s, base_addr, depth + 1, show_context);
8375ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        }
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
867e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda    s->Printf("%p: ", this);
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    *s << "Block" << ((const UserID&)*this);
8912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    const Block* parent_block = GetParent();
9012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    if (parent_block)
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
925f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        s->Printf(", parent = {0x%8.8" PRIx64 "}", parent_block->GetID());
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_inlineInfoSP.get() != NULL)
951924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    {
961924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        bool show_fullpaths = false;
971924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        m_inlineInfoSP->Dump(s, show_fullpaths);
981924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    }
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    if (!m_ranges.IsEmpty())
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *s << ", ranges =";
103bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton
104bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        size_t num_ranges = m_ranges.GetSize();
105bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        for (size_t i=0; i<num_ranges; ++i)
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
107bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            const Range &range = m_ranges.GetEntryRef(i);
108bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            if (parent_block != NULL && parent_block->Contains(range) == false)
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *s << '!';
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *s << ' ';
112bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            s->AddressRange(base_addr + range.GetRangeBase(), base_addr + range.GetRangeEnd(), 4);
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->EOL();
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (depth > 0)
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->IndentMore();
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton        if (m_variable_list_sp.get())
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
123b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton            m_variable_list_sp->Dump(s, show_context);
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1262cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        collection::const_iterator pos, end = m_children.end();
1272cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        for (pos = m_children.begin(); pos != end; ++pos)
1282cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton            (*pos)->Dump(s, base_addr, depth - 1, show_context);
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->IndentLess();
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13675ccf50c3371d8c8e293af25461705b86fb10a46Greg ClaytonBlock *
13775ccf50c3371d8c8e293af25461705b86fb10a46Greg ClaytonBlock::FindBlockByID (user_id_t block_id)
13875ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton{
13975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    if (block_id == GetID())
14075ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        return this;
14175ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton
14275ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    Block *matching_block = NULL;
1432cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton    collection::const_iterator pos, end = m_children.end();
1442cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton    for (pos = m_children.begin(); pos != end; ++pos)
14575ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    {
1462cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        matching_block = (*pos)->FindBlockByID (block_id);
14775ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        if (matching_block)
14875ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton            break;
14975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    }
15075ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    return matching_block;
15175ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton}
15275ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
154b04e7a805310f2f2cc77947a8b263de9061617aeGreg ClaytonBlock::CalculateSymbolContext (SymbolContext* sc)
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15675ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    if (m_parent_scope)
15775ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        m_parent_scope->CalculateSymbolContext(sc);
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    sc->block = this;
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1613508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Claytonlldb::ModuleSP
162c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonBlock::CalculateSymbolContextModule ()
163c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
164c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_parent_scope)
165c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        return m_parent_scope->CalculateSymbolContextModule ();
1663508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    return lldb::ModuleSP();
167c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
168c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
169c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonCompileUnit *
170c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonBlock::CalculateSymbolContextCompileUnit ()
171c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
172c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_parent_scope)
173c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        return m_parent_scope->CalculateSymbolContextCompileUnit ();
174c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return NULL;
175c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
176c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
177c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonFunction *
178c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonBlock::CalculateSymbolContextFunction ()
179c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
180c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (m_parent_scope)
181c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        return m_parent_scope->CalculateSymbolContextFunction ();
182c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return NULL;
183c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
184c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
185c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonBlock *
186c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonBlock::CalculateSymbolContextBlock ()
187c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
188c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return this;
189c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
190c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBlock::DumpSymbolContext(Stream *s)
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
194c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    Function *function = CalculateSymbolContextFunction();
195c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (function)
196c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        function->DumpSymbolContext(s);
1975f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    s->Printf(", Block{0x%8.8" PRIx64 "}", GetID());
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20098f930f429160f9777f626c3ac6aa609f4e965d2Caroline Ticevoid
20198f930f429160f9777f626c3ac6aa609f4e965d2Caroline TiceBlock::DumpAddressRanges (Stream *s, lldb::addr_t base_addr)
20298f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice{
203bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    if (!m_ranges.IsEmpty())
20498f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    {
205bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        size_t num_ranges = m_ranges.GetSize();
206bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        for (size_t i=0; i<num_ranges; ++i)
207bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        {
208bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            const Range &range = m_ranges.GetEntryRef(i);
209bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            s->AddressRange(base_addr + range.GetRangeBase(), base_addr + range.GetRangeEnd(), 4);
210bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        }
21198f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    }
21298f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice}
21398f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBlock::Contains (addr_t range_offset) const
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
217bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    return m_ranges.FindEntryThatContains(range_offset) != NULL;
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
22172b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg ClaytonBlock::Contains (const Block *block) const
22272b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton{
22372b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton    if (this == block)
224a357ecfaec0c9c718e26d5558499622110993e73Greg Clayton        return false; // This block doesn't contain itself...
22572b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton
226a357ecfaec0c9c718e26d5558499622110993e73Greg Clayton    // Walk the parent chain for "block" and see if any if them match this block
22772b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton    const Block *block_parent;
22872b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton    for (block_parent = block->GetParent();
22972b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton         block_parent != NULL;
23072b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton         block_parent = block_parent->GetParent())
23172b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton    {
232a357ecfaec0c9c718e26d5558499622110993e73Greg Clayton        if (this == block_parent)
233a357ecfaec0c9c718e26d5558499622110993e73Greg Clayton            return true; // One of the parents of "block" is this object!
23472b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton    }
23572b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton    return false;
23672b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton}
23772b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton
23872b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Claytonbool
239bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg ClaytonBlock::Contains (const Range& range) const
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
241bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    return m_ranges.FindEntryThatContains (range) != NULL;
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24475ccf50c3371d8c8e293af25461705b86fb10a46Greg ClaytonBlock *
24575ccf50c3371d8c8e293af25461705b86fb10a46Greg ClaytonBlock::GetParent () const
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24775ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    if (m_parent_scope)
248c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        return m_parent_scope->CalculateSymbolContextBlock();
24975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    return NULL;
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25233ed170599d41fe407a4dcf5f0875c75e1ad1375Greg ClaytonBlock *
253b04e7a805310f2f2cc77947a8b263de9061617aeGreg ClaytonBlock::GetContainingInlinedBlock ()
254b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton{
25569aa5d9a7620a183cdc4da12cc87ea82e2ffcbf9Greg Clayton    if (GetInlinedFunctionInfo())
256b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton        return this;
257b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton    return GetInlinedParent ();
258b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton}
259b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton
260b04e7a805310f2f2cc77947a8b263de9061617aeGreg ClaytonBlock *
261b04e7a805310f2f2cc77947a8b263de9061617aeGreg ClaytonBlock::GetInlinedParent ()
26233ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton{
26333ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    Block *parent_block = GetParent ();
26433ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    if (parent_block)
26533ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    {
26669aa5d9a7620a183cdc4da12cc87ea82e2ffcbf9Greg Clayton        if (parent_block->GetInlinedFunctionInfo())
26733ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton            return parent_block;
26833ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton        else
26933ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton            return parent_block->GetInlinedParent();
27033ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    }
27133ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    return NULL;
27233ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton}
27333ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton
27433ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton
27533ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Claytonbool
276bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg ClaytonBlock::GetRangeContainingOffset (const addr_t offset, Range &range)
277b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton{
278bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    const Range *range_ptr = m_ranges.FindEntryThatContains (offset);
279bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    if (range_ptr)
280b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton    {
281bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        range = *range_ptr;
282b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton        return true;
283b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton    }
284b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton    range.Clear();
285b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton    return false;
286b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton}
287b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton
288b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton
289b04e7a805310f2f2cc77947a8b263de9061617aeGreg Claytonbool
290bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg ClaytonBlock::GetRangeContainingAddress (const Address& addr, AddressRange &range)
29133ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton{
292c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    Function *function = CalculateSymbolContextFunction();
293c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (function)
29433ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    {
295c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        const AddressRange &func_range = function->GetAddressRange();
29633ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton        if (addr.GetSection() == func_range.GetBaseAddress().GetSection())
29733ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton        {
29833ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton            const addr_t addr_offset = addr.GetOffset();
29933ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton            const addr_t func_offset = func_range.GetBaseAddress().GetOffset();
30033ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton            if (addr_offset >= func_offset && addr_offset < func_offset + func_range.GetByteSize())
30133ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton            {
30233ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton                addr_t offset = addr_offset - func_offset;
30333ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton
304bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton                const Range *range_ptr = m_ranges.FindEntryThatContains (offset);
305bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton
306bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton                if (range_ptr)
30733ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton                {
30833ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton                    range.GetBaseAddress() = func_range.GetBaseAddress();
309bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton                    range.GetBaseAddress().SetOffset(func_offset + range_ptr->GetRangeBase());
310bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton                    range.SetByteSize(range_ptr->GetByteSize());
31133ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton                    return true;
31233ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton                }
31333ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton            }
31433ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton        }
31533ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    }
31633ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    range.Clear();
31733ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    return false;
31833ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton}
31933ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton
320243a08c68876912c90440c0c6c0f95cb49af21c9Jim Inghambool
321243a08c68876912c90440c0c6c0f95cb49af21c9Jim InghamBlock::GetRangeContainingLoadAddress (lldb::addr_t load_addr, Target &target, AddressRange &range)
322243a08c68876912c90440c0c6c0f95cb49af21c9Jim Ingham{
323243a08c68876912c90440c0c6c0f95cb49af21c9Jim Ingham    Address load_address;
324243a08c68876912c90440c0c6c0f95cb49af21c9Jim Ingham    load_address.SetLoadAddress(load_addr, &target);
325243a08c68876912c90440c0c6c0f95cb49af21c9Jim Ingham    AddressRange containing_range;
326243a08c68876912c90440c0c6c0f95cb49af21c9Jim Ingham    return GetRangeContainingAddress(load_address, containing_range);
327243a08c68876912c90440c0c6c0f95cb49af21c9Jim Ingham}
328243a08c68876912c90440c0c6c0f95cb49af21c9Jim Ingham
329243a08c68876912c90440c0c6c0f95cb49af21c9Jim Ingham
330bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Claytonuint32_t
331bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg ClaytonBlock::GetRangeIndexContainingAddress (const Address& addr)
332bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton{
333bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    Function *function = CalculateSymbolContextFunction();
334bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    if (function)
335bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    {
336bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        const AddressRange &func_range = function->GetAddressRange();
337bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        if (addr.GetSection() == func_range.GetBaseAddress().GetSection())
338bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        {
339bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            const addr_t addr_offset = addr.GetOffset();
340bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            const addr_t func_offset = func_range.GetBaseAddress().GetOffset();
341bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            if (addr_offset >= func_offset && addr_offset < func_offset + func_range.GetByteSize())
342bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            {
343bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton                addr_t offset = addr_offset - func_offset;
344bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton                return m_ranges.FindEntryIndexThatContains (offset);
345bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            }
346bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        }
347bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    }
348bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    return UINT32_MAX;
349bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton}
350bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton
351ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Claytonbool
352ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg ClaytonBlock::GetRangeAtIndex (uint32_t range_idx, AddressRange &range)
353ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton{
354bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    if (range_idx < m_ranges.GetSize())
355ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    {
356c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        Function *function = CalculateSymbolContextFunction();
357c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        if (function)
358ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton        {
359bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            const Range &vm_range = m_ranges.GetEntryRef(range_idx);
360c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton            range.GetBaseAddress() = function->GetAddressRange().GetBaseAddress();
361bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            range.GetBaseAddress().Slide(vm_range.GetRangeBase ());
362bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            range.SetByteSize (vm_range.GetByteSize());
363ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton            return true;
364ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton        }
365ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    }
366ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    return false;
367ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton}
368feb6e56275a8a7a53336bdb957064e9093e8e170Greg Clayton
369feb6e56275a8a7a53336bdb957064e9093e8e170Greg Claytonbool
370feb6e56275a8a7a53336bdb957064e9093e8e170Greg ClaytonBlock::GetStartAddress (Address &addr)
371feb6e56275a8a7a53336bdb957064e9093e8e170Greg Clayton{
372bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    if (m_ranges.IsEmpty())
373feb6e56275a8a7a53336bdb957064e9093e8e170Greg Clayton        return false;
374feb6e56275a8a7a53336bdb957064e9093e8e170Greg Clayton
375c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    Function *function = CalculateSymbolContextFunction();
376c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (function)
377feb6e56275a8a7a53336bdb957064e9093e8e170Greg Clayton    {
378c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        addr = function->GetAddressRange().GetBaseAddress();
379bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        addr.Slide(m_ranges.GetEntryRef(0).GetRangeBase ());
380feb6e56275a8a7a53336bdb957064e9093e8e170Greg Clayton        return true;
381feb6e56275a8a7a53336bdb957064e9093e8e170Greg Clayton    }
382feb6e56275a8a7a53336bdb957064e9093e8e170Greg Clayton    return false;
383feb6e56275a8a7a53336bdb957064e9093e8e170Greg Clayton}
384feb6e56275a8a7a53336bdb957064e9093e8e170Greg Clayton
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
386bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg ClaytonBlock::FinalizeRanges ()
387bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton{
388bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    m_ranges.Sort();
389bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    m_ranges.CombineConsecutiveRanges ();
390bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton}
391bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton
392bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Claytonvoid
393bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg ClaytonBlock::AddRange (const Range& range)
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
395ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton    Block *parent_block = GetParent ();
396bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    if (parent_block && !parent_block->Contains(range))
397ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton    {
398952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SYMBOLS));
399ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton        if (log)
400ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton        {
4013508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            ModuleSP module_sp (m_parent_scope->CalculateSymbolContextModule());
402ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton            Function *function = m_parent_scope->CalculateSymbolContextFunction();
403ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton            const addr_t function_file_addr = function->GetAddressRange().GetBaseAddress().GetFileAddress();
404bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            const addr_t block_start_addr = function_file_addr + range.GetRangeBase ();
405bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton            const addr_t block_end_addr = function_file_addr + range.GetRangeEnd ();
406ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton            Type *func_type = function->GetType();
407ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton
408ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton            const Declaration &func_decl = func_type->GetDeclaration();
409ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton            if (func_decl.GetLine())
410ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton            {
41197a19b21dacd9063bb5475812df7781777262198Greg Clayton                log->Printf ("warning: %s:%u block {0x%8.8" PRIx64 "} has range[%u] [0x%" PRIx64 " - 0x%" PRIx64 ") which is not contained in parent block {0x%8.8" PRIx64 "} in function {0x%8.8" PRIx64 "} from %s",
41297a19b21dacd9063bb5475812df7781777262198Greg Clayton                             func_decl.GetFile().GetPath().c_str(),
413ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton                             func_decl.GetLine(),
414ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton                             GetID(),
415bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton                             (uint32_t)m_ranges.GetSize(),
416ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton                             block_start_addr,
417ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton                             block_end_addr,
418ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton                             parent_block->GetID(),
419ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton                             function->GetID(),
42097a19b21dacd9063bb5475812df7781777262198Greg Clayton                             module_sp->GetFileSpec().GetPath().c_str());
421ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton            }
422ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton            else
423ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton            {
42497a19b21dacd9063bb5475812df7781777262198Greg Clayton                log->Printf ("warning: block {0x%8.8" PRIx64 "} has range[%u] [0x%" PRIx64 " - 0x%" PRIx64 ") which is not contained in parent block {0x%8.8" PRIx64 "} in function {0x%8.8" PRIx64 "} from %s",
425ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton                             GetID(),
426bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton                             (uint32_t)m_ranges.GetSize(),
427ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton                             block_start_addr,
428ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton                             block_end_addr,
429ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton                             parent_block->GetID(),
430ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton                             function->GetID(),
43197a19b21dacd9063bb5475812df7781777262198Greg Clayton                             module_sp->GetFileSpec().GetPath().c_str());
432ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton            }
433ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton        }
434bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        parent_block->AddRange (range);
435ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton    }
436bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    m_ranges.Append(range);
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Return the current number of bytes that this object occupies in memory
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBlock::MemorySize() const
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
443bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton    size_t mem_size = sizeof(Block) + m_ranges.GetSize() * sizeof(Range);
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_inlineInfoSP.get())
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        mem_size += m_inlineInfoSP->MemorySize();
446b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton    if (m_variable_list_sp.get())
447b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton        mem_size += m_variable_list_sp->MemorySize();
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return mem_size;
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45275ccf50c3371d8c8e293af25461705b86fb10a46Greg Claytonvoid
45375ccf50c3371d8c8e293af25461705b86fb10a46Greg ClaytonBlock::AddChild(const BlockSP &child_block_sp)
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45575ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    if (child_block_sp)
45675ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    {
45775ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        child_block_sp->SetParentScope (this);
45875ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        m_children.push_back (child_block_sp);
45975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    }
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBlock::SetInlinedFunctionInfo(const char *name, const char *mangled, const Declaration *decl_ptr, const Declaration *call_decl_ptr)
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_inlineInfoSP.reset(new InlineFunctionInfo(name, mangled, decl_ptr, call_decl_ptr));
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4687382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham
4697382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham
4707382a539b87335bbcc1cb27039e2735ca167ea39Jim InghamVariableListSP
4711bd2b2feb7694e06b9a971063c283f9c490479d2Greg ClaytonBlock::GetBlockVariableList (bool can_create)
4727382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham{
47375ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    if (m_parsed_block_variables == false)
4747382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham    {
475b04e7a805310f2f2cc77947a8b263de9061617aeGreg Clayton        if (m_variable_list_sp.get() == NULL && can_create)
47675ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        {
47775ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton            m_parsed_block_variables = true;
47875ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton            SymbolContext sc;
47975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton            CalculateSymbolContext(&sc);
48075ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton            assert(sc.module_sp);
48175ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton            sc.module_sp->GetSymbolVendor()->ParseVariablesForContext(sc);
48275ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        }
4837382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham    }
4841bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    return m_variable_list_sp;
4851bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton}
4867382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham
4871bd2b2feb7694e06b9a971063c283f9c490479d2Greg Claytonuint32_t
4881bd2b2feb7694e06b9a971063c283f9c490479d2Greg ClaytonBlock::AppendBlockVariables (bool can_create,
4891bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                             bool get_child_block_variables,
4901bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                             bool stop_if_child_block_is_inlined_function,
4911bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                             VariableList *variable_list)
4921bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton{
4931bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    uint32_t num_variables_added = 0;
4941bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    VariableList *block_var_list = GetBlockVariableList (can_create).get();
4951bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    if (block_var_list)
4967382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham    {
4971bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton        num_variables_added += block_var_list->GetSize();
4981bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton        variable_list->AddVariables (block_var_list);
4991bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    }
5001bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton
5011bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    if (get_child_block_variables)
5021bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    {
5032cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        collection::const_iterator pos, end = m_children.end();
5042cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        for (pos = m_children.begin(); pos != end; ++pos)
5052cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        {
5062cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton            Block *child_block = pos->get();
5071bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton            if (stop_if_child_block_is_inlined_function == false ||
5081bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                child_block->GetInlinedFunctionInfo() == NULL)
5091bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton            {
5101bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                num_variables_added += child_block->AppendBlockVariables (can_create,
5111bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                                                                          get_child_block_variables,
5121bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                                                                          stop_if_child_block_is_inlined_function,
5131bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton                                                                          variable_list);
5147382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham            }
5157382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham        }
5167382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham    }
5171bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    return num_variables_added;
5187382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham}
5197382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham
5207382a539b87335bbcc1cb27039e2735ca167ea39Jim Inghamuint32_t
52133ed170599d41fe407a4dcf5f0875c75e1ad1375Greg ClaytonBlock::AppendVariables
52233ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton(
52333ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    bool can_create,
52433ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    bool get_parent_variables,
52533ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    bool stop_if_block_is_inlined_function,
52633ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton    VariableList *variable_list
52733ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton)
5287382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham{
5297382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham    uint32_t num_variables_added = 0;
5301bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    VariableListSP variable_list_sp(GetBlockVariableList(can_create));
5317382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham
53269aa5d9a7620a183cdc4da12cc87ea82e2ffcbf9Greg Clayton    bool is_inlined_function = GetInlinedFunctionInfo() != NULL;
5337382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham    if (variable_list_sp.get())
5347382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham    {
5357382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham        num_variables_added = variable_list_sp->GetSize();
5367382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham        variable_list->AddVariables(variable_list_sp.get());
5377382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham    }
53833ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton
5397382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham    if (get_parent_variables)
5407382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham    {
54133ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton        if (stop_if_block_is_inlined_function && is_inlined_function)
54233ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton            return num_variables_added;
54333ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton
5447382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham        Block* parent_block = GetParent();
5457382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham        if (parent_block)
54633ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton            num_variables_added += parent_block->AppendVariables (can_create, get_parent_variables, stop_if_block_is_inlined_function, variable_list);
5477382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham    }
5487382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham    return num_variables_added;
5497382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham}
5507382a539b87335bbcc1cb27039e2735ca167ea39Jim Ingham
551c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callananclang::DeclContext *
552b3a1a2bba41281ba56a99fe64887a8a04760784cGreg ClaytonBlock::GetClangDeclContext()
553c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan{
554c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    SymbolContext sc;
555c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
556c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    CalculateSymbolContext (&sc);
557c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
558c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    if (!sc.module_sp)
559c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        return NULL;
560c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
561c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    SymbolVendor *sym_vendor = sc.module_sp->GetSymbolVendor();
562c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
563c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    if (!sym_vendor)
564c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        return NULL;
565c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
566c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    SymbolFile *sym_file = sym_vendor->GetSymbolFile();
567c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
568c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    if (!sym_file)
569c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        return NULL;
570c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
571c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    return sym_file->GetClangDeclContextForTypeUID (sc, m_uid);
572c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan}
573c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
57575ccf50c3371d8c8e293af25461705b86fb10a46Greg ClaytonBlock::SetBlockInfoHasBeenParsed (bool b, bool set_children)
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
57775ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    m_parsed_block_info = b;
57875ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton    if (set_children)
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
58075ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton        m_parsed_child_blocks = true;
5812cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        collection::const_iterator pos, end = m_children.end();
5822cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        for (pos = m_children.begin(); pos != end; ++pos)
5832cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton            (*pos)->SetBlockInfoHasBeenParsed (b, true);
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5861bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton
5871bd2b2feb7694e06b9a971063c283f9c490479d2Greg Claytonvoid
5881bd2b2feb7694e06b9a971063c283f9c490479d2Greg ClaytonBlock::SetDidParseVariables (bool b, bool set_children)
5891bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton{
5901bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    m_parsed_block_variables = b;
5911bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    if (set_children)
5921bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    {
5932cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        collection::const_iterator pos, end = m_children.end();
5942cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        for (pos = m_children.begin(); pos != end; ++pos)
5952cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton            (*pos)->SetDidParseVariables (b, true);
5962cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton    }
5972cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton}
5982cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton
5992cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton
6002cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg ClaytonBlock *
6012cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg ClaytonBlock::GetSibling() const
6022cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton{
6032cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton    if (m_parent_scope)
6042cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton    {
605ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton        Block *parent_block = GetParent();
6062cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        if (parent_block)
6072cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton            return parent_block->GetSiblingForChild (this);
6081bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton    }
6092cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton    return NULL;
6102cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton}
6112cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton// A parent of child blocks can be asked to find a sibling block given
6122cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton// one of its child blocks
6132cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg ClaytonBlock *
6142cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg ClaytonBlock::GetSiblingForChild (const Block *child_block) const
6152cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton{
6162cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton    if (!m_children.empty())
6172cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton    {
6182cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        collection::const_iterator pos, end = m_children.end();
6192cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        for (pos = m_children.begin(); pos != end; ++pos)
6202cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        {
6212cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton            if (pos->get() == child_block)
6222cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton            {
6232cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton                if (++pos != end)
6242cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton                    return pos->get();
6252cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton                break;
6262cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton            }
6272cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton        }
6282cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton    }
6292cd9fbd2e10e80a2aaf6b48034928988151cadcdGreg Clayton    return NULL;
6301bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton}
6311bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton
632