Path: blob/main/contrib/llvm-project/llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFStreamer.cpp
35294 views
//===-- X86WinCOFFStreamer.cpp - X86 Target WinCOFF Streamer ----*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "X86MCTargetDesc.h"9#include "X86TargetStreamer.h"10#include "llvm/MC/MCAsmBackend.h"11#include "llvm/MC/MCAssembler.h"12#include "llvm/MC/MCCodeEmitter.h"13#include "llvm/MC/MCObjectWriter.h"14#include "llvm/MC/MCWin64EH.h"15#include "llvm/MC/MCWinCOFFStreamer.h"1617using namespace llvm;1819namespace {20class X86WinCOFFStreamer : public MCWinCOFFStreamer {21Win64EH::UnwindEmitter EHStreamer;22public:23X86WinCOFFStreamer(MCContext &C, std::unique_ptr<MCAsmBackend> AB,24std::unique_ptr<MCCodeEmitter> CE,25std::unique_ptr<MCObjectWriter> OW)26: MCWinCOFFStreamer(C, std::move(AB), std::move(CE), std::move(OW)) {}2728void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override;29void emitWinEHHandlerData(SMLoc Loc) override;30void emitWindowsUnwindTables(WinEH::FrameInfo *Frame) override;31void emitWindowsUnwindTables() override;32void emitCVFPOData(const MCSymbol *ProcSym, SMLoc Loc) override;33void finishImpl() override;34};3536void X86WinCOFFStreamer::emitInstruction(const MCInst &Inst,37const MCSubtargetInfo &STI) {38X86_MC::emitInstruction(*this, Inst, STI);39}4041void X86WinCOFFStreamer::emitWinEHHandlerData(SMLoc Loc) {42MCStreamer::emitWinEHHandlerData(Loc);4344// We have to emit the unwind info now, because this directive45// actually switches to the .xdata section.46if (WinEH::FrameInfo *CurFrame = getCurrentWinFrameInfo())47EHStreamer.EmitUnwindInfo(*this, CurFrame, /* HandlerData = */ true);48}4950void X86WinCOFFStreamer::emitWindowsUnwindTables(WinEH::FrameInfo *Frame) {51EHStreamer.EmitUnwindInfo(*this, Frame, /* HandlerData = */ false);52}5354void X86WinCOFFStreamer::emitWindowsUnwindTables() {55if (!getNumWinFrameInfos())56return;57EHStreamer.Emit(*this);58}5960void X86WinCOFFStreamer::emitCVFPOData(const MCSymbol *ProcSym, SMLoc Loc) {61X86TargetStreamer *XTS =62static_cast<X86TargetStreamer *>(getTargetStreamer());63XTS->emitFPOData(ProcSym, Loc);64}6566void X86WinCOFFStreamer::finishImpl() {67emitFrames(nullptr);68emitWindowsUnwindTables();6970MCWinCOFFStreamer::finishImpl();71}72} // namespace7374MCStreamer *75llvm::createX86WinCOFFStreamer(MCContext &C, std::unique_ptr<MCAsmBackend> &&AB,76std::unique_ptr<MCObjectWriter> &&OW,77std::unique_ptr<MCCodeEmitter> &&CE) {78return new X86WinCOFFStreamer(C, std::move(AB), std::move(CE), std::move(OW));79}808182