X86WinCOFFStreamer.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. //===-- X86WinCOFFStreamer.cpp - X86 Target WinCOFF Streamer ----*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "X86MCTargetDesc.h"
  9. #include "X86TargetStreamer.h"
  10. #include "llvm/MC/MCAsmBackend.h"
  11. #include "llvm/MC/MCCodeEmitter.h"
  12. #include "llvm/MC/MCObjectWriter.h"
  13. #include "llvm/MC/MCWin64EH.h"
  14. #include "llvm/MC/MCWinCOFFStreamer.h"
  15. using namespace llvm;
  16. namespace {
  17. class X86WinCOFFStreamer : public MCWinCOFFStreamer {
  18. Win64EH::UnwindEmitter EHStreamer;
  19. public:
  20. X86WinCOFFStreamer(MCContext &C, std::unique_ptr<MCAsmBackend> AB,
  21. std::unique_ptr<MCCodeEmitter> CE,
  22. std::unique_ptr<MCObjectWriter> OW)
  23. : MCWinCOFFStreamer(C, std::move(AB), std::move(CE), std::move(OW)) {}
  24. void EmitWinEHHandlerData(SMLoc Loc) override;
  25. void EmitWindowsUnwindTables(WinEH::FrameInfo *Frame) override;
  26. void EmitWindowsUnwindTables() override;
  27. void EmitCVFPOData(const MCSymbol *ProcSym, SMLoc Loc) override;
  28. void finishImpl() override;
  29. };
  30. void X86WinCOFFStreamer::EmitWinEHHandlerData(SMLoc Loc) {
  31. MCStreamer::EmitWinEHHandlerData(Loc);
  32. // We have to emit the unwind info now, because this directive
  33. // actually switches to the .xdata section.
  34. if (WinEH::FrameInfo *CurFrame = getCurrentWinFrameInfo())
  35. EHStreamer.EmitUnwindInfo(*this, CurFrame, /* HandlerData = */ true);
  36. }
  37. void X86WinCOFFStreamer::EmitWindowsUnwindTables(WinEH::FrameInfo *Frame) {
  38. EHStreamer.EmitUnwindInfo(*this, Frame, /* HandlerData = */ false);
  39. }
  40. void X86WinCOFFStreamer::EmitWindowsUnwindTables() {
  41. if (!getNumWinFrameInfos())
  42. return;
  43. EHStreamer.Emit(*this);
  44. }
  45. void X86WinCOFFStreamer::EmitCVFPOData(const MCSymbol *ProcSym, SMLoc Loc) {
  46. X86TargetStreamer *XTS =
  47. static_cast<X86TargetStreamer *>(getTargetStreamer());
  48. XTS->emitFPOData(ProcSym, Loc);
  49. }
  50. void X86WinCOFFStreamer::finishImpl() {
  51. emitFrames(nullptr);
  52. EmitWindowsUnwindTables();
  53. MCWinCOFFStreamer::finishImpl();
  54. }
  55. } // namespace
  56. MCStreamer *llvm::createX86WinCOFFStreamer(MCContext &C,
  57. std::unique_ptr<MCAsmBackend> &&AB,
  58. std::unique_ptr<MCObjectWriter> &&OW,
  59. std::unique_ptr<MCCodeEmitter> &&CE,
  60. bool RelaxAll,
  61. bool IncrementalLinkerCompatible) {
  62. X86WinCOFFStreamer *S =
  63. new X86WinCOFFStreamer(C, std::move(AB), std::move(CE), std::move(OW));
  64. S->getAssembler().setRelaxAll(RelaxAll);
  65. S->getAssembler().setIncrementalLinkerCompatible(IncrementalLinkerCompatible);
  66. return S;
  67. }