| //===- llvm/CodeGen/WinEHFuncInfo.h -----------------------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Data structures and associated state for Windows exception handling schemes. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_CODEGEN_WINEHFUNCINFO_H |
| #define LLVM_CODEGEN_WINEHFUNCINFO_H |
| |
| #include "llvm/ADT/DenseMap.h" |
| #include "llvm/ADT/PointerUnion.h" |
| #include "llvm/ADT/SmallVector.h" |
| #include <cstdint> |
| #include <limits> |
| #include <utility> |
| |
| namespace llvm { |
| |
| class AllocaInst; |
| class BasicBlock; |
| class FuncletPadInst; |
| class Function; |
| class GlobalVariable; |
| class Instruction; |
| class InvokeInst; |
| class MachineBasicBlock; |
| class MCSymbol; |
| |
| // The following structs respresent the .xdata tables for various |
| // Windows-related EH personalities. |
| |
| using MBBOrBasicBlock = PointerUnion<const BasicBlock *, MachineBasicBlock *>; |
| |
| struct CxxUnwindMapEntry { |
| int ToState; |
| MBBOrBasicBlock Cleanup; |
| }; |
| |
| /// Similar to CxxUnwindMapEntry, but supports SEH filters. |
| struct SEHUnwindMapEntry { |
| /// If unwinding continues through this handler, transition to the handler at |
| /// this state. This indexes into SEHUnwindMap. |
| int ToState = -1; |
| |
| bool IsFinally = false; |
| |
| /// Holds the filter expression function. |
| const Function *Filter = nullptr; |
| |
| /// Holds the __except or __finally basic block. |
| MBBOrBasicBlock Handler; |
| }; |
| |
| struct WinEHHandlerType { |
| int Adjectives; |
| /// The CatchObj starts out life as an LLVM alloca and is eventually turned |
| /// frame index. |
| union { |
| const AllocaInst *Alloca; |
| int FrameIndex; |
| } CatchObj = {}; |
| GlobalVariable *TypeDescriptor; |
| MBBOrBasicBlock Handler; |
| }; |
| |
| struct WinEHTryBlockMapEntry { |
| int TryLow = -1; |
| int TryHigh = -1; |
| int CatchHigh = -1; |
| SmallVector<WinEHHandlerType, 1> HandlerArray; |
| }; |
| |
| enum class ClrHandlerType { Catch, Finally, Fault, Filter }; |
| |
| struct ClrEHUnwindMapEntry { |
| MBBOrBasicBlock Handler; |
| uint32_t TypeToken; |
| int HandlerParentState; ///< Outer handler enclosing this entry's handler |
| int TryParentState; ///< Outer try region enclosing this entry's try region, |
| ///< treating later catches on same try as "outer" |
| ClrHandlerType HandlerType; |
| }; |
| |
| struct WinEHFuncInfo { |
| DenseMap<const Instruction *, int> EHPadStateMap; |
| DenseMap<const FuncletPadInst *, int> FuncletBaseStateMap; |
| DenseMap<const InvokeInst *, int> InvokeStateMap; |
| DenseMap<MCSymbol *, std::pair<int, MCSymbol *>> LabelToStateMap; |
| SmallVector<CxxUnwindMapEntry, 4> CxxUnwindMap; |
| SmallVector<WinEHTryBlockMapEntry, 4> TryBlockMap; |
| SmallVector<SEHUnwindMapEntry, 4> SEHUnwindMap; |
| SmallVector<ClrEHUnwindMapEntry, 4> ClrEHUnwindMap; |
| int UnwindHelpFrameIdx = std::numeric_limits<int>::max(); |
| int PSPSymFrameIdx = std::numeric_limits<int>::max(); |
| |
| int getLastStateNumber() const { return CxxUnwindMap.size() - 1; } |
| |
| void addIPToStateRange(const InvokeInst *II, MCSymbol *InvokeBegin, |
| MCSymbol *InvokeEnd); |
| |
| int EHRegNodeFrameIndex = std::numeric_limits<int>::max(); |
| int EHRegNodeEndOffset = std::numeric_limits<int>::max(); |
| int EHGuardFrameIndex = std::numeric_limits<int>::max(); |
| int SEHSetFrameOffset = std::numeric_limits<int>::max(); |
| |
| WinEHFuncInfo(); |
| }; |
| |
| /// Analyze the IR in ParentFn and it's handlers to build WinEHFuncInfo, which |
| /// describes the state numbers and tables used by __CxxFrameHandler3. This |
| /// analysis assumes that WinEHPrepare has already been run. |
| void calculateWinCXXEHStateNumbers(const Function *ParentFn, |
| WinEHFuncInfo &FuncInfo); |
| |
| void calculateSEHStateNumbers(const Function *ParentFn, |
| WinEHFuncInfo &FuncInfo); |
| |
| void calculateClrEHStateNumbers(const Function *Fn, WinEHFuncInfo &FuncInfo); |
| |
| } // end namespace llvm |
| |
| #endif // LLVM_CODEGEN_WINEHFUNCINFO_H |