Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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