xref: /freebsd/contrib/llvm-project/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
106c3fb27SDimitry Andric //===-- RISCVELFStreamer.h - RISC-V ELF Target Streamer ---------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
904eeddc0SDimitry Andric #ifndef LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVELFSTREAMER_H
1004eeddc0SDimitry Andric #define LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVELFSTREAMER_H
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include "RISCVTargetStreamer.h"
130b57cec5SDimitry Andric #include "llvm/MC/MCELFStreamer.h"
140b57cec5SDimitry Andric 
15bdd1243dSDimitry Andric using namespace llvm;
16bdd1243dSDimitry Andric 
17bdd1243dSDimitry Andric class RISCVELFStreamer : public MCELFStreamer {
18bdd1243dSDimitry Andric   void reset() override;
195f757f3fSDimitry Andric   void emitDataMappingSymbol();
205f757f3fSDimitry Andric   void emitInstructionsMappingSymbol();
215f757f3fSDimitry Andric   void emitMappingSymbol(StringRef Name);
225f757f3fSDimitry Andric 
235f757f3fSDimitry Andric   enum ElfMappingSymbol { EMS_None, EMS_Instructions, EMS_Data };
245f757f3fSDimitry Andric 
255f757f3fSDimitry Andric   DenseMap<const MCSection *, ElfMappingSymbol> LastMappingSymbols;
265f757f3fSDimitry Andric   ElfMappingSymbol LastEMS = EMS_None;
27bdd1243dSDimitry Andric 
28bdd1243dSDimitry Andric public:
RISCVELFStreamer(MCContext & C,std::unique_ptr<MCAsmBackend> MAB,std::unique_ptr<MCObjectWriter> MOW,std::unique_ptr<MCCodeEmitter> MCE)29bdd1243dSDimitry Andric   RISCVELFStreamer(MCContext &C, std::unique_ptr<MCAsmBackend> MAB,
30bdd1243dSDimitry Andric                    std::unique_ptr<MCObjectWriter> MOW,
31bdd1243dSDimitry Andric                    std::unique_ptr<MCCodeEmitter> MCE)
32bdd1243dSDimitry Andric       : MCELFStreamer(C, std::move(MAB), std::move(MOW), std::move(MCE)) {}
335f757f3fSDimitry Andric 
34*0fca6ea1SDimitry Andric   void changeSection(MCSection *Section, uint32_t Subsection) override;
355f757f3fSDimitry Andric   void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override;
365f757f3fSDimitry Andric   void emitBytes(StringRef Data) override;
375f757f3fSDimitry Andric   void emitFill(const MCExpr &NumBytes, uint64_t FillValue, SMLoc Loc) override;
385f757f3fSDimitry Andric   void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc) override;
39bdd1243dSDimitry Andric };
40bdd1243dSDimitry Andric 
410b57cec5SDimitry Andric namespace llvm {
420b57cec5SDimitry Andric 
430b57cec5SDimitry Andric class RISCVTargetELFStreamer : public RISCVTargetStreamer {
445ffd83dbSDimitry Andric private:
455ffd83dbSDimitry Andric   StringRef CurrentVendor;
465ffd83dbSDimitry Andric 
475ffd83dbSDimitry Andric   MCSection *AttributeSection = nullptr;
485ffd83dbSDimitry Andric 
495ffd83dbSDimitry Andric   void emitAttribute(unsigned Attribute, unsigned Value) override;
505ffd83dbSDimitry Andric   void emitTextAttribute(unsigned Attribute, StringRef String) override;
515ffd83dbSDimitry Andric   void emitIntTextAttribute(unsigned Attribute, unsigned IntValue,
525ffd83dbSDimitry Andric                             StringRef StringValue) override;
535ffd83dbSDimitry Andric   void finishAttributeSection() override;
545ffd83dbSDimitry Andric 
5581ad6265SDimitry Andric   void reset() override;
5681ad6265SDimitry Andric 
570b57cec5SDimitry Andric public:
58bdd1243dSDimitry Andric   RISCVELFStreamer &getStreamer();
590b57cec5SDimitry Andric   RISCVTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
600b57cec5SDimitry Andric 
615ffd83dbSDimitry Andric   void emitDirectiveOptionPush() override;
625ffd83dbSDimitry Andric   void emitDirectiveOptionPop() override;
635ffd83dbSDimitry Andric   void emitDirectiveOptionPIC() override;
645ffd83dbSDimitry Andric   void emitDirectiveOptionNoPIC() override;
655ffd83dbSDimitry Andric   void emitDirectiveOptionRVC() override;
665ffd83dbSDimitry Andric   void emitDirectiveOptionNoRVC() override;
675ffd83dbSDimitry Andric   void emitDirectiveOptionRelax() override;
685ffd83dbSDimitry Andric   void emitDirectiveOptionNoRelax() override;
69bdd1243dSDimitry Andric   void emitDirectiveVariantCC(MCSymbol &Symbol) override;
7081ad6265SDimitry Andric 
7181ad6265SDimitry Andric   void finish() override;
720b57cec5SDimitry Andric };
73fe6060f1SDimitry Andric 
74fe6060f1SDimitry Andric MCELFStreamer *createRISCVELFStreamer(MCContext &C,
75fe6060f1SDimitry Andric                                       std::unique_ptr<MCAsmBackend> MAB,
76fe6060f1SDimitry Andric                                       std::unique_ptr<MCObjectWriter> MOW,
77*0fca6ea1SDimitry Andric                                       std::unique_ptr<MCCodeEmitter> MCE);
780b57cec5SDimitry Andric }
790b57cec5SDimitry Andric #endif
80