130 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file declares the SystemZHLASMAsmStreamer class.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZHLASMASMSTREAMER_H14#define LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZHLASMASMSTREAMER_H15 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 30namespace llvm {31 32class 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 49public: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 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 the81 /// output of the compiler more readable. This only affects the MCAsmStreamer82 /// 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.96 bool isVerboseAsm() const override { return IsVerboseAsm; }97 98 /// Do we support EmitRawText?99 bool hasRawTextSupport() const override { return true; }100 101 /// @name MCStreamer Interface102 /// @{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;108 bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override {109 return false;110 }111 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 llvm128 129#endif // LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZHLASMASMSTREAMER_H130