StackFrame.h revision ccd584dccb920cdb028de69950774c3bcdc025ec
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===-- StackFrame.h --------------------------------------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef liblldb_StackFrame_h_
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define liblldb_StackFrame_h_
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C Includes
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C++ Includes
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Other libraries and framework includes
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Project includes
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Core/Error.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "lldb/Core/Flags.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Core/Scalar.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "lldb/Core/StreamString.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "lldb/Core/UserID.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "lldb/Core/ValueObjectList.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "lldb/Symbol/SymbolContext.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "lldb/Target/ExecutionContextScope.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Target/StackID.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace lldb_private {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class StackFrame :
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public ExecutionContextScope
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch{
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //------------------------------------------------------------------
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Constructors and Destructors
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //------------------------------------------------------------------
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    StackFrame (lldb::user_id_t frame_idx,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                lldb::user_id_t unwind_frame_idx,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                Thread &thread,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                lldb::addr_t cfa,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                lldb::addr_t pc,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const SymbolContext *sc_ptr);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StackFrame (lldb::user_id_t frame_idx,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                lldb::user_id_t unwind_frame_idx,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Thread &thread,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const lldb::RegisterContextSP &reg_context_sp,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                lldb::addr_t cfa,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                lldb::addr_t pc,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const SymbolContext *sc_ptr);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StackFrame (lldb::user_id_t frame_idx,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                lldb::user_id_t unwind_frame_idx,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Thread &thread,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const lldb::RegisterContextSP &reg_context_sp,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                lldb::addr_t cfa,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const Address& pc,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const SymbolContext *sc_ptr);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~StackFrame ();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Thread &
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetThread()
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { return m_thread; }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Thread &
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetThread() const
67bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    { return m_thread; }
68bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StackID&
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetStackID();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Address&
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetFrameCodeAddress();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChangePC (lldb::addr_t pc);
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SymbolContext&
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSymbolContext (uint32_t resolve_scope);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GetFrameBaseValue(Scalar &value, Error *error_ptr);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Block *
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetFrameBlock ();
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    RegisterContext *
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetRegisterContext ();
89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const lldb::RegisterContextSP &
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetRegisterContextSP () const
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return m_reg_context_sp;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VariableList *
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetVariableList (bool get_file_globals);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HasDebugInformation ();
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const char *
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Disassemble ();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Dump (Stream *strm, bool show_frame_index, bool show_fullpaths);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IsInlined ();
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    uint32_t
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetFrameIndex () const
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return m_frame_index;
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetUnwindFrameIndex () const
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return m_unwind_frame_index;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lldb::ValueObjectSP
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetValueObjectForFrameVariable (const lldb::VariableSP &variable_sp);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lldb::ValueObjectSP
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TrackGlobalVariable (const lldb::VariableSP &variable_sp);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //------------------------------------------------------------------
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // lldb::ExecutionContextScope pure virtual functions
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    //------------------------------------------------------------------
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual Target *
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CalculateTarget ();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual Process *
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CalculateProcess ();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual Thread *
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CalculateThread ();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual StackFrame *
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CalculateStackFrame ();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Calculate (ExecutionContext &exe_ctx);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lldb::StackFrameSP
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSP ();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class StackFrameList;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetSymbolContextScope (SymbolContextScope *symbol_scope);
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    UpdateCurrentFrameFromPreviousFrame (StackFrame &prev_frame);
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    void
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    UpdatePreviousFrameFromCurrentFrame (StackFrame &curr_frame);
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HasCachedData () const;
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochprivate:
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //------------------------------------------------------------------
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For StackFrame only
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //------------------------------------------------------------------
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Thread &m_thread;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t m_frame_index;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t m_unwind_frame_index;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lldb::RegisterContextSP m_reg_context_sp;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StackID m_id;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Address m_frame_code_addr;   // The frame code address (might not be the same as the actual PC for inlined frames) as a section/offset address
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SymbolContext m_sc;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Flags m_flags;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Scalar m_frame_base;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Error m_frame_base_error;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lldb::VariableListSP m_variable_list_sp;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ValueObjectList m_variable_list_value_objects;  // Value objects for each variable in m_variable_list_sp
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StreamString m_disassembly;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN (StackFrame);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace lldb_private
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // liblldb_StackFrame_h_
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)