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