LLDB mainline
RegisterUtilities.h
Go to the documentation of this file.
1//===-- RegisterUtilities.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 LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERUTILITIES_H
10#define LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERUTILITIES_H
11
14#include "llvm/BinaryFormat/ELF.h"
15
16namespace lldb_private {
17/// Core files PT_NOTE segment descriptor types
18
63
64namespace OPENBSD {
65enum {
67 NT_AUXV = 11,
68 NT_REGS = 20,
70};
71}
72
77
78// A structure describing how to find a register set in a core file from a given
79// OS.
80struct RegsetDesc {
81 // OS to which this entry applies to. Must not be UnknownOS.
82 llvm::Triple::OSType OS;
83
84 // Architecture to which this entry applies to. Can be UnknownArch, in which
85 // case it applies to all architectures of a given OS.
86 llvm::Triple::ArchType Arch;
87
88 // The note type under which the register set can be found.
89 uint32_t Note;
90};
91
92// Returns the register set in Notes which corresponds to the specified Triple
93// according to the list of register set descriptions in RegsetDescs. The list
94// is scanned linearly, so you can use a more specific entry (e.g. linux-i386)
95// to override a more general entry (e.g. general linux), as long as you place
96// it earlier in the list. If a register set is not found, it returns an empty
97// DataExtractor.
98DataExtractor getRegset(llvm::ArrayRef<CoreNote> Notes,
99 const llvm::Triple &Triple,
100 llvm::ArrayRef<RegsetDesc> RegsetDescs);
101
102constexpr RegsetDesc FPR_Desc[] = {
103 // FreeBSD/i386 core NT_FPREGSET is x87 FSAVE result but the XSAVE dump
104 // starts with FXSAVE struct, so use that instead if available.
105 {llvm::Triple::FreeBSD, llvm::Triple::x86, llvm::ELF::NT_X86_XSTATE},
106 {llvm::Triple::FreeBSD, llvm::Triple::UnknownArch, llvm::ELF::NT_FPREGSET},
107 // In a i386 core file NT_FPREGSET is present, but it's not the result
108 // of the FXSAVE instruction like in 64 bit files.
109 // The result from FXSAVE is in NT_PRXFPREG for i386 core files
110 {llvm::Triple::Linux, llvm::Triple::x86, llvm::ELF::NT_PRXFPREG},
111 {llvm::Triple::Linux, llvm::Triple::UnknownArch, llvm::ELF::NT_FPREGSET},
112 {llvm::Triple::NetBSD, llvm::Triple::aarch64, NETBSD::AARCH64::NT_FPREGS},
113 {llvm::Triple::NetBSD, llvm::Triple::x86, NETBSD::I386::NT_FPREGS},
114 {llvm::Triple::NetBSD, llvm::Triple::x86_64, NETBSD::AMD64::NT_FPREGS},
115 {llvm::Triple::OpenBSD, llvm::Triple::UnknownArch, OPENBSD::NT_FPREGS},
116};
117
119 {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_SVE},
120};
121
123 {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_SSVE},
124};
125
127 {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_ZA},
128};
129
131 {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_ZT},
132};
133
135 {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_PAC_MASK},
136};
137
139 {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_TLS},
140};
141
143 {llvm::Triple::Linux, llvm::Triple::aarch64,
144 llvm::ELF::NT_ARM_TAGGED_ADDR_CTRL},
145};
146
148 {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_FPMR},
149};
150
152 {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_GCS},
153};
154
156 {llvm::Triple::FreeBSD, llvm::Triple::arm, llvm::ELF::NT_ARM_VFP},
157 {llvm::Triple::Linux, llvm::Triple::arm, llvm::ELF::NT_ARM_VFP},
158};
159
161 {llvm::Triple::FreeBSD, llvm::Triple::UnknownArch, llvm::ELF::NT_PPC_VMX},
162 {llvm::Triple::Linux, llvm::Triple::UnknownArch, llvm::ELF::NT_PPC_VMX},
163};
164
166 {llvm::Triple::Linux, llvm::Triple::UnknownArch, llvm::ELF::NT_PPC_VSX},
167};
168
169} // namespace lldb_private
170
171#endif // LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERUTILITIES_H
An data extractor class.
Core files PT_NOTE segment descriptor types.
A class that represents a running process on the host machine.
constexpr RegsetDesc ARM_VFP_Desc[]
DataExtractor getRegset(llvm::ArrayRef< CoreNote > Notes, const llvm::Triple &Triple, llvm::ArrayRef< RegsetDesc > RegsetDescs)
constexpr RegsetDesc AARCH64_TLS_Desc[]
constexpr RegsetDesc AARCH64_FPMR_Desc[]
constexpr RegsetDesc AARCH64_ZT_Desc[]
constexpr RegsetDesc AARCH64_SSVE_Desc[]
constexpr RegsetDesc FPR_Desc[]
constexpr RegsetDesc AARCH64_GCS_Desc[]
constexpr RegsetDesc AARCH64_MTE_Desc[]
constexpr RegsetDesc PPC_VSX_Desc[]
constexpr RegsetDesc AARCH64_SVE_Desc[]
constexpr RegsetDesc AARCH64_PAC_Desc[]
constexpr RegsetDesc PPC_VMX_Desc[]
constexpr RegsetDesc AARCH64_ZA_Desc[]
llvm::Triple::OSType OS
llvm::Triple::ArchType Arch