xref: /freebsd/contrib/llvm-project/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===- SystemZHLASMAsmStreamer.h - HLASM Assembly Text Output ---*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file declares the SystemZHLASMAsmStreamer class.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZHLASMASMSTREAMER_H
14 #define LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZHLASMASMSTREAMER_H
15 
16 #include "llvm/ADT/SmallString.h"
17 #include "llvm/ADT/StringRef.h"
18 #include "llvm/MC/MCAsmBackend.h"
19 #include "llvm/MC/MCAsmInfo.h"
20 #include "llvm/MC/MCAssembler.h"
21 #include "llvm/MC/MCCodeEmitter.h"
22 #include "llvm/MC/MCContext.h"
23 #include "llvm/MC/MCInst.h"
24 #include "llvm/MC/MCInstPrinter.h"
25 #include "llvm/MC/MCObjectWriter.h"
26 #include "llvm/MC/MCStreamer.h"
27 #include "llvm/MC/MCTargetOptions.h"
28 #include "llvm/Support/FormattedStream.h"
29 
30 namespace llvm {
31 
32 class SystemZHLASMAsmStreamer final : public MCStreamer {
33   constexpr static size_t InstLimit = 80;
34   constexpr static size_t ContIndicatorColumn = 72;
35   constexpr static size_t ContStartColumn = 15;
36   constexpr static size_t ContLen = ContIndicatorColumn - ContStartColumn;
37   std::unique_ptr<formatted_raw_ostream> FOSOwner;
38   formatted_raw_ostream &FOS;
39   std::string Str;
40   raw_string_ostream OS;
41   const MCAsmInfo *MAI;
42   std::unique_ptr<MCInstPrinter> InstPrinter;
43   std::unique_ptr<MCAssembler> Assembler;
44   SmallString<128> CommentToEmit;
45   raw_svector_ostream CommentStream;
46   raw_null_ostream NullStream;
47   bool IsVerboseAsm = false;
48 
49 public:
SystemZHLASMAsmStreamer(MCContext & Context,std::unique_ptr<formatted_raw_ostream> os,std::unique_ptr<MCInstPrinter> printer,std::unique_ptr<MCCodeEmitter> emitter,std::unique_ptr<MCAsmBackend> asmbackend)50   SystemZHLASMAsmStreamer(MCContext &Context,
51                           std::unique_ptr<formatted_raw_ostream> os,
52                           std::unique_ptr<MCInstPrinter> printer,
53                           std::unique_ptr<MCCodeEmitter> emitter,
54                           std::unique_ptr<MCAsmBackend> asmbackend)
55       : MCStreamer(Context), FOSOwner(std::move(os)), FOS(*FOSOwner), OS(Str),
56         MAI(Context.getAsmInfo()), InstPrinter(std::move(printer)),
57         Assembler(std::make_unique<MCAssembler>(
58             Context, std::move(asmbackend), std::move(emitter),
59             (asmbackend) ? asmbackend->createObjectWriter(NullStream)
60                          : nullptr)),
61         CommentStream(CommentToEmit) {
62     assert(InstPrinter);
63     if (Assembler->getBackendPtr())
64       setAllowAutoPadding(Assembler->getBackend().allowAutoPadding());
65 
66     Context.setUseNamesOnTempLabels(true);
67     auto *TO = Context.getTargetOptions();
68     if (!TO)
69       return;
70     IsVerboseAsm = TO->AsmVerbose;
71     if (IsVerboseAsm)
72       InstPrinter->setCommentStream(CommentStream);
73   }
74 
getAssembler()75   MCAssembler &getAssembler() { return *Assembler; }
76 
77   void EmitEOL();
78   void EmitComment();
79 
80   /// Add a comment that can be emitted to the generated .s file to make the
81   /// output of the compiler more readable. This only affects the MCAsmStreamer
82   /// and only when verbose assembly output is enabled.
83   void AddComment(const Twine &T, bool EOL = true) override;
84 
85   void emitBytes(StringRef Data) override;
86 
87   void emitAlignmentDS(uint64_t ByteAlignment, std::optional<int64_t> Value,
88                        unsigned ValueSize, unsigned MaxBytesToEmit);
89   void emitValueToAlignment(Align Alignment, int64_t Fill, uint8_t FillLen,
90                             unsigned MaxBytesToEmit) override;
91 
92   void emitCodeAlignment(Align Alignment, const MCSubtargetInfo *STI,
93                          unsigned MaxBytesToEmit = 0) override;
94 
95   /// Return true if this streamer supports verbose assembly at all.
isVerboseAsm()96   bool isVerboseAsm() const override { return IsVerboseAsm; }
97 
98   /// Do we support EmitRawText?
hasRawTextSupport()99   bool hasRawTextSupport() const override { return true; }
100 
101   /// @name MCStreamer Interface
102   /// @{
103 
104   void changeSection(MCSection *Section, uint32_t Subsection) override;
105 
106   void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override;
107   void emitLabel(MCSymbol *Symbol, SMLoc Loc) override;
emitSymbolAttribute(MCSymbol * Symbol,MCSymbolAttr Attribute)108   bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override {
109     return false;
110   }
111 
emitCommonSymbol(MCSymbol * Symbol,uint64_t Size,Align ByteAlignment)112   void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
113                         Align ByteAlignment) override {}
114 
115   void emitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr,
116                     uint64_t Size = 0, Align ByteAlignment = Align(1),
117                     SMLoc Loc = SMLoc()) override {}
118   void emitRawTextImpl(StringRef String) override;
119   void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc) override;
120 
121   void emitHLASMValueImpl(const MCExpr *Value, unsigned Size,
122                           bool Parens = false);
123   /// @}
124 
125   void emitEnd();
126 };
127 } // namespace llvm
128 
129 #endif // LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZHLASMASMSTREAMER_H
130