mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	to match Microsoft's definitions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132112 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			101 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===-- 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
 |