106c3fb27SDimitry Andric //===-- RISCVTargetStreamer.h - RISC-V 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_RISCVTARGETSTREAMER_H 1004eeddc0SDimitry Andric #define LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVTARGETSTREAMER_H 110b57cec5SDimitry Andric 1281ad6265SDimitry Andric #include "RISCV.h" 130b57cec5SDimitry Andric #include "llvm/MC/MCStreamer.h" 145ffd83dbSDimitry Andric #include "llvm/MC/MCSubtargetInfo.h" 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric namespace llvm { 170b57cec5SDimitry Andric 18fe6060f1SDimitry Andric class formatted_raw_ostream; 19fe6060f1SDimitry Andric 2006c3fb27SDimitry Andric enum class RISCVOptionArchArgType { 2106c3fb27SDimitry Andric Full, 2206c3fb27SDimitry Andric Plus, 2306c3fb27SDimitry Andric Minus, 2406c3fb27SDimitry Andric }; 2506c3fb27SDimitry Andric 2606c3fb27SDimitry Andric struct RISCVOptionArchArg { 2706c3fb27SDimitry Andric RISCVOptionArchArgType Type; 2806c3fb27SDimitry Andric std::string Value; 2906c3fb27SDimitry Andric RISCVOptionArchArgRISCVOptionArchArg3006c3fb27SDimitry Andric RISCVOptionArchArg(RISCVOptionArchArgType Type, std::string Value) 3106c3fb27SDimitry Andric : Type(Type), Value(Value) {} 3206c3fb27SDimitry Andric }; 3306c3fb27SDimitry Andric 340b57cec5SDimitry Andric class RISCVTargetStreamer : public MCTargetStreamer { 3581ad6265SDimitry Andric RISCVABI::ABI TargetABI = RISCVABI::ABI_Unknown; 36*3a079333SDimitry Andric bool HasRVC = false; 37*3a079333SDimitry Andric bool HasTSO = false; 3881ad6265SDimitry Andric 390b57cec5SDimitry Andric public: 400b57cec5SDimitry Andric RISCVTargetStreamer(MCStreamer &S); 415ffd83dbSDimitry Andric void finish() override; 4281ad6265SDimitry Andric virtual void reset(); 430b57cec5SDimitry Andric 445ffd83dbSDimitry Andric virtual void emitDirectiveOptionPush(); 455ffd83dbSDimitry Andric virtual void emitDirectiveOptionPop(); 465ffd83dbSDimitry Andric virtual void emitDirectiveOptionPIC(); 475ffd83dbSDimitry Andric virtual void emitDirectiveOptionNoPIC(); 485ffd83dbSDimitry Andric virtual void emitDirectiveOptionRVC(); 495ffd83dbSDimitry Andric virtual void emitDirectiveOptionNoRVC(); 505ffd83dbSDimitry Andric virtual void emitDirectiveOptionRelax(); 515ffd83dbSDimitry Andric virtual void emitDirectiveOptionNoRelax(); 5206c3fb27SDimitry Andric virtual void emitDirectiveOptionArch(ArrayRef<RISCVOptionArchArg> Args); 53bdd1243dSDimitry Andric virtual void emitDirectiveVariantCC(MCSymbol &Symbol); 545ffd83dbSDimitry Andric virtual void emitAttribute(unsigned Attribute, unsigned Value); 555ffd83dbSDimitry Andric virtual void finishAttributeSection(); 565ffd83dbSDimitry Andric virtual void emitTextAttribute(unsigned Attribute, StringRef String); 575ffd83dbSDimitry Andric virtual void emitIntTextAttribute(unsigned Attribute, unsigned IntValue, 585ffd83dbSDimitry Andric StringRef StringValue); 595ffd83dbSDimitry Andric 6006c3fb27SDimitry Andric void emitTargetAttributes(const MCSubtargetInfo &STI, bool EmitStackAlign); 6181ad6265SDimitry Andric void setTargetABI(RISCVABI::ABI ABI); getTargetABI()6281ad6265SDimitry Andric RISCVABI::ABI getTargetABI() const { return TargetABI; } 63*3a079333SDimitry Andric void setFlagsFromFeatures(const MCSubtargetInfo &STI); hasRVC()64*3a079333SDimitry Andric bool hasRVC() const { return HasRVC; } hasTSO()65*3a079333SDimitry Andric bool hasTSO() const { return HasTSO; } 660b57cec5SDimitry Andric }; 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric // This part is for ascii assembly output 690b57cec5SDimitry Andric class RISCVTargetAsmStreamer : public RISCVTargetStreamer { 700b57cec5SDimitry Andric formatted_raw_ostream &OS; 710b57cec5SDimitry Andric 725ffd83dbSDimitry Andric void finishAttributeSection() override; 735ffd83dbSDimitry Andric void emitAttribute(unsigned Attribute, unsigned Value) override; 745ffd83dbSDimitry Andric void emitTextAttribute(unsigned Attribute, StringRef String) override; 755ffd83dbSDimitry Andric void emitIntTextAttribute(unsigned Attribute, unsigned IntValue, 765ffd83dbSDimitry Andric StringRef StringValue) override; 775ffd83dbSDimitry Andric 780b57cec5SDimitry Andric public: 790b57cec5SDimitry Andric RISCVTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS); 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric void emitDirectiveOptionPush() override; 820b57cec5SDimitry Andric void emitDirectiveOptionPop() override; 835ffd83dbSDimitry Andric void emitDirectiveOptionPIC() override; 845ffd83dbSDimitry Andric void emitDirectiveOptionNoPIC() override; 850b57cec5SDimitry Andric void emitDirectiveOptionRVC() override; 860b57cec5SDimitry Andric void emitDirectiveOptionNoRVC() override; 870b57cec5SDimitry Andric void emitDirectiveOptionRelax() override; 880b57cec5SDimitry Andric void emitDirectiveOptionNoRelax() override; 8906c3fb27SDimitry Andric void emitDirectiveOptionArch(ArrayRef<RISCVOptionArchArg> Args) override; 90bdd1243dSDimitry Andric void emitDirectiveVariantCC(MCSymbol &Symbol) override; 910b57cec5SDimitry Andric }; 920b57cec5SDimitry Andric 930b57cec5SDimitry Andric } 940b57cec5SDimitry Andric #endif 95