1//===-- UnwindMacOSXFrameBackchain.h ----------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef lldb_UnwindMacOSXFrameBackchain_h_
11#define lldb_UnwindMacOSXFrameBackchain_h_
12
13// C Includes
14// C++ Includes
15#include <vector>
16
17// Other libraries and framework includes
18// Project includes
19#include "lldb/lldb-private.h"
20#include "lldb/Target/Unwind.h"
21
22class UnwindMacOSXFrameBackchain : public lldb_private::Unwind
23{
24public:
25    UnwindMacOSXFrameBackchain (lldb_private::Thread &thread);
26
27    ~UnwindMacOSXFrameBackchain() override = default;
28
29protected:
30    void
31    DoClear() override
32    {
33        m_cursors.clear();
34    }
35
36    uint32_t
37    DoGetFrameCount() override;
38
39    bool
40    DoGetFrameInfoAtIndex(uint32_t frame_idx,
41                          lldb::addr_t& cfa,
42                          lldb::addr_t& pc) override;
43
44    lldb::RegisterContextSP
45    DoCreateRegisterContextForFrame(lldb_private::StackFrame *frame) override;
46
47    friend class RegisterContextMacOSXFrameBackchain;
48
49    struct Cursor
50    {
51        lldb::addr_t pc;    // Program counter
52        lldb::addr_t fp;    // Frame pointer for us with backchain
53    };
54
55private:
56    std::vector<Cursor> m_cursors;
57
58    size_t
59    GetStackFrameData_i386 (const lldb_private::ExecutionContext &exe_ctx);
60
61    size_t
62    GetStackFrameData_x86_64 (const lldb_private::ExecutionContext &exe_ctx);
63
64    //------------------------------------------------------------------
65    // For UnwindMacOSXFrameBackchain only
66    //------------------------------------------------------------------
67    DISALLOW_COPY_AND_ASSIGN (UnwindMacOSXFrameBackchain);
68};
69
70#endif // lldb_UnwindMacOSXFrameBackchain_h_
71