121 lines · c
1//===-- WinException.h - Windows Exception Handling ----------*- 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-exception6//7//===----------------------------------------------------------------------===//8//9// This file contains support for writing windows exception info into asm files.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_LIB_CODEGEN_ASMPRINTER_WIN64EXCEPTION_H14#define LLVM_LIB_CODEGEN_ASMPRINTER_WIN64EXCEPTION_H15 16#include "EHStreamer.h"17#include <vector>18 19namespace llvm {20class GlobalValue;21class MachineFunction;22class MCExpr;23class MCSection;24struct WinEHFuncInfo;25 26class LLVM_LIBRARY_VISIBILITY WinException : public EHStreamer {27 /// Per-function flag to indicate if personality info should be emitted.28 bool shouldEmitPersonality = false;29 30 /// Per-function flag to indicate if the LSDA should be emitted.31 bool shouldEmitLSDA = false;32 33 /// Per-function flag to indicate if frame moves info should be emitted.34 bool shouldEmitMoves = false;35 36 /// True if this is a 64-bit target and we should use image relative offsets.37 bool useImageRel32 = false;38 39 /// True if we are generating exception handling on Windows for ARM64.40 bool isAArch64 = false;41 42 /// True if we are generating exception handling on Windows for ARM (Thumb).43 bool isThumb = false;44 45 /// Pointer to the current funclet entry BB.46 const MachineBasicBlock *CurrentFuncletEntry = nullptr;47 48 /// The section of the last funclet start.49 MCSection *CurrentFuncletTextSection = nullptr;50 51 /// The list of symbols to add to the ehcont section52 std::vector<const MCSymbol *> EHContTargets;53 54 void emitCSpecificHandlerTable(const MachineFunction *MF);55 56 void emitSEHActionsForRange(const WinEHFuncInfo &FuncInfo,57 const MCSymbol *BeginLabel,58 const MCSymbol *EndLabel, int State);59 60 /// Emit the EH table data for 32-bit and 64-bit functions using61 /// the __CxxFrameHandler3 personality.62 void emitCXXFrameHandler3Table(const MachineFunction *MF);63 64 /// Emit the EH table data for _except_handler3 and _except_handler465 /// personality functions. These are only used on 32-bit and do not use CFI66 /// tables.67 void emitExceptHandlerTable(const MachineFunction *MF);68 69 void emitCLRExceptionTable(const MachineFunction *MF);70 71 void computeIP2StateTable(72 const MachineFunction *MF, const WinEHFuncInfo &FuncInfo,73 SmallVectorImpl<std::pair<const MCExpr *, int>> &IPToStateTable);74 75 /// Emits the label used with llvm.eh.recoverfp, which is used by76 /// outlined funclets.77 void emitEHRegistrationOffsetLabel(const WinEHFuncInfo &FuncInfo,78 StringRef FLinkageName);79 80 const MCExpr *create32bitRef(const MCSymbol *Value);81 const MCExpr *create32bitRef(const GlobalValue *GV);82 const MCExpr *getLabel(const MCSymbol *Label);83 const MCExpr *getOffset(const MCSymbol *OffsetOf, const MCSymbol *OffsetFrom);84 const MCExpr *getOffsetPlusOne(const MCSymbol *OffsetOf,85 const MCSymbol *OffsetFrom);86 87 /// Gets the offset that we should use in a table for a stack object with the88 /// given index. For targets using CFI (Win64, etc), this is relative to the89 /// established SP at the end of the prologue. For targets without CFI (Win3290 /// only), it is relative to the frame pointer.91 int getFrameIndexOffset(int FrameIndex, const WinEHFuncInfo &FuncInfo);92 93 void endFuncletImpl();94public:95 //===--------------------------------------------------------------------===//96 // Main entry points.97 //98 WinException(AsmPrinter *A);99 ~WinException() override;100 101 /// Emit all exception information that should come after the content.102 void endModule() override;103 104 /// Gather pre-function exception information. Assumes being emitted105 /// immediately after the function entry point.106 void beginFunction(const MachineFunction *MF) override;107 108 void markFunctionEnd() override;109 110 /// Gather and emit post-function exception information.111 void endFunction(const MachineFunction *) override;112 113 /// Emit target-specific EH funclet machinery.114 void beginFunclet(const MachineBasicBlock &MBB, MCSymbol *Sym) override;115 void endFunclet() override;116};117}118 119#endif120 121