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 |