brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 93b1ac4 Raw
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