brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · 47dd30c Raw
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