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