blob: 3ee8cca88dec48a619e03e2f0478b573c637fa2c [file] [log] [blame]
Greg Claytonffc922e32011-04-25 21:05:07 +00001//===-- UnwindAssemblyInstEmulation.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 liblldb_UnwindAssemblyInstEmulation_h_
11#define liblldb_UnwindAssemblyInstEmulation_h_
12
13#include "lldb/lldb-private.h"
Greg Clayton2ed751b2011-04-26 04:39:08 +000014#include "lldb/Core/EmulateInstruction.h"
Greg Clayton7349bd92011-05-09 20:18:18 +000015#include "lldb/Core/RegisterValue.h"
Greg Claytone5b34982011-04-29 22:50:31 +000016#include "lldb/Symbol/UnwindPlan.h"
Greg Clayton7be25422011-04-25 21:14:26 +000017#include "lldb/Target/UnwindAssembly.h"
Greg Claytonffc922e32011-04-25 21:05:07 +000018
Greg Clayton7be25422011-04-25 21:14:26 +000019class UnwindAssemblyInstEmulation : public lldb_private::UnwindAssembly
Greg Claytonffc922e32011-04-25 21:05:07 +000020{
21public:
22
23 virtual
24 ~UnwindAssemblyInstEmulation ()
25 {
26 }
27
28 virtual bool
29 GetNonCallSiteUnwindPlanFromAssembly (lldb_private::AddressRange& func,
30 lldb_private::Thread& thread,
31 lldb_private::UnwindPlan& unwind_plan);
32
33 virtual bool
34 GetFastUnwindPlan (lldb_private::AddressRange& func,
35 lldb_private::Thread& thread,
36 lldb_private::UnwindPlan &unwind_plan);
37
38 // thread may be NULL in which case we only use the Target (e.g. if this is called pre-process-launch).
39 virtual bool
40 FirstNonPrologueInsn (lldb_private::AddressRange& func,
Greg Clayton1ac04c32012-02-21 00:09:25 +000041 const lldb_private::ExecutionContext &exe_ctx,
Greg Claytonffc922e32011-04-25 21:05:07 +000042 lldb_private::Address& first_non_prologue_insn);
43
Greg Clayton7be25422011-04-25 21:14:26 +000044 static lldb_private::UnwindAssembly *
Greg Claytonffc922e32011-04-25 21:05:07 +000045 CreateInstance (const lldb_private::ArchSpec &arch);
46
Greg Claytonffc922e32011-04-25 21:05:07 +000047 //------------------------------------------------------------------
48 // PluginInterface protocol
49 //------------------------------------------------------------------
50 static void
51 Initialize();
52
53 static void
54 Terminate();
55
56 static const char *
57 GetPluginNameStatic();
58
59 static const char *
60 GetPluginDescriptionStatic();
61
62 virtual const char *
63 GetPluginName();
64
65 virtual const char *
66 GetShortPluginName();
67
68 virtual uint32_t
69 GetPluginVersion();
70
71private:
Greg Clayton2ed751b2011-04-26 04:39:08 +000072
73 static size_t
74 ReadMemory (lldb_private::EmulateInstruction *instruction,
75 void *baton,
76 const lldb_private::EmulateInstruction::Context &context,
77 lldb::addr_t addr,
78 void *dst,
79 size_t length);
80
81 static size_t
82 WriteMemory (lldb_private::EmulateInstruction *instruction,
83 void *baton,
84 const lldb_private::EmulateInstruction::Context &context,
85 lldb::addr_t addr,
86 const void *dst,
87 size_t length);
88
89 static bool
90 ReadRegister (lldb_private::EmulateInstruction *instruction,
91 void *baton,
Greg Clayton7349bd92011-05-09 20:18:18 +000092 const lldb_private::RegisterInfo *reg_info,
93 lldb_private::RegisterValue &reg_value);
Greg Clayton2ed751b2011-04-26 04:39:08 +000094
95 static bool
96 WriteRegister (lldb_private::EmulateInstruction *instruction,
97 void *baton,
98 const lldb_private::EmulateInstruction::Context &context,
Greg Clayton7349bd92011-05-09 20:18:18 +000099 const lldb_private::RegisterInfo *reg_info,
100 const lldb_private::RegisterValue &reg_value);
Greg Clayton2ed751b2011-04-26 04:39:08 +0000101
Greg Claytonffc922e32011-04-25 21:05:07 +0000102
Greg Clayton31f1d2f2011-05-11 18:39:18 +0000103// size_t
104// ReadMemory (lldb_private::EmulateInstruction *instruction,
105// const lldb_private::EmulateInstruction::Context &context,
106// lldb::addr_t addr,
107// void *dst,
108// size_t length);
109
110 size_t
111 WriteMemory (lldb_private::EmulateInstruction *instruction,
112 const lldb_private::EmulateInstruction::Context &context,
113 lldb::addr_t addr,
114 const void *dst,
115 size_t length);
116
117 bool
118 ReadRegister (lldb_private::EmulateInstruction *instruction,
119 const lldb_private::RegisterInfo *reg_info,
120 lldb_private::RegisterValue &reg_value);
121
122 bool
123 WriteRegister (lldb_private::EmulateInstruction *instruction,
124 const lldb_private::EmulateInstruction::Context &context,
125 const lldb_private::RegisterInfo *reg_info,
126 const lldb_private::RegisterValue &reg_value);
127
Greg Claytonffc922e32011-04-25 21:05:07 +0000128 // Call CreateInstance to get an instance of this class
Greg Clayton2ed751b2011-04-26 04:39:08 +0000129 UnwindAssemblyInstEmulation (const lldb_private::ArchSpec &arch,
130 lldb_private::EmulateInstruction *inst_emulator) :
131 UnwindAssembly (arch),
132 m_inst_emulator_ap (inst_emulator),
133 m_range_ptr (NULL),
134 m_thread_ptr (NULL),
Greg Clayton31f1d2f2011-05-11 18:39:18 +0000135 m_unwind_plan_ptr (NULL),
136 m_curr_row (),
137 m_cfa_reg_info (),
138 m_fp_is_cfa (false),
139 m_register_values (),
140 m_pushed_regs()
Greg Claytonffc922e32011-04-25 21:05:07 +0000141 {
Greg Clayton2ed751b2011-04-26 04:39:08 +0000142 if (m_inst_emulator_ap.get())
143 {
144 m_inst_emulator_ap->SetBaton (this);
145 m_inst_emulator_ap->SetCallbacks (ReadMemory, WriteMemory, ReadRegister, WriteRegister);
146 }
Greg Claytonffc922e32011-04-25 21:05:07 +0000147 }
148
Greg Clayton2ed751b2011-04-26 04:39:08 +0000149 static uint64_t
Greg Clayton79ea8782011-04-26 23:48:45 +0000150 MakeRegisterKindValuePair (const lldb_private::RegisterInfo &reg_info);
Greg Clayton2ed751b2011-04-26 04:39:08 +0000151
152 void
Greg Clayton7349bd92011-05-09 20:18:18 +0000153 SetRegisterValue (const lldb_private::RegisterInfo &reg_info,
154 const lldb_private::RegisterValue &reg_value);
Greg Clayton2ed751b2011-04-26 04:39:08 +0000155
Greg Clayton7349bd92011-05-09 20:18:18 +0000156 bool
157 GetRegisterValue (const lldb_private::RegisterInfo &reg_info,
158 lldb_private::RegisterValue &reg_value);
Greg Clayton2ed751b2011-04-26 04:39:08 +0000159
160 std::auto_ptr<lldb_private::EmulateInstruction> m_inst_emulator_ap;
161 lldb_private::AddressRange* m_range_ptr;
162 lldb_private::Thread* m_thread_ptr;
163 lldb_private::UnwindPlan* m_unwind_plan_ptr;
Greg Claytone5b34982011-04-29 22:50:31 +0000164 lldb_private::UnwindPlan::Row m_curr_row;
Greg Clayton31f1d2f2011-05-11 18:39:18 +0000165 typedef std::map<uint64_t, uint64_t> PushedRegisterToAddrMap;
Greg Clayton7349bd92011-05-09 20:18:18 +0000166 uint64_t m_initial_sp;
Greg Clayton31f1d2f2011-05-11 18:39:18 +0000167 lldb_private::RegisterInfo m_cfa_reg_info;
168 bool m_fp_is_cfa;
Greg Clayton7349bd92011-05-09 20:18:18 +0000169 typedef std::map<uint64_t, lldb_private::RegisterValue> RegisterValueMap;
Greg Clayton2ed751b2011-04-26 04:39:08 +0000170 RegisterValueMap m_register_values;
Greg Clayton31f1d2f2011-05-11 18:39:18 +0000171 PushedRegisterToAddrMap m_pushed_regs;
Greg Claytonffc922e32011-04-25 21:05:07 +0000172};
173
174#endif // liblldb_UnwindAssemblyInstEmulation_h_