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