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 20namespace llvm { 21class MachineFunction; 22class ARMTargetStreamer; 23 24class 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 45public: 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 66class 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 76public: 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 96class 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 101public: 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