| Index: include/llvm/MC/MCAsmStreamer.h
|
| diff --git a/include/llvm/MC/MCAsmStreamer.h b/include/llvm/MC/MCAsmStreamer.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..80a32a88ef500ac8f2510ba955f0c608c71f3ca8
|
| --- /dev/null
|
| +++ b/include/llvm/MC/MCAsmStreamer.h
|
| @@ -0,0 +1,246 @@
|
| +//===- lib/MC/MCAsmStreamer.cpp - Text Assembly Output --------------------===//
|
| +//
|
| +// The LLVM Compiler Infrastructure
|
| +//
|
| +// This file is distributed under the University of Illinois Open Source
|
| +// License. See LICENSE.TXT for details.
|
| +//
|
| +//===----------------------------------------------------------------------===//
|
| +#ifndef LLVM_MC_ASM_STREAMER_H
|
| +#define LLVM_MC_ASM_STREAMER_H
|
| +
|
| +#include "llvm/MC/MCStreamer.h"
|
| +#include "llvm/ADT/STLExtras.h"
|
| +#include "llvm/ADT/SmallString.h"
|
| +#include "llvm/ADT/StringExtras.h"
|
| +#include "llvm/ADT/Twine.h"
|
| +#include "llvm/MC/MCAsmBackend.h"
|
| +#include "llvm/MC/MCAsmInfo.h"
|
| +#include "llvm/MC/MCCodeEmitter.h"
|
| +#include "llvm/MC/MCContext.h"
|
| +#include "llvm/MC/MCExpr.h"
|
| +#include "llvm/MC/MCFixupKindInfo.h"
|
| +#include "llvm/MC/MCInst.h"
|
| +#include "llvm/MC/MCInstPrinter.h"
|
| +#include "llvm/MC/MCObjectFileInfo.h"
|
| +#include "llvm/MC/MCRegisterInfo.h"
|
| +#include "llvm/MC/MCSectionCOFF.h"
|
| +#include "llvm/MC/MCSectionMachO.h"
|
| +#include "llvm/MC/MCSymbol.h"
|
| +#include "llvm/Support/CommandLine.h"
|
| +#include "llvm/Support/ErrorHandling.h"
|
| +#include "llvm/Support/Format.h"
|
| +#include "llvm/Support/FormattedStream.h"
|
| +#include "llvm/Support/MathExtras.h"
|
| +#include "llvm/Support/Path.h"
|
| +#include <cctype>
|
| +using namespace llvm;
|
| +
|
| +class MCAsmStreamer : public MCStreamer {
|
| + std::unique_ptr<formatted_raw_ostream> OSOwner;
|
| + formatted_raw_ostream &OS;
|
| + const MCAsmInfo *MAI;
|
| + std::unique_ptr<MCInstPrinter> InstPrinter;
|
| + std::unique_ptr<MCCodeEmitter> Emitter;
|
| + std::unique_ptr<MCAsmBackend> AsmBackend;
|
| +
|
| + SmallString<128> CommentToEmit;
|
| + raw_svector_ostream CommentStream;
|
| +
|
| + unsigned IsVerboseAsm : 1;
|
| + unsigned ShowInst : 1;
|
| + unsigned UseDwarfDirectory : 1;
|
| + // @LOCALMOD: we don't have an MCAssembler object here, so we can't ask it
|
| + // if bundle alignment is enabled. Instead, just track the alignment here.
|
| + unsigned BundleAlignmentEnabled : 1;
|
| +
|
| + void EmitRegisterName(int64_t Register);
|
| + void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override;
|
| + void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override;
|
| +
|
| +public:
|
| + MCAsmStreamer(MCContext &Context, std::unique_ptr<formatted_raw_ostream> os,
|
| + bool isVerboseAsm, bool useDwarfDirectory,
|
| + MCInstPrinter *printer, MCCodeEmitter *emitter,
|
| + MCAsmBackend *asmbackend, bool showInst)
|
| + : MCStreamer(Context), OSOwner(std::move(os)), OS(*OSOwner),
|
| + MAI(Context.getAsmInfo()), InstPrinter(printer), Emitter(emitter),
|
| + AsmBackend(asmbackend), CommentStream(CommentToEmit),
|
| + IsVerboseAsm(isVerboseAsm), ShowInst(showInst),
|
| + UseDwarfDirectory(useDwarfDirectory),
|
| + BundleAlignmentEnabled(0) {
|
| + if (InstPrinter && IsVerboseAsm)
|
| + InstPrinter->setCommentStream(CommentStream);
|
| + }
|
| +
|
| + inline void EmitEOL() {
|
| + // If we don't have any comments, just emit a \n.
|
| + if (!IsVerboseAsm) {
|
| + OS << '\n';
|
| + return;
|
| + }
|
| + EmitCommentsAndEOL();
|
| + }
|
| + void EmitCommentsAndEOL();
|
| +
|
| + /// isVerboseAsm - Return true if this streamer supports verbose assembly at
|
| + /// all.
|
| + bool isVerboseAsm() const override { return IsVerboseAsm; }
|
| +
|
| + /// hasRawTextSupport - We support EmitRawText.
|
| + bool hasRawTextSupport() const override { return true; }
|
| +
|
| + /// AddComment - Add a comment that can be emitted to the generated .s
|
| + /// file if applicable as a QoI issue to make the output of the compiler
|
| + /// more readable. This only affects the MCAsmStreamer, and only when
|
| + /// verbose assembly output is enabled.
|
| + void AddComment(const Twine &T) override;
|
| +
|
| + /// AddEncodingComment - Add a comment showing the encoding of an instruction.
|
| + void AddEncodingComment(const MCInst &Inst, const MCSubtargetInfo &);
|
| +
|
| + /// GetCommentOS - Return a raw_ostream that comments can be written to.
|
| + /// Unlike AddComment, you are required to terminate comments with \n if you
|
| + /// use this method.
|
| + raw_ostream &GetCommentOS() override {
|
| + if (!IsVerboseAsm)
|
| + return nulls(); // Discard comments unless in verbose asm mode.
|
| + return CommentStream;
|
| + }
|
| +
|
| + void emitRawComment(const Twine &T, bool TabPrefix = true) override;
|
| +
|
| + /// AddBlankLine - Emit a blank line to a .s file to pretty it up.
|
| + void AddBlankLine() override {
|
| + EmitEOL();
|
| + }
|
| +
|
| + /// @name MCStreamer Interface
|
| + /// @{
|
| +
|
| + void ChangeSection(const MCSection *Section,
|
| + const MCExpr *Subsection) override;
|
| +
|
| + void EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) override;
|
| + void EmitLabel(MCSymbol *Symbol) override;
|
| +
|
| + void EmitAssemblerFlag(MCAssemblerFlag Flag) override;
|
| + void EmitLinkerOptions(ArrayRef<std::string> Options) override;
|
| + void EmitDataRegion(MCDataRegionType Kind) override;
|
| + void EmitVersionMin(MCVersionMinType Kind, unsigned Major, unsigned Minor,
|
| + unsigned Update) override;
|
| + void EmitThumbFunc(MCSymbol *Func) override;
|
| +
|
| + void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
|
| + void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
|
| + bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
|
| +
|
| + void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
|
| + void BeginCOFFSymbolDef(const MCSymbol *Symbol) override;
|
| + void EmitCOFFSymbolStorageClass(int StorageClass) override;
|
| + void EmitCOFFSymbolType(int Type) override;
|
| + void EndCOFFSymbolDef() override;
|
| + void EmitCOFFSectionIndex(MCSymbol const *Symbol) override;
|
| + void EmitCOFFSecRel32(MCSymbol const *Symbol) override;
|
| + void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) override;
|
| + void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
|
| + unsigned ByteAlignment) override;
|
| +
|
| + /// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol.
|
| + ///
|
| + /// @param Symbol - The common symbol to emit.
|
| + /// @param Size - The size of the common symbol.
|
| + /// @param ByteAlignment - The alignment of the common symbol in bytes.
|
| + void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
|
| + unsigned ByteAlignment) override;
|
| +
|
| + void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = nullptr,
|
| + uint64_t Size = 0, unsigned ByteAlignment = 0) override;
|
| +
|
| + void EmitTBSSSymbol (const MCSection *Section, MCSymbol *Symbol,
|
| + uint64_t Size, unsigned ByteAlignment = 0) override;
|
| +
|
| + void EmitBytes(StringRef Data) override;
|
| +
|
| + void EmitValueImpl(const MCExpr *Value, unsigned Size,
|
| + const SMLoc &Loc = SMLoc()) override;
|
| + void EmitIntValue(uint64_t Value, unsigned Size) override;
|
| +
|
| + void EmitULEB128Value(const MCExpr *Value) override;
|
| +
|
| + void EmitSLEB128Value(const MCExpr *Value) override;
|
| +
|
| + void EmitGPRel64Value(const MCExpr *Value) override;
|
| +
|
| + void EmitGPRel32Value(const MCExpr *Value) override;
|
| +
|
| +
|
| + void EmitFill(uint64_t NumBytes, uint8_t FillValue) override;
|
| +
|
| + void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,
|
| + unsigned ValueSize = 1,
|
| + unsigned MaxBytesToEmit = 0) override;
|
| +
|
| + void EmitCodeAlignment(unsigned ByteAlignment,
|
| + unsigned MaxBytesToEmit = 0) override;
|
| +
|
| + bool EmitValueToOffset(const MCExpr *Offset,
|
| + unsigned char Value = 0) override;
|
| +
|
| + void EmitFileDirective(StringRef Filename) override;
|
| + unsigned EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
|
| + StringRef Filename,
|
| + unsigned CUID = 0) override;
|
| + void EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
|
| + unsigned Column, unsigned Flags,
|
| + unsigned Isa, unsigned Discriminator,
|
| + StringRef FileName) override;
|
| + MCSymbol *getDwarfLineTableSymbol(unsigned CUID) override;
|
| +
|
| + void EmitIdent(StringRef IdentString) override;
|
| + void EmitCFISections(bool EH, bool Debug) override;
|
| + void EmitCFIDefCfa(int64_t Register, int64_t Offset) override;
|
| + void EmitCFIDefCfaOffset(int64_t Offset) override;
|
| + void EmitCFIDefCfaRegister(int64_t Register) override;
|
| + void EmitCFIOffset(int64_t Register, int64_t Offset) override;
|
| + void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding) override;
|
| + void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) override;
|
| + void EmitCFIRememberState() override;
|
| + void EmitCFIRestoreState() override;
|
| + void EmitCFISameValue(int64_t Register) override;
|
| + void EmitCFIRelOffset(int64_t Register, int64_t Offset) override;
|
| + void EmitCFIAdjustCfaOffset(int64_t Adjustment) override;
|
| + void EmitCFISignalFrame() override;
|
| + void EmitCFIUndefined(int64_t Register) override;
|
| + void EmitCFIRegister(int64_t Register1, int64_t Register2) override;
|
| + void EmitCFIWindowSave() override;
|
| +
|
| + void EmitWinCFIStartProc(const MCSymbol *Symbol) override;
|
| + void EmitWinCFIEndProc() override;
|
| + void EmitWinCFIStartChained() override;
|
| + void EmitWinCFIEndChained() override;
|
| + void EmitWinCFIPushReg(unsigned Register) override;
|
| + void EmitWinCFISetFrame(unsigned Register, unsigned Offset) override;
|
| + void EmitWinCFIAllocStack(unsigned Size) override;
|
| + void EmitWinCFISaveReg(unsigned Register, unsigned Offset) override;
|
| + void EmitWinCFISaveXMM(unsigned Register, unsigned Offset) override;
|
| + void EmitWinCFIPushFrame(bool Code) override;
|
| + void EmitWinCFIEndProlog() override;
|
| +
|
| + void EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except) override;
|
| + void EmitWinEHHandlerData() override;
|
| +
|
| + void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override;
|
| +
|
| + void EmitBundleAlignMode(unsigned AlignPow2) override;
|
| + void EmitBundleLock(bool AlignToEnd) override;
|
| + void EmitBundleUnlock() override;
|
| +
|
| + /// EmitRawText - If this file is backed by an assembly streamer, this dumps
|
| + /// the specified string in the output .s file. This capability is
|
| + /// indicated by the hasRawTextSupport() predicate.
|
| + void EmitRawTextImpl(StringRef String) override;
|
| +
|
| + void FinishImpl() override;
|
| +};
|
| +#endif
|
|
|