MCWin64EH.h revision 91d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===- MCWin64EH.h - Machine Code Win64 EH support --------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains the declaration of the MCDwarfFile to support the dwarf
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .file directive and the .loc directive.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef LLVM_MC_MCWIN64EH_H
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LLVM_MC_MCWIN64EH_H
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/CodeGen/MachineLocation.h" // FIXME
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/Win64EH.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace llvm {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class MCStreamer;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class MCSymbol;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class MCWin64EHInstruction {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef Win64EH::UnwindOpcodes OpType;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  private:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OpType Operation;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned Offset;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MachineLocation Destination;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MachineLocation Source;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MCWin64EHInstruction(OpType Op, unsigned Register)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : Operation(Op), Offset(0), Destination(0), Source(Register) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert(Op == Win64EH::UOP_PushNonVol);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MCWin64EHInstruction(unsigned Size)
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      : Operation(Size>128 ? Win64EH::UOP_AllocLarge : Win64EH::UOP_AllocSmall),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Offset(Size) { }
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    MCWin64EHInstruction(unsigned Register, unsigned Off)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : Operation(Win64EH::UOP_SetFPReg), Offset(Off), Destination(Register) { }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MCWin64EHInstruction(OpType Op, const MachineLocation &D,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         unsigned S)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : Operation(Op), Destination(D), Source(S) {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      assert(Op == Win64EH::UOP_SaveNonVol ||
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             Op == Win64EH::UOP_SaveNonVolBig ||
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             Op == Win64EH::UOP_SaveXMM128 ||
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             Op == Win64EH::UOP_SaveXMM128Big);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MCWin64EHInstruction(OpType Op, bool Code)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : Operation(Op), Offset(Code ? 1 : 0) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert(Op == Win64EH::UOP_PushMachFrame);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OpType getOperation() const { return Operation; }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned getOffset() const { return Offset; }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned getSize() const { return Offset; }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool isPushCodeFrame() const { return Offset == 1; }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MachineLocation &getDestination() const { return Destination; }
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const MachineLocation &getSource() const { return Source; }
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct MCWin64EHUnwindInfo {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MCWin64EHUnwindInfo() : Begin(0), End(0), ExceptionHandler(0), Lsda(0),
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            Function(0), UnwindOnly(false), LsdaSize(0),
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            PrologSize(0), LastFrameInst(-1), ChainedParent(0),
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            Instructions() {}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MCSymbol *Begin;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MCSymbol *End;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MCSymbol *ExceptionHandler;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MCSymbol *Lsda;
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const MCSymbol *Function;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool UnwindOnly;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned LsdaSize;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned PrologSize;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int LastFrameInst;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MCWin64EHUnwindInfo *ChainedParent;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<MCWin64EHInstruction> Instructions;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class MCWin64EHUnwindEmitter {
83  public:
84    //
85    // This emits the unwind info section (.xdata in PE/COFF).
86    //
87    static void Emit(MCStreamer &streamer);
88  };
89} // end namespace llvm
90
91#endif
92