LLVM 19.0.0git
Win64EH.h
Go to the documentation of this file.
1//===-- llvm/Support/Win64EH.h ---Win64 EH Constants-------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains constants and structures used for implementing
10// exception handling on Win64 platforms. For more information, see
11// http://msdn.microsoft.com/en-us/library/1eyas8tf.aspx
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_SUPPORT_WIN64EH_H
16#define LLVM_SUPPORT_WIN64EH_H
17
19#include "llvm/Support/Endian.h"
20
21namespace llvm {
22namespace Win64EH {
23
24/// UnwindOpcodes - Enumeration whose values specify a single operation in
25/// the prolog of a function.
27 // The following set of unwind opcodes is for x86_64. They are documented at
28 // https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64.
29 // Some generic values from this set are used for other architectures too.
41 // The following set of unwind opcodes is for ARM64. They are documented at
42 // https://docs.microsoft.com/en-us/cpp/build/arm64-exception-handling
78
79 // The following set of unwind opcodes is for ARM. They are documented at
80 // https://docs.microsoft.com/en-us/cpp/build/arm-exception-handling
81
82 // Stack allocations use UOP_AllocSmall, UOP_AllocLarge from above, plus
83 // the following. AllocSmall, AllocLarge and AllocHuge represent a 16 bit
84 // instruction, while the WideAlloc* opcodes represent a 32 bit instruction.
85 // Small can represent a stack offset of 0x7f*4 (252) bytes, Medium can
86 // represent up to 0x3ff*4 (4092) bytes, Large up to 0xffff*4 (262140) bytes,
87 // and Huge up to 0xffffff*4 (67108860) bytes.
92
102 // Using UOP_Nop from above
104 // Using UOP_End from above
107 // A custom unspecified opcode, consisting of one or more bytes. This
108 // allows producing opcodes in the implementation defined/reserved range.
110};
111
112/// UnwindCode - This union describes a single operation in a function prolog,
113/// or part thereof.
115 struct {
116 uint8_t CodeOffset;
118 } u;
120
121 uint8_t getUnwindOp() const {
122 return u.UnwindOpAndOpInfo & 0x0F;
123 }
124 uint8_t getOpInfo() const {
125 return (u.UnwindOpAndOpInfo >> 4) & 0x0F;
126 }
127};
128
129enum {
130 /// UNW_ExceptionHandler - Specifies that this function has an exception
131 /// handler.
133 /// UNW_TerminateHandler - Specifies that this function has a termination
134 /// handler.
136 /// UNW_ChainInfo - Specifies that this UnwindInfo structure is chained to
137 /// another one.
138 UNW_ChainInfo = 0x04
140
141/// RuntimeFunction - An entry in the table of functions with unwind info.
146};
147
148/// UnwindInfo - An entry in the exception table.
151 uint8_t PrologSize;
152 uint8_t NumCodes;
155
156 uint8_t getVersion() const {
157 return VersionAndFlags & 0x07;
158 }
159 uint8_t getFlags() const {
160 return (VersionAndFlags >> 3) & 0x1f;
161 }
162 uint8_t getFrameRegister() const {
163 return FrameRegisterAndOffset & 0x0f;
164 }
165 uint8_t getFrameOffset() const {
166 return (FrameRegisterAndOffset >> 4) & 0x0f;
167 }
168
169 // The data after unwindCodes depends on flags.
170 // If UNW_ExceptionHandler or UNW_TerminateHandler is set then follows
171 // the address of the language-specific exception handler.
172 // If UNW_ChainInfo is set then follows a RuntimeFunction which defines
173 // the chained unwind info.
174 // For more information please see MSDN at:
175 // http://msdn.microsoft.com/en-us/library/ddssxxy8.aspx
176
177 /// Return pointer to language specific data part of UnwindInfo.
179 return reinterpret_cast<void *>(&UnwindCodes[(NumCodes+1) & ~1]);
180 }
181
182 /// Return pointer to language specific data part of UnwindInfo.
183 const void *getLanguageSpecificData() const {
184 return reinterpret_cast<const void *>(&UnwindCodes[(NumCodes + 1) & ~1]);
185 }
186
187 /// Return image-relative offset of language-specific exception handler.
189 return *reinterpret_cast<const support::ulittle32_t *>(
191 }
192
193 /// Set image-relative offset of language-specific exception handler.
195 *reinterpret_cast<support::ulittle32_t *>(getLanguageSpecificData()) =
196 offset;
197 }
198
199 /// Return pointer to exception-specific data.
201 return reinterpret_cast<void *>(reinterpret_cast<uint32_t *>(
203 }
204
205 /// Return pointer to chained unwind info.
207 return reinterpret_cast<RuntimeFunction *>(getLanguageSpecificData());
208 }
209
210 /// Return pointer to chained unwind info.
212 return reinterpret_cast<const RuntimeFunction *>(getLanguageSpecificData());
213 }
214};
215
216
217} // End of namespace Win64EH
218} // End of namespace llvm
219
220#endif
@ UNW_TerminateHandler
UNW_TerminateHandler - Specifies that this function has a termination handler.
Definition: Win64EH.h:135
@ UNW_ExceptionHandler
UNW_ExceptionHandler - Specifies that this function has an exception handler.
Definition: Win64EH.h:132
@ UNW_ChainInfo
UNW_ChainInfo - Specifies that this UnwindInfo structure is chained to another one.
Definition: Win64EH.h:138
UnwindOpcodes
UnwindOpcodes - Enumeration whose values specify a single operation in the prolog of a function.
Definition: Win64EH.h:26
@ UOP_SaveFRegP
Definition: Win64EH.h:54
@ UOP_SaveFReg
Definition: Win64EH.h:52
@ UOP_WideEndNop
Definition: Win64EH.h:106
@ UOP_SaveAnyRegDPX
Definition: Win64EH.h:75
@ UOP_SaveRegsR4R7LR
Definition: Win64EH.h:95
@ UOP_SaveFRegPX
Definition: Win64EH.h:55
@ UOP_SaveFPLRX
Definition: Win64EH.h:45
@ UOP_ClearUnwoundToCall
Definition: Win64EH.h:64
@ UOP_SaveNonVolBig
Definition: Win64EH.h:35
@ UOP_WideAllocMedium
Definition: Win64EH.h:89
@ UOP_SaveAnyRegDX
Definition: Win64EH.h:74
@ UOP_AllocHuge
Definition: Win64EH.h:88
@ UOP_SaveFRegD0D15
Definition: Win64EH.h:100
@ UOP_SaveAnyRegQP
Definition: Win64EH.h:71
@ UOP_SaveAnyRegD
Definition: Win64EH.h:68
@ UOP_SaveFPLR
Definition: Win64EH.h:46
@ UOP_WideSaveRegsR4R11LR
Definition: Win64EH.h:96
@ UOP_SpareCode
Definition: Win64EH.h:37
@ UOP_SaveNonVol
Definition: Win64EH.h:34
@ UOP_SaveAnyRegIPX
Definition: Win64EH.h:73
@ UOP_WideAllocHuge
Definition: Win64EH.h:91
@ UOP_SaveRegX
Definition: Win64EH.h:48
@ UOP_SaveAnyRegQX
Definition: Win64EH.h:76
@ UOP_AllocLarge
Definition: Win64EH.h:31
@ UOP_SetFPReg
Definition: Win64EH.h:33
@ UOP_SaveRegMask
Definition: Win64EH.h:98
@ UOP_SaveLRPair
Definition: Win64EH.h:51
@ UOP_SaveAnyRegIX
Definition: Win64EH.h:72
@ UOP_SaveXMM128
Definition: Win64EH.h:38
@ UOP_AllocSmall
Definition: Win64EH.h:32
@ UOP_SaveRegP
Definition: Win64EH.h:49
@ UOP_SaveXMM128Big
Definition: Win64EH.h:39
@ UOP_SaveRegPX
Definition: Win64EH.h:50
@ UOP_SaveAnyRegQ
Definition: Win64EH.h:70
@ UOP_SaveNext
Definition: Win64EH.h:60
@ UOP_SaveAnyRegDP
Definition: Win64EH.h:69
@ UOP_PushNonVol
Definition: Win64EH.h:30
@ UOP_SaveFRegD8D15
Definition: Win64EH.h:97
@ UOP_PushMachFrame
Definition: Win64EH.h:40
@ UOP_SaveR19R20X
Definition: Win64EH.h:44
@ UOP_SaveAnyRegQPX
Definition: Win64EH.h:77
@ UOP_PACSignLR
Definition: Win64EH.h:65
@ UOP_WideAllocLarge
Definition: Win64EH.h:90
@ UOP_ECContext
Definition: Win64EH.h:63
@ UOP_WideSaveRegMask
Definition: Win64EH.h:93
@ UOP_AllocMedium
Definition: Win64EH.h:43
@ UOP_SaveAnyRegIP
Definition: Win64EH.h:67
@ UOP_TrapFrame
Definition: Win64EH.h:61
@ UOP_SaveFRegX
Definition: Win64EH.h:53
@ UOP_SaveFRegD16D31
Definition: Win64EH.h:101
@ UOP_SaveAnyRegI
Definition: Win64EH.h:66
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
RuntimeFunction - An entry in the table of functions with unwind info.
Definition: Win64EH.h:142
support::ulittle32_t StartAddress
Definition: Win64EH.h:143
support::ulittle32_t EndAddress
Definition: Win64EH.h:144
support::ulittle32_t UnwindInfoOffset
Definition: Win64EH.h:145
UnwindInfo - An entry in the exception table.
Definition: Win64EH.h:149
void * getExceptionData()
Return pointer to exception-specific data.
Definition: Win64EH.h:200
uint8_t getFrameOffset() const
Definition: Win64EH.h:165
uint8_t getFrameRegister() const
Definition: Win64EH.h:162
UnwindCode UnwindCodes[1]
Definition: Win64EH.h:154
uint8_t getFlags() const
Definition: Win64EH.h:159
const void * getLanguageSpecificData() const
Return pointer to language specific data part of UnwindInfo.
Definition: Win64EH.h:183
void setLanguageSpecificHandlerOffset(uint32_t offset)
Set image-relative offset of language-specific exception handler.
Definition: Win64EH.h:194
uint8_t FrameRegisterAndOffset
Definition: Win64EH.h:153
const RuntimeFunction * getChainedFunctionEntry() const
Return pointer to chained unwind info.
Definition: Win64EH.h:211
uint32_t getLanguageSpecificHandlerOffset() const
Return image-relative offset of language-specific exception handler.
Definition: Win64EH.h:188
void * getLanguageSpecificData()
Return pointer to language specific data part of UnwindInfo.
Definition: Win64EH.h:178
uint8_t getVersion() const
Definition: Win64EH.h:156
RuntimeFunction * getChainedFunctionEntry()
Return pointer to chained unwind info.
Definition: Win64EH.h:206
UnwindCode - This union describes a single operation in a function prolog, or part thereof.
Definition: Win64EH.h:114
struct llvm::Win64EH::UnwindCode::@412 u
uint8_t getOpInfo() const
Definition: Win64EH.h:124
support::ulittle16_t FrameOffset
Definition: Win64EH.h:119
uint8_t getUnwindOp() const
Definition: Win64EH.h:121