// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_MC_MCOBJECTSTREAMER_H #define RCC_MC_MCOBJECTSTREAMER_H #include "rcc/MC/MCAssembler.h" #include "rcc/MC/MCObjectWriter.h" #include "rcc/MC/MCStreamer.h" #include #include #include #include namespace rcc::mc { class ELFObjectStreamer final : public MCStreamer { public: ELFObjectStreamer(const MCCodeEmitter &Emitter, const MCAsmBackend &Backend, const MCObjectWriter &Writer) noexcept : Assembler(Emitter, Backend), Writer(&Writer) {} [[nodiscard]] Expected switchSection(MCSectionRef Section) override; [[nodiscard]] Expected emitLabel(MCSymbolRef Symbol) override; [[nodiscard]] Expected emitInstruction(const MCInst &Instruction) override; [[nodiscard]] Expected emitValue(MCExprRef Value, std::uint8_t Size) override; [[nodiscard]] Expected emitBytes(std::span Bytes) override; [[nodiscard]] Expected emitZeroFill(std::uint64_t Size) override; [[nodiscard]] Expected emitAlignment(std::uint64_t Alignment, std::uint8_t Fill = 0, std::uint64_t MaximumBytes = 0) override; [[nodiscard]] Expected emitSymbolAttribute(MCSymbolRef Symbol, MCSymbolAttribute Attribute) override; [[nodiscard]] Expected emitSymbolSize(MCSymbolRef Symbol, MCExprRef Size) override; [[nodiscard]] Expected emitCommonSymbol(MCSymbolRef Symbol, std::uint64_t Size, std::uint64_t Alignment) override; [[nodiscard]] Expected emitDirective(std::string_view Name, std::string_view Arguments = {}) override; [[nodiscard]] Expected emitCFI(const MCCFIInstruction &Instruction) override; [[nodiscard]] Expected emitInlineAssembly(std::string_view Text) override; [[nodiscard]] Expected emitComment(std::string_view Text) override; [[nodiscard]] Expected finish() override; [[nodiscard]] Expected configureDwarfFrame(MCSectionRef Section, MCDwarfFrameInfo Info); [[nodiscard]] Expected> takeOutput(); private: [[nodiscard]] Expected ensureOpen() const; MCAssembler Assembler; const MCObjectWriter *Writer; std::vector Output; bool IsFinished = false; bool OutputWasTaken = false; }; } // namespace rcc::mc #endif // RCC_MC_MCOBJECTSTREAMER_H