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. 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 104 void endModule() override {} 105 void beginFunction(const MachineFunction *MF) override {} 106 void endFunction(const MachineFunction *MF) override; 107 }; 108 } // End of namespace llvm 109 110 #endif 111