1*9880d681SAndroid Build Coastguard Worker //===- MCWinEH.h - Windows Unwinding Support --------------------*- 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 #ifndef LLVM_MC_MCWINEH_H 11*9880d681SAndroid Build Coastguard Worker #define LLVM_MC_MCWINEH_H 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker #include <vector> 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker namespace llvm { 16*9880d681SAndroid Build Coastguard Worker class MCSection; 17*9880d681SAndroid Build Coastguard Worker class MCStreamer; 18*9880d681SAndroid Build Coastguard Worker class MCSymbol; 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker namespace WinEH { 21*9880d681SAndroid Build Coastguard Worker struct Instruction { 22*9880d681SAndroid Build Coastguard Worker const MCSymbol *Label; 23*9880d681SAndroid Build Coastguard Worker const unsigned Offset; 24*9880d681SAndroid Build Coastguard Worker const unsigned Register; 25*9880d681SAndroid Build Coastguard Worker const unsigned Operation; 26*9880d681SAndroid Build Coastguard Worker InstructionInstruction27*9880d681SAndroid Build Coastguard Worker Instruction(unsigned Op, MCSymbol *L, unsigned Reg, unsigned Off) 28*9880d681SAndroid Build Coastguard Worker : Label(L), Offset(Off), Register(Reg), Operation(Op) {} 29*9880d681SAndroid Build Coastguard Worker }; 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker struct FrameInfo { 32*9880d681SAndroid Build Coastguard Worker const MCSymbol *Begin = nullptr; 33*9880d681SAndroid Build Coastguard Worker const MCSymbol *End = nullptr; 34*9880d681SAndroid Build Coastguard Worker const MCSymbol *ExceptionHandler = nullptr; 35*9880d681SAndroid Build Coastguard Worker const MCSymbol *Function = nullptr; 36*9880d681SAndroid Build Coastguard Worker const MCSymbol *PrologEnd = nullptr; 37*9880d681SAndroid Build Coastguard Worker const MCSymbol *Symbol = nullptr; 38*9880d681SAndroid Build Coastguard Worker const MCSection *TextSection = nullptr; 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker bool HandlesUnwind = false; 41*9880d681SAndroid Build Coastguard Worker bool HandlesExceptions = false; 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker int LastFrameInst = -1; 44*9880d681SAndroid Build Coastguard Worker const FrameInfo *ChainedParent = nullptr; 45*9880d681SAndroid Build Coastguard Worker std::vector<Instruction> Instructions; 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker FrameInfo() = default; FrameInfoFrameInfo48*9880d681SAndroid Build Coastguard Worker FrameInfo(const MCSymbol *Function, const MCSymbol *BeginFuncEHLabel) 49*9880d681SAndroid Build Coastguard Worker : Begin(BeginFuncEHLabel), Function(Function) {} FrameInfoFrameInfo50*9880d681SAndroid Build Coastguard Worker FrameInfo(const MCSymbol *Function, const MCSymbol *BeginFuncEHLabel, 51*9880d681SAndroid Build Coastguard Worker const FrameInfo *ChainedParent) 52*9880d681SAndroid Build Coastguard Worker : Begin(BeginFuncEHLabel), Function(Function), 53*9880d681SAndroid Build Coastguard Worker ChainedParent(ChainedParent) {} 54*9880d681SAndroid Build Coastguard Worker }; 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker class UnwindEmitter { 57*9880d681SAndroid Build Coastguard Worker public: 58*9880d681SAndroid Build Coastguard Worker virtual ~UnwindEmitter(); 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker /// This emits the unwind info sections (.pdata and .xdata in PE/COFF). 61*9880d681SAndroid Build Coastguard Worker virtual void Emit(MCStreamer &Streamer) const = 0; 62*9880d681SAndroid Build Coastguard Worker virtual void EmitUnwindInfo(MCStreamer &Streamer, FrameInfo *FI) const = 0; 63*9880d681SAndroid Build Coastguard Worker }; 64*9880d681SAndroid Build Coastguard Worker } 65*9880d681SAndroid Build Coastguard Worker } 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker #endif 68