124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- StackID.h -----------------------------------------------*- 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#ifndef liblldb_StackID_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_StackID_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/AddressRange.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private { 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass StackID 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Constructors and Destructors 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 28f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton StackID () : 2972b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton m_pc (LLDB_INVALID_ADDRESS), 3065124eac53b7a214906e8931be314e429bbbeb30Greg Clayton m_cfa (LLDB_INVALID_ADDRESS), 314fb08150367853dae24bb92904356788e919a72fGreg Clayton m_symbol_scope (NULL) 32f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton { 33f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton } 34f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton 35f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton explicit 3672b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton StackID (lldb::addr_t pc, lldb::addr_t cfa, SymbolContextScope *symbol_scope) : 3772b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton m_pc (pc), 38f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton m_cfa (cfa), 394fb08150367853dae24bb92904356788e919a72fGreg Clayton m_symbol_scope (symbol_scope) 40f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton { 41f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton } 42f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton 43f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton StackID (const StackID& rhs) : 4472b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton m_pc (rhs.m_pc), 45f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton m_cfa (rhs.m_cfa), 464fb08150367853dae24bb92904356788e919a72fGreg Clayton m_symbol_scope (rhs.m_symbol_scope) 47f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton { 48f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton } 49f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton 50f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton ~StackID() 51f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton { 52f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton } 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 545205f0b6585a127acc6ed210021abb6091220a89Greg Clayton lldb::addr_t 5572b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton GetPC() const 5633ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton { 5772b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton return m_pc; 5833ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton } 595205f0b6585a127acc6ed210021abb6091220a89Greg Clayton 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t 6133ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton GetCallFrameAddress() const 6233ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton { 6333ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton return m_cfa; 6433ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton } 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 664fb08150367853dae24bb92904356788e919a72fGreg Clayton SymbolContextScope * 674fb08150367853dae24bb92904356788e919a72fGreg Clayton GetSymbolContextScope () const 68f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton { 694fb08150367853dae24bb92904356788e919a72fGreg Clayton return m_symbol_scope; 70f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton } 71f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton 72f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton void 734fb08150367853dae24bb92904356788e919a72fGreg Clayton SetSymbolContextScope (SymbolContextScope *symbol_scope) 7433ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton { 754fb08150367853dae24bb92904356788e919a72fGreg Clayton m_symbol_scope = symbol_scope; 7633ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton } 77f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton 784fb08150367853dae24bb92904356788e919a72fGreg Clayton void 79fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Clear () 80fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 81fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_pc = LLDB_INVALID_ADDRESS; 82fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_cfa = LLDB_INVALID_ADDRESS; 83fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_symbol_scope = NULL; 84fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 85fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 86fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool 87b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton IsValid () const 88fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 89b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton return m_pc != LLDB_INVALID_ADDRESS || m_cfa != LLDB_INVALID_ADDRESS; 90fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 91fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 92fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham void 934fb08150367853dae24bb92904356788e919a72fGreg Clayton Dump (Stream *s); 944fb08150367853dae24bb92904356788e919a72fGreg Clayton 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Operators 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StackID& 99f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton operator=(const StackID& rhs) 100f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton { 101f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton if (this != &rhs) 102f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton { 10372b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton m_pc = rhs.m_pc; 104f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton m_cfa = rhs.m_cfa; 1054fb08150367853dae24bb92904356788e919a72fGreg Clayton m_symbol_scope = rhs.m_symbol_scope; 106f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton } 107f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton return *this; 108f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton } 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 1115205f0b6585a127acc6ed210021abb6091220a89Greg Clayton 1125205f0b6585a127acc6ed210021abb6091220a89Greg Clayton friend class StackFrame; 1135205f0b6585a127acc6ed210021abb6091220a89Greg Clayton 1145205f0b6585a127acc6ed210021abb6091220a89Greg Clayton void 1155205f0b6585a127acc6ed210021abb6091220a89Greg Clayton SetPC (lldb::addr_t pc) 1165205f0b6585a127acc6ed210021abb6091220a89Greg Clayton { 1175205f0b6585a127acc6ed210021abb6091220a89Greg Clayton m_pc = pc; 1185205f0b6585a127acc6ed210021abb6091220a89Greg Clayton } 1195205f0b6585a127acc6ed210021abb6091220a89Greg Clayton 1205205f0b6585a127acc6ed210021abb6091220a89Greg Clayton 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Classes that inherit from StackID can see and modify these 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 12472b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton lldb::addr_t m_pc; // The pc value for the function/symbol for this frame. This will 12572b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton // only get used if the symbol scope is NULL (the code where we are 12672b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton // stopped is not represented by any function or symbol in any 12772b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton // shared library). 128f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton lldb::addr_t m_cfa; // The call frame address (stack pointer) value 129f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton // at the beginning of the function that uniquely 1304fb08150367853dae24bb92904356788e919a72fGreg Clayton // identifies this frame (along with m_symbol_scope below) 1314fb08150367853dae24bb92904356788e919a72fGreg Clayton SymbolContextScope *m_symbol_scope; // If NULL, there is no block or symbol for this frame. 1324fb08150367853dae24bb92904356788e919a72fGreg Clayton // If not NULL, this will either be the scope for the 1334fb08150367853dae24bb92904356788e919a72fGreg Clayton // lexical block for the frame, or the scope 1344fb08150367853dae24bb92904356788e919a72fGreg Clayton // for the symbol. Symbol context scopes are 1354fb08150367853dae24bb92904356788e919a72fGreg Clayton // always be unique pointers since the are part 1364fb08150367853dae24bb92904356788e919a72fGreg Clayton // of the Block and Symbol objects and can easily 1374fb08150367853dae24bb92904356788e919a72fGreg Clayton // be used to tell if a stack ID is the same as 1384fb08150367853dae24bb92904356788e919a72fGreg Clayton // another. 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool operator== (const StackID& lhs, const StackID& rhs); 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool operator!= (const StackID& lhs, const StackID& rhs); 143441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham 144441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham// frame_id_1 < frame_id_2 means "frame_id_1 is YOUNGER than frame_id_2" 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool operator< (const StackID& lhs, const StackID& rhs); 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // liblldb_StackID_h_ 150