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,
504 return llvm::make_error<llvm::StringError>(
506 llvm::inconvertibleErrorCode());
510 return llvm::make_error<llvm::StringError>(
511 LOG_PREFIX "GetProcess() failed", llvm::inconvertibleErrorCode());
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 uint32_t n = m_type.
GetNumChildren(omit_empty_base_classes,
nullptr);
781 std::optional<uint64_t> elem_size =
785 if (type_flags & eTypeIsComplex || !(type_flags & eTypeIsFloat)) {
787 LOG_PREFIX "Unexpected type found in homogeneous aggregate");
791 for (uint32_t i = 0; i < n; i++) {
792 ValueSP val_sp = GetFloatValue(elem_type, i);
798 size_t rc = val_sp->GetScalar().GetAsMemoryData(
799 m_data_up->GetBytes() + m_dst_offs, *elem_size, m_byte_order,
801 if (rc != *elem_size) {
805 m_dst_offs += *elem_size;
807 return BuildValueObject();
818 auto attrs = record_decl->attrs();
819 for (
const auto &attr : attrs) {
820 if (attr->getKind() == clang::attr::Packed) {
829 m_packed ?
"packed" :
"not packed");
831 for (uint32_t i = 0; i < n; i++) {
834 GetChildType(i, name, size);
839 if (!ExtractField(size))
843 return BuildValueObject();
847 bool ExtractFromRegs(int32_t offs, uint32_t size,
void *buf) {
849 auto reg = GetGPRByOffs(offs);
853 uint32_t n = std::min(reg.Avail(), size);
856 if (!reg.GetRawData(raw_data))
859 memcpy(buf, (
char *)&raw_data + reg.Offs(), n);
862 buf = (
char *)buf + n;
868 bool ExtractField(uint32_t size) {
869 auto reg = GetGPRByOffs(m_src_offs);
875 uint32_t n = m_src_offs % size;
880 LOG_PREFIX "Extracting {0} alignment bytes at offset {1}", n,
883 if (!ExtractFromRegs(m_src_offs, n, m_data_up->GetBytes() + m_dst_offs))
893 if (!ExtractFromRegs(m_src_offs, size, m_data_up->GetBytes() + m_dst_offs))
901 CompilerType GetChildType(uint32_t i, std::string &name, uint32_t &size) {
903 const bool transparent_pointers =
false;
904 const bool omit_empty_base_classes =
true;
905 const bool ignore_array_bounds =
false;
908 uint32_t child_bitfield_bit_size;
909 uint32_t child_bitfield_bit_offset;
910 bool child_is_base_class;
911 bool child_is_deref_of_parent;
913 uint64_t language_flags;
918 &exe_ctx, i, transparent_pointers, omit_empty_base_classes,
919 ignore_array_bounds, name, size, child_offs, child_bitfield_bit_size,
920 child_bitfield_bit_offset, child_is_base_class,
921 child_is_deref_of_parent, valobj, language_flags);
935 auto exp_extractor = ReturnValueExtractor::Create(thread, type);
936 if (!exp_extractor) {
939 "Extracting return value failed: {0}");
943 return exp_extractor.get().GetValue();
972 row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0);
975 row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num,
true);
1005 const int32_t ptr_size = 8;
1006 row->SetUnspecifiedRegistersAreUndefined(
true);
1007 row->GetCFAValue().SetIsRegisterDereferenced(sp_reg_num);
1009 row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * 2,
true);
1010 row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0,
true);
1011 row->SetRegisterLocationToAtCFAPlusOffset(cr_reg_num, ptr_size,
true);
1040 const char *name = reg_info->
name;
1041 if (name[0] ==
'r') {
1042 if ((name[1] ==
'1' || name[1] ==
'2') && name[2] ==
'\0')
1044 if (name[1] ==
'1' && name[2] >
'2')
1046 if ((name[1] ==
'2' || name[1] ==
'3') && name[2] !=
'\0')
1050 if (name[0] ==
'f' && name[1] >=
'0' && name[2] <=
'9') {
1051 if (name[2] ==
'\0')
1053 if (name[1] ==
'1' && name[2] >=
'4')
1055 if ((name[1] ==
'2' || name[1] ==
'3') && name[2] !=
'\0')
1059 if (name[0] ==
's' && name[1] ==
'p' && name[2] ==
'\0')
1061 if (name[0] ==
'f' && name[1] ==
'p' && name[2] ==
'\0')
1063 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.
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
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
uint32_t GetNumChildren(bool omit_empty_base_classes, const ExecutionContext *exe_ctx) 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.
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.