EmulateInstruction.h revision 395fc33dc4b06c048ed35047ec461bc092ef2df3
164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//===-- EmulateInstruction.h ------------------------------------*- C++ -*-===//
264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//
364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//                     The LLVM Compiler Infrastructure
464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//
564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// This file is distributed under the University of Illinois Open Source
664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// License. See LICENSE.TXT for details.
764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//
864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//===----------------------------------------------------------------------===//
964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
1064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#ifndef lldb_EmulateInstruction_h_
1164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#define lldb_EmulateInstruction_h_
1264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
1364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#include "lldb/lldb-include.h"
1431e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton#include "lldb/Core/PluginInterface.h"
155bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
165bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton//----------------------------------------------------------------------
175bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// @class EmulateInstruction EmulateInstruction.h "lldb/Core/EmulateInstruction.h"
185bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// @brief A class that allows emulation of CPU opcodes.
195bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
205bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class is a plug-in interface that is accessed through the
215bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// standard static FindPlugin function call in the EmulateInstruction
225bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// class. The FindPlugin takes a target triple and returns a new object
235bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// if there is a plug-in that supports the architecture and OS. Four
245bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// callbacks and a baton are provided. The four callbacks are read
255bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// register, write register, read memory and write memory.
265bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
275bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class is currently designed for these main use cases:
285bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Auto generation of Call Frame Information (CFI) from assembly code
295bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Predicting single step breakpoint locations
305bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Emulating instructions for breakpoint traps
315bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
325e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// Objects can be asked to read an instruction which will cause a call
335bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// to the read register callback to get the PC, followed by a read
345bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// memory call to read the opcode. If ReadInstruction () returns true,
355bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// then a call to EmulateInstruction::EvaluateInstruction () can be
365bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// made. At this point the EmulateInstruction subclass will use all of
375bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the callbacks to emulate an instruction.
385bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
395bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Clients that provide the callbacks can either do the read/write
405bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// registers/memory to actually emulate the instruction on a real or
415e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// virtual CPU, or watch for the EmulateInstruction::Context which
425bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// is context for the read/write register/memory which explains why
435bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the callback is being called. Examples of a context are:
445e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// "pushing register 3 onto the stack at offset -12", or "adjusting
455bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// stack pointer by -16". This extra context allows the generation of
465bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// CFI information from assembly code without having to actually do
475bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the read/write register/memory.
485bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
495bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Clients must be prepared that not all instructions for an
505bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Instruction Set Architecture (ISA) will be emulated.
515bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
525bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Subclasses at the very least should implement the instructions that
535bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// save and restore regiters onto the stack and adjustment to the stack
545bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// pointer. By just implementing a few instructions for an ISA that are
555bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the typical prologue opcodes, you can then generate CFI using a
565bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// class that will soon be available.
575bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
585bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Implmenting all of the instructions that affect the PC can then
595e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// allow single step prediction support.
605bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
615bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Implmenting all of the instructions allows for emulation of opcodes
625bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// for breakpoint traps and will pave the way for "thread centric"
635bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// debugging. The current debugging model is "process centric" where
645bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// all threads must be stopped when any thread is stopped since when
655bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// hitting software breakpoints once must disable the breakpoint by
665bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restoring the original breakpoint opcde, single stepping and
675bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restoring the breakpoint trap. If all threads were allowed to run
685bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// then other threads could miss the breakpoint.
695bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
705bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class centralizes the code that usually is done in separate
715bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// code paths in a debugger (single step prediction, finding save
725bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restore locations of registers for unwinding stack frame variables,
735bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// and emulating the intruction is just a bonus.
745bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton//----------------------------------------------------------------------
755bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
7664c8443d255f44267490c8c839f4a9365cf55ea7Greg Claytonnamespace lldb_private {
7764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
7831e2a388b07f337c1bf61de32a39c154f190c06eGreg Claytonclass EmulateInstruction :
7931e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton    public PluginInterface
8064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton{
8131e2a388b07f337c1bf61de32a39c154f190c06eGreg Claytonpublic:
8231e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton
8352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    static EmulateInstruction*
84395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton    FindPlugin (const ArchSpec &arch, const char *plugin_name);
8531e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton
8664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    enum ContextType
8764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
8864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextInvalid = 0,
895bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Read an instruciton opcode from memory
9064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextReadOpcode,
915bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
925bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Usually used for writing a register value whose source value in an
935bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // immediate
9464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextImmediate,
955bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
965bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Exclusively used when saving a register to the stack as part of the
975bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // prologue
985bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // arg0 = register kind
995bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // arg1 = register number
1005bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // arg2 = signed offset from current SP value where register is being
1015bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        //        stored
10264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextPushRegisterOnStack,
1035bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
104ef85e9162b61fa40ff9d3c9e32476e53cc94aac1Johnny Chen        // Exclusively used when restoring a register off the stack as part of
1055bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // the epilogue
1065bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // arg0 = register kind
1075bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // arg1 = register number
1085bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // arg2 = signed offset from current SP value where register is being
1095bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        //        restored
1105bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        eContextPopRegisterOffStack,
1115bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
1125bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Add or subtract a value from the stack
1135bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // arg0 = register kind for SP
1145bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // arg1 = register number for SP
1155bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // arg2 = signed offset being applied to the SP value
11664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextAdjustStackPointer,
117fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice
118fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // Add or subtract a value from a base address register (other than SP)
119fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // arg0 = register kind for base register
120fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // arg1 = register number of base register
121fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // arg2 = signed offset being applied to base register
122fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        eContextAdjustBaseRegister,
1235bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
1245bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Used in WriteRegister callbacks to indicate where the
1255bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // arg0 = source register kind
1265bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // arg1 = source register number
1275bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // arg2 = source signed offset
12864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextRegisterPlusOffset,
1299b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen
130fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // Used in WriteMemory callback to indicate where the data came from
131fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // arg0 = register kind
132fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // arg1 = register number (register being stored)
133fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // arg2 = address of store
134fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        eContextRegisterStore,
135fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice
1369b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        // Used when performing a PC-relative branch where the
1379b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        // arg0 = don't care
1389dd30d0b56d859a0ca600760e46b74a6b674672dJohnny Chen        // arg1 = imm32 (signed offset)
1399dd30d0b56d859a0ca600760e46b74a6b674672dJohnny Chen        // arg2 = target instruction set or don't care
1409b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        eContextRelativeBranchImmediate,
1419b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen
1429b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        // Used when performing an absolute branch where the
1439b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        // arg0 = target register kind
1449b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        // arg1 = target register number
1459b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        // arg2 = target instruction set or don't care
1469b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        eContextAbsoluteBranchRegister,
147b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen
148b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen        // Used when performing a supervisor call to an operating system to
149b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen        // provide a service:
150b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen        // arg0 = current instruction set or don't care
151b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen        // arg1 = immediate data or don't care
152b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen        // arg2 = don't care
153713c2665a27096b68f3f8956222375354f1292f8Caroline Tice        eContextSupervisorCall,
154713c2665a27096b68f3f8956222375354f1292f8Caroline Tice
155713c2665a27096b68f3f8956222375354f1292f8Caroline Tice        // Used when random bits are written into a register
156713c2665a27096b68f3f8956222375354f1292f8Caroline Tice        // arg0 = target register kind
157713c2665a27096b68f3f8956222375354f1292f8Caroline Tice        // arg1 = target register number
158713c2665a27096b68f3f8956222375354f1292f8Caroline Tice        // arg2 = don't care
159fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        eContextWriteRegisterRandomBits,
160fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice
161fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // Used when random bits are written to memory
162fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // arg0 = target memory address
163fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // arg1 = don't care
164fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // arg2 = don't care
165fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        eContextWriteMemoryRandomBits
16664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
16764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
1689bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    enum InfoType {
1699bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegisterPlusOffset,
1709bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegisterPlusIndirectOffset,
1719bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegisterToRegisterPlusOffset,
1729bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeOffset,
1739bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegister,
1749bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeImmediate,
1759bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeImmediateSigned,
1769bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeAddress,
1779bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeModeAndImmediate,
1789bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeModeAndImmediateSigned,
179668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen        eInfoTypeMode,
1809bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeNoArgs
1819bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    } InfoType;
1829bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
1839bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    struct Register
1849bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    {
1859bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        uint32_t kind;
1869bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        uint32_t num;
1879bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
1889bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
1899bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
1909bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetRegister (uint32_t reg_kind, uint32_t reg_num)
1919bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
1929bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            kind = reg_kind;
1939bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            num = reg_num;
1949bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
1959bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    };
1969bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
19764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    struct Context
19864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
19964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        ContextType type;
2009bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        enum InfoType info_type;
2019bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        union
2029bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2039bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct RegisterPlusOffset
2049bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
2059bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                Register reg;          // base register
2069bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                int64_t signed_offset; // signed offset added to base register
2079bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } RegisterPlusOffset;
2089bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2099bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct RegisterPlusIndirectOffset
2109bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
2119bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                Register base_reg;    // base register number
2129bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                Register offset_reg;  // offset register kind
2139bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } RegisterPlusIndirectOffset;
2149bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2159bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct RegisterToRegisterPlusOffset
2169bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
2179bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                Register data_reg;  // source/target register for data
2189bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                Register base_reg;  // base register for address calculation
2199bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                int64_t offset;     // offset for address calculation
2209bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } RegisterToRegisterPlusOffset;
2219bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2229bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            int64_t signed_offset; // signed offset by which to adjust self (for registers only)
2239bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2249bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            Register reg;          // plain register
2259bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2269bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            uint64_t immediate;    // immediate value
2279bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2289bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            int64_t signed_immediate; // signed immediate value
2299bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2309bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            lldb::addr_t address;        // direct address
2319bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2329bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct ModeAndImmediate
2339bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
2349bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                uint32_t mode;        // eModeARM or eModeThumb
235668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen                uint32_t data_value;  // immdiate data
2369bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } ModeAndImmediate;
2379bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2389bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct ModeAndImmediateSigned
2399bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
2409bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                uint32_t mode;             // eModeARM or eModeThumb
2419bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                int32_t signed_data_value; // signed immdiate data
2429bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } ModeAndImmediateSigned;
2439bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
244668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen            uint32_t mode;         // eModeARM or eModeThumb
2459bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2469bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        } info;
2479bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2489bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
2499bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetRegisterPlusOffset (Register base_reg,
2509bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                               int64_t signed_offset)
2519bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2529bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegisterPlusOffset;
2539bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusOffset.reg = base_reg;
2549bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusOffset.signed_offset = signed_offset;
2559bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2569bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2579bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
2589bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetRegisterPlusIndirectOffset (Register base_reg,
2599bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                                       Register offset_reg)
2609bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2619bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegisterPlusIndirectOffset;
2629bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusIndirectOffset.base_reg   = base_reg;
2639bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusIndirectOffset.offset_reg = offset_reg;
2649bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2659bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2669bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
2679bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetRegisterToRegisterPlusOffset (Register data_reg,
2689bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                                         Register base_reg,
2699bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                                         int64_t offset)
2709bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2719bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegisterToRegisterPlusOffset;
2729bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterToRegisterPlusOffset.data_reg = data_reg;
2739bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterToRegisterPlusOffset.base_reg = base_reg;
2749bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterToRegisterPlusOffset.offset   = offset;
2759bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2769bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2779bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
2789bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetOffset (int64_t signed_offset)
2799bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2809bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeOffset;
2819bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.signed_offset = signed_offset;
2829bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2839bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2849bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
2859bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetRegister (Register reg)
2869bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2879bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegister;
2889bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.reg = reg;
2899bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2909bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2919bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
2929bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetImmediate (uint64_t immediate)
2939bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2949bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeImmediate;
2959bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.immediate = immediate;
2969bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2979bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2989bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
2999bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetImmediateSigned (int64_t signed_immediate)
3009bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3019bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeImmediateSigned;
3029bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.signed_immediate = signed_immediate;
3039bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3049bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3059bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3069bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetAddress (lldb::addr_t address)
3079bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3089bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeAddress;
3099bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.address = address;
3109bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3119bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3129bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetModeAndImmediate (uint32_t mode, uint32_t data_value)
3139bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3149bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeModeAndImmediate;
3159bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.ModeAndImmediate.mode = mode;
3169bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.ModeAndImmediate.data_value = data_value;
3179bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3189bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3199bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3209bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetModeAndImmediateSigned (uint32_t mode, int32_t signed_data_value)
3219bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3229bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeModeAndImmediateSigned;
3239bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.ModeAndImmediateSigned.mode = mode;
3249bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.ModeAndImmediateSigned.signed_data_value = signed_data_value;
3259bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3269bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3279bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
328668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen        SetMode (uint32_t mode)
3299bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
330668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen            info_type = eInfoTypeMode;
331668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen            info.mode = mode;
3329bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3339bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3349bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3359bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetNoArgs ()
3369bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3379bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeNoArgs;
3389bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3399bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
34064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
34164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
34264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    union Opcode
34364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
34464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        uint8_t inst8;
34564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        uint16_t inst16;
34664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        uint32_t inst32;
34764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        uint64_t inst64;
34864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        union inst
34964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        {
35064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton            uint8_t bytes[16];
35164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton            uint8_t length;
35264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        };
35364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
35464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
35564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    enum OpcodeType
35664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
35764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eOpcode8,
35864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eOpcode16,
35964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eOpcode32,
36064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eOpcode64,
36117f5afe9ed10bda3efbce0f26cf0c030331f8b15Greg Clayton        eOpcodeBytes
36264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
36364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
36464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    struct Instruction
36564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
36664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        OpcodeType opcode_type;
36764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        Opcode opcode;
36864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
36964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
37064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    typedef size_t (*ReadMemory) (void *baton,
37164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                  const Context &context,
37264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                  lldb::addr_t addr,
37364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                  void *dst,
37464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                  size_t length);
37564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
37664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    typedef size_t (*WriteMemory) (void *baton,
37764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                   const Context &context,
37864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                   lldb::addr_t addr,
37964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                   const void *dst,
38064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                   size_t length);
38164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
38264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    typedef bool   (*ReadRegister)  (void *baton,
38364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint32_t reg_kind,
38464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint32_t reg_num,
38564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint64_t &reg_value);
38664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
38764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    typedef bool   (*WriteRegister) (void *baton,
38864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     const Context &context,
38964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint32_t reg_kind,
39064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint32_t reg_num,
39164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint64_t reg_value);
39264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
39364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    EmulateInstruction (lldb::ByteOrder byte_order,
39464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        uint32_t addr_byte_size,
39564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        void *baton,
39664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        ReadMemory read_mem_callback,
39764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        WriteMemory write_mem_callback,
39864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        ReadRegister read_reg_callback,
39964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        WriteRegister write_reg_callback);
40064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
40164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    virtual ~EmulateInstruction()
40264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
40364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
40464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
40531e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton    virtual bool
406395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton    SetTargetTriple (const ArchSpec &arch) = 0;
40731e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton
40864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    virtual bool
40964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadInstruction () = 0;
41064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
41164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    virtual bool
41264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    EvaluateInstruction () = 0;
41364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
41464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint64_t
41564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadRegisterUnsigned (uint32_t reg_kind,
41664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                          uint32_t reg_num,
41764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                          uint64_t fail_value,
41864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                          bool *success_ptr);
41964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
42064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    bool
42164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    WriteRegisterUnsigned (const Context &context,
42264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                           uint32_t reg_kind,
42364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                           uint32_t reg_num,
42464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                           uint64_t reg_value);
42564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
42664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint64_t
42764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadMemoryUnsigned (const Context &context,
42864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        lldb::addr_t addr,
42964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        size_t byte_size,
43064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        uint64_t fail_value,
43164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        bool *success_ptr);
43264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
43364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    bool
43464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    WriteMemoryUnsigned (const Context &context,
43564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                         lldb::addr_t addr,
43664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                         uint64_t uval,
43764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                         size_t uval_byte_size);
43864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
43964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint32_t
44064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    GetAddressByteSize () const
44164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
44264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        return m_addr_byte_size;
44364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
44464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
44564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    lldb::ByteOrder
44664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    GetByteOrder () const
44764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
44864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        return m_byte_order;
44964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
45064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
45164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint64_t
45264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    OpcodeAsUnsigned (bool *success_ptr)
45364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
45464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        if (success_ptr)
45564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton            *success_ptr = true;
45664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        switch (m_inst.opcode_type)
45764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        {
45864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eOpcode8:   return m_inst.opcode.inst8;
45964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eOpcode16:  return m_inst.opcode.inst16;
46064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eOpcode32:  return m_inst.opcode.inst32;
46164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eOpcode64:  return m_inst.opcode.inst64;
46264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eOpcodeBytes:
46364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton            break;
46464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        }
46564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        if (success_ptr)
46664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton            *success_ptr = false;
46764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        return 0;
46864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
46964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
47064c8443d255f44267490c8c839f4a9365cf55ea7Greg Claytonprotected:
47164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    lldb::ByteOrder     m_byte_order;
47264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint32_t            m_addr_byte_size;
47364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    void *              m_baton;
47464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadMemory          m_read_mem_callback;
47564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    WriteMemory         m_write_mem_callback;
47664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadRegister        m_read_reg_callback;
47764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    WriteRegister       m_write_reg_callback;
47864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
47964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    lldb::addr_t m_inst_pc;
48064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    Instruction m_inst;
48164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    //------------------------------------------------------------------
48264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    // For EmulateInstruction only
48364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    //------------------------------------------------------------------
48464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    DISALLOW_COPY_AND_ASSIGN (EmulateInstruction);
48564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton};
48664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
48764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton}   // namespace lldb_private
48864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
48964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#endif  // lldb_EmulateInstruction_h_
490