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);
302 CompilerType compiler_type = new_value_sp->GetCompilerType();
303 if (!compiler_type) {
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()) {
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;
338 "We don't support returning longer than 64 bit "
339 "integer values at present.");
344 "We don't support returning complex values at present");
346 std::optional<uint64_t> bit_width =
352 if (*bit_width <= 64) {
355 size_t num_bytes = new_value_sp->GetData(data, data_error);
356 if (data_error.
Fail()) {
358 "Couldn't convert return value to raw data: %s",
363 unsigned char buffer[16];
367 set_it_simple =
true;
371 "We don't support returning float values > 64 bits at present");
376 if (!set_it_simple) {
381 "We only support setting simple integer and float "
382 "return types at present.");
394#define LOG_PREFIX "ReturnValueExtractor: "
396class ReturnValueExtractor {
415 : m_index(index), m_offs(offs %
sizeof(uint64_t)),
416 m_avail(
sizeof(uint64_t) - m_offs), m_type(ty), m_reg_ctx(reg_ctx),
417 m_byte_order(byte_order) {}
422 : Register(ty, index, 0, reg_ctx, byte_order) {}
426 : Register(
GPR, offs /
sizeof(uint64_t), offs, reg_ctx, byte_order) {}
428 uint32_t Index()
const {
return m_index; }
431 uint32_t Offs()
const {
return m_offs; }
434 uint32_t Avail()
const {
return m_avail; }
436 bool IsValid()
const {
439 "No more than 8 registers should be used to return values");
447 return (
"r" + llvm::Twine(m_index + 3)).str();
449 return (
"f" + llvm::Twine(m_index + 1)).str();
453 bool GetRawData(uint64_t &raw_data) {
455 m_reg_ctx->GetRegisterInfoByName(
GetName());
462 if (!m_reg_ctx->ReadRegister(reg_info, reg_val)) {
469 *reg_info, &raw_data,
sizeof(raw_data), m_byte_order,
error);
470 if (rc !=
sizeof(raw_data)) {
485 Log *m_log =
GetLog(LLDBLog::Expressions);
488 Register GetGPR(uint32_t index)
const {
489 return Register(Register::GPR, index, m_reg_ctx, m_byte_order);
492 Register GetFPR(uint32_t index)
const {
493 return Register(Register::FPR, index, m_reg_ctx, m_byte_order);
496 Register GetGPRByOffs(uint32_t offs)
const {
497 return Register(offs, m_reg_ctx, m_byte_order);
502 static llvm::Expected<ReturnValueExtractor> Create(
Thread &thread,
507 "Failed to get RegisterContext");
511 return llvm::createStringError(
LOG_PREFIX "GetProcess() failed");
513 return ReturnValueExtractor(thread, type, reg_ctx, process_sp);
518 const uint32_t type_flags = m_type.GetTypeInfo();
523 if (type_flags & eTypeIsScalar) {
524 if (type_flags & eTypeIsInteger) {
525 value_sp = GetIntegerValue(0);
526 }
else if (type_flags & eTypeIsFloat) {
527 if (type_flags & eTypeIsComplex) {
531 value_sp = GetFloatValue(m_type, 0);
534 }
else if (type_flags & eTypeIsPointer) {
535 value_sp = GetPointerValue(0);
540 m_thread.GetStackFrameAtIndex(0).get(), *value_sp,
ConstString(
""));
541 }
else if (type_flags & eTypeIsVector) {
542 valobj_sp = GetVectorValueObject();
543 }
else if (type_flags & eTypeIsStructUnion || type_flags & eTypeIsClass) {
544 valobj_sp = GetStructValueObject();
554 uint64_t m_byte_size;
555 std::unique_ptr<DataBufferHeap> m_data_up;
556 int32_t m_src_offs = 0;
557 int32_t m_dst_offs = 0;
558 bool m_packed =
false;
559 Log *m_log =
GetLog(LLDBLog::Expressions);
563 uint32_t m_addr_size;
570 : m_thread(thread), m_type(type),
571 m_byte_size(m_type.
GetByteSize(&thread).value_or(0)),
572 m_data_up(
new DataBufferHeap(m_byte_size, 0)), m_reg_ctx(reg_ctx),
573 m_process_sp(process_sp), m_byte_order(process_sp->GetByteOrder()),
575 process_sp->GetTarget().GetArchitecture().GetAddressByteSize()) {}
580 value_sp->SetCompilerType(type);
581 value_sp->SetValueType(Value::ValueType::Scalar);
586 ValueSP GetIntegerValue(uint32_t reg_index) {
588 auto reg = GetGPR(reg_index);
589 if (!reg.GetRawData(raw_value))
593 ValueSP value_sp(NewScalarValue(m_type));
596 bool is_signed = (type_flags & eTypeIsSigned) != 0;
598 switch (m_byte_size) {
599 case sizeof(uint64_t):
601 value_sp->GetScalar() = (int64_t)(raw_value);
603 value_sp->GetScalar() = (uint64_t)(raw_value);
606 case sizeof(uint32_t):
608 value_sp->GetScalar() = (int32_t)(raw_value &
UINT32_MAX);
610 value_sp->GetScalar() = (uint32_t)(raw_value &
UINT32_MAX);
613 case sizeof(uint16_t):
615 value_sp->GetScalar() = (int16_t)(raw_value & UINT16_MAX);
617 value_sp->GetScalar() = (uint16_t)(raw_value & UINT16_MAX);
620 case sizeof(uint8_t):
622 value_sp->GetScalar() = (int8_t)(raw_value & UINT8_MAX);
624 value_sp->GetScalar() = (uint8_t)(raw_value & UINT8_MAX);
628 llvm_unreachable(
"Invalid integer size");
637 auto reg = GetFPR(reg_index);
638 if (!reg.GetRawData(raw_data))
642 ValueSP value_sp(NewScalarValue(type));
644 DataExtractor de(&raw_data,
sizeof(raw_data), m_byte_order, m_addr_size);
647 std::optional<uint64_t> byte_size = type.
GetByteSize(m_process_sp.get());
650 switch (*byte_size) {
652 value_sp->GetScalar() = (float)de.
GetDouble(&offset);
656 value_sp->GetScalar() = de.
GetDouble(&offset);
660 llvm_unreachable(
"Invalid floating point size");
667 ValueSP GetPointerValue(uint32_t reg_index) {
669 auto reg = GetGPR(reg_index);
670 if (!reg.GetRawData(raw_data))
674 ValueSP value_sp(NewScalarValue(m_type));
675 value_sp->GetScalar() = raw_data;
689 const uint32_t MAX_VRS = 2;
699 const uint32_t vr_size = vr[0]->
byte_size;
701 if (m_byte_size > 2 * vr_size) {
704 "Returning vectors that don't fit in 2 VR regs is not supported");
709 if (m_byte_size > vr_size) {
723 std::unique_ptr<DataBufferHeap> vr_data(
726 for (uint32_t i = 0; i < vrs; i++) {
731 if (!vr_val[i].GetAsMemoryData(*vr[i], vr_data->GetBytes() + i * vr_size,
732 vr_size, m_byte_order,
error)) {
742 if (m_byte_size < vr_size)
743 offs = vr_size - m_byte_size;
746 memcpy(m_data_up->GetBytes(), vr_data->GetBytes() + offs, m_byte_size);
747 return BuildValueObject();
753 if (m_byte_size > 2 *
sizeof(uint64_t)) {
755 auto reg = GetGPR(0);
756 if (!reg.GetRawData(addr))
760 size_t rc = m_process_sp->ReadMemory(addr, m_data_up->GetBytes(),
762 if (rc != m_byte_size) {
766 return BuildValueObject();
770 const bool omit_empty_base_classes =
true;
771 auto n_or_err = m_type.
GetNumChildren(omit_empty_base_classes,
nullptr);
776 uint32_t n = *n_or_err;
786 std::optional<uint64_t> elem_size =
790 if (type_flags & eTypeIsComplex || !(type_flags & eTypeIsFloat)) {
792 LOG_PREFIX "Unexpected type found in homogeneous aggregate");
796 for (uint32_t i = 0; i < n; i++) {
797 ValueSP val_sp = GetFloatValue(elem_type, i);
803 size_t rc = val_sp->GetScalar().GetAsMemoryData(
804 m_data_up->GetBytes() + m_dst_offs, *elem_size, m_byte_order,
806 if (rc != *elem_size) {
810 m_dst_offs += *elem_size;
812 return BuildValueObject();
823 auto attrs = record_decl->attrs();
824 for (
const auto &attr : attrs) {
825 if (attr->getKind() == clang::attr::Packed) {
834 m_packed ?
"packed" :
"not packed");
836 for (uint32_t i = 0; i < n; i++) {
839 (void)GetChildType(i, name, size);
844 if (!ExtractField(size))
848 return BuildValueObject();
852 bool ExtractFromRegs(int32_t offs, uint32_t size,
void *buf) {
854 auto reg = GetGPRByOffs(offs);
858 uint32_t n = std::min(reg.Avail(), size);
861 if (!reg.GetRawData(raw_data))
864 memcpy(buf, (
char *)&raw_data + reg.Offs(), n);
867 buf = (
char *)buf + n;
873 bool ExtractField(uint32_t size) {
874 auto reg = GetGPRByOffs(m_src_offs);
880 uint32_t n = m_src_offs % size;
885 LOG_PREFIX "Extracting {0} alignment bytes at offset {1}", n,
888 if (!ExtractFromRegs(m_src_offs, n, m_data_up->GetBytes() + m_dst_offs))
898 if (!ExtractFromRegs(m_src_offs, size, m_data_up->GetBytes() + m_dst_offs))
906 llvm::Expected<CompilerType> GetChildType(uint32_t i, std::string &name,
909 const bool transparent_pointers =
false;
910 const bool omit_empty_base_classes =
true;
911 const bool ignore_array_bounds =
false;
914 uint32_t child_bitfield_bit_size;
915 uint32_t child_bitfield_bit_offset;
916 bool child_is_base_class;
917 bool child_is_deref_of_parent;
919 uint64_t language_flags;
924 &exe_ctx, i, transparent_pointers, omit_empty_base_classes,
925 ignore_array_bounds, name, size, child_offs, child_bitfield_bit_size,
926 child_bitfield_bit_offset, child_is_base_class,
927 child_is_deref_of_parent, valobj, language_flags);
941 auto exp_extractor = ReturnValueExtractor::Create(thread, type);
942 if (!exp_extractor) {
945 "Extracting return value failed: {0}");
949 return exp_extractor.get().GetValue();
978 row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0);
981 row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num,
true);
1011 const int32_t ptr_size = 8;
1012 row->SetUnspecifiedRegistersAreUndefined(
true);
1013 row->GetCFAValue().SetIsRegisterDereferenced(sp_reg_num);
1015 row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * 2,
true);
1016 row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0,
true);
1017 row->SetRegisterLocationToAtCFAPlusOffset(cr_reg_num, ptr_size,
true);
1046 const char *name = reg_info->
name;
1047 if (name[0] ==
'r') {
1048 if ((name[1] ==
'1' || name[1] ==
'2') && name[2] ==
'\0')
1050 if (name[1] ==
'1' && name[2] >
'2')
1052 if ((name[1] ==
'2' || name[1] ==
'3') && name[2] !=
'\0')
1056 if (name[0] ==
'f' && name[1] >=
'0' && name[2] <=
'9') {
1057 if (name[2] ==
'\0')
1059 if (name[1] ==
'1' && name[2] >=
'4')
1061 if ((name[1] ==
'2' || name[1] ==
'3') && name[2] !=
'\0')
1065 if (name[0] ==
's' && name[1] ==
'p' && name[2] ==
'\0')
1067 if (name[0] ==
'f' && name[1] ==
'p' && name[2] ==
'\0')
1069 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)
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.
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.