137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===- MCWinEH.h - Windows Unwinding Support --------------------*- C++ -*-===// 237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// 337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// The LLVM Compiler Infrastructure 437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// 537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// This file is distributed under the University of Illinois Open Source 637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// License. See LICENSE.TXT for details. 737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// 837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===// 937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_MC_MCWINEH_H 1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_MC_MCWINEH_H 1237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 1337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include <vector> 1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesnamespace llvm { 1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass MCSection; 1737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass MCStreamer; 1837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass MCSymbol; 1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 2037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesnamespace WinEH { 2137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstruct Instruction { 2237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const MCSymbol *Label; 2337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const unsigned Offset; 2437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const unsigned Register; 2537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const unsigned Operation; 2637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 2737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Instruction(unsigned Op, MCSymbol *L, unsigned Reg, unsigned Off) 2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines : Label(L), Offset(Off), Register(Reg), Operation(Op) {} 2937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 3037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 3137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstruct FrameInfo { 32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const MCSymbol *Begin = nullptr; 33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const MCSymbol *End = nullptr; 34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const MCSymbol *ExceptionHandler = nullptr; 35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const MCSymbol *Function = nullptr; 36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const MCSymbol *PrologEnd = nullptr; 37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const MCSymbol *Symbol = nullptr; 38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const MCSection *TextSection = nullptr; 3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool HandlesUnwind = false; 41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool HandlesExceptions = false; 4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar int LastFrameInst = -1; 44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const FrameInfo *ChainedParent = nullptr; 4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::vector<Instruction> Instructions; 4637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar FrameInfo() = default; 4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines FrameInfo(const MCSymbol *Function, const MCSymbol *BeginFuncEHLabel) 49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar : Begin(BeginFuncEHLabel), Function(Function) {} 5037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines FrameInfo(const MCSymbol *Function, const MCSymbol *BeginFuncEHLabel, 5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const FrameInfo *ChainedParent) 52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar : Begin(BeginFuncEHLabel), Function(Function), 53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ChainedParent(ChainedParent) {} 5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass UnwindEmitter { 5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic: 58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar virtual ~UnwindEmitter(); 5937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// This emits the unwind info sections (.pdata and .xdata in PE/COFF). 6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines virtual void Emit(MCStreamer &Streamer) const = 0; 6237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines virtual void EmitUnwindInfo(MCStreamer &Streamer, FrameInfo *FI) const = 0; 6337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 6437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 6537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 6637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 6737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif 68