1*9880d681SAndroid Build Coastguard Worker //===-- DwarfException.h - Dwarf Exception Framework -----------*- C++ -*--===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file contains support for writing dwarf exception info into asm files. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "EHStreamer.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/AsmPrinter.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCDwarf.h" 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker namespace llvm { 22*9880d681SAndroid Build Coastguard Worker class MachineFunction; 23*9880d681SAndroid Build Coastguard Worker class ARMTargetStreamer; 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY DwarfCFIExceptionBase : public EHStreamer { 26*9880d681SAndroid Build Coastguard Worker protected: 27*9880d681SAndroid Build Coastguard Worker DwarfCFIExceptionBase(AsmPrinter *A); 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker /// Per-function flag to indicate if frame CFI info should be emitted. 30*9880d681SAndroid Build Coastguard Worker bool shouldEmitCFI; 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker void markFunctionEnd() override; 33*9880d681SAndroid Build Coastguard Worker void endFragment() override; 34*9880d681SAndroid Build Coastguard Worker }; 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY DwarfCFIException : public DwarfCFIExceptionBase { 37*9880d681SAndroid Build Coastguard Worker /// Per-function flag to indicate if .cfi_personality should be emitted. 38*9880d681SAndroid Build Coastguard Worker bool shouldEmitPersonality; 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker /// Per-function flag to indicate if .cfi_personality must be emitted. 41*9880d681SAndroid Build Coastguard Worker bool forceEmitPersonality; 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker /// Per-function flag to indicate if .cfi_lsda should be emitted. 44*9880d681SAndroid Build Coastguard Worker bool shouldEmitLSDA; 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker /// Per-function flag to indicate if frame moves info should be emitted. 47*9880d681SAndroid Build Coastguard Worker bool shouldEmitMoves; 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker AsmPrinter::CFIMoveType moveTypeModule; 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker public: 52*9880d681SAndroid Build Coastguard Worker //===--------------------------------------------------------------------===// 53*9880d681SAndroid Build Coastguard Worker // Main entry points. 54*9880d681SAndroid Build Coastguard Worker // 55*9880d681SAndroid Build Coastguard Worker DwarfCFIException(AsmPrinter *A); 56*9880d681SAndroid Build Coastguard Worker ~DwarfCFIException() override; 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker /// Emit all exception information that should come after the content. 59*9880d681SAndroid Build Coastguard Worker void endModule() override; 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker /// Gather pre-function exception information. Assumes being emitted 62*9880d681SAndroid Build Coastguard Worker /// immediately after the function entry point. 63*9880d681SAndroid Build Coastguard Worker void beginFunction(const MachineFunction *MF) override; 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker /// Gather and emit post-function exception information. 66*9880d681SAndroid Build Coastguard Worker void endFunction(const MachineFunction *) override; 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker void beginFragment(const MachineBasicBlock *MBB, 69*9880d681SAndroid Build Coastguard Worker ExceptionSymbolProvider ESP) override; 70*9880d681SAndroid Build Coastguard Worker }; 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY ARMException : public DwarfCFIExceptionBase { 73*9880d681SAndroid Build Coastguard Worker void emitTypeInfos(unsigned TTypeEncoding) override; 74*9880d681SAndroid Build Coastguard Worker ARMTargetStreamer &getTargetStreamer(); 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker public: 77*9880d681SAndroid Build Coastguard Worker //===--------------------------------------------------------------------===// 78*9880d681SAndroid Build Coastguard Worker // Main entry points. 79*9880d681SAndroid Build Coastguard Worker // 80*9880d681SAndroid Build Coastguard Worker ARMException(AsmPrinter *A); 81*9880d681SAndroid Build Coastguard Worker ~ARMException() override; 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker /// Emit all exception information that should come after the content. 84*9880d681SAndroid Build Coastguard Worker void endModule() override; 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker /// Gather pre-function exception information. Assumes being emitted 87*9880d681SAndroid Build Coastguard Worker /// immediately after the function entry point. 88*9880d681SAndroid Build Coastguard Worker void beginFunction(const MachineFunction *MF) override; 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker /// Gather and emit post-function exception information. 91*9880d681SAndroid Build Coastguard Worker void endFunction(const MachineFunction *) override; 92*9880d681SAndroid Build Coastguard Worker }; 93*9880d681SAndroid Build Coastguard Worker } // End of namespace llvm 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker #endif 96