| //===-- llvm/Support/Win64EH.h ---Win64 EH Constants-------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file contains constants and structures used for implementing |
| // exception handling on Win64 platforms. For more information, see |
| // http://msdn.microsoft.com/en-us/library/1eyas8tf.aspx |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_SUPPORT_WIN64EH_H |
| #define LLVM_SUPPORT_WIN64EH_H |
| |
| #include "llvm/Support/DataTypes.h" |
| |
| namespace llvm { |
| namespace Win64EH { |
| |
| /// UnwindOpcodes - Enumeration whose values specify a single operation in |
| /// the prolog of a function. |
| enum UnwindOpcodes { |
| UOP_PushNonVol = 0, |
| UOP_AllocLarge, |
| UOP_AllocSmall, |
| UOP_SetFPReg, |
| UOP_SaveNonVol, |
| UOP_SaveNonVolBig, |
| UOP_SaveXMM128 = 8, |
| UOP_SaveXMM128Big, |
| UOP_PushMachFrame |
| }; |
| |
| /// UnwindCode - This union describes a single operation in a function prolog, |
| /// or part thereof. |
| union UnwindCode { |
| struct { |
| uint8_t codeOffset; |
| uint8_t unwindOp:4, |
| opInfo:4; |
| } u; |
| uint16_t frameOffset; |
| }; |
| |
| enum { |
| /// UNW_ExceptionHandler - Specifies that this function has an exception |
| /// handler. |
| UNW_ExceptionHandler = 0x01, |
| /// UNW_TerminateHandler - Specifies that this function has a termination |
| /// handler. |
| UNW_TerminateHandler = 0x02, |
| /// UNW_ChainInfo - Specifies that this UnwindInfo structure is chained to |
| /// another one. |
| UNW_ChainInfo = 0x04 |
| }; |
| |
| /// RuntimeFunction - An entry in the table of functions with unwind info. |
| struct RuntimeFunction { |
| uint64_t startAddress; |
| uint64_t endAddress; |
| uint64_t unwindInfoOffset; |
| }; |
| |
| /// UnwindInfo - An entry in the exception table. |
| struct UnwindInfo { |
| uint8_t version:3, |
| flags:5; |
| uint8_t prologSize; |
| uint8_t numCodes; |
| uint8_t frameRegister:4, |
| frameOffset:4; |
| UnwindCode unwindCodes[1]; |
| |
| void *getLanguageSpecificData() { |
| return reinterpret_cast<void *>(&unwindCodes[(numCodes+1) & ~1]); |
| } |
| uint64_t getLanguageSpecificHandlerOffset() { |
| return *reinterpret_cast<uint64_t *>(getLanguageSpecificData()); |
| } |
| void setLanguageSpecificHandlerOffset(uint64_t offset) { |
| *reinterpret_cast<uint64_t *>(getLanguageSpecificData()) = offset; |
| } |
| RuntimeFunction *getChainedFunctionEntry() { |
| return reinterpret_cast<RuntimeFunction *>(getLanguageSpecificData()); |
| } |
| void *getExceptionData() { |
| return reinterpret_cast<void *>(reinterpret_cast<uint64_t *>( |
| getLanguageSpecificData())+1); |
| } |
| }; |
| |
| |
| } // End of namespace Win64EH |
| } // End of namespace llvm |
| |
| #endif |