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));
135 ProcessSP process_sp(thread.GetProcess());
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) {
209 scalar = thread.GetRegisterContext()->ReadRegisterAsUnsigned(
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 =
276 llvm::expectedToOptional(compiler_type.
GetBitSize(&thread));
283 argument_register_ids, current_argument_register,
284 current_stack_argument);
287 argument_register_ids, current_argument_register,
288 current_stack_argument);
303 CompilerType compiler_type = new_value_sp->GetCompilerType();
304 if (!compiler_type) {
309 Thread *thread = frame_sp->GetThread().get();
315 bool set_it_simple =
false;
322 size_t num_bytes = new_value_sp->GetData(data, data_error);
323 if (data_error.
Fail()) {
325 "Couldn't convert return value to raw data: %s",
330 if (num_bytes <= 8) {
331 uint64_t raw_value = data.
GetMaxU64(&offset, num_bytes);
334 set_it_simple =
true;
337 "We don't support returning longer than 64 bit "
338 "integer values at present.");
341 std::optional<uint64_t> bit_width =
342 llvm::expectedToOptional(compiler_type.
GetBitSize(frame_sp.get()));
347 if (*bit_width <= 64) {
350 size_t num_bytes = new_value_sp->GetData(data, data_error);
351 if (data_error.
Fail()) {
353 "Couldn't convert return value to raw data: %s",
358 unsigned char buffer[16];
362 set_it_simple =
true;
366 "We don't support returning float values > 64 bits at present");
370 if (!set_it_simple) {
375 "We only support setting simple integer and float "
376 "return types at present.");
388#define LOG_PREFIX "ReturnValueExtractor: "
390class ReturnValueExtractor {
409 : m_index(index), m_offs(offs %
sizeof(uint64_t)),
410 m_avail(
sizeof(uint64_t) - m_offs), m_type(ty), m_reg_ctx(reg_ctx),
411 m_byte_order(byte_order) {}
416 : Register(ty, index, 0, reg_ctx, byte_order) {}
420 : Register(
GPR, offs /
sizeof(uint64_t), offs, reg_ctx, byte_order) {}
422 uint32_t Index()
const {
return m_index; }
425 uint32_t Offs()
const {
return m_offs; }
428 uint32_t Avail()
const {
return m_avail; }
430 bool IsValid()
const {
433 "No more than 8 registers should be used to return values");
441 return (
"r" + llvm::Twine(m_index + 3)).str();
443 return (
"f" + llvm::Twine(m_index + 1)).str();
447 bool GetRawData(uint64_t &raw_data) {
449 m_reg_ctx->GetRegisterInfoByName(
GetName());
456 if (!m_reg_ctx->ReadRegister(reg_info, reg_val)) {
463 *reg_info, &raw_data,
sizeof(raw_data), m_byte_order,
error);
464 if (rc !=
sizeof(raw_data)) {
482 Register GetGPR(uint32_t index)
const {
483 return Register(Register::GPR, index, m_reg_ctx, m_byte_order);
486 Register GetFPR(uint32_t index)
const {
487 return Register(Register::FPR, index, m_reg_ctx, m_byte_order);
490 Register GetGPRByOffs(uint32_t offs)
const {
491 return Register(offs, m_reg_ctx, m_byte_order);
496 static llvm::Expected<ReturnValueExtractor> Create(
Thread &thread,
501 "Failed to get RegisterContext");
503 ProcessSP process_sp = thread.GetProcess();
505 return llvm::createStringError(
LOG_PREFIX "GetProcess() failed");
507 return ReturnValueExtractor(thread, type, reg_ctx, process_sp);
512 const uint32_t type_flags = m_type.GetTypeInfo();
517 if (type_flags & eTypeIsScalar) {
518 if (type_flags & eTypeIsInteger) {
519 value_sp = GetIntegerValue(0);
520 }
else if (type_flags & eTypeIsFloat) {
521 if (type_flags & eTypeIsComplex) {
525 value_sp = GetFloatValue(m_type, 0);
528 }
else if (type_flags & eTypeIsPointer) {
529 value_sp = GetPointerValue(0);
534 m_thread.GetStackFrameAtIndex(0).get(), *value_sp,
ConstString(
""));
535 }
else if (type_flags & eTypeIsVector) {
536 valobj_sp = GetVectorValueObject();
537 }
else if (type_flags & eTypeIsStructUnion || type_flags & eTypeIsClass) {
538 valobj_sp = GetStructValueObject();
548 uint64_t m_byte_size;
549 std::unique_ptr<DataBufferHeap> m_data_up;
550 int32_t m_src_offs = 0;
551 int32_t m_dst_offs = 0;
552 bool m_packed =
false;
557 uint32_t m_addr_size;
564 : m_thread(thread), m_type(type),
566 llvm::expectedToOptional(m_type.
GetByteSize(&thread)).value_or(0)),
567 m_data_up(
new DataBufferHeap(m_byte_size, 0)), m_reg_ctx(reg_ctx),
568 m_process_sp(process_sp), m_byte_order(process_sp->GetByteOrder()),
570 process_sp->GetTarget().GetArchitecture().GetAddressByteSize()) {}
575 value_sp->SetCompilerType(type);
581 ValueSP GetIntegerValue(uint32_t reg_index) {
583 auto reg = GetGPR(reg_index);
584 if (!reg.GetRawData(raw_value))
588 ValueSP value_sp(NewScalarValue(m_type));
591 bool is_signed = (type_flags & eTypeIsSigned) != 0;
593 switch (m_byte_size) {
594 case sizeof(uint64_t):
596 value_sp->GetScalar() = (int64_t)(raw_value);
598 value_sp->GetScalar() = (uint64_t)(raw_value);
601 case sizeof(uint32_t):
603 value_sp->GetScalar() = (int32_t)(raw_value &
UINT32_MAX);
605 value_sp->GetScalar() = (uint32_t)(raw_value &
UINT32_MAX);
608 case sizeof(uint16_t):
610 value_sp->GetScalar() = (int16_t)(raw_value & UINT16_MAX);
612 value_sp->GetScalar() = (uint16_t)(raw_value & UINT16_MAX);
615 case sizeof(uint8_t):
617 value_sp->GetScalar() = (int8_t)(raw_value & UINT8_MAX);
619 value_sp->GetScalar() = (uint8_t)(raw_value & UINT8_MAX);
623 llvm_unreachable(
"Invalid integer size");
632 auto reg = GetFPR(reg_index);
633 if (!reg.GetRawData(raw_data))
637 ValueSP value_sp(NewScalarValue(type));
639 DataExtractor de(&raw_data,
sizeof(raw_data), m_byte_order, m_addr_size);
642 std::optional<uint64_t> byte_size =
643 llvm::expectedToOptional(type.
GetByteSize(m_process_sp.get()));
646 switch (*byte_size) {
648 value_sp->GetScalar() = (float)de.
GetDouble(&offset);
652 value_sp->GetScalar() = de.
GetDouble(&offset);
656 llvm_unreachable(
"Invalid floating point size");
663 ValueSP GetPointerValue(uint32_t reg_index) {
665 auto reg = GetGPR(reg_index);
666 if (!reg.GetRawData(raw_data))
670 ValueSP value_sp(NewScalarValue(m_type));
671 value_sp->GetScalar() = raw_data;
685 const uint32_t MAX_VRS = 2;
695 const uint32_t vr_size = vr[0]->
byte_size;
697 if (m_byte_size > 2 * vr_size) {
700 "Returning vectors that don't fit in 2 VR regs is not supported");
705 if (m_byte_size > vr_size) {
719 std::unique_ptr<DataBufferHeap> vr_data(
722 for (uint32_t i = 0; i < vrs; i++) {
727 if (!vr_val[i].GetAsMemoryData(*vr[i], vr_data->GetBytes() + i * vr_size,
728 vr_size, m_byte_order,
error)) {
738 if (m_byte_size < vr_size)
739 offs = vr_size - m_byte_size;
742 memcpy(m_data_up->GetBytes(), vr_data->GetBytes() + offs, m_byte_size);
743 return BuildValueObject();
749 if (m_byte_size > 2 *
sizeof(uint64_t)) {
751 auto reg = GetGPR(0);
752 if (!reg.GetRawData(addr))
756 size_t rc = m_process_sp->ReadMemory(addr, m_data_up->GetBytes(),
758 if (rc != m_byte_size) {
762 return BuildValueObject();
766 const bool omit_empty_base_classes =
true;
767 auto n_or_err = m_type.
GetNumChildren(omit_empty_base_classes,
nullptr);
772 uint32_t n = *n_or_err;
782 std::optional<uint64_t> elem_size =
783 llvm::expectedToOptional(elem_type.
GetByteSize(m_process_sp.get()));
786 if (type_flags & eTypeIsComplex || !(type_flags & eTypeIsFloat)) {
788 LOG_PREFIX "Unexpected type found in homogeneous aggregate");
792 for (uint32_t i = 0; i < n; i++) {
793 ValueSP val_sp = GetFloatValue(elem_type, i);
799 size_t rc = val_sp->GetScalar().GetAsMemoryData(
800 m_data_up->GetBytes() + m_dst_offs, *elem_size, m_byte_order,
802 if (rc != *elem_size) {
806 m_dst_offs += *elem_size;
808 return BuildValueObject();
819 auto attrs = record_decl->attrs();
820 for (
const auto &attr : attrs) {
821 if (attr->getKind() == clang::attr::Packed) {
830 m_packed ?
"packed" :
"not packed");
832 for (uint32_t i = 0; i < n; i++) {
835 (void)GetChildType(i, name, size);
840 if (!ExtractField(size))
844 return BuildValueObject();
848 bool ExtractFromRegs(int32_t offs, uint32_t size,
void *buf) {
850 auto reg = GetGPRByOffs(offs);
854 uint32_t n = std::min(reg.Avail(), size);
857 if (!reg.GetRawData(raw_data))
860 memcpy(buf, (
char *)&raw_data + reg.Offs(), n);
863 buf = (
char *)buf + n;
869 bool ExtractField(uint32_t size) {
870 auto reg = GetGPRByOffs(m_src_offs);
876 uint32_t n = m_src_offs % size;
881 LOG_PREFIX "Extracting {0} alignment bytes at offset {1}", n,
884 if (!ExtractFromRegs(m_src_offs, n, m_data_up->GetBytes() + m_dst_offs))
894 if (!ExtractFromRegs(m_src_offs, size, m_data_up->GetBytes() + m_dst_offs))
902 llvm::Expected<CompilerType> GetChildType(uint32_t i, std::string &name,
905 const bool transparent_pointers =
false;
906 const bool omit_empty_base_classes =
true;
907 const bool ignore_array_bounds =
false;
910 uint32_t child_bitfield_bit_size;
911 uint32_t child_bitfield_bit_offset;
912 bool child_is_base_class;
913 bool child_is_deref_of_parent;
915 uint64_t language_flags;
920 &exe_ctx, i, transparent_pointers, omit_empty_base_classes,
921 ignore_array_bounds, name, size, child_offs, child_bitfield_bit_size,
922 child_bitfield_bit_offset, child_is_base_class,
923 child_is_deref_of_parent, valobj, language_flags);
937 auto exp_extractor = ReturnValueExtractor::Create(thread, type);
938 if (!exp_extractor) {
941 "Extracting return value failed: {0}");
945 return exp_extractor.get().GetValue();
978 plan_sp->AppendRow(std::move(row));
979 plan_sp->SetSourceName(
"ppc64 at-func-entry default");
1000 const int32_t ptr_size = 8;
1009 plan_sp->AppendRow(std::move(row));
1010 plan_sp->SetSourceName(
"ppc64 default unwind plan");
1012 plan_sp->SetUnwindPlanValidAtAllInstructions(
eLazyBoolNo);
1014 plan_sp->SetReturnAddressRegister(pc_reg_num);
1036 const char *name = reg_info->
name;
1037 if (name[0] ==
'r') {
1038 if ((name[1] ==
'1' || name[1] ==
'2') && name[2] ==
'\0')
1040 if (name[1] ==
'1' && name[2] >
'2')
1042 if ((name[1] ==
'2' || name[1] ==
'3') && name[2] !=
'\0')
1046 if (name[0] ==
'f' && name[1] >=
'0' && name[2] <=
'9') {
1047 if (name[2] ==
'\0')
1049 if (name[1] ==
'1' && name[2] >=
'4')
1051 if ((name[1] ==
'2' || name[1] ==
'3') && name[2] !=
'\0')
1055 if (name[0] ==
's' && name[1] ==
'p' && name[2] ==
'\0')
1057 if (name[0] ==
'f' && name[1] ==
'p' && name[2] ==
'\0')
1059 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
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
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
lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override
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
lldb::UnwindPlanSP CreateDefaultUnwindPlan() override
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.
uint32_t IsHomogeneousAggregate(CompilerType *base_type_ptr) const
llvm::Expected< uint64_t > GetByteSize(ExecutionContextScope *exe_scope) const
Return the size of the type in bytes.
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
bool IsRealFloatingPointType() const
Returns true for non-complex float types.
llvm::Expected< uint32_t > GetNumChildren(bool omit_empty_base_classes, const ExecutionContext *exe_ctx) const
llvm::Expected< uint64_t > GetBitSize(ExecutionContextScope *exe_scope) const
Return the size of the type in bits.
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)
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
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.
void CalculateExecutionContext(ExecutionContext &exe_ctx) override
Reconstruct the object's execution context into sc.
A TypeSystem implementation based on Clang.
static clang::RecordDecl * GetAsRecordDecl(const CompilerType &type)
void SetIsRegisterDereferenced(uint32_t reg_num)
void SetIsRegisterPlusOffset(uint32_t reg_num, int32_t offset)
bool SetRegisterLocationToIsCFAPlusOffset(uint32_t reg_num, int32_t offset, bool can_replace)
bool SetRegisterLocationToAtCFAPlusOffset(uint32_t reg_num, int32_t offset, bool can_replace)
const FAValue & GetCFAValue() const
bool SetRegisterLocationToRegister(uint32_t reg_num, uint32_t other_reg_num, bool can_replace)
void SetUnspecifiedRegistersAreUndefined(bool unspec_is_undef)
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
See comment on m_scalar to understand what GetScalar returns.
@ Scalar
A raw scalar value.
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::UnwindPlan > UnwindPlanSP
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.