1 //===-- AppleArm64ExceptionClass.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_TARGET_APPLEARM64EXCEPTIONCLASS_H
10 #define LLDB_TARGET_APPLEARM64EXCEPTIONCLASS_H
11 
12 #include <cstdint>
13 
14 namespace lldb_private {
15 
16 enum class AppleArm64ExceptionClass : unsigned {
17 #define APPLE_ARM64_EXCEPTION_CLASS(Name, Code) Name = Code,
18 #include "AppleArm64ExceptionClass.def"
19 };
20 
21 /// Get the Apple ARM64 exception class encoded within \p esr.
22 inline AppleArm64ExceptionClass getAppleArm64ExceptionClass(uint32_t esr) {
23   /*
24    * Exception Syndrome Register
25    *
26    *  31  26 25 24               0
27    * +------+--+------------------+
28    * |  EC  |IL|       ISS        |
29    * +------+--+------------------+
30    *
31    * EC  - Exception Class
32    * IL  - Instruction Length
33    * ISS - Instruction Specific Syndrome
34    */
35   return static_cast<AppleArm64ExceptionClass>(esr >> 26);
36 }
37 
38 inline const char *toString(AppleArm64ExceptionClass EC) {
39   switch (EC) {
40 #define APPLE_ARM64_EXCEPTION_CLASS(Name, Code)                                \
41   case AppleArm64ExceptionClass::Name:                                         \
42     return #Name;
43 #include "AppleArm64ExceptionClass.def"
44   }
45   return "Unknown Exception Class";
46 }
47 
48 } // namespace lldb_private
49 
50 #endif // LLDB_TARGET_APPLEARM64EXCEPTIONCLASS_H
51