LLDB mainline
EmulateInstruction.h
Go to the documentation of this file.
1//===-- EmulateInstruction.h ------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_CORE_EMULATEINSTRUCTION_H
10#define LLDB_CORE_EMULATEINSTRUCTION_H
11
12#include <optional>
13#include <string>
14
15#include "lldb/Core/Address.h"
16#include "lldb/Core/Opcode.h"
19#include "lldb/lldb-defines.h"
23#include "lldb/lldb-types.h"
24
25#include "llvm/Support/Error.h"
26
27#include <cstddef>
28#include <cstdint>
29
30namespace lldb_private {
32class RegisterContext;
33class RegisterValue;
34class Stream;
35class Target;
36class UnwindPlan;
38
39using BreakpointLocations = std::vector<lldb::addr_t>;
40
42public:
44 std::unique_ptr<EmulateInstruction> emulator_up)
45 : m_emulator_up{std::move(emulator_up)} {}
46
48
49 virtual llvm::Expected<unsigned>
50 GetBreakpointSize([[maybe_unused]] lldb::addr_t bp_addr) {
51 return 4;
52 }
53
55
56protected:
57 // This function retrieves the address of the next instruction as it appears
58 // in the binary file. Essentially, it reads the value of the PC register,
59 // determines the size of the current instruction (where the PC is pointing),
60 // and returns the sum of these two values.
62
64 Status &error);
65
66 std::unique_ptr<EmulateInstruction> m_emulator_up;
67 bool m_emulation_result = false;
68};
69
70/// \class EmulateInstruction EmulateInstruction.h
71/// "lldb/Core/EmulateInstruction.h"
72/// A class that allows emulation of CPU opcodes.
73///
74/// This class is a plug-in interface that is accessed through the standard
75/// static FindPlugin function call in the EmulateInstruction class. The
76/// FindPlugin takes a target triple and returns a new object if there is a
77/// plug-in that supports the architecture and OS. Four callbacks and a baton
78/// are provided. The four callbacks are read register, write register, read
79/// memory and write memory.
80///
81/// This class is currently designed for these main use cases: - Auto
82/// generation of Call Frame Information (CFI) from assembly code - Predicting
83/// single step breakpoint locations - Emulating instructions for breakpoint
84/// traps
85///
86/// Objects can be asked to read an instruction which will cause a call to the
87/// read register callback to get the PC, followed by a read memory call to
88/// read the opcode. If ReadInstruction () returns true, then a call to
89/// EmulateInstruction::EvaluateInstruction () can be made. At this point the
90/// EmulateInstruction subclass will use all of the callbacks to emulate an
91/// instruction.
92///
93/// Clients that provide the callbacks can either do the read/write
94/// registers/memory to actually emulate the instruction on a real or virtual
95/// CPU, or watch for the EmulateInstruction::Context which is context for the
96/// read/write register/memory which explains why the callback is being
97/// called. Examples of a context are: "pushing register 3 onto the stack at
98/// offset -12", or "adjusting stack pointer by -16". This extra context
99/// allows the generation of
100/// CFI information from assembly code without having to actually do
101/// the read/write register/memory.
102///
103/// Clients must be prepared that not all instructions for an Instruction Set
104/// Architecture (ISA) will be emulated.
105///
106/// Subclasses at the very least should implement the instructions that save
107/// and restore registers onto the stack and adjustment to the stack pointer.
108/// By just implementing a few instructions for an ISA that are the typical
109/// prologue opcodes, you can then generate CFI using a class that will soon
110/// be available.
111///
112/// Implementing all of the instructions that affect the PC can then allow
113/// single step prediction support.
114///
115/// Implementing all of the instructions allows for emulation of opcodes for
116/// breakpoint traps and will pave the way for "thread centric" debugging. The
117/// current debugging model is "process centric" where all threads must be
118/// stopped when any thread is stopped; when hitting software breakpoints we
119/// must disable the breakpoint by restoring the original breakpoint opcode,
120/// single stepping and restoring the breakpoint trap. If all threads were
121/// allowed to run then other threads could miss the breakpoint.
122///
123/// This class centralizes the code that usually is done in separate code
124/// paths in a debugger (single step prediction, finding save restore
125/// locations of registers for unwinding stack frame variables) and emulating
126/// the instruction is just a bonus.
127
129public:
130 static EmulateInstruction *FindPlugin(const ArchSpec &arch,
131 InstructionType supported_inst_type,
132 const char *plugin_name);
133
136 // Read an instruction opcode from memory
138
139 // Usually used for writing a register value whose source value is an
140 // immediate
142
143 // Exclusively used when saving a register to the stack as part of the
144 // prologue
146
147 // Exclusively used when restoring a register off the stack as part of the
148 // epilogue
150
151 // Add or subtract a value from the stack
153
154 // Adjust the frame pointer for the current frame
156
157 // Typically in an epilogue sequence. Copy the frame pointer back into the
158 // stack pointer, use SP for CFA calculations again.
160
161 // Add or subtract a value from a base address register (other than SP)
163
164 // Add or subtract a value from the PC or store a value to the PC.
166
167 // Used in WriteRegister callbacks to indicate where the
169
170 // Used in WriteMemory callback to indicate where the data came from
172
174
175 // Used when performing a PC-relative branch where the
177
178 // Used when performing an absolute branch where the
180
181 // Used when performing a supervisor call to an operating system to provide
182 // a service:
184
185 // Used when performing a MemU operation to read the PC-relative offset
186 // from an address.
188
189 // Used when random bits are written into a register
191
192 // Used when random bits are written to memory
194
196
198
200 };
201
218
219 struct Context {
221
222 private:
224
225 public:
226 enum InfoType GetInfoType() const { return info_type; }
229 RegisterInfo reg; // base register
230 int64_t signed_offset; // signed offset added to base register
232
237
239 RegisterInfo data_reg; // source/target register for data
240 RegisterInfo base_reg; // base register for address calculation
241 int64_t offset; // offset for address calculation
243
245 RegisterInfo base_reg; // base register for address calculation
246 RegisterInfo offset_reg; // offset register for address calculation
247 RegisterInfo data_reg; // source/target register for data
249
252 operand1; // register containing first operand for binary op
254 operand2; // register containing second operand for binary op
256
257 int64_t signed_offset; // signed offset by which to adjust self (for
258 // registers only)
259
260 RegisterInfo reg; // plain register
261
262 uint64_t unsigned_immediate; // unsigned immediate value
263 int64_t signed_immediate; // signed immediate value
264
265 lldb::addr_t address; // direct address
266
268 uint32_t isa;
269 uint32_t unsigned_data32; // immediate data
271
273 uint32_t isa;
274 int32_t signed_data32; // signed immediate data
276
277 uint32_t isa;
279 static_assert(std::is_trivial<ContextInfo>::value,
280 "ContextInfo must be trivial.");
281
282 Context() = default;
283
284 void SetRegisterPlusOffset(RegisterInfo base_reg, int64_t signed_offset) {
286 info.RegisterPlusOffset.reg = base_reg;
287 info.RegisterPlusOffset.signed_offset = signed_offset;
288 }
289
291 RegisterInfo offset_reg) {
293 info.RegisterPlusIndirectOffset.base_reg = base_reg;
294 info.RegisterPlusIndirectOffset.offset_reg = offset_reg;
295 }
296
298 RegisterInfo base_reg,
299 int64_t offset) {
301 info.RegisterToRegisterPlusOffset.data_reg = data_reg;
302 info.RegisterToRegisterPlusOffset.base_reg = base_reg;
303 info.RegisterToRegisterPlusOffset.offset = offset;
304 }
305
307 RegisterInfo offset_reg,
308 RegisterInfo data_reg) {
310 info.RegisterToRegisterPlusIndirectOffset.base_reg = base_reg;
311 info.RegisterToRegisterPlusIndirectOffset.offset_reg = offset_reg;
312 info.RegisterToRegisterPlusIndirectOffset.data_reg = data_reg;
313 }
314
316 RegisterInfo op2_reg) {
318 info.RegisterRegisterOperands.operand1 = op1_reg;
319 info.RegisterRegisterOperands.operand2 = op2_reg;
320 }
321
322 void SetOffset(int64_t signed_offset) {
324 info.signed_offset = signed_offset;
325 }
326
329 info.reg = reg;
330 }
331
332 void SetImmediate(uint64_t immediate) {
334 info.unsigned_immediate = immediate;
335 }
336
337 void SetImmediateSigned(int64_t signed_immediate) {
339 info.signed_immediate = signed_immediate;
340 }
341
342 void SetAddress(lldb::addr_t address) {
344 info.address = address;
345 }
346 void SetISAAndImmediate(uint32_t isa, uint32_t data) {
348 info.ISAAndImmediate.isa = isa;
349 info.ISAAndImmediate.unsigned_data32 = data;
350 }
351
352 void SetISAAndImmediateSigned(uint32_t isa, int32_t data) {
354 info.ISAAndImmediateSigned.isa = isa;
355 info.ISAAndImmediateSigned.signed_data32 = data;
356 }
357
358 void SetISA(uint32_t isa) {
360 info.isa = isa;
361 }
362
364
365 void Dump(Stream &s, EmulateInstruction *instruction) const;
366 };
367
368 typedef size_t (*ReadMemoryCallback)(EmulateInstruction *instruction,
369 void *baton, const Context &context,
370 lldb::addr_t addr, void *dst,
371 size_t length);
372
373 typedef size_t (*WriteMemoryCallback)(EmulateInstruction *instruction,
374 void *baton, const Context &context,
375 lldb::addr_t addr, const void *dst,
376 size_t length);
377
379 void *baton,
380 const RegisterInfo *reg_info,
381 RegisterValue &reg_value);
382
384 void *baton, const Context &context,
385 const RegisterInfo *reg_info,
386 const RegisterValue &reg_value);
387
388 // Type to represent the condition of an instruction. The UINT32 value is
389 // reserved for the unconditional case and all other value can be used in an
390 // architecture dependent way.
391 typedef uint32_t InstructionCondition;
393
394 EmulateInstruction(const ArchSpec &arch);
395
396 ~EmulateInstruction() override = default;
397
398 // Mandatory overrides
399 virtual bool
401
402 virtual bool SetTargetTriple(const ArchSpec &arch) = 0;
403
404 virtual bool ReadInstruction() = 0;
405
406 virtual std::optional<uint32_t> GetLastInstrSize() { return std::nullopt; }
407
408 virtual bool EvaluateInstruction(uint32_t evaluate_options) = 0;
409
413
414 virtual bool TestEmulation(Stream &out_stream, ArchSpec &arch,
415 OptionValueDictionary *test_data) = 0;
416
417 virtual std::optional<RegisterInfo>
418 GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num) = 0;
419
420 // Optional overrides
421 virtual bool SetInstruction(const Opcode &insn_opcode,
422 const Address &inst_addr, Target *target);
423
424 virtual bool CreateFunctionEntryUnwind(UnwindPlan &unwind_plan);
425
426 static const char *TranslateRegister(lldb::RegisterKind reg_kind,
427 uint32_t reg_num, std::string &reg_name);
428
429 // RegisterInfo variants
430 std::optional<RegisterValue> ReadRegister(const RegisterInfo &reg_info);
431
432 uint64_t ReadRegisterUnsigned(const RegisterInfo &reg_info,
433 uint64_t fail_value, bool *success_ptr);
434
435 bool WriteRegister(const Context &context, const RegisterInfo &ref_info,
436 const RegisterValue &reg_value);
437
438 bool WriteRegisterUnsigned(const Context &context,
439 const RegisterInfo &reg_info, uint64_t reg_value);
440
441 // Register kind and number variants
442 bool ReadRegister(lldb::RegisterKind reg_kind, uint32_t reg_num,
443 RegisterValue &reg_value);
444
445 bool WriteRegister(const Context &context, lldb::RegisterKind reg_kind,
446 uint32_t reg_num, const RegisterValue &reg_value);
447
448 uint64_t ReadRegisterUnsigned(lldb::RegisterKind reg_kind, uint32_t reg_num,
449 uint64_t fail_value, bool *success_ptr);
450
451 bool WriteRegisterUnsigned(const Context &context,
452 lldb::RegisterKind reg_kind, uint32_t reg_num,
453 uint64_t reg_value);
454
455 size_t ReadMemory(const Context &context, lldb::addr_t addr, void *dst,
456 size_t dst_len);
457
458 uint64_t ReadMemoryUnsigned(const Context &context, lldb::addr_t addr,
459 size_t byte_size, uint64_t fail_value,
460 bool *success_ptr);
461
462 bool WriteMemory(const Context &context, lldb::addr_t addr, const void *src,
463 size_t src_len);
464
465 bool WriteMemoryUnsigned(const Context &context, lldb::addr_t addr,
466 uint64_t uval, size_t uval_byte_size);
467
468 uint32_t GetAddressByteSize() const { return m_arch.GetAddressByteSize(); }
469
470 lldb::ByteOrder GetByteOrder() const { return m_arch.GetByteOrder(); }
471
472 const Opcode &GetOpcode() const { return m_opcode; }
473
474 lldb::addr_t GetAddress() const { return m_addr; }
475
476 const ArchSpec &GetArchitecture() const { return m_arch; }
477
478 static size_t ReadMemoryFrame(EmulateInstruction *instruction, void *baton,
479 const Context &context, lldb::addr_t addr,
480 void *dst, size_t length);
481
482 static size_t WriteMemoryFrame(EmulateInstruction *instruction, void *baton,
483 const Context &context, lldb::addr_t addr,
484 const void *dst, size_t length);
485
486 static bool ReadRegisterFrame(EmulateInstruction *instruction, void *baton,
487 const RegisterInfo *reg_info,
488 RegisterValue &reg_value);
489
490 static bool WriteRegisterFrame(EmulateInstruction *instruction, void *baton,
491 const Context &context,
492 const RegisterInfo *reg_info,
493 const RegisterValue &reg_value);
494
495 static size_t ReadMemoryDefault(EmulateInstruction *instruction, void *baton,
496 const Context &context, lldb::addr_t addr,
497 void *dst, size_t length);
498
499 static size_t WriteMemoryDefault(EmulateInstruction *instruction, void *baton,
500 const Context &context, lldb::addr_t addr,
501 const void *dst, size_t length);
502
503 static bool ReadRegisterDefault(EmulateInstruction *instruction, void *baton,
504 const RegisterInfo *reg_info,
505 RegisterValue &reg_value);
506
507 static bool WriteRegisterDefault(EmulateInstruction *instruction, void *baton,
508 const Context &context,
509 const RegisterInfo *reg_info,
510 const RegisterValue &reg_value);
511
512 void SetBaton(void *baton);
513
514 void SetCallbacks(ReadMemoryCallback read_mem_callback,
515 WriteMemoryCallback write_mem_callback,
516 ReadRegisterCallback read_reg_callback,
517 WriteRegisterCallback write_reg_callback);
518
519 void SetReadMemCallback(ReadMemoryCallback read_mem_callback);
520
521 void SetWriteMemCallback(WriteMemoryCallback write_mem_callback);
522
523 void SetReadRegCallback(ReadRegisterCallback read_reg_callback);
524
525 void SetWriteRegCallback(WriteRegisterCallback write_reg_callback);
526
527 static bool GetBestRegisterKindAndNumber(const RegisterInfo *reg_info,
528 lldb::RegisterKind &reg_kind,
529 uint32_t &reg_num);
530
531 static uint32_t GetInternalRegisterNumber(RegisterContext *reg_ctx,
532 const RegisterInfo &reg_info);
533
534 static std::unique_ptr<SingleStepBreakpointLocationsPredictor>
536 std::unique_ptr<EmulateInstruction> emulator_up);
537
538 // Helper functions
539 std::optional<lldb::addr_t> ReadPC();
540 bool WritePC(lldb::addr_t addr);
541
542protected:
544 std::function<std::unique_ptr<SingleStepBreakpointLocationsPredictor>(
545 std::unique_ptr<EmulateInstruction>)>;
546
548 void *m_baton = nullptr;
555
556private:
559 if (!m_arch.IsMIPS() && !m_arch.GetTriple().isPPC64() &&
560 !m_arch.GetTriple().isLoongArch()) {
561 // Unsupported architecture
562 return [](std::unique_ptr<EmulateInstruction> emulator_up) {
563 return nullptr;
564 };
565 }
566 return [](std::unique_ptr<EmulateInstruction> emulator_up) {
567 return std::make_unique<SingleStepBreakpointLocationsPredictor>(
568 std::move(emulator_up));
569 };
570 }
571
572 // For EmulateInstruction only
575};
576
577} // namespace lldb_private
578
579#endif // LLDB_CORE_EMULATEINSTRUCTION_H
static llvm::raw_ostream & error(Stream &strm)
static bool ReadRegisterCallback(EmulateInstruction *instruction, void *baton, const RegisterInfo *reg_info, RegisterValue &reg_value)
static size_t WriteMemoryCallback(EmulateInstruction *instruction, void *baton, const EmulateInstruction::Context &context, lldb::addr_t addr, const void *dst, size_t length)
static size_t ReadMemoryCallback(EmulateInstruction *instruction, void *baton, const EmulateInstruction::Context &context, lldb::addr_t addr, void *dst, size_t length)
static bool WriteRegisterCallback(EmulateInstruction *instruction, void *baton, const EmulateInstruction::Context &context, const RegisterInfo *reg_info, const RegisterValue &reg_value)
A section + offset based address class.
Definition Address.h:62
An architecture specification class.
Definition ArchSpec.h:31
"lldb/Core/EmulateInstruction.h" A class that allows emulation of CPU opcodes.
static bool GetBestRegisterKindAndNumber(const RegisterInfo *reg_info, lldb::RegisterKind &reg_kind, uint32_t &reg_num)
static bool WriteRegisterDefault(EmulateInstruction *instruction, void *baton, const Context &context, const RegisterInfo *reg_info, const RegisterValue &reg_value)
static size_t WriteMemoryFrame(EmulateInstruction *instruction, void *baton, const Context &context, lldb::addr_t addr, const void *dst, size_t length)
const EmulateInstruction & operator=(const EmulateInstruction &)=delete
lldb::ByteOrder GetByteOrder() const
void SetWriteRegCallback(WriteRegisterCallback write_reg_callback)
virtual bool TestEmulation(Stream &out_stream, ArchSpec &arch, OptionValueDictionary *test_data)=0
bool(* WriteRegisterCallback)(EmulateInstruction *instruction, void *baton, const Context &context, const RegisterInfo *reg_info, const RegisterValue &reg_value)
void SetCallbacks(ReadMemoryCallback read_mem_callback, WriteMemoryCallback write_mem_callback, ReadRegisterCallback read_reg_callback, WriteRegisterCallback write_reg_callback)
static bool ReadRegisterDefault(EmulateInstruction *instruction, void *baton, const RegisterInfo *reg_info, RegisterValue &reg_value)
std::optional< lldb::addr_t > ReadPC()
virtual bool CreateFunctionEntryUnwind(UnwindPlan &unwind_plan)
const ArchSpec & GetArchitecture() const
EmulateInstruction(const EmulateInstruction &)=delete
bool WriteMemoryUnsigned(const Context &context, lldb::addr_t addr, uint64_t uval, size_t uval_byte_size)
~EmulateInstruction() override=default
virtual bool SupportsEmulatingInstructionsOfType(InstructionType inst_type)=0
virtual InstructionCondition GetInstructionCondition()
virtual bool EvaluateInstruction(uint32_t evaluate_options)=0
static uint32_t GetInternalRegisterNumber(RegisterContext *reg_ctx, const RegisterInfo &reg_info)
void SetReadRegCallback(ReadRegisterCallback read_reg_callback)
std::function< std::unique_ptr< SingleStepBreakpointLocationsPredictor >( std::unique_ptr< EmulateInstruction >)> BreakpointLocationsPredictorCreator
static const InstructionCondition UnconditionalCondition
size_t ReadMemory(const Context &context, lldb::addr_t addr, void *dst, size_t dst_len)
std::optional< RegisterValue > ReadRegister(const RegisterInfo &reg_info)
size_t(* WriteMemoryCallback)(EmulateInstruction *instruction, void *baton, const Context &context, lldb::addr_t addr, const void *dst, size_t length)
static size_t ReadMemoryFrame(EmulateInstruction *instruction, void *baton, const Context &context, lldb::addr_t addr, void *dst, size_t length)
bool WriteRegister(const Context &context, const RegisterInfo &ref_info, const RegisterValue &reg_value)
bool WriteRegisterUnsigned(const Context &context, const RegisterInfo &reg_info, uint64_t reg_value)
virtual bool SetTargetTriple(const ArchSpec &arch)=0
bool WriteMemory(const Context &context, lldb::addr_t addr, const void *src, size_t src_len)
virtual std::optional< uint32_t > GetLastInstrSize()
uint64_t ReadMemoryUnsigned(const Context &context, lldb::addr_t addr, size_t byte_size, uint64_t fail_value, bool *success_ptr)
WriteRegisterCallback m_write_reg_callback
static std::unique_ptr< SingleStepBreakpointLocationsPredictor > CreateBreakpointLocationPredictor(std::unique_ptr< EmulateInstruction > emulator_up)
static size_t WriteMemoryDefault(EmulateInstruction *instruction, void *baton, const Context &context, lldb::addr_t addr, const void *dst, size_t length)
size_t(* ReadMemoryCallback)(EmulateInstruction *instruction, void *baton, const Context &context, lldb::addr_t addr, void *dst, size_t length)
void SetReadMemCallback(ReadMemoryCallback read_mem_callback)
static bool WriteRegisterFrame(EmulateInstruction *instruction, void *baton, const Context &context, const RegisterInfo *reg_info, const RegisterValue &reg_value)
static const char * TranslateRegister(lldb::RegisterKind reg_kind, uint32_t reg_num, std::string &reg_name)
static bool ReadRegisterFrame(EmulateInstruction *instruction, void *baton, const RegisterInfo *reg_info, RegisterValue &reg_value)
bool(* ReadRegisterCallback)(EmulateInstruction *instruction, void *baton, const RegisterInfo *reg_info, RegisterValue &reg_value)
virtual std::optional< RegisterInfo > GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num)=0
static size_t ReadMemoryDefault(EmulateInstruction *instruction, void *baton, const Context &context, lldb::addr_t addr, void *dst, size_t length)
virtual bool SetInstruction(const Opcode &insn_opcode, const Address &inst_addr, Target *target)
static EmulateInstruction * FindPlugin(const ArchSpec &arch, InstructionType supported_inst_type, const char *plugin_name)
virtual BreakpointLocationsPredictorCreator GetSingleStepBreakpointLocationsPredictorCreator()
uint64_t ReadRegisterUnsigned(const RegisterInfo &reg_info, uint64_t fail_value, bool *success_ptr)
void SetWriteMemCallback(WriteMemoryCallback write_mem_callback)
virtual llvm::Expected< unsigned > GetBreakpointSize(lldb::addr_t bp_addr)
std::unique_ptr< EmulateInstruction > m_emulator_up
SingleStepBreakpointLocationsPredictor(std::unique_ptr< EmulateInstruction > emulator_up)
virtual BreakpointLocations GetBreakpointLocations(Status &status)
lldb::addr_t GetBreakpointLocationAddress(lldb::addr_t entry_pc, Status &error)
An error handling class.
Definition Status.h:118
A stream class that can stream formatted output to a file.
Definition Stream.h:28
#define LLDB_INVALID_ADDRESS
#define UINT32_MAX
A class that represents a running process on the host machine.
InstructionType
Instruction types.
std::vector< lldb::addr_t > BreakpointLocations
ByteOrder
Byte ordering definitions.
uint64_t addr_t
Definition lldb-types.h:80
RegisterKind
Register numbering types.
void SetRegisterRegisterOperands(RegisterInfo op1_reg, RegisterInfo op2_reg)
void Dump(Stream &s, EmulateInstruction *instruction) const
void SetISAAndImmediate(uint32_t isa, uint32_t data)
void SetISAAndImmediateSigned(uint32_t isa, int32_t data)
void SetRegisterPlusOffset(RegisterInfo base_reg, int64_t signed_offset)
union lldb_private::EmulateInstruction::Context::ContextInfo info
void SetImmediateSigned(int64_t signed_immediate)
void SetRegisterToRegisterPlusIndirectOffset(RegisterInfo base_reg, RegisterInfo offset_reg, RegisterInfo data_reg)
void SetRegisterToRegisterPlusOffset(RegisterInfo data_reg, RegisterInfo base_reg, int64_t offset)
void SetRegisterPlusIndirectOffset(RegisterInfo base_reg, RegisterInfo offset_reg)
Every register is described in detail including its name, alternate name (optional),...
struct lldb_private::EmulateInstruction::Context::ContextInfo::ISAAndImmediateSigned ISAAndImmediateSigned
struct lldb_private::EmulateInstruction::Context::ContextInfo::RegisterRegisterOperands RegisterRegisterOperands
struct lldb_private::EmulateInstruction::Context::ContextInfo::RegisterPlusOffset RegisterPlusOffset
struct lldb_private::EmulateInstruction::Context::ContextInfo::RegisterPlusIndirectOffset RegisterPlusIndirectOffset
struct lldb_private::EmulateInstruction::Context::ContextInfo::RegisterToRegisterPlusIndirectOffset RegisterToRegisterPlusIndirectOffset
struct lldb_private::EmulateInstruction::Context::ContextInfo::RegisterToRegisterPlusOffset RegisterToRegisterPlusOffset
struct lldb_private::EmulateInstruction::Context::ContextInfo::ISAAndImmediate ISAAndImmediate