136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--- ARMEHABI.h - ARM Exception Handling ABI ----------------*- C++ -*-===//
2620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien//
3620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien//                     The LLVM Compiler Infrastructure
4620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien//
5620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien// This file is distributed under the University of Illinois Open Source
6620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien// License. See LICENSE.TXT for details.
7620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien//
8620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien//===----------------------------------------------------------------------===//
9620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien//
10620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien// This file defines the constants for the ARM unwind opcodes and exception
11620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien// handling table entry kinds.
12620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien//
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The enumerations and constants in this file reflect the ARM EHABI
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Specification as published by ARM.
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Exception Handling ABI for the ARM Architecture r2.09 - November 30, 2012
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038a/IHI0038A_ehabi.pdf
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
20620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien//===----------------------------------------------------------------------===//
21620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef LLVM_SUPPORT_ARM_EHABI_H
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define LLVM_SUPPORT_ARM_EHABI_H
24620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
25620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chiennamespace llvm {
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace ARM {
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace EHABI {
28620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien  /// ARM exception handling table entry kinds
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  enum EHTEntryKind {
30620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    EHT_GENERIC = 0x00,
31620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    EHT_COMPACT = 0x80
32620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien  };
33620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
34620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien  enum {
35620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    /// Special entry for the function never unwind
36620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    EXIDX_CANTUNWIND = 0x1
37620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien  };
38620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
39620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien  /// ARM-defined frame unwinding opcodes
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  enum UnwindOpcodes {
41620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 00xxxxxx
42620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: vsp = vsp + ((x << 2) + 4)
43620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_INC_VSP = 0x00,
44620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
45620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 01xxxxxx
46620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: vsp = vsp - ((x << 2) + 4)
47620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_DEC_VSP = 0x40,
48620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
49620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 10000000 00000000
50620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: refuse to unwind
51620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_REFUSE = 0x8000,
52620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
53620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 1000xxxx xxxxxxxx
54620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: pop r[15:12], r[11:4]
55620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Constraint: x != 0
56620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_POP_REG_MASK_R4 = 0x8000,
57620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
58620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 1001xxxx
59620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: vsp = r[x]
60620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Constraint: x != 13 && x != 15
61620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_SET_VSP = 0x90,
62620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
63620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 10100xxx
64620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: pop r[(4+x):4]
65620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_POP_REG_RANGE_R4 = 0xa0,
66620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
67620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 10101xxx
68620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: pop r14, r[(4+x):4]
69620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_POP_REG_RANGE_R4_R14 = 0xa8,
70620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
71620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 10110000
72620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: finish
73620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_FINISH = 0xb0,
74620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
75620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 10110001 0000xxxx
76620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: pop r[3:0]
77620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Constraint: x != 0
78620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_POP_REG_MASK = 0xb100,
79620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
80620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 10110010 x(uleb128)
81620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: vsp = vsp + ((x << 2) + 0x204)
82620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_INC_VSP_ULEB128 = 0xb2,
83620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
84620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 10110011 xxxxyyyy
85620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: pop d[(x+y):x]
86620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_POP_VFP_REG_RANGE_FSTMFDX = 0xb300,
87620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
88620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 10111xxx
89620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: pop d[(8+x):8]
90620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_POP_VFP_REG_RANGE_FSTMFDX_D8 = 0xb8,
91620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
92620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 11000xxx
93620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: pop wR[(10+x):10]
94620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_POP_WIRELESS_MMX_REG_RANGE_WR10 = 0xc0,
95620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
96620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 11000110 xxxxyyyy
97620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: pop wR[(x+y):x]
98620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_POP_WIRELESS_MMX_REG_RANGE = 0xc600,
99620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
100620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 11000111 0000xxxx
101620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: pop wCGR[3:0]
102620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Constraint: x != 0
103620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_POP_WIRELESS_MMX_REG_MASK = 0xc700,
104620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
105620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 11001000 xxxxyyyy
106620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: pop d[(16+x+y):(16+x)]
107620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_POP_VFP_REG_RANGE_FSTMFDD_D16 = 0xc800,
108620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
109620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 11001001 xxxxyyyy
110620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: pop d[(x+y):x]
111620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_POP_VFP_REG_RANGE_FSTMFDD = 0xc900,
112620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
113620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Format: 11010xxx
114620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    // Purpose: pop d[(8+x):8]
115620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien    UNWIND_OPCODE_POP_VFP_REG_RANGE_FSTMFDD_D8 = 0xd0
116620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien  };
117620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
118532854d7ab47d4ec20fd8cec703aa8c89d4eefb2Logan Chien  /// ARM-defined Personality Routine Index
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  enum PersonalityRoutineIndex {
120532854d7ab47d4ec20fd8cec703aa8c89d4eefb2Logan Chien    // To make the exception handling table become more compact, ARM defined
121532854d7ab47d4ec20fd8cec703aa8c89d4eefb2Logan Chien    // several personality routines in EHABI.  There are 3 different
122532854d7ab47d4ec20fd8cec703aa8c89d4eefb2Logan Chien    // personality routines in ARM EHABI currently.  It is possible to have 16
123532854d7ab47d4ec20fd8cec703aa8c89d4eefb2Logan Chien    // pre-defined personality routines at most.
124532854d7ab47d4ec20fd8cec703aa8c89d4eefb2Logan Chien    AEABI_UNWIND_CPP_PR0 = 0,
125532854d7ab47d4ec20fd8cec703aa8c89d4eefb2Logan Chien    AEABI_UNWIND_CPP_PR1 = 1,
126532854d7ab47d4ec20fd8cec703aa8c89d4eefb2Logan Chien    AEABI_UNWIND_CPP_PR2 = 2,
127532854d7ab47d4ec20fd8cec703aa8c89d4eefb2Logan Chien
128532854d7ab47d4ec20fd8cec703aa8c89d4eefb2Logan Chien    NUM_PERSONALITY_INDEX
129532854d7ab47d4ec20fd8cec703aa8c89d4eefb2Logan Chien  };
13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
132620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien}
133620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien
134620d5bd8e43331a9b5ba2437c1de0d3f4a43a34dLogan Chien#endif // ARM_UNWIND_OP_H
135