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