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