180814287SRaphael Isemann //===-- RegisterContextPOSIX_arm64.cpp ------------------------------------===//
2c5c4e3a3STodd Fiala //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c5c4e3a3STodd Fiala //
7c5c4e3a3STodd Fiala //===----------------------------------------------------------------------===//
8c5c4e3a3STodd Fiala 
976e47d48SRaphael Isemann #include <cerrno>
1076e47d48SRaphael Isemann #include <cstdint>
11c5c4e3a3STodd Fiala #include <cstring>
12c5c4e3a3STodd Fiala 
131a05affaSJames Y Knight #include "lldb/Target/Process.h"
14c5c4e3a3STodd Fiala #include "lldb/Target/Target.h"
15c5c4e3a3STodd Fiala #include "lldb/Target/Thread.h"
16666cc0b2SZachary Turner #include "lldb/Utility/DataBufferHeap.h"
17666cc0b2SZachary Turner #include "lldb/Utility/DataExtractor.h"
1801c3243fSZachary Turner #include "lldb/Utility/Endian.h"
19d821c997SPavel Labath #include "lldb/Utility/RegisterValue.h"
20d821c997SPavel Labath #include "lldb/Utility/Scalar.h"
21c5c4e3a3STodd Fiala #include "llvm/Support/Compiler.h"
22c5c4e3a3STodd Fiala 
23b9c1b51eSKate Stone #include "RegisterContextPOSIX_arm64.h"
24c5c4e3a3STodd Fiala 
251e209fccSTamas Berghammer using namespace lldb;
261e209fccSTamas Berghammer using namespace lldb_private;
271e209fccSTamas Berghammer 
IsGPR(unsigned reg)28b9c1b51eSKate Stone bool RegisterContextPOSIX_arm64::IsGPR(unsigned reg) {
297fa7b81bSMuhammad Omair Javaid   if (m_register_info_up->GetRegisterSetFromRegisterIndex(reg) ==
307fa7b81bSMuhammad Omair Javaid       RegisterInfoPOSIX_arm64::GPRegSet)
317fa7b81bSMuhammad Omair Javaid     return true;
327fa7b81bSMuhammad Omair Javaid   return false;
33c5c4e3a3STodd Fiala }
34c5c4e3a3STodd Fiala 
IsFPR(unsigned reg)35b9c1b51eSKate Stone bool RegisterContextPOSIX_arm64::IsFPR(unsigned reg) {
367fa7b81bSMuhammad Omair Javaid   if (m_register_info_up->GetRegisterSetFromRegisterIndex(reg) ==
377fa7b81bSMuhammad Omair Javaid       RegisterInfoPOSIX_arm64::FPRegSet)
387fa7b81bSMuhammad Omair Javaid     return true;
397fa7b81bSMuhammad Omair Javaid   return false;
40c5c4e3a3STodd Fiala }
41c5c4e3a3STodd Fiala 
IsSVE(unsigned reg) const42510e37c8SMuhammad Omair Javaid bool RegisterContextPOSIX_arm64::IsSVE(unsigned reg) const {
43d6d3d21cSMuhammad Omair Javaid   return m_register_info_up->IsSVEReg(reg);
44510e37c8SMuhammad Omair Javaid }
45510e37c8SMuhammad Omair Javaid 
IsPAuth(unsigned reg) const4669a32692SMuhammad Omair Javaid bool RegisterContextPOSIX_arm64::IsPAuth(unsigned reg) const {
4769a32692SMuhammad Omair Javaid   return m_register_info_up->IsPAuthReg(reg);
4869a32692SMuhammad Omair Javaid }
4969a32692SMuhammad Omair Javaid 
RegisterContextPOSIX_arm64(lldb_private::Thread & thread,std::unique_ptr<RegisterInfoPOSIX_arm64> register_info)50b9c1b51eSKate Stone RegisterContextPOSIX_arm64::RegisterContextPOSIX_arm64(
517fa7b81bSMuhammad Omair Javaid     lldb_private::Thread &thread,
527fa7b81bSMuhammad Omair Javaid     std::unique_ptr<RegisterInfoPOSIX_arm64> register_info)
537fa7b81bSMuhammad Omair Javaid     : lldb_private::RegisterContext(thread, 0),
544923dca9SMuhammad Omair Javaid       m_register_info_up(std::move(register_info)) {}
55c5c4e3a3STodd Fiala 
56*fd2433e1SJonas Devlieghere RegisterContextPOSIX_arm64::~RegisterContextPOSIX_arm64() = default;
57c5c4e3a3STodd Fiala 
Invalidate()58b9c1b51eSKate Stone void RegisterContextPOSIX_arm64::Invalidate() {}
59c5c4e3a3STodd Fiala 
InvalidateAllRegisters()60b9c1b51eSKate Stone void RegisterContextPOSIX_arm64::InvalidateAllRegisters() {}
61c5c4e3a3STodd Fiala 
GetRegisterOffset(unsigned reg)62b9c1b51eSKate Stone unsigned RegisterContextPOSIX_arm64::GetRegisterOffset(unsigned reg) {
637fa7b81bSMuhammad Omair Javaid   return m_register_info_up->GetRegisterInfo()[reg].byte_offset;
64c5c4e3a3STodd Fiala }
65c5c4e3a3STodd Fiala 
GetRegisterSize(unsigned reg)66b9c1b51eSKate Stone unsigned RegisterContextPOSIX_arm64::GetRegisterSize(unsigned reg) {
677fa7b81bSMuhammad Omair Javaid   return m_register_info_up->GetRegisterInfo()[reg].byte_size;
68c5c4e3a3STodd Fiala }
69c5c4e3a3STodd Fiala 
GetRegisterCount()70b9c1b51eSKate Stone size_t RegisterContextPOSIX_arm64::GetRegisterCount() {
717fa7b81bSMuhammad Omair Javaid   return m_register_info_up->GetRegisterCount();
72c5c4e3a3STodd Fiala }
73c5c4e3a3STodd Fiala 
GetGPRSize()74b9c1b51eSKate Stone size_t RegisterContextPOSIX_arm64::GetGPRSize() {
75d5b44036SJonas Devlieghere   return m_register_info_up->GetGPRSize();
76c5c4e3a3STodd Fiala }
77c5c4e3a3STodd Fiala 
78c5c4e3a3STodd Fiala const lldb_private::RegisterInfo *
GetRegisterInfo()79b9c1b51eSKate Stone RegisterContextPOSIX_arm64::GetRegisterInfo() {
80b9c1b51eSKate Stone   // Commonly, this method is overridden and g_register_infos is copied and
8105097246SAdrian Prantl   // specialized. So, use GetRegisterInfo() rather than g_register_infos in
8205097246SAdrian Prantl   // this scope.
83d5b44036SJonas Devlieghere   return m_register_info_up->GetRegisterInfo();
84c5c4e3a3STodd Fiala }
85c5c4e3a3STodd Fiala 
86c5c4e3a3STodd Fiala const lldb_private::RegisterInfo *
GetRegisterInfoAtIndex(size_t reg)87b9c1b51eSKate Stone RegisterContextPOSIX_arm64::GetRegisterInfoAtIndex(size_t reg) {
887fa7b81bSMuhammad Omair Javaid   if (reg < GetRegisterCount())
89c5c4e3a3STodd Fiala     return &GetRegisterInfo()[reg];
90510e37c8SMuhammad Omair Javaid 
91248a1305SKonrad Kleine   return nullptr;
92c5c4e3a3STodd Fiala }
93c5c4e3a3STodd Fiala 
GetRegisterSetCount()94b9c1b51eSKate Stone size_t RegisterContextPOSIX_arm64::GetRegisterSetCount() {
957fa7b81bSMuhammad Omair Javaid   return m_register_info_up->GetRegisterSetCount();
966c455329SMuhammad Omair Javaid }
976c455329SMuhammad Omair Javaid 
98c5c4e3a3STodd Fiala const lldb_private::RegisterSet *
GetRegisterSet(size_t set)99b9c1b51eSKate Stone RegisterContextPOSIX_arm64::GetRegisterSet(size_t set) {
1007fa7b81bSMuhammad Omair Javaid   return m_register_info_up->GetRegisterSet(set);
101c5c4e3a3STodd Fiala }
102c5c4e3a3STodd Fiala 
GetRegisterName(unsigned reg)103b9c1b51eSKate Stone const char *RegisterContextPOSIX_arm64::GetRegisterName(unsigned reg) {
1047fa7b81bSMuhammad Omair Javaid   if (reg < GetRegisterCount())
105c5c4e3a3STodd Fiala     return GetRegisterInfo()[reg].name;
1067fa7b81bSMuhammad Omair Javaid   return nullptr;
107c5c4e3a3STodd Fiala }
108