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