1//===-- llvm/Support/Win64EH.h ---Win64 EH Constants-------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains constants and structures used for implementing 11// exception handling on Win64 platforms. For more information, see 12// http://msdn.microsoft.com/en-us/library/1eyas8tf.aspx 13// 14//===----------------------------------------------------------------------===// 15 16#ifndef LLVM_SUPPORT_WIN64EH_H 17#define LLVM_SUPPORT_WIN64EH_H 18 19#include "llvm/Support/DataTypes.h" 20 21namespace llvm { 22namespace Win64EH { 23 24/// UnwindOpcodes - Enumeration whose values specify a single operation in 25/// the prolog of a function. 26enum UnwindOpcodes { 27 UOP_PushNonVol = 0, 28 UOP_AllocLarge, 29 UOP_AllocSmall, 30 UOP_SetFPReg, 31 UOP_SaveNonVol, 32 UOP_SaveNonVolBig, 33 UOP_SaveXMM128 = 8, 34 UOP_SaveXMM128Big, 35 UOP_PushMachFrame 36}; 37 38/// UnwindCode - This union describes a single operation in a function prolog, 39/// or part thereof. 40union UnwindCode { 41 struct { 42 uint8_t codeOffset; 43 uint8_t unwindOp:4, 44 opInfo:4; 45 } u; 46 uint16_t frameOffset; 47}; 48 49enum { 50 /// UNW_ExceptionHandler - Specifies that this function has an exception 51 /// handler. 52 UNW_ExceptionHandler = 0x01, 53 /// UNW_TerminateHandler - Specifies that this function has a termination 54 /// handler. 55 UNW_TerminateHandler = 0x02, 56 /// UNW_ChainInfo - Specifies that this UnwindInfo structure is chained to 57 /// another one. 58 UNW_ChainInfo = 0x04 59}; 60 61/// RuntimeFunction - An entry in the table of functions with unwind info. 62struct RuntimeFunction { 63 uint64_t startAddress; 64 uint64_t endAddress; 65 uint64_t unwindInfoOffset; 66}; 67 68/// UnwindInfo - An entry in the exception table. 69struct UnwindInfo { 70 uint8_t version:3, 71 flags:5; 72 uint8_t prologSize; 73 uint8_t numCodes; 74 uint8_t frameRegister:4, 75 frameOffset:4; 76 UnwindCode unwindCodes[1]; 77 78 void *getLanguageSpecificData() { 79 return reinterpret_cast<void *>(&unwindCodes[(numCodes+1) & ~1]); 80 } 81 uint64_t getLanguageSpecificHandlerOffset() { 82 return *reinterpret_cast<uint64_t *>(getLanguageSpecificData()); 83 } 84 void setLanguageSpecificHandlerOffset(uint64_t offset) { 85 *reinterpret_cast<uint64_t *>(getLanguageSpecificData()) = offset; 86 } 87 RuntimeFunction *getChainedFunctionEntry() { 88 return reinterpret_cast<RuntimeFunction *>(getLanguageSpecificData()); 89 } 90 void *getExceptionData() { 91 return reinterpret_cast<void *>(reinterpret_cast<uint64_t *>( 92 getLanguageSpecificData())+1); 93 } 94}; 95 96 97} // End of namespace Win64EH 98} // End of namespace llvm 99 100#endif 101