1 //===- MCWin64EH.h - Machine Code Win64 EH support --------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file contains declarations to support the Win64 Exception Handling 10 // scheme in MC. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_MC_MCWIN64EH_H 15 #define LLVM_MC_MCWIN64EH_H 16 17 #include "llvm/MC/MCWinEH.h" 18 #include "llvm/Support/Win64EH.h" 19 20 namespace llvm { 21 class MCStreamer; 22 class MCSymbol; 23 24 namespace Win64EH { 25 struct Instruction { 26 static WinEH::Instruction PushNonVol(MCSymbol *L, unsigned Reg) { 27 return WinEH::Instruction(Win64EH::UOP_PushNonVol, L, Reg, -1); 28 } 29 static WinEH::Instruction Alloc(MCSymbol *L, unsigned Size) { 30 return WinEH::Instruction(Size > 128 ? UOP_AllocLarge : UOP_AllocSmall, L, 31 -1, Size); 32 } 33 static WinEH::Instruction PushMachFrame(MCSymbol *L, bool Code) { 34 return WinEH::Instruction(UOP_PushMachFrame, L, -1, Code ? 1 : 0); 35 } 36 static WinEH::Instruction SaveNonVol(MCSymbol *L, unsigned Reg, 37 unsigned Offset) { 38 return WinEH::Instruction(Offset > 512 * 1024 - 8 ? UOP_SaveNonVolBig 39 : UOP_SaveNonVol, 40 L, Reg, Offset); 41 } 42 static WinEH::Instruction SaveXMM(MCSymbol *L, unsigned Reg, 43 unsigned Offset) { 44 return WinEH::Instruction(Offset > 512 * 1024 - 8 ? UOP_SaveXMM128Big 45 : UOP_SaveXMM128, 46 L, Reg, Offset); 47 } 48 static WinEH::Instruction SetFPReg(MCSymbol *L, unsigned Reg, unsigned Off) { 49 return WinEH::Instruction(UOP_SetFPReg, L, Reg, Off); 50 } 51 }; 52 53 class UnwindEmitter : public WinEH::UnwindEmitter { 54 public: 55 void Emit(MCStreamer &Streamer) const override; 56 void EmitUnwindInfo(MCStreamer &Streamer, WinEH::FrameInfo *FI, 57 bool HandlerData) const override; 58 }; 59 60 class ARMUnwindEmitter : public WinEH::UnwindEmitter { 61 public: 62 void Emit(MCStreamer &Streamer) const override; 63 void EmitUnwindInfo(MCStreamer &Streamer, WinEH::FrameInfo *FI, 64 bool HandlerData) const override; 65 }; 66 67 class ARM64UnwindEmitter : public WinEH::UnwindEmitter { 68 public: 69 void Emit(MCStreamer &Streamer) const override; 70 void EmitUnwindInfo(MCStreamer &Streamer, WinEH::FrameInfo *FI, 71 bool HandlerData) const override; 72 }; 73 } 74 } // end namespace llvm 75 76 #endif 77