diff --git a/include/llvm/Support/Win64EH.h b/include/llvm/Support/Win64EH.h new file mode 100644 index 00000000000..54ed68c52f2 --- /dev/null +++ b/include/llvm/Support/Win64EH.h @@ -0,0 +1,100 @@ +//===-- 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 + +namespace llvm { +namespace Win64EH { + +extern "C" { + +/// 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, + 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; + }; + 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 +}; + +/// 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]; +}; + +inline UnwindCode &getUnwindCodeEntry(UnwindInfo &info, uint32_t index) { + return info.unwindCodes[index]; +} +inline void *getLanguageSpecificData(UnwindInfo &info) { + return reinterpret_cast(&getUnwindCodeEntry(info,info.numCodes+1)&~1); +} +inline uint64_t getLanguageSpecificHandlerOffset(UnwindInfo &info) { + return *reinterpret_cast(getLangaugeSpecificData(info)); +} +inline void setLanguageSpecificHandlerOffset(UnwindInfo &info, uint64_t offset){ + *reinterpret_cast(getLanguageSpecificData(info)) = offset; +} +inline uint64_t getChainedFunctionEntryOffset(UnwindInfo &info) { + return *reinterpret_cast(getLanguageSpecificData(info)); +} +inline void setChainedFunctionEntryOffset(UnwindInfo &info, uint64_t offset) { + *reinterpret_cast(getLanguageSpecificData(info)) = offset; +} +inline void *getExceptionData(UnwindInfo &info) { + return reinterpret_cast(reinterpret_cast( + getLanguageSpecificData(info))+1); +} + +} // End of extern "C" + +} // End of namespace Win64EH +} // End of namespace llvm + +#endif