LLVM  14.0.0git
WinException.h
Go to the documentation of this file.
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-exception
6 //
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_H
14 #define LLVM_LIB_CODEGEN_ASMPRINTER_WIN64EXCEPTION_H
15 
16 #include "EHStreamer.h"
17 #include <vector>
18 
19 namespace llvm {
20 class GlobalValue;
21 class MachineFunction;
22 class MCExpr;
23 class MCSection;
24 struct WinEHFuncInfo;
25 
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  /// Pointer to the current funclet entry BB.
43  const MachineBasicBlock *CurrentFuncletEntry = nullptr;
44 
45  /// The section of the last funclet start.
46  MCSection *CurrentFuncletTextSection = nullptr;
47 
48  /// The list of symbols to add to the ehcont section
49  std::vector<const MCSymbol *> EHContTargets;
50 
51  void emitCSpecificHandlerTable(const MachineFunction *MF);
52 
53  void emitSEHActionsForRange(const WinEHFuncInfo &FuncInfo,
54  const MCSymbol *BeginLabel,
55  const MCSymbol *EndLabel, int State);
56 
57  /// Emit the EH table data for 32-bit and 64-bit functions using
58  /// the __CxxFrameHandler3 personality.
59  void emitCXXFrameHandler3Table(const MachineFunction *MF);
60 
61  /// Emit the EH table data for _except_handler3 and _except_handler4
62  /// personality functions. These are only used on 32-bit and do not use CFI
63  /// tables.
64  void emitExceptHandlerTable(const MachineFunction *MF);
65 
66  void emitCLRExceptionTable(const MachineFunction *MF);
67 
68  void computeIP2StateTable(
69  const MachineFunction *MF, const WinEHFuncInfo &FuncInfo,
70  SmallVectorImpl<std::pair<const MCExpr *, int>> &IPToStateTable);
71 
72  /// Emits the label used with llvm.eh.recoverfp, which is used by
73  /// outlined funclets.
74  void emitEHRegistrationOffsetLabel(const WinEHFuncInfo &FuncInfo,
75  StringRef FLinkageName);
76 
77  const MCExpr *create32bitRef(const MCSymbol *Value);
78  const MCExpr *create32bitRef(const GlobalValue *GV);
79  const MCExpr *getLabel(const MCSymbol *Label);
80  const MCExpr *getOffset(const MCSymbol *OffsetOf, const MCSymbol *OffsetFrom);
81  const MCExpr *getOffsetPlusOne(const MCSymbol *OffsetOf,
82  const MCSymbol *OffsetFrom);
83 
84  /// Gets the offset that we should use in a table for a stack object with the
85  /// given index. For targets using CFI (Win64, etc), this is relative to the
86  /// established SP at the end of the prologue. For targets without CFI (Win32
87  /// only), it is relative to the frame pointer.
88  int getFrameIndexOffset(int FrameIndex, const WinEHFuncInfo &FuncInfo);
89 
90  void endFuncletImpl();
91 public:
92  //===--------------------------------------------------------------------===//
93  // Main entry points.
94  //
96  ~WinException() override;
97 
98  /// Emit all exception information that should come after the content.
99  void endModule() override;
100 
101  /// Gather pre-function exception information. Assumes being emitted
102  /// immediately after the function entry point.
103  void beginFunction(const MachineFunction *MF) override;
104 
105  void markFunctionEnd() override;
106 
107  /// Gather and emit post-function exception information.
108  void endFunction(const MachineFunction *) override;
109 
110  /// Emit target-specific EH funclet machinery.
111  void beginFunclet(const MachineBasicBlock &MBB, MCSymbol *Sym) override;
112  void endFunclet() override;
113 };
114 }
115 
116 #endif
117 
llvm
---------------------— PointerInfo ------------------------------------—
Definition: AllocatorList.h:23
llvm::MCSymbol
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
llvm::EHStreamer
Emits exception handling directives.
Definition: EHStreamer.h:30
llvm::getOffset
static Error getOffset(const SymbolRef &Sym, SectionRef Sec, uint64_t &Result)
Definition: RuntimeDyld.cpp:170
EHStreamer.h
llvm::WinException
Definition: WinException.h:26
llvm::MachineBasicBlock
Definition: MachineBasicBlock.h:95
llvm::GlobalValue
Definition: GlobalValue.h:44
llvm::WinEHFuncInfo
Definition: WinEHFuncInfo.h:90
llvm::MachineFunction
Definition: MachineFunction.h:230
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:58
llvm::MCSection
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition: MCSection.h:39
LLVM_LIBRARY_VISIBILITY
#define LLVM_LIBRARY_VISIBILITY
LLVM_LIBRARY_VISIBILITY - If a class marked with this attribute is linked into a shared library,...
Definition: Compiler.h:131
llvm::ISD::FrameIndex
@ FrameIndex
Definition: ISDOpcodes.h:80
MBB
MachineBasicBlock & MBB
Definition: AArch64SLSHardening.cpp:74
llvm::AsmPrinter
This class is intended to be used as a driving class for all asm writers.
Definition: AsmPrinter.h:82
llvm::SmallVectorImpl
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: APFloat.h:43
llvm::Value
LLVM Value Representation.
Definition: Value.h:75
llvm::MCExpr
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:35