RegisterContextMinidump_ARM.h revision 360784
1//===-- RegisterContextMinidump_ARM.h ---------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef liblldb_RegisterContextMinidump_ARM_h_ 10#define liblldb_RegisterContextMinidump_ARM_h_ 11 12#include "MinidumpTypes.h" 13 14#include "Plugins/Process/Utility/RegisterInfoInterface.h" 15 16#include "lldb/Target/RegisterContext.h" 17 18#include "llvm/ADT/ArrayRef.h" 19#include "llvm/ADT/BitmaskEnum.h" 20 21// C includes 22// C++ includes 23 24namespace lldb_private { 25 26namespace minidump { 27 28LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); 29 30class RegisterContextMinidump_ARM : public lldb_private::RegisterContext { 31public: 32 RegisterContextMinidump_ARM(lldb_private::Thread &thread, 33 const DataExtractor &data, bool apple); 34 35 ~RegisterContextMinidump_ARM() override = default; 36 37 void InvalidateAllRegisters() override { 38 // Do nothing... registers are always valid... 39 } 40 41 // Used for unit testing. 42 static size_t GetRegisterCountStatic(); 43 // Used for unit testing. 44 static const lldb_private::RegisterInfo * 45 GetRegisterInfoAtIndexStatic(size_t reg, bool apple); 46 47 size_t GetRegisterCount() override; 48 49 const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override; 50 51 size_t GetRegisterSetCount() override; 52 53 const lldb_private::RegisterSet *GetRegisterSet(size_t set) override; 54 55 const char *GetRegisterName(unsigned reg); 56 57 bool ReadRegister(const RegisterInfo *reg_info, 58 RegisterValue ®_value) override; 59 60 bool WriteRegister(const RegisterInfo *reg_info, 61 const RegisterValue ®_value) override; 62 63 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, 64 uint32_t num) override; 65 66 // Reference: see breakpad/crashpad source 67 struct QRegValue { 68 uint64_t lo; 69 uint64_t hi; 70 }; 71 72 struct Context { 73 uint32_t context_flags; 74 uint32_t r[16]; 75 uint32_t cpsr; 76 uint64_t fpscr; 77 union { 78 uint64_t d[32]; 79 uint32_t s[32]; 80 QRegValue q[16]; 81 }; 82 uint32_t extra[8]; 83 }; 84 85protected: 86 enum class Flags : uint32_t { 87 ARM_Flag = 0x40000000, 88 Integer = ARM_Flag | 0x00000002, 89 FloatingPoint = ARM_Flag | 0x00000004, 90 LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ FloatingPoint) 91 }; 92 Context m_regs; 93 const bool m_apple; // True if this is an Apple ARM where FP is R7 94}; 95 96} // end namespace minidump 97} // end namespace lldb_private 98#endif // liblldb_RegisterContextMinidump_ARM_h_ 99