//===- MCWin64EH.h - Machine Code Win64 EH support --------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file contains declarations to support the Win64 Exception Handling // scheme in MC. // //===----------------------------------------------------------------------===// #ifndef LLVM_MC_MCWIN64EH_H #define LLVM_MC_MCWIN64EH_H #include "llvm/Support/Win64EH.h" #include <cassert> #include <vector> namespace llvm { class StringRef; class MCStreamer; class MCSymbol; class MCWin64EHInstruction { public: typedef Win64EH::UnwindOpcodes OpType; private: OpType Operation; MCSymbol *Label; unsigned Offset; unsigned Register; public: MCWin64EHInstruction(OpType Op, MCSymbol *L, unsigned Reg) : Operation(Op), Label(L), Offset(0), Register(Reg) { assert(Op == Win64EH::UOP_PushNonVol); } MCWin64EHInstruction(MCSymbol *L, unsigned Size) : Operation(Size>128 ? Win64EH::UOP_AllocLarge : Win64EH::UOP_AllocSmall), Label(L), Offset(Size) { } MCWin64EHInstruction(OpType Op, MCSymbol *L, unsigned Reg, unsigned Off) : Operation(Op), Label(L), Offset(Off), Register(Reg) { assert(Op == Win64EH::UOP_SetFPReg || Op == Win64EH::UOP_SaveNonVol || Op == Win64EH::UOP_SaveNonVolBig || Op == Win64EH::UOP_SaveXMM128 || Op == Win64EH::UOP_SaveXMM128Big); } MCWin64EHInstruction(OpType Op, MCSymbol *L, bool Code) : Operation(Op), Label(L), Offset(Code ? 1 : 0) { assert(Op == Win64EH::UOP_PushMachFrame); } OpType getOperation() const { return Operation; } MCSymbol *getLabel() const { return Label; } unsigned getOffset() const { return Offset; } unsigned getSize() const { return Offset; } unsigned getRegister() const { return Register; } bool isPushCodeFrame() const { return Offset == 1; } }; struct MCWin64EHUnwindInfo { MCWin64EHUnwindInfo() : Begin(0), End(0), ExceptionHandler(0), Function(0), PrologEnd(0), Symbol(0), HandlesUnwind(false), HandlesExceptions(false), LastFrameInst(-1), ChainedParent(0), Instructions() {} MCSymbol *Begin; MCSymbol *End; const MCSymbol *ExceptionHandler; const MCSymbol *Function; MCSymbol *PrologEnd; MCSymbol *Symbol; bool HandlesUnwind; bool HandlesExceptions; int LastFrameInst; MCWin64EHUnwindInfo *ChainedParent; std::vector<MCWin64EHInstruction> Instructions; }; class MCWin64EHUnwindEmitter { public: static StringRef GetSectionSuffix(const MCSymbol *func); // // This emits the unwind info sections (.pdata and .xdata in PE/COFF). // static void Emit(MCStreamer &streamer); static void EmitUnwindInfo(MCStreamer &streamer, MCWin64EHUnwindInfo *info); }; } // end namespace llvm #endif