1 //===- MCWinEH.h - Windows Unwinding Support --------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef LLVM_MC_MCWINEH_H
11 #define LLVM_MC_MCWINEH_H
12 
13 #include <vector>
14 
15 namespace llvm {
16 class MCContext;
17 class MCSection;
18 class MCStreamer;
19 class MCSymbol;
20 class StringRef;
21 
22 namespace WinEH {
23 struct Instruction {
24   const MCSymbol *Label;
25   const unsigned Offset;
26   const unsigned Register;
27   const unsigned Operation;
28 
InstructionInstruction29   Instruction(unsigned Op, MCSymbol *L, unsigned Reg, unsigned Off)
30     : Label(L), Offset(Off), Register(Reg), Operation(Op) {}
31 };
32 
33 struct FrameInfo {
34   const MCSymbol *Begin;
35   const MCSymbol *End;
36   const MCSymbol *ExceptionHandler;
37   const MCSymbol *Function;
38   const MCSymbol *PrologEnd;
39   const MCSymbol *Symbol;
40 
41   bool HandlesUnwind;
42   bool HandlesExceptions;
43 
44   int LastFrameInst;
45   const FrameInfo *ChainedParent;
46   std::vector<Instruction> Instructions;
47 
FrameInfoFrameInfo48   FrameInfo()
49     : Begin(nullptr), End(nullptr), ExceptionHandler(nullptr),
50       Function(nullptr), PrologEnd(nullptr), Symbol(nullptr),
51       HandlesUnwind(false), HandlesExceptions(false), LastFrameInst(-1),
52       ChainedParent(nullptr), Instructions() {}
FrameInfoFrameInfo53   FrameInfo(const MCSymbol *Function, const MCSymbol *BeginFuncEHLabel)
54     : Begin(BeginFuncEHLabel), End(nullptr), ExceptionHandler(nullptr),
55       Function(Function), PrologEnd(nullptr), Symbol(nullptr),
56       HandlesUnwind(false), HandlesExceptions(false), LastFrameInst(-1),
57       ChainedParent(nullptr), Instructions() {}
FrameInfoFrameInfo58   FrameInfo(const MCSymbol *Function, const MCSymbol *BeginFuncEHLabel,
59             const FrameInfo *ChainedParent)
60     : Begin(BeginFuncEHLabel), End(nullptr), ExceptionHandler(nullptr),
61       Function(Function), PrologEnd(nullptr), Symbol(nullptr),
62       HandlesUnwind(false), HandlesExceptions(false), LastFrameInst(-1),
63       ChainedParent(ChainedParent), Instructions() {}
64 };
65 
66 class UnwindEmitter {
67 public:
68   static const MCSection *getPDataSection(const MCSymbol *Function,
69                                           MCContext &Context);
70   static const MCSection *getXDataSection(const MCSymbol *Function,
71                                           MCContext &Context);
72 
~UnwindEmitter()73   virtual ~UnwindEmitter() { }
74 
75   //
76   // This emits the unwind info sections (.pdata and .xdata in PE/COFF).
77   //
78   virtual void Emit(MCStreamer &Streamer) const = 0;
79   virtual void EmitUnwindInfo(MCStreamer &Streamer, FrameInfo *FI) const = 0;
80 };
81 }
82 }
83 
84 #endif
85