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