UnwindAssemblyInstEmulation.cpp revision 061b79dbf1fefaf157d414747e98a463a0f32eda
1f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//===-- UnwindAssemblyInstEmulation.cpp --------------------------*- C++ -*-===//
2f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//
3f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//                     The LLVM Compiler Infrastructure
4f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//
5f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton// This file is distributed under the University of Illinois Open Source
6f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton// License. See LICENSE.TXT for details.
7f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//
8f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//===----------------------------------------------------------------------===//
9f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
10f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "UnwindAssemblyInstEmulation.h"
11f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
12f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "llvm-c/EnhancedDisassembly.h"
13f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
14f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Core/Address.h"
15f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Core/ArchSpec.h"
16888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#include "lldb/Core/DataBufferHeap.h"
17888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#include "lldb/Core/Disassembler.h"
18888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#include "lldb/Core/Error.h"
19f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Core/PluginManager.h"
20888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#include "lldb/Core/StreamFile.h"
21f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Target/ExecutionContext.h"
22f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Target/Process.h"
23f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Target/Thread.h"
24f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Target/Target.h"
25f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
26f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonusing namespace lldb;
27f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonusing namespace lldb_private;
28f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
29f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
30f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
31f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//-----------------------------------------------------------------------------------------------
32f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//  UnwindAssemblyParser_x86 method definitions
33f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//-----------------------------------------------------------------------------------------------
34f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
35f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonbool
36888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::GetNonCallSiteUnwindPlanFromAssembly (AddressRange& range,
37888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                                   Thread& thread,
38888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                                   UnwindPlan& unwind_plan)
39f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
40888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#if 0
41888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    UnwindPlan::Row row;
42888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    UnwindPlan::Row::RegisterLocation regloc;
43888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
44888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    m_unwind_plan_sp->SetRegisterKind (eRegisterKindGeneric);
45888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    row.SetCFARegister (LLDB_REGNUM_GENERIC_FP);
46888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    row.SetCFAOffset (2 * 8);
47888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    row.SetOffset (0);
48888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
49888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    regloc.SetAtCFAPlusOffset (2 * -8);
50888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    row.SetRegisterInfo (LLDB_REGNUM_GENERIC_FP, regloc);
51888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    regloc.SetAtCFAPlusOffset (1 * -8);
52888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    row.SetRegisterInfo (LLDB_REGNUM_GENERIC_PC, regloc);
53888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    regloc.SetIsCFAPlusOffset (0);
54888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    row.SetRegisterInfo (LLDB_REGNUM_GENERIC_SP, regloc);
55888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
56888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    m_unwind_plan_sp->AppendRow (row);
57888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    m_unwind_plan_sp->SetSourceName ("x86_64 architectural default");
58888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#endif
59888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
60888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    if (range.GetByteSize() > 0 &&
61888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        range.GetBaseAddress().IsValid() &&
62888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        m_inst_emulator_ap.get())
63888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    {
64888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#if  0
65888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        Target &target = thread.GetProcess().GetTarget();
66888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        const ArchSpec &target_arch = target.GetArchitecture();
67888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        bool prefer_file_cache = true;
68888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        Error error;
69888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        DataBufferHeap data_buffer (range.GetByteSize(), 0);
70888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        if (target.ReadMemory (range.GetBaseAddress(),
71888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                               prefer_file_cache,
72888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                               data_buffer.GetBytes(),
73888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                               data_buffer.GetByteSize(),
74888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                               error) == data_buffer.GetByteSize())
75888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        {
76888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            DataExtractor data (data_buffer.GetBytes(),
77888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                data_buffer.GetByteSize(),
78888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                target_arch.GetByteOrder(),
79888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                target_arch.GetAddressByteSize());
80888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        }
81888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#endif
82888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        StreamFile strm (stdout, false);
83888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
84888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        ExecutionContext exe_ctx;
85888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        thread.CalculateExecutionContext(exe_ctx);
86888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        DisassemblerSP disasm_sp (Disassembler::DisassembleRange (m_arch,
87888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                                  NULL,
88888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                                  exe_ctx,
89888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                                  range));
90888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        if (disasm_sp)
91888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        {
92888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
93888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            m_range_ptr = ⦥
94888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            m_thread_ptr = &thread;
95888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            m_unwind_plan_ptr = &unwind_plan;
96888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
97888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            const uint32_t addr_byte_size = m_arch.GetAddressByteSize();
98888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            const bool show_address = true;
99888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            const bool show_bytes = true;
100888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            const bool raw = false;
101888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            // Initialize the stack pointer with a known value. In the 32 bit case
102888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            // it will be 0x80000000, and in the 64 bit case 0x8000000000000000.
103888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            // We use the address byte size to be safe for any future addresss sizes
104c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            RegisterInfo sp_reg_info;
105c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            m_inst_emulator_ap->GetRegisterInfo (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp_reg_info);
106061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            m_initial_sp = (1ull << ((addr_byte_size * 8) - 1));
107061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            SetRegisterValue(sp_reg_info, m_initial_sp);
108888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
109888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            const InstructionList &inst_list = disasm_sp->GetInstructionList ();
110888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            const size_t num_instructions = inst_list.GetSize();
1113063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton            if (num_instructions > 0)
112888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            {
1133063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                Instruction *inst = inst_list.GetInstructionAtIndex (0).get();
1143063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                const addr_t base_addr = inst->GetAddress().GetFileAddress();
115888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
1163063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                for (size_t idx=0; idx<num_instructions; ++idx)
1173063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                {
1183063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                    inst = inst_list.GetInstructionAtIndex (idx).get();
1193063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                    if (inst)
1203063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                    {
1213063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        m_curr_row.Clear();
1223063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        inst->Dump(&strm, inst_list.GetMaxOpcocdeByteSize (), show_address, show_bytes, &exe_ctx, raw);
1233063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        strm.EOL();
1243063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton
1253063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        m_inst_emulator_ap->SetInstruction (inst->GetOpcode(),
1263063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                                                            inst->GetAddress(),
1273063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                                                            exe_ctx.target);
1283063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        m_curr_row.SetOffset (inst->GetAddress().GetFileAddress() + inst->GetOpcode().GetByteSize() - base_addr);
1293063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton
1303063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        m_inst_emulator_ap->EvaluateInstruction (eEmulateInstructionOptionIgnoreConditions);
1313063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                    }
132888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                }
133888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            }
134888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        }
135888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    }
136f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return false;
137f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
138f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
139f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonbool
140888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::GetFastUnwindPlan (AddressRange& func,
141888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                Thread& thread,
142888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                UnwindPlan &unwind_plan)
143f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
144f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return false;
145f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
146f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
147f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonbool
148888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::FirstNonPrologueInsn (AddressRange& func,
149888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                   Target& target,
150888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                   Thread* thread,
151888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                   Address& first_non_prologue_insn)
152f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
153f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return false;
154f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
155f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
1568badcb2503ed2e2884a48f66099c1d48494817f4Greg ClaytonUnwindAssembly *
157f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::CreateInstance (const ArchSpec &arch)
158f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
159061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    std::auto_ptr<EmulateInstruction> inst_emulator_ap (EmulateInstruction::FindPlugin (arch, eInstructionTypePrologueEpilogue, NULL));
160888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    // Make sure that all prologue instructions are handled
161888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    if (inst_emulator_ap.get())
162888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        return new UnwindAssemblyInstEmulation (arch, inst_emulator_ap.release());
163f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return NULL;
164f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
165f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
166f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
167f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//------------------------------------------------------------------
168f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton// PluginInterface protocol in UnwindAssemblyParser_x86
169f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//------------------------------------------------------------------
170f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
171f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonconst char *
172f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::GetPluginName()
173f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
174f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return "UnwindAssemblyInstEmulation";
175f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
176f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
177f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonconst char *
178f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::GetShortPluginName()
179f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
180f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return "unwindassembly.inst-emulation";
181f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
182f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
183f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
184f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonuint32_t
185f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::GetPluginVersion()
186f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
187f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return 1;
188f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
189f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
190f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonvoid
191f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::Initialize()
192f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
193f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    PluginManager::RegisterPlugin (GetPluginNameStatic(),
194f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton                                   GetPluginDescriptionStatic(),
195f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton                                   CreateInstance);
196f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
197f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
198f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonvoid
199f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::Terminate()
200f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
201f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    PluginManager::UnregisterPlugin (CreateInstance);
202f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
203f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
204f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
205f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonconst char *
206f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::GetPluginNameStatic()
207f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
208f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return "UnwindAssemblyInstEmulation";
209f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
210f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
211f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonconst char *
212f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::GetPluginDescriptionStatic()
213f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
214f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return "Instruction emulation based unwind information.";
215f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
216888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
217888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
218c07d451bb046e47215bd73fda0235362cc6b1a47Greg Claytonuint64_t
219061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonUnwindAssemblyInstEmulation::MakeRegisterKindValuePair (const RegisterInfo &reg_info)
220c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton{
221c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    uint32_t reg_kind, reg_num;
222061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (EmulateInstruction::GetBestRegisterKindAndNumber (&reg_info, reg_kind, reg_num))
223c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        return (uint64_t)reg_kind << 24 | reg_num;
224c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    return 0ull;
225c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton}
226c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
227c07d451bb046e47215bd73fda0235362cc6b1a47Greg Claytonvoid
228061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonUnwindAssemblyInstEmulation::SetRegisterValue (const RegisterInfo &reg_info, const RegisterValue &reg_value)
229c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton{
230c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    m_register_values[MakeRegisterKindValuePair (reg_info)] = reg_value;
231c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton}
232c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
233061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonbool
234061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonUnwindAssemblyInstEmulation::GetRegisterValue (const RegisterInfo &reg_info, RegisterValue &reg_value)
235c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton{
236c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    const uint64_t reg_id = MakeRegisterKindValuePair (reg_info);
237c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    RegisterValueMap::const_iterator pos = m_register_values.find(reg_id);
238c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    if (pos != m_register_values.end())
239061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
240061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        reg_value = pos->second;
241061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return true; // We had a real value that comes from an opcode that wrote
242061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                     // to it...
243061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
244061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // We are making up a value that is recognizable...
245061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    reg_value.SetUInt(reg_id, reg_info.byte_size);
246061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return false;
247c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton}
248c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
249888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
250888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Claytonsize_t
251888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::ReadMemory (EmulateInstruction *instruction,
252888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                         void *baton,
253888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                         const EmulateInstruction::Context &context,
254888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                         lldb::addr_t addr,
255888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                         void *dst,
256888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                         size_t dst_len)
257888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton{
258888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    //UnwindAssemblyInstEmulation *inst_emulator = (UnwindAssemblyInstEmulation *)baton;
259c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    printf ("UnwindAssemblyInstEmulation::ReadMemory    (addr = 0x%16.16llx, dst = %p, dst_len = %zu, context = ",
260888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            addr,
261888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            dst,
262888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            dst_len);
263c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    context.Dump(stdout, instruction);
264888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    return dst_len;
265888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton}
266888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
267888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Claytonsize_t
268888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::WriteMemory (EmulateInstruction *instruction,
269888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                          void *baton,
270888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                          const EmulateInstruction::Context &context,
271888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                          lldb::addr_t addr,
272888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                          const void *dst,
273888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                          size_t dst_len)
274888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton{
2753063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton    UnwindAssemblyInstEmulation *inst_emulator = (UnwindAssemblyInstEmulation *)baton;
276888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
277888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    DataExtractor data (dst,
278888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                        dst_len,
279888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                        instruction->GetArchitecture ().GetByteOrder(),
280888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                        instruction->GetArchitecture ().GetAddressByteSize());
281888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    StreamFile strm(stdout, false);
282888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
283c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    strm.PutCString ("UnwindAssemblyInstEmulation::WriteMemory   (");
284888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    data.Dump(&strm, 0, eFormatBytes, 1, dst_len, UINT32_MAX, addr, 0, 0);
285c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    strm.PutCString (", context = ");
286c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    context.Dump(stdout, instruction);
2873063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton
2883063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton    switch (context.type)
2893063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton    {
290061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        default:
2913063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextInvalid:
2923063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextReadOpcode:
2933063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextImmediate:
2943063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextAdjustBaseRegister:
2953063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextRegisterPlusOffset:
2963063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextAdjustPC:
2973063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextRegisterStore:
2983063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextRegisterLoad:
2993063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextRelativeBranchImmediate:
3003063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextAbsoluteBranchRegister:
3013063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextSupervisorCall:
3023063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextTableBranchReadMemory:
3033063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextWriteRegisterRandomBits:
3043063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextWriteMemoryRandomBits:
3053063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextArithmetic:
3063063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextAdvancePC:
3073063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextReturnFromException:
3083063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextPopRegisterOffStack:
3093063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextAdjustStackPointer:
310061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            assert (!"unhandled case, add code to handle this!");
3113063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton            break;
3123063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton
3133063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        case EmulateInstruction::eContextPushRegisterOnStack:
3143063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton            switch (context.info_type)
3153063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton            {
3163063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                case EmulateInstruction::eInfoTypeRegisterToRegisterPlusOffset:
3173063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                    {
3183063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        UnwindPlan::Row::RegisterLocation regloc;
3193063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        const uint32_t dwarf_reg_num = context.info.RegisterToRegisterPlusOffset.data_reg.kinds[eRegisterKindDWARF];
320061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                        //const addr_t reg_cfa_offset = inst_emulator->m_curr_row.GetCFAOffset() + context.info.RegisterToRegisterPlusOffset.offset;
321061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                        regloc.SetAtCFAPlusOffset (addr - inst_emulator->m_initial_sp);
3223063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        inst_emulator->m_curr_row.SetRegisterInfo (dwarf_reg_num, regloc);
3233063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                    }
3243063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                    break;
3253063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton
3263063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                default:
3273063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                    assert (!"unhandled case, add code to handle this!");
3283063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                    break;
3293063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton            }
3303063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton            break;
3313063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton
3323063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton    }
3333063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton
334888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    return dst_len;
335888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton}
336888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
337888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Claytonbool
338888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::ReadRegister (EmulateInstruction *instruction,
339888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                           void *baton,
340061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                           const RegisterInfo *reg_info,
341061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                           RegisterValue &reg_value)
342888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton{
343061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (baton && reg_info)
344061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
345061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        UnwindAssemblyInstEmulation *inst_emulator = (UnwindAssemblyInstEmulation *)baton;
346061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        bool synthetic = inst_emulator->GetRegisterValue (*reg_info, reg_value);
347888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
348061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        StreamFile strm (stdout, false);
349061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        strm.Printf ("UnwindAssemblyInstEmulation::ReadRegister  (name = \"%s\") => synthetic_value = %i, value = ", reg_info->name, synthetic);
350061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        reg_value.Dump(&strm, reg_info, false, eFormatDefault);
351061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        strm.EOL();
352061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
353888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    return true;
354888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton}
355888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
356888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Claytonbool
357888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::WriteRegister (EmulateInstruction *instruction,
358888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                            void *baton,
359888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                            const EmulateInstruction::Context &context,
360061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                            const RegisterInfo *reg_info,
361061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                            const RegisterValue &reg_value)
362888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton{
363061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (!baton || !reg_info)
364061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return false;
365061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
366888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    UnwindAssemblyInstEmulation *inst_emulator = (UnwindAssemblyInstEmulation *)baton;
367061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    StreamFile strm (stdout, false);
368061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    strm.Printf ("UnwindAssemblyInstEmulation::WriteRegister (name = \"%s\", value = ", reg_info->name);
369061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    reg_value.Dump(&strm, reg_info, false, eFormatDefault);
370061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    strm.PutCString (", context = ");
371c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    context.Dump(stdout, instruction);
372c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
373061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    inst_emulator->SetRegisterValue (*reg_info, reg_value);
374888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
375888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    switch (context.type)
376888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    {
377061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        default:
378888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextInvalid:
379888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextReadOpcode:
380888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextImmediate:
381888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextAdjustBaseRegister:
382888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextRegisterPlusOffset:
383888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextAdjustPC:
384888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextRegisterStore:
385888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextRegisterLoad:
386888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextRelativeBranchImmediate:
387888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextAbsoluteBranchRegister:
388888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextSupervisorCall:
389888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextTableBranchReadMemory:
390888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextWriteRegisterRandomBits:
391888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextWriteMemoryRandomBits:
392c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        case EmulateInstruction::eContextArithmetic:
393888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextAdvancePC:
394888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextReturnFromException:
395888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextPushRegisterOnStack:
396061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            assert (!"unhandled case, add code to handle this!");
397888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            break;
3983063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton
399888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextPopRegisterOffStack:
4003063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton            {
4013063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                switch (context.info_type)
4023063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                {
4033063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                    case EmulateInstruction::eInfoTypeRegisterPlusOffset:
4043063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        {
405061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                            const uint32_t dwarf_reg_num = reg_info->kinds[eRegisterKindDWARF];
4063063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                            UnwindPlan::Row::RegisterLocation regloc;
4073063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                            regloc.SetSame();
4083063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                            inst_emulator->m_curr_row.SetRegisterInfo (dwarf_reg_num, regloc);
4093063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        }
4103063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        break;
4113063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton
4123063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                    default:
4133063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        assert (!"unhandled case, add code to handle this!");
4143063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                        break;
4153063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton                }
4163063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton            }
417888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            break;
418888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
419888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextAdjustStackPointer:
420061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            inst_emulator->m_curr_row.SetCFAOffset (reg_value.GetAsUInt64() - inst_emulator->m_initial_sp);
421888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            break;
422888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    }
423888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    return true;
424888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton}
425888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
426888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
427