Home | History | Annotate | Download | only in MCTargetDesc
      1 //===-- X86WinCOFFStreamer.cpp - X86 Target WinCOFF Streamer ----*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "X86MCTargetDesc.h"
     11 #include "llvm/MC/MCWinCOFFStreamer.h"
     12 
     13 using namespace llvm;
     14 
     15 namespace {
     16 class X86WinCOFFStreamer : public MCWinCOFFStreamer {
     17 public:
     18   X86WinCOFFStreamer(MCContext &C, MCAsmBackend &AB, MCCodeEmitter *CE,
     19                      raw_ostream &OS)
     20     : MCWinCOFFStreamer(C, AB, *CE, OS) { }
     21 
     22   void EmitWinEHHandlerData() override;
     23   void FinishImpl() override;
     24 };
     25 
     26 void X86WinCOFFStreamer::EmitWinEHHandlerData() {
     27   MCStreamer::EmitWinEHHandlerData();
     28 
     29   // We have to emit the unwind info now, because this directive
     30   // actually switches to the .xdata section!
     31   MCWin64EHUnwindEmitter::EmitUnwindInfo(*this, getCurrentW64UnwindInfo());
     32 }
     33 
     34 void X86WinCOFFStreamer::FinishImpl() {
     35   EmitFrames(nullptr);
     36   EmitW64Tables();
     37 
     38   MCWinCOFFStreamer::FinishImpl();
     39 }
     40 }
     41 
     42 namespace llvm {
     43 MCStreamer *createX86WinCOFFStreamer(MCContext &C, MCAsmBackend &AB,
     44                                      MCCodeEmitter *CE, raw_ostream &OS,
     45                                      bool RelaxAll) {
     46   X86WinCOFFStreamer *S = new X86WinCOFFStreamer(C, AB, CE, OS);
     47   S->getAssembler().setRelaxAll(RelaxAll);
     48   return S;
     49 }
     50 }
     51 
     52