X86WinCOFFStreamer.cpp revision 296417
1274955Ssvnmir//===-- X86WinCOFFStreamer.cpp - X86 Target WinCOFF Streamer ----*- C++ -*-===// 2274955Ssvnmir// 3274955Ssvnmir// The LLVM Compiler Infrastructure 4274955Ssvnmir// 5274955Ssvnmir// This file is distributed under the University of Illinois Open Source 6274955Ssvnmir// License. See LICENSE.TXT for details. 7274955Ssvnmir// 8274955Ssvnmir//===----------------------------------------------------------------------===// 9274955Ssvnmir 10274955Ssvnmir#include "X86MCTargetDesc.h" 11280031Sdim#include "llvm/MC/MCWin64EH.h" 12274955Ssvnmir#include "llvm/MC/MCWinCOFFStreamer.h" 13274955Ssvnmir 14274955Ssvnmirusing namespace llvm; 15274955Ssvnmir 16274955Ssvnmirnamespace { 17274955Ssvnmirclass X86WinCOFFStreamer : public MCWinCOFFStreamer { 18280031Sdim Win64EH::UnwindEmitter EHStreamer; 19274955Ssvnmirpublic: 20274955Ssvnmir X86WinCOFFStreamer(MCContext &C, MCAsmBackend &AB, MCCodeEmitter *CE, 21288943Sdim raw_pwrite_stream &OS) 22288943Sdim : MCWinCOFFStreamer(C, AB, *CE, OS) {} 23274955Ssvnmir 24274955Ssvnmir void EmitWinEHHandlerData() override; 25280031Sdim void EmitWindowsUnwindTables() override; 26274955Ssvnmir void FinishImpl() override; 27274955Ssvnmir}; 28274955Ssvnmir 29274955Ssvnmirvoid X86WinCOFFStreamer::EmitWinEHHandlerData() { 30274955Ssvnmir MCStreamer::EmitWinEHHandlerData(); 31274955Ssvnmir 32274955Ssvnmir // We have to emit the unwind info now, because this directive 33274955Ssvnmir // actually switches to the .xdata section! 34280031Sdim EHStreamer.EmitUnwindInfo(*this, getCurrentWinFrameInfo()); 35274955Ssvnmir} 36274955Ssvnmir 37280031Sdimvoid X86WinCOFFStreamer::EmitWindowsUnwindTables() { 38280031Sdim if (!getNumWinFrameInfos()) 39280031Sdim return; 40280031Sdim EHStreamer.Emit(*this); 41280031Sdim} 42280031Sdim 43274955Ssvnmirvoid X86WinCOFFStreamer::FinishImpl() { 44274955Ssvnmir EmitFrames(nullptr); 45274955Ssvnmir EmitWindowsUnwindTables(); 46274955Ssvnmir 47274955Ssvnmir MCWinCOFFStreamer::FinishImpl(); 48274955Ssvnmir} 49274955Ssvnmir} 50274955Ssvnmir 51288943SdimMCStreamer *llvm::createX86WinCOFFStreamer(MCContext &C, MCAsmBackend &AB, 52288943Sdim raw_pwrite_stream &OS, 53296417Sdim MCCodeEmitter *CE, bool RelaxAll, 54296417Sdim bool IncrementalLinkerCompatible) { 55274955Ssvnmir X86WinCOFFStreamer *S = new X86WinCOFFStreamer(C, AB, CE, OS); 56274955Ssvnmir S->getAssembler().setRelaxAll(RelaxAll); 57296417Sdim S->getAssembler().setIncrementalLinkerCompatible(IncrementalLinkerCompatible); 58274955Ssvnmir return S; 59274955Ssvnmir} 60274955Ssvnmir 61