1 //===- MCWin64EH.h - Machine Code Win64 EH 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 // This file contains declarations to support the Win64 Exception Handling
11 // scheme in MC.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_MC_MCWIN64EH_H
16 #define LLVM_MC_MCWIN64EH_H
17 
18 #include "llvm/MC/MCWinEH.h"
19 #include "llvm/Support/Win64EH.h"
20 #include <vector>
21 
22 namespace llvm {
23 class MCStreamer;
24 class MCSymbol;
25 
26 namespace Win64EH {
27 struct Instruction {
PushNonVolInstruction28   static WinEH::Instruction PushNonVol(MCSymbol *L, unsigned Reg) {
29     return WinEH::Instruction(Win64EH::UOP_PushNonVol, L, Reg, -1);
30   }
AllocInstruction31   static WinEH::Instruction Alloc(MCSymbol *L, unsigned Size) {
32     return WinEH::Instruction(Size > 128 ? UOP_AllocLarge : UOP_AllocSmall, L,
33                               -1, Size);
34   }
PushMachFrameInstruction35   static WinEH::Instruction PushMachFrame(MCSymbol *L, bool Code) {
36     return WinEH::Instruction(UOP_PushMachFrame, L, -1, Code ? 1 : 0);
37   }
SaveNonVolInstruction38   static WinEH::Instruction SaveNonVol(MCSymbol *L, unsigned Reg,
39                                        unsigned Offset) {
40     return WinEH::Instruction(Offset > 512 * 1024 - 8 ? UOP_SaveNonVolBig
41                                                       : UOP_SaveNonVol,
42                               L, Reg, Offset);
43   }
SaveXMMInstruction44   static WinEH::Instruction SaveXMM(MCSymbol *L, unsigned Reg,
45                                     unsigned Offset) {
46     return WinEH::Instruction(Offset > 512 * 1024 - 8 ? UOP_SaveXMM128Big
47                                                       : UOP_SaveXMM128,
48                               L, Reg, Offset);
49   }
SetFPRegInstruction50   static WinEH::Instruction SetFPReg(MCSymbol *L, unsigned Reg, unsigned Off) {
51     return WinEH::Instruction(UOP_SetFPReg, L, Reg, Off);
52   }
53 };
54 
55 class UnwindEmitter : public WinEH::UnwindEmitter {
56 public:
57   void Emit(MCStreamer &Streamer) const override;
58   void EmitUnwindInfo(MCStreamer &Streamer, WinEH::FrameInfo *FI) const override;
59 };
60 }
61 } // end namespace llvm
62 
63 #endif
64