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