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