1 //===-- DwarfException.h - Dwarf Exception Framework -----------*- 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 dwarf exception info into asm files.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H
14 #define LLVM_LIB_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H
15 
16 #include "EHStreamer.h"
17 #include "llvm/CodeGen/AsmPrinter.h"
18 #include "llvm/MC/MCDwarf.h"
19 
20 namespace llvm {
21 class MachineFunction;
22 class ARMTargetStreamer;
23 
24 class LLVM_LIBRARY_VISIBILITY DwarfCFIException : public EHStreamer {
25   /// Per-function flag to indicate if .cfi_personality should be emitted.
26   bool shouldEmitPersonality = false;
27 
28   /// Per-function flag to indicate if .cfi_personality must be emitted.
29   bool forceEmitPersonality = false;
30 
31   /// Per-function flag to indicate if .cfi_lsda should be emitted.
32   bool shouldEmitLSDA = false;
33 
34   /// Per-function flag to indicate if frame CFI info should be emitted.
35   bool shouldEmitCFI = false;
36 
37   /// Per-module flag to indicate if .cfi_section has beeen emitted.
38   bool hasEmittedCFISections = false;
39 
40   /// Vector of all personality functions seen so far in the module.
41   std::vector<const GlobalValue *> Personalities;
42 
43   void addPersonality(const GlobalValue *Personality);
44 
45 public:
46   //===--------------------------------------------------------------------===//
47   // Main entry points.
48   //
49   DwarfCFIException(AsmPrinter *A);
50   ~DwarfCFIException() override;
51 
52   /// Emit all exception information that should come after the content.
53   void endModule() override;
54 
55   /// Gather pre-function exception information.  Assumes being emitted
56   /// immediately after the function entry point.
57   void beginFunction(const MachineFunction *MF) override;
58 
59   /// Gather and emit post-function exception information.
60   void endFunction(const MachineFunction *) override;
61 
62   void beginBasicBlockSection(const MachineBasicBlock &MBB) override;
63   void endBasicBlockSection(const MachineBasicBlock &MBB) override;
64 };
65 
66 class LLVM_LIBRARY_VISIBILITY ARMException : public EHStreamer {
67   /// Per-function flag to indicate if frame CFI info should be emitted.
68   bool shouldEmitCFI = false;
69 
70   /// Per-module flag to indicate if .cfi_section has beeen emitted.
71   bool hasEmittedCFISections = false;
72 
73   void emitTypeInfos(unsigned TTypeEncoding, MCSymbol *TTBaseLabel) override;
74   ARMTargetStreamer &getTargetStreamer();
75 
76 public:
77   //===--------------------------------------------------------------------===//
78   // Main entry points.
79   //
80   ARMException(AsmPrinter *A);
81   ~ARMException() override;
82 
83   /// Emit all exception information that should come after the content.
endModule()84   void endModule() override {}
85 
86   /// Gather pre-function exception information.  Assumes being emitted
87   /// immediately after the function entry point.
88   void beginFunction(const MachineFunction *MF) override;
89 
90   /// Gather and emit post-function exception information.
91   void endFunction(const MachineFunction *) override;
92 
93   void markFunctionEnd() override;
94 };
95 
96 class LLVM_LIBRARY_VISIBILITY AIXException : public EHStreamer {
97   /// This is AIX's compat unwind section, which unwinder would use
98   /// to find the location of LSDA area and personality rountine.
99   void emitExceptionInfoTable(const MCSymbol *LSDA, const MCSymbol *PerSym);
100 
101 public:
102   AIXException(AsmPrinter *A);
103 
endModule()104   void endModule() override {}
beginFunction(const MachineFunction * MF)105   void beginFunction(const MachineFunction *MF) override {}
106   void endFunction(const MachineFunction *MF) override;
107 };
108 } // End of namespace llvm
109 
110 #endif
111