MCWin64EH.h revision 7b06b7357aa5a7cbdd769edbf6edb10fa055ea09
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//===- MCWin64EH.h - Machine Code Win64 EH support --------------*- C++ -*-===//
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//                     The LLVM Compiler Infrastructure
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This file is distributed under the University of Illinois Open Source
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// License. See LICENSE.TXT for details.
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//===----------------------------------------------------------------------===//
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This file contains declarations to support the Win64 Exception Handling
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// scheme in MC.
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//===----------------------------------------------------------------------===//
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef LLVM_MC_MCWIN64EH_H
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define LLVM_MC_MCWIN64EH_H
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "llvm/Support/Win64EH.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <cassert>
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector>
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace llvm {
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  class StringRef;
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  class MCStreamer;
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  class MCSymbol;
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  class MCWin64EHInstruction {
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  public:
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    typedef Win64EH::UnwindOpcodes OpType;
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  private:
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    OpType Operation;
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MCSymbol *Label;
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    unsigned Offset;
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    unsigned Register;
35  public:
36    MCWin64EHInstruction(OpType Op, MCSymbol *L, unsigned Reg)
37      : Operation(Op), Label(L), Offset(0), Register(Reg) {
38     assert(Op == Win64EH::UOP_PushNonVol);
39    }
40    MCWin64EHInstruction(MCSymbol *L, unsigned Size)
41      : Operation(Size>128 ? Win64EH::UOP_AllocLarge : Win64EH::UOP_AllocSmall),
42        Label(L), Offset(Size) { }
43    MCWin64EHInstruction(OpType Op, MCSymbol *L, unsigned Reg, unsigned Off)
44      : Operation(Op), Label(L), Offset(Off), Register(Reg) {
45      assert(Op == Win64EH::UOP_SetFPReg ||
46             Op == Win64EH::UOP_SaveNonVol ||
47             Op == Win64EH::UOP_SaveNonVolBig ||
48             Op == Win64EH::UOP_SaveXMM128 ||
49             Op == Win64EH::UOP_SaveXMM128Big);
50    }
51    MCWin64EHInstruction(OpType Op, MCSymbol *L, bool Code)
52      : Operation(Op), Label(L), Offset(Code ? 1 : 0) {
53      assert(Op == Win64EH::UOP_PushMachFrame);
54    }
55    OpType getOperation() const { return Operation; }
56    MCSymbol *getLabel() const { return Label; }
57    unsigned getOffset() const { return Offset; }
58    unsigned getSize() const { return Offset; }
59    unsigned getRegister() const { return Register; }
60    bool isPushCodeFrame() const { return Offset == 1; }
61  };
62
63  struct MCWin64EHUnwindInfo {
64    MCWin64EHUnwindInfo() : Begin(0), End(0), ExceptionHandler(0),
65                            Function(0), PrologEnd(0), Symbol(0),
66                            HandlesUnwind(false), HandlesExceptions(false),
67                            LastFrameInst(-1), ChainedParent(0),
68                            Instructions() {}
69    MCSymbol *Begin;
70    MCSymbol *End;
71    const MCSymbol *ExceptionHandler;
72    const MCSymbol *Function;
73    MCSymbol *PrologEnd;
74    MCSymbol *Symbol;
75    bool HandlesUnwind;
76    bool HandlesExceptions;
77    int LastFrameInst;
78    MCWin64EHUnwindInfo *ChainedParent;
79    std::vector<MCWin64EHInstruction> Instructions;
80  };
81
82  class MCWin64EHUnwindEmitter {
83  public:
84    static StringRef GetSectionSuffix(const MCSymbol *func);
85    //
86    // This emits the unwind info sections (.pdata and .xdata in PE/COFF).
87    //
88    static void Emit(MCStreamer &streamer);
89    static void EmitUnwindInfo(MCStreamer &streamer, MCWin64EHUnwindInfo *info);
90  };
91} // end namespace llvm
92
93#endif
94