Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.