//===- MCWinEH.h - Windows Unwinding Support --------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_MC_MCWINEH_H #define LLVM_MC_MCWINEH_H #include namespace llvm { class MCContext; class MCSection; class MCStreamer; class MCSymbol; class StringRef; namespace WinEH { struct Instruction { const MCSymbol *Label; const unsigned Offset; const unsigned Register; const unsigned Operation; Instruction(unsigned Op, MCSymbol *L, unsigned Reg, unsigned Off) : Label(L), Offset(Off), Register(Reg), Operation(Op) {} }; struct FrameInfo { const MCSymbol *Begin; const MCSymbol *End; const MCSymbol *ExceptionHandler; const MCSymbol *Function; const MCSymbol *PrologEnd; const MCSymbol *Symbol; bool HandlesUnwind; bool HandlesExceptions; int LastFrameInst; const FrameInfo *ChainedParent; std::vector Instructions; FrameInfo() : Begin(nullptr), End(nullptr), ExceptionHandler(nullptr), Function(nullptr), PrologEnd(nullptr), Symbol(nullptr), HandlesUnwind(false), HandlesExceptions(false), LastFrameInst(-1), ChainedParent(nullptr), Instructions() {} FrameInfo(const MCSymbol *Function, const MCSymbol *BeginFuncEHLabel) : Begin(BeginFuncEHLabel), End(nullptr), ExceptionHandler(nullptr), Function(Function), PrologEnd(nullptr), Symbol(nullptr), HandlesUnwind(false), HandlesExceptions(false), LastFrameInst(-1), ChainedParent(nullptr), Instructions() {} FrameInfo(const MCSymbol *Function, const MCSymbol *BeginFuncEHLabel, const FrameInfo *ChainedParent) : Begin(BeginFuncEHLabel), End(nullptr), ExceptionHandler(nullptr), Function(Function), PrologEnd(nullptr), Symbol(nullptr), HandlesUnwind(false), HandlesExceptions(false), LastFrameInst(-1), ChainedParent(ChainedParent), Instructions() {} }; class UnwindEmitter { public: static MCSection *getPDataSection(const MCSymbol *Function, MCContext &Context); static MCSection *getXDataSection(const MCSymbol *Function, MCContext &Context); virtual ~UnwindEmitter() { } // // This emits the unwind info sections (.pdata and .xdata in PE/COFF). // virtual void Emit(MCStreamer &Streamer) const = 0; virtual void EmitUnwindInfo(MCStreamer &Streamer, FrameInfo *FI) const = 0; }; } } #endif