16#include "llvm/Support/Endian.h"
25 "AArch64-specific algorithms",
33std::unique_ptr<Architecture>
36 if (machine != llvm::Triple::aarch64 && machine != llvm::Triple::aarch64_be &&
37 machine != llvm::Triple::aarch64_32) {
47 uint32_t z_reg_byte_size = vg * 8;
52 for (
auto ® : regs) {
53 if (reg.value_regs ==
nullptr) {
54 if (reg.name[0] ==
'z' && isdigit(reg.name[1]))
55 reg.byte_size = z_reg_byte_size;
56 else if (reg.name[0] ==
'p' && isdigit(reg.name[1]))
58 else if (strcmp(reg.name,
"ffr") == 0)
68 for (
auto ® : regs) {
69 if (strcmp(reg.name,
"za") == 0) {
71 reg.byte_size = (svg * 8) * (svg * 8);
86 std::optional<uint64_t> vg_reg_value;
92 if (reg_value != fail_value && reg_value <= 32)
93 vg_reg_value = reg_value;
96 std::optional<uint64_t> svg_reg_value;
102 if (reg_value != fail_value && reg_value <= 32)
103 svg_reg_value = reg_value;
105 if (!svg_reg_value) {
107 if (darwin_svg_reg_info) {
114 if (reg_value != fail_value && reg_value <= 256) {
115 svg_reg_value = reg_value / 8;
120 vg_reg_value = reg_value / 8;
125 if (!vg_reg_value && !svg_reg_value)
130 vg_reg_value = svg_reg_value;
153 llvm::ArrayRef<uint8_t> reference, llvm::ArrayRef<uint8_t> observed)
const {
154 if (reference.size() < 4 || observed.size() < 4)
156 auto ref_bytes = llvm::support::endian::read32le(reference.data());
157 auto bytes = llvm::support::endian::read32le(observed.data());
160 uint32_t mask = 0xFFE00000;
164 return (ref_bytes == (bytes & mask)) && ((bytes & ~mask) >> 5 == 0xF000);
static void UpdateARM64SMERegistersInfos(DynamicRegisterInfo::reg_collection_range regs, uint64_t svg)
static void UpdateARM64SVERegistersInfos(DynamicRegisterInfo::reg_collection_range regs, uint64_t vg)
#define LLDB_PLUGIN_DEFINE(PluginName)
An architecture specification class.
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
static llvm::StringRef GetPluginNameStatic()
static std::unique_ptr< Architecture > Create(const ArchSpec &arch)
bool ReconfigureRegisterInfo(DynamicRegisterInfo ®_info, DataExtractor ®_data, RegisterContext ®_context) const override
bool IsValidTrapInstruction(llvm::ArrayRef< uint8_t > reference, llvm::ArrayRef< uint8_t > observed) const override
Returns whether a given byte sequence is a valid trap instruction for the architecture.
ArchitectureAArch64()=default
llvm::iterator_range< reg_collection::iterator > reg_collection_range
size_t GetRegisterDataByteSize() const
const lldb_private::RegisterInfo * GetRegisterInfo(uint32_t kind, uint32_t num) const
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 lldb::ByteOrder GetByteOrder()
#define LLDB_INVALID_INDEX32
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
@ eRegisterKindLLDB
lldb's internal register numbers
Every register is described in detail including its name, alternate name (optional),...
uint32_t kinds[lldb::kNumRegisterKinds]
Holds all of the various register numbers for all register kinds.