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