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();
317 bool set_it_simple =
false;
324 size_t num_bytes = new_value_sp->GetData(data, data_error);
325 if (data_error.
Fail()) {
327 "Couldn't convert return value to raw data: %s",
332 if (num_bytes <= 8) {
333 uint64_t raw_value = data.
GetMaxU64(&offset, num_bytes);
336 set_it_simple =
true;
339 "We don't support returning longer than 64 bit "
340 "integer values at present.");
345 "We don't support returning complex values at present");
347 std::optional<uint64_t> bit_width =
348 llvm::expectedToOptional(compiler_type.
GetBitSize(frame_sp.get()));
353 if (*bit_width <= 64) {
356 size_t num_bytes = new_value_sp->GetData(data, data_error);
357 if (data_error.
Fail()) {
359 "Couldn't convert return value to raw data: %s",
364 unsigned char buffer[16];
368 set_it_simple =
true;
372 "We don't support returning float values > 64 bits at present");
377 if (!set_it_simple) {
382 "We only support setting simple integer and float "
383 "return types at present.");
395#define LOG_PREFIX "ReturnValueExtractor: "
397class ReturnValueExtractor {
416 : m_index(index), m_offs(offs %
sizeof(uint64_t)),
417 m_avail(
sizeof(uint64_t) - m_offs), m_type(ty), m_reg_ctx(reg_ctx),
418 m_byte_order(byte_order) {}
423 : Register(ty, index, 0, reg_ctx, byte_order) {}
427 : Register(
GPR, offs /
sizeof(uint64_t), offs, reg_ctx, byte_order) {}
429 uint32_t Index()
const {
return m_index; }
432 uint32_t Offs()
const {
return m_offs; }
435 uint32_t Avail()
const {
return m_avail; }
437 bool IsValid()
const {
440 "No more than 8 registers should be used to return values");
448 return (
"r" + llvm::Twine(m_index + 3)).str();
450 return (
"f" + llvm::Twine(m_index + 1)).str();
454 bool GetRawData(uint64_t &raw_data) {
456 m_reg_ctx->GetRegisterInfoByName(
GetName());
463 if (!m_reg_ctx->ReadRegister(reg_info, reg_val)) {
470 *reg_info, &raw_data,
sizeof(raw_data), m_byte_order,
error);
471 if (rc !=
sizeof(raw_data)) {
489 Register GetGPR(uint32_t index)
const {
490 return Register(Register::GPR, index, m_reg_ctx, m_byte_order);
493 Register GetFPR(uint32_t index)
const {
494 return Register(Register::FPR, index, m_reg_ctx, m_byte_order);
497 Register GetGPRByOffs(uint32_t offs)
const {
498 return Register(offs, m_reg_ctx, m_byte_order);
503 static llvm::Expected<ReturnValueExtractor> Create(
Thread &thread,
508 "Failed to get RegisterContext");
510 ProcessSP process_sp = thread.GetProcess();
512 return llvm::createStringError(
LOG_PREFIX "GetProcess() failed");
514 return ReturnValueExtractor(thread, type, reg_ctx, process_sp);
519 const uint32_t type_flags = m_type.GetTypeInfo();
524 if (type_flags & eTypeIsScalar) {
525 if (type_flags & eTypeIsInteger) {
526 value_sp = GetIntegerValue(0);
527 }
else if (type_flags & eTypeIsFloat) {
528 if (type_flags & eTypeIsComplex) {
532 value_sp = GetFloatValue(m_type, 0);
535 }
else if (type_flags & eTypeIsPointer) {
536 value_sp = GetPointerValue(0);
541 m_thread.GetStackFrameAtIndex(0).get(), *value_sp,
ConstString(
""));
542 }
else if (type_flags & eTypeIsVector) {
543 valobj_sp = GetVectorValueObject();
544 }
else if (type_flags & eTypeIsStructUnion || type_flags & eTypeIsClass) {
545 valobj_sp = GetStructValueObject();
555 uint64_t m_byte_size;
556 std::unique_ptr<DataBufferHeap> m_data_up;
557 int32_t m_src_offs = 0;
558 int32_t m_dst_offs = 0;
559 bool m_packed =
false;
564 uint32_t m_addr_size;
571 : m_thread(thread), m_type(type),
573 llvm::expectedToOptional(m_type.
GetByteSize(&thread)).value_or(0)),
574 m_data_up(
new DataBufferHeap(m_byte_size, 0)), m_reg_ctx(reg_ctx),
575 m_process_sp(process_sp), m_byte_order(process_sp->GetByteOrder()),
577 process_sp->GetTarget().GetArchitecture().GetAddressByteSize()) {}
582 value_sp->SetCompilerType(type);
588 ValueSP GetIntegerValue(uint32_t reg_index) {
590 auto reg = GetGPR(reg_index);
591 if (!reg.GetRawData(raw_value))
595 ValueSP value_sp(NewScalarValue(m_type));
598 bool is_signed = (type_flags & eTypeIsSigned) != 0;
600 switch (m_byte_size) {
601 case sizeof(uint64_t):
603 value_sp->GetScalar() = (int64_t)(raw_value);
605 value_sp->GetScalar() = (uint64_t)(raw_value);
608 case sizeof(uint32_t):
610 value_sp->GetScalar() = (int32_t)(raw_value &
UINT32_MAX);
612 value_sp->GetScalar() = (uint32_t)(raw_value &
UINT32_MAX);
615 case sizeof(uint16_t):
617 value_sp->GetScalar() = (int16_t)(raw_value & UINT16_MAX);
619 value_sp->GetScalar() = (uint16_t)(raw_value & UINT16_MAX);
622 case sizeof(uint8_t):
624 value_sp->GetScalar() = (int8_t)(raw_value & UINT8_MAX);
626 value_sp->GetScalar() = (uint8_t)(raw_value & UINT8_MAX);
630 llvm_unreachable(
"Invalid integer size");
639 auto reg = GetFPR(reg_index);
640 if (!reg.GetRawData(raw_data))
644 ValueSP value_sp(NewScalarValue(type));
646 DataExtractor de(&raw_data,
sizeof(raw_data), m_byte_order, m_addr_size);
649 std::optional<uint64_t> byte_size =
650 llvm::expectedToOptional(type.
GetByteSize(m_process_sp.get()));
653 switch (*byte_size) {
655 value_sp->GetScalar() = (float)de.
GetDouble(&offset);
659 value_sp->GetScalar() = de.
GetDouble(&offset);
663 llvm_unreachable(
"Invalid floating point size");
670 ValueSP GetPointerValue(uint32_t reg_index) {
672 auto reg = GetGPR(reg_index);
673 if (!reg.GetRawData(raw_data))
677 ValueSP value_sp(NewScalarValue(m_type));
678 value_sp->GetScalar() = raw_data;
692 const uint32_t MAX_VRS = 2;
702 const uint32_t vr_size = vr[0]->
byte_size;
704 if (m_byte_size > 2 * vr_size) {
707 "Returning vectors that don't fit in 2 VR regs is not supported");
712 if (m_byte_size > vr_size) {
726 std::unique_ptr<DataBufferHeap> vr_data(
729 for (uint32_t i = 0; i < vrs; i++) {
734 if (!vr_val[i].GetAsMemoryData(*vr[i], vr_data->GetBytes() + i * vr_size,
735 vr_size, m_byte_order,
error)) {
745 if (m_byte_size < vr_size)
746 offs = vr_size - m_byte_size;
749 memcpy(m_data_up->GetBytes(), vr_data->GetBytes() + offs, m_byte_size);
750 return BuildValueObject();
756 if (m_byte_size > 2 *
sizeof(uint64_t)) {
758 auto reg = GetGPR(0);
759 if (!reg.GetRawData(addr))
763 size_t rc = m_process_sp->ReadMemory(addr, m_data_up->GetBytes(),
765 if (rc != m_byte_size) {
769 return BuildValueObject();
773 const bool omit_empty_base_classes =
true;
774 auto n_or_err = m_type.
GetNumChildren(omit_empty_base_classes,
nullptr);
779 uint32_t n = *n_or_err;
789 std::optional<uint64_t> elem_size =
790 llvm::expectedToOptional(elem_type.
GetByteSize(m_process_sp.get()));
793 if (type_flags & eTypeIsComplex || !(type_flags & eTypeIsFloat)) {
795 LOG_PREFIX "Unexpected type found in homogeneous aggregate");
799 for (uint32_t i = 0; i < n; i++) {
800 ValueSP val_sp = GetFloatValue(elem_type, i);
806 size_t rc = val_sp->GetScalar().GetAsMemoryData(
807 m_data_up->GetBytes() + m_dst_offs, *elem_size, m_byte_order,
809 if (rc != *elem_size) {
813 m_dst_offs += *elem_size;
815 return BuildValueObject();
826 auto attrs = record_decl->attrs();
827 for (
const auto &attr : attrs) {
828 if (attr->getKind() == clang::attr::Packed) {
837 m_packed ?
"packed" :
"not packed");
839 for (uint32_t i = 0; i < n; i++) {
842 (void)GetChildType(i, name, size);
847 if (!ExtractField(size))
851 return BuildValueObject();
855 bool ExtractFromRegs(int32_t offs, uint32_t size,
void *buf) {
857 auto reg = GetGPRByOffs(offs);
861 uint32_t n = std::min(reg.Avail(), size);
864 if (!reg.GetRawData(raw_data))
867 memcpy(buf, (
char *)&raw_data + reg.Offs(), n);
870 buf = (
char *)buf + n;
876 bool ExtractField(uint32_t size) {
877 auto reg = GetGPRByOffs(m_src_offs);
883 uint32_t n = m_src_offs % size;
888 LOG_PREFIX "Extracting {0} alignment bytes at offset {1}", n,
891 if (!ExtractFromRegs(m_src_offs, n, m_data_up->GetBytes() + m_dst_offs))
901 if (!ExtractFromRegs(m_src_offs, size, m_data_up->GetBytes() + m_dst_offs))
909 llvm::Expected<CompilerType> GetChildType(uint32_t i, std::string &name,
912 const bool transparent_pointers =
false;
913 const bool omit_empty_base_classes =
true;
914 const bool ignore_array_bounds =
false;
917 uint32_t child_bitfield_bit_size;
918 uint32_t child_bitfield_bit_offset;
919 bool child_is_base_class;
920 bool child_is_deref_of_parent;
922 uint64_t language_flags;
927 &exe_ctx, i, transparent_pointers, omit_empty_base_classes,
928 ignore_array_bounds, name, size, child_offs, child_bitfield_bit_size,
929 child_bitfield_bit_offset, child_is_base_class,
930 child_is_deref_of_parent, valobj, language_flags);
944 auto exp_extractor = ReturnValueExtractor::Create(thread, type);
945 if (!exp_extractor) {
948 "Extracting return value failed: {0}");
952 return exp_extractor.get().GetValue();
985 plan_sp->AppendRow(std::move(row));
986 plan_sp->SetSourceName(
"ppc64 at-func-entry default");
1007 const int32_t ptr_size = 8;
1016 plan_sp->AppendRow(std::move(row));
1017 plan_sp->SetSourceName(
"ppc64 default unwind plan");
1019 plan_sp->SetUnwindPlanValidAtAllInstructions(
eLazyBoolNo);
1021 plan_sp->SetReturnAddressRegister(pc_reg_num);
1043 const char *name = reg_info->
name;
1044 if (name[0] ==
'r') {
1045 if ((name[1] ==
'1' || name[1] ==
'2') && name[2] ==
'\0')
1047 if (name[1] ==
'1' && name[2] >
'2')
1049 if ((name[1] ==
'2' || name[1] ==
'3') && name[2] !=
'\0')
1053 if (name[0] ==
'f' && name[1] >=
'0' && name[2] <=
'9') {
1054 if (name[2] ==
'\0')
1056 if (name[1] ==
'1' && name[2] >=
'4')
1058 if ((name[1] ==
'2' || name[1] ==
'3') && name[2] !=
'\0')
1062 if (name[0] ==
's' && name[1] ==
'p' && name[2] ==
'\0')
1064 if (name[0] ==
'f' && name[1] ==
'p' && name[2] ==
'\0')
1066 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 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
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.