xref: /freebsd/contrib/llvm-project/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.h (revision 3a0793336edfc21cb6d4c8c5c5d7f1665f3e6c5a)
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