11#include "llvm/ADT/STLExtras.h"
12#include "llvm/TargetParser/Triple.h"
36#include "clang/AST/ASTContext.h"
37#include "clang/AST/Attr.h"
38#include "clang/AST/Decl.h"
40#define DECLARE_REGISTER_INFOS_PPC64_STRUCT
42#undef DECLARE_REGISTER_INFOS_PPC64_STRUCT
44#define DECLARE_REGISTER_INFOS_PPC64LE_STRUCT
46#undef DECLARE_REGISTER_INFOS_PPC64LE_STRUCT
57 count = std::size(g_register_infos_ppc64le);
58 return g_register_infos_ppc64le;
60 count = std::size(g_register_infos_ppc64);
61 return g_register_infos_ppc64;
84 llvm::ArrayRef<addr_t> args)
const {
89 s.
Printf(
"ABISysV_ppc64::PrepareTrivialCall (tid = 0x%" PRIx64
90 ", sp = 0x%" PRIx64
", func_addr = 0x%" PRIx64
91 ", return_addr = 0x%" PRIx64,
92 thread.
GetID(), (uint64_t)
sp, (uint64_t)func_addr,
93 (uint64_t)return_addr);
95 for (
size_t i = 0; i < args.size(); ++i)
96 s.
Printf(
", arg%" PRIu64
" = 0x%" PRIx64,
static_cast<uint64_t
>(i + 1),
111 for (
size_t i = 0; i < args.size(); ++i) {
114 LLDB_LOGF(log,
"About to write arg%" PRIu64
" (0x%" PRIx64
") into %s",
115 static_cast<uint64_t
>(i + 1), args[i], reg_info->
name);
122 LLDB_LOGF(log,
"16-byte aligning SP: 0x%" PRIx64
" to 0x%" PRIx64,
123 (uint64_t)
sp, (uint64_t)(
sp & ~0xfull));
143 "Pushing the return address onto the stack: 0x%" PRIx64
145 (uint64_t)
sp, (uint64_t)return_addr);
146 if (!process_sp->WritePointerToMemory(
sp + 16, return_addr,
error))
150 LLDB_LOGF(log,
"Writing LR: 0x%" PRIx64, (uint64_t)return_addr);
155 LLDB_LOGF(log,
"Writing R12: 0x%" PRIx64, (uint64_t)func_addr);
163 uint64_t stack_offset;
169 LLDB_LOGF(log,
"Writing R2 (TOC) at SP(0x%" PRIx64
")+%d: 0x%" PRIx64,
170 (uint64_t)(
sp + stack_offset), (
int)stack_offset,
171 (uint64_t)reg_value);
172 if (!process_sp->WritePointerToMemory(
sp + stack_offset, reg_value,
error))
179 LLDB_LOGF(log,
"Writing SP at SP(0x%" PRIx64
")+0: 0x%" PRIx64, (uint64_t)
sp,
180 (uint64_t)reg_value);
181 if (!process_sp->WritePointerToMemory(
sp, reg_value,
error))
185 LLDB_LOGF(log,
"Writing SP: 0x%" PRIx64, (uint64_t)
sp);
192 LLDB_LOGF(log,
"Writing IP: 0x%" PRIx64, (uint64_t)func_addr);
201 bool is_signed,
Thread &thread,
202 uint32_t *argument_register_ids,
203 unsigned int ¤t_argument_register,
204 addr_t ¤t_stack_argument) {
208 if (current_argument_register < 6) {
210 argument_register_ids[current_argument_register], 0);
211 current_argument_register++;
215 uint32_t byte_size = (bit_width + (8 - 1)) / 8;
217 if (thread.
GetProcess()->ReadScalarIntegerFromMemory(
218 current_stack_argument, byte_size, is_signed, scalar,
error)) {
219 current_stack_argument += byte_size;
228 unsigned int num_values = values.
GetSize();
229 unsigned int value_index;
246 uint64_t stack_offset;
253 addr_t current_stack_argument =
sp + stack_offset;
254 uint32_t argument_register_ids[8];
256 for (
size_t i = 0; i < 8; ++i) {
257 argument_register_ids[i] =
264 unsigned int current_argument_register = 0;
266 for (value_index = 0; value_index < num_values; ++value_index) {
275 std::optional<uint64_t> bit_size = compiler_type.
GetBitSize(&thread);
282 argument_register_ids, current_argument_register,
283 current_stack_argument);
286 argument_register_ids, current_argument_register,
287 current_stack_argument);
298 error.SetErrorString(
"Empty value object for return value.");
302 CompilerType compiler_type = new_value_sp->GetCompilerType();
303 if (!compiler_type) {
304 error.SetErrorString(
"Null clang type for return value.");
308 Thread *thread = frame_sp->GetThread().get();
316 bool set_it_simple =
false;
323 size_t num_bytes = new_value_sp->GetData(data, data_error);
324 if (data_error.
Fail()) {
325 error.SetErrorStringWithFormat(
326 "Couldn't convert return value to raw data: %s",
331 if (num_bytes <= 8) {
332 uint64_t raw_value = data.
GetMaxU64(&offset, num_bytes);
335 set_it_simple =
true;
337 error.SetErrorString(
"We don't support returning longer than 64 bit "
338 "integer values at present.");
342 error.SetErrorString(
343 "We don't support returning complex values at present");
345 std::optional<uint64_t> bit_width =
348 error.SetErrorString(
"can't get size of type");
351 if (*bit_width <= 64) {
354 size_t num_bytes = new_value_sp->GetData(data, data_error);
355 if (data_error.
Fail()) {
356 error.SetErrorStringWithFormat(
357 "Couldn't convert return value to raw data: %s",
362 unsigned char buffer[16];
366 set_it_simple =
true;
369 error.SetErrorString(
370 "We don't support returning float values > 64 bits at present");
375 if (!set_it_simple) {
379 error.SetErrorString(
"We only support setting simple integer and float "
380 "return types at present.");
392#define LOG_PREFIX "ReturnValueExtractor: "
394class ReturnValueExtractor {
413 : m_index(index), m_offs(offs %
sizeof(uint64_t)),
414 m_avail(
sizeof(uint64_t) - m_offs), m_type(ty), m_reg_ctx(reg_ctx),
415 m_byte_order(byte_order) {}
420 : Register(ty, index, 0, reg_ctx, byte_order) {}
424 : Register(
GPR, offs /
sizeof(uint64_t), offs, reg_ctx, byte_order) {}
426 uint32_t Index()
const {
return m_index; }
429 uint32_t Offs()
const {
return m_offs; }
432 uint32_t Avail()
const {
return m_avail; }
434 bool IsValid()
const {
437 "No more than 8 registers should be used to return values");
445 return (
"r" + llvm::Twine(m_index + 3)).str();
447 return (
"f" + llvm::Twine(m_index + 1)).str();
451 bool GetRawData(uint64_t &raw_data) {
453 m_reg_ctx->GetRegisterInfoByName(
GetName());
460 if (!m_reg_ctx->ReadRegister(reg_info, reg_val)) {
467 *reg_info, &raw_data,
sizeof(raw_data), m_byte_order,
error);
468 if (rc !=
sizeof(raw_data)) {
483 Log *m_log =
GetLog(LLDBLog::Expressions);
486 Register GetGPR(uint32_t index)
const {
487 return Register(Register::GPR, index, m_reg_ctx, m_byte_order);
490 Register GetFPR(uint32_t index)
const {
491 return Register(Register::FPR, index, m_reg_ctx, m_byte_order);
494 Register GetGPRByOffs(uint32_t offs)
const {
495 return Register(offs, m_reg_ctx, m_byte_order);
500 static llvm::Expected<ReturnValueExtractor> Create(
Thread &thread,
505 "Failed to get RegisterContext");
509 return llvm::createStringError(
LOG_PREFIX "GetProcess() failed");
511 return ReturnValueExtractor(thread, type, reg_ctx, process_sp);
516 const uint32_t type_flags = m_type.GetTypeInfo();
521 if (type_flags & eTypeIsScalar) {
522 if (type_flags & eTypeIsInteger) {
523 value_sp = GetIntegerValue(0);
524 }
else if (type_flags & eTypeIsFloat) {
525 if (type_flags & eTypeIsComplex) {
529 value_sp = GetFloatValue(m_type, 0);
532 }
else if (type_flags & eTypeIsPointer) {
533 value_sp = GetPointerValue(0);
538 m_thread.GetStackFrameAtIndex(0).get(), *value_sp,
ConstString(
""));
539 }
else if (type_flags & eTypeIsVector) {
540 valobj_sp = GetVectorValueObject();
541 }
else if (type_flags & eTypeIsStructUnion || type_flags & eTypeIsClass) {
542 valobj_sp = GetStructValueObject();
552 uint64_t m_byte_size;
553 std::unique_ptr<DataBufferHeap> m_data_up;
554 int32_t m_src_offs = 0;
555 int32_t m_dst_offs = 0;
556 bool m_packed =
false;
557 Log *m_log =
GetLog(LLDBLog::Expressions);
561 uint32_t m_addr_size;
568 : m_thread(thread), m_type(type),
569 m_byte_size(m_type.
GetByteSize(&thread).value_or(0)),
570 m_data_up(
new DataBufferHeap(m_byte_size, 0)), m_reg_ctx(reg_ctx),
571 m_process_sp(process_sp), m_byte_order(process_sp->GetByteOrder()),
573 process_sp->GetTarget().GetArchitecture().GetAddressByteSize()) {}
578 value_sp->SetCompilerType(type);
579 value_sp->SetValueType(Value::ValueType::Scalar);
584 ValueSP GetIntegerValue(uint32_t reg_index) {
586 auto reg = GetGPR(reg_index);
587 if (!reg.GetRawData(raw_value))
591 ValueSP value_sp(NewScalarValue(m_type));
594 bool is_signed = (type_flags & eTypeIsSigned) != 0;
596 switch (m_byte_size) {
597 case sizeof(uint64_t):
599 value_sp->GetScalar() = (int64_t)(raw_value);
601 value_sp->GetScalar() = (uint64_t)(raw_value);
604 case sizeof(uint32_t):
606 value_sp->GetScalar() = (int32_t)(raw_value &
UINT32_MAX);
608 value_sp->GetScalar() = (uint32_t)(raw_value &
UINT32_MAX);
611 case sizeof(uint16_t):
613 value_sp->GetScalar() = (int16_t)(raw_value & UINT16_MAX);
615 value_sp->GetScalar() = (uint16_t)(raw_value & UINT16_MAX);
618 case sizeof(uint8_t):
620 value_sp->GetScalar() = (int8_t)(raw_value & UINT8_MAX);
622 value_sp->GetScalar() = (uint8_t)(raw_value & UINT8_MAX);
626 llvm_unreachable(
"Invalid integer size");
635 auto reg = GetFPR(reg_index);
636 if (!reg.GetRawData(raw_data))
640 ValueSP value_sp(NewScalarValue(type));
642 DataExtractor de(&raw_data,
sizeof(raw_data), m_byte_order, m_addr_size);
645 std::optional<uint64_t> byte_size = type.
GetByteSize(m_process_sp.get());
648 switch (*byte_size) {
650 value_sp->GetScalar() = (float)de.
GetDouble(&offset);
654 value_sp->GetScalar() = de.
GetDouble(&offset);
658 llvm_unreachable(
"Invalid floating point size");
665 ValueSP GetPointerValue(uint32_t reg_index) {
667 auto reg = GetGPR(reg_index);
668 if (!reg.GetRawData(raw_data))
672 ValueSP value_sp(NewScalarValue(m_type));
673 value_sp->GetScalar() = raw_data;
687 const uint32_t MAX_VRS = 2;
697 const uint32_t vr_size = vr[0]->
byte_size;
699 if (m_byte_size > 2 * vr_size) {
702 "Returning vectors that don't fit in 2 VR regs is not supported");
707 if (m_byte_size > vr_size) {
721 std::unique_ptr<DataBufferHeap> vr_data(
724 for (uint32_t i = 0; i < vrs; i++) {
729 if (!vr_val[i].GetAsMemoryData(*vr[i], vr_data->GetBytes() + i * vr_size,
730 vr_size, m_byte_order,
error)) {
740 if (m_byte_size < vr_size)
741 offs = vr_size - m_byte_size;
744 memcpy(m_data_up->GetBytes(), vr_data->GetBytes() + offs, m_byte_size);
745 return BuildValueObject();
751 if (m_byte_size > 2 *
sizeof(uint64_t)) {
753 auto reg = GetGPR(0);
754 if (!reg.GetRawData(addr))
758 size_t rc = m_process_sp->ReadMemory(addr, m_data_up->GetBytes(),
760 if (rc != m_byte_size) {
764 return BuildValueObject();
768 const bool omit_empty_base_classes =
true;
769 auto n_or_err = m_type.
GetNumChildren(omit_empty_base_classes,
nullptr);
774 uint32_t n = *n_or_err;
784 std::optional<uint64_t> elem_size =
788 if (type_flags & eTypeIsComplex || !(type_flags & eTypeIsFloat)) {
790 LOG_PREFIX "Unexpected type found in homogeneous aggregate");
794 for (uint32_t i = 0; i < n; i++) {
795 ValueSP val_sp = GetFloatValue(elem_type, i);
801 size_t rc = val_sp->GetScalar().GetAsMemoryData(
802 m_data_up->GetBytes() + m_dst_offs, *elem_size, m_byte_order,
804 if (rc != *elem_size) {
808 m_dst_offs += *elem_size;
810 return BuildValueObject();
821 auto attrs = record_decl->attrs();
822 for (
const auto &attr : attrs) {
823 if (attr->getKind() == clang::attr::Packed) {
832 m_packed ?
"packed" :
"not packed");
834 for (uint32_t i = 0; i < n; i++) {
837 (void)GetChildType(i, name, size);
842 if (!ExtractField(size))
846 return BuildValueObject();
850 bool ExtractFromRegs(int32_t offs, uint32_t size,
void *buf) {
852 auto reg = GetGPRByOffs(offs);
856 uint32_t n = std::min(reg.Avail(), size);
859 if (!reg.GetRawData(raw_data))
862 memcpy(buf, (
char *)&raw_data + reg.Offs(), n);
865 buf = (
char *)buf + n;
871 bool ExtractField(uint32_t size) {
872 auto reg = GetGPRByOffs(m_src_offs);
878 uint32_t n = m_src_offs % size;
883 LOG_PREFIX "Extracting {0} alignment bytes at offset {1}", n,
886 if (!ExtractFromRegs(m_src_offs, n, m_data_up->GetBytes() + m_dst_offs))
896 if (!ExtractFromRegs(m_src_offs, size, m_data_up->GetBytes() + m_dst_offs))
904 llvm::Expected<CompilerType> GetChildType(uint32_t i, std::string &name,
907 const bool transparent_pointers =
false;
908 const bool omit_empty_base_classes =
true;
909 const bool ignore_array_bounds =
false;
912 uint32_t child_bitfield_bit_size;
913 uint32_t child_bitfield_bit_offset;
914 bool child_is_base_class;
915 bool child_is_deref_of_parent;
917 uint64_t language_flags;
922 &exe_ctx, i, transparent_pointers, omit_empty_base_classes,
923 ignore_array_bounds, name, size, child_offs, child_bitfield_bit_size,
924 child_bitfield_bit_offset, child_is_base_class,
925 child_is_deref_of_parent, valobj, language_flags);
939 auto exp_extractor = ReturnValueExtractor::Create(thread, type);
940 if (!exp_extractor) {
943 "Extracting return value failed: {0}");
947 return exp_extractor.get().GetValue();
976 row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0);
979 row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num,
true);
1009 const int32_t ptr_size = 8;
1010 row->SetUnspecifiedRegistersAreUndefined(
true);
1011 row->GetCFAValue().SetIsRegisterDereferenced(sp_reg_num);
1013 row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * 2,
true);
1014 row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0,
true);
1015 row->SetRegisterLocationToAtCFAPlusOffset(cr_reg_num, ptr_size,
true);
1044 const char *name = reg_info->
name;
1045 if (name[0] ==
'r') {
1046 if ((name[1] ==
'1' || name[1] ==
'2') && name[2] ==
'\0')
1048 if (name[1] ==
'1' && name[2] >
'2')
1050 if ((name[1] ==
'2' || name[1] ==
'3') && name[2] !=
'\0')
1054 if (name[0] ==
'f' && name[1] >=
'0' && name[2] <=
'9') {
1055 if (name[2] ==
'\0')
1057 if (name[1] ==
'1' && name[2] >=
'4')
1059 if ((name[1] ==
'2' || name[1] ==
'3') && name[2] !=
'\0')
1063 if (name[0] ==
's' && name[1] ==
'p' && name[2] ==
'\0')
1065 if (name[0] ==
'f' && name[1] ==
'p' && name[2] ==
'\0')
1067 if (name[0] ==
'p' && name[1] ==
'c' && name[2] ==
'\0')
static bool ReadIntegerArgument(Scalar &scalar, unsigned int bit_width, bool is_signed, Thread &thread, uint32_t *argument_register_ids, unsigned int ¤t_argument_register, addr_t ¤t_stack_argument)
static bool ReadIntegerArgument(Scalar &scalar, unsigned int bit_width, bool is_signed, Thread &thread, uint32_t *argument_register_ids, unsigned int ¤t_argument_register, addr_t ¤t_stack_argument)
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
#define LLDB_PLUGIN_DEFINE(PluginName)
static llvm::StringRef GetName(XcodeSDK::Type type)
static lldb::ABISP CreateInstance(lldb::ProcessSP process_sp, const lldb_private::ArchSpec &arch)
bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info)
bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override
bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override
lldb_private::Status SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value) override
bool GetArgumentValues(lldb_private::Thread &thread, lldb_private::ValueList &values) const override
bool CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override
const lldb_private::RegisterInfo * GetRegisterInfoArray(uint32_t &count) override
lldb::ValueObjectSP GetReturnValueObjectImpl(lldb_private::Thread &thread, lldb_private::CompilerType &type) const override
lldb::ValueObjectSP GetReturnValueObjectSimple(lldb_private::Thread &thread, lldb_private::CompilerType &ast_type) const
bool PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp, lldb::addr_t functionAddress, lldb::addr_t returnAddress, llvm::ArrayRef< lldb::addr_t > args) const override
lldb::ByteOrder GetByteOrder() const
size_t GetRedZoneSize() const override
static llvm::StringRef GetPluginNameStatic()
static std::unique_ptr< llvm::MCRegisterInfo > MakeMCRegisterInfo(const ArchSpec &arch)
Utility function to construct a MCRegisterInfo using the ArchSpec triple.
lldb::ProcessSP GetProcessSP() const
Request to get a Process shared pointer.
An architecture specification class.
llvm::Triple & GetTriple()
Architecture triple accessor.
std::shared_ptr< TypeSystemType > dyn_cast_or_null()
Return a shared_ptr<TypeSystemType> if dyn_cast succeeds.
Generic representation of a type in a programming language.
TypeSystemSPWrapper GetTypeSystem() const
Accessors.
std::optional< uint64_t > GetByteSize(ExecutionContextScope *exe_scope) const
Return the size of the type in bytes.
uint32_t IsHomogeneousAggregate(CompilerType *base_type_ptr) const
bool IsFloatingPointType(uint32_t &count, bool &is_complex) const
bool IsIntegerOrEnumerationType(bool &is_signed) const
llvm::Expected< CompilerType > GetChildCompilerTypeAtIndex(ExecutionContext *exe_ctx, size_t idx, bool transparent_pointers, bool omit_empty_base_classes, bool ignore_array_bounds, std::string &child_name, uint32_t &child_byte_size, int32_t &child_byte_offset, uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset, bool &child_is_base_class, bool &child_is_deref_of_parent, ValueObject *valobj, uint64_t &language_flags) const
uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr) const
std::optional< uint64_t > GetBitSize(ExecutionContextScope *exe_scope) const
Return the size of the type in bits.
llvm::Expected< uint32_t > GetNumChildren(bool omit_empty_base_classes, const ExecutionContext *exe_ctx) const
bool IsPointerType(CompilerType *pointee_type=nullptr) const
A uniqued constant string class.
A subclass of DataBuffer that stores a data buffer on the heap.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
void PutString(llvm::StringRef str)
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
uint64_t ReadRegisterAsUnsigned(uint32_t reg, uint64_t fail_value)
virtual const RegisterInfo * GetRegisterInfoAtIndex(size_t reg)=0
uint64_t GetSP(uint64_t fail_value=LLDB_INVALID_ADDRESS)
const RegisterInfo * GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num)
bool WriteRegisterFromUnsigned(uint32_t reg, uint64_t uval)
const RegisterInfo * GetRegisterInfoByName(llvm::StringRef reg_name, uint32_t start_idx=0)
virtual bool ReadRegister(const RegisterInfo *reg_info, RegisterValue ®_value)=0
uint32_t GetAsMemoryData(const RegisterInfo ®_info, void *dst, uint32_t dst_len, lldb::ByteOrder dst_byte_order, Status &error) const
bool SignExtend(uint32_t bit_pos)
bool Fail() const
Test for error condition.
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
llvm::StringRef GetString() const
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
virtual lldb::RegisterContextSP GetRegisterContext()=0
void CalculateExecutionContext(ExecutionContext &exe_ctx) override
Reconstruct the object's execution context into sc.
lldb::ProcessSP GetProcess() const
A TypeSystem implementation based on Clang.
static clang::RecordDecl * GetAsRecordDecl(const CompilerType &type)
void SetUnwindPlanForSignalTrap(lldb_private::LazyBool is_for_signal_trap)
void SetRegisterKind(lldb::RegisterKind kind)
void SetReturnAddressRegister(uint32_t regnum)
void AppendRow(const RowSP &row_sp)
std::shared_ptr< Row > RowSP
void SetSourcedFromCompiler(lldb_private::LazyBool from_compiler)
void SetSourceName(const char *)
void SetUnwindPlanValidAtAllInstructions(lldb_private::LazyBool valid_at_all_insn)
Value * GetValueAtIndex(size_t idx)
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, lldb::ByteOrder byte_order, uint32_t addr_byte_size, lldb::addr_t address=LLDB_INVALID_ADDRESS)
const Scalar & GetScalar() const
const CompilerType & GetCompilerType()
#define LLDB_REGNUM_GENERIC_RA
#define LLDB_REGNUM_GENERIC_SP
#define LLDB_REGNUM_GENERIC_ARG1
#define LLDB_REGNUM_GENERIC_PC
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::shared_ptr< lldb_private::ABI > ABISP
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::Process > ProcessSP
ByteOrder
Byte ordering definitions.
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::Value > ValueSP
@ eRegisterKindGeneric
insn ptr reg, stack ptr reg, etc not specific to any particular target
@ eRegisterKindLLDB
lldb's internal register numbers
@ eRegisterKindDWARF
the register numbers seen DWARF
Every register is described in detail including its name, alternate name (optional),...
uint32_t byte_size
Size in bytes of the register.
uint32_t kinds[lldb::kNumRegisterKinds]
Holds all of the various register numbers for all register kinds.
const char * name
Name of this register, can't be NULL.
lldb::user_id_t GetID() const
Get accessor for the user ID.