OLD | NEW |
(Empty) | |
| 1 //===- lib/MC/MCAsmStreamer.cpp - Text Assembly Output --------------------===// |
| 2 // |
| 3 // The LLVM Compiler Infrastructure |
| 4 // |
| 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. |
| 7 // |
| 8 //===----------------------------------------------------------------------===// |
| 9 #ifndef LLVM_MC_ASM_STREAMER_H |
| 10 #define LLVM_MC_ASM_STREAMER_H |
| 11 |
| 12 #include "llvm/MC/MCStreamer.h" |
| 13 #include "llvm/ADT/STLExtras.h" |
| 14 #include "llvm/ADT/SmallString.h" |
| 15 #include "llvm/ADT/StringExtras.h" |
| 16 #include "llvm/ADT/Twine.h" |
| 17 #include "llvm/MC/MCAsmBackend.h" |
| 18 #include "llvm/MC/MCAsmInfo.h" |
| 19 #include "llvm/MC/MCCodeEmitter.h" |
| 20 #include "llvm/MC/MCContext.h" |
| 21 #include "llvm/MC/MCExpr.h" |
| 22 #include "llvm/MC/MCFixupKindInfo.h" |
| 23 #include "llvm/MC/MCInst.h" |
| 24 #include "llvm/MC/MCInstPrinter.h" |
| 25 #include "llvm/MC/MCObjectFileInfo.h" |
| 26 #include "llvm/MC/MCRegisterInfo.h" |
| 27 #include "llvm/MC/MCSectionCOFF.h" |
| 28 #include "llvm/MC/MCSectionMachO.h" |
| 29 #include "llvm/MC/MCSymbol.h" |
| 30 #include "llvm/Support/CommandLine.h" |
| 31 #include "llvm/Support/ErrorHandling.h" |
| 32 #include "llvm/Support/Format.h" |
| 33 #include "llvm/Support/FormattedStream.h" |
| 34 #include "llvm/Support/MathExtras.h" |
| 35 #include "llvm/Support/Path.h" |
| 36 #include <cctype> |
| 37 using namespace llvm; |
| 38 |
| 39 class MCAsmStreamer : public MCStreamer { |
| 40 std::unique_ptr<formatted_raw_ostream> OSOwner; |
| 41 formatted_raw_ostream &OS; |
| 42 const MCAsmInfo *MAI; |
| 43 std::unique_ptr<MCInstPrinter> InstPrinter; |
| 44 std::unique_ptr<MCCodeEmitter> Emitter; |
| 45 std::unique_ptr<MCAsmBackend> AsmBackend; |
| 46 |
| 47 SmallString<128> CommentToEmit; |
| 48 raw_svector_ostream CommentStream; |
| 49 |
| 50 unsigned IsVerboseAsm : 1; |
| 51 unsigned ShowInst : 1; |
| 52 unsigned UseDwarfDirectory : 1; |
| 53 // @LOCALMOD: we don't have an MCAssembler object here, so we can't ask it |
| 54 // if bundle alignment is enabled. Instead, just track the alignment here. |
| 55 unsigned BundleAlignmentEnabled : 1; |
| 56 |
| 57 void EmitRegisterName(int64_t Register); |
| 58 void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override; |
| 59 void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override; |
| 60 |
| 61 public: |
| 62 MCAsmStreamer(MCContext &Context, std::unique_ptr<formatted_raw_ostream> os, |
| 63 bool isVerboseAsm, bool useDwarfDirectory, |
| 64 MCInstPrinter *printer, MCCodeEmitter *emitter, |
| 65 MCAsmBackend *asmbackend, bool showInst) |
| 66 : MCStreamer(Context), OSOwner(std::move(os)), OS(*OSOwner), |
| 67 MAI(Context.getAsmInfo()), InstPrinter(printer), Emitter(emitter), |
| 68 AsmBackend(asmbackend), CommentStream(CommentToEmit), |
| 69 IsVerboseAsm(isVerboseAsm), ShowInst(showInst), |
| 70 UseDwarfDirectory(useDwarfDirectory), |
| 71 BundleAlignmentEnabled(0) { |
| 72 if (InstPrinter && IsVerboseAsm) |
| 73 InstPrinter->setCommentStream(CommentStream); |
| 74 } |
| 75 |
| 76 inline void EmitEOL() { |
| 77 // If we don't have any comments, just emit a \n. |
| 78 if (!IsVerboseAsm) { |
| 79 OS << '\n'; |
| 80 return; |
| 81 } |
| 82 EmitCommentsAndEOL(); |
| 83 } |
| 84 void EmitCommentsAndEOL(); |
| 85 |
| 86 /// isVerboseAsm - Return true if this streamer supports verbose assembly at |
| 87 /// all. |
| 88 bool isVerboseAsm() const override { return IsVerboseAsm; } |
| 89 |
| 90 /// hasRawTextSupport - We support EmitRawText. |
| 91 bool hasRawTextSupport() const override { return true; } |
| 92 |
| 93 /// AddComment - Add a comment that can be emitted to the generated .s |
| 94 /// file if applicable as a QoI issue to make the output of the compiler |
| 95 /// more readable. This only affects the MCAsmStreamer, and only when |
| 96 /// verbose assembly output is enabled. |
| 97 void AddComment(const Twine &T) override; |
| 98 |
| 99 /// AddEncodingComment - Add a comment showing the encoding of an instruction. |
| 100 void AddEncodingComment(const MCInst &Inst, const MCSubtargetInfo &); |
| 101 |
| 102 /// GetCommentOS - Return a raw_ostream that comments can be written to. |
| 103 /// Unlike AddComment, you are required to terminate comments with \n if you |
| 104 /// use this method. |
| 105 raw_ostream &GetCommentOS() override { |
| 106 if (!IsVerboseAsm) |
| 107 return nulls(); // Discard comments unless in verbose asm mode. |
| 108 return CommentStream; |
| 109 } |
| 110 |
| 111 void emitRawComment(const Twine &T, bool TabPrefix = true) override; |
| 112 |
| 113 /// AddBlankLine - Emit a blank line to a .s file to pretty it up. |
| 114 void AddBlankLine() override { |
| 115 EmitEOL(); |
| 116 } |
| 117 |
| 118 /// @name MCStreamer Interface |
| 119 /// @{ |
| 120 |
| 121 void ChangeSection(const MCSection *Section, |
| 122 const MCExpr *Subsection) override; |
| 123 |
| 124 void EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) override; |
| 125 void EmitLabel(MCSymbol *Symbol) override; |
| 126 |
| 127 void EmitAssemblerFlag(MCAssemblerFlag Flag) override; |
| 128 void EmitLinkerOptions(ArrayRef<std::string> Options) override; |
| 129 void EmitDataRegion(MCDataRegionType Kind) override; |
| 130 void EmitVersionMin(MCVersionMinType Kind, unsigned Major, unsigned Minor, |
| 131 unsigned Update) override; |
| 132 void EmitThumbFunc(MCSymbol *Func) override; |
| 133 |
| 134 void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override; |
| 135 void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override; |
| 136 bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override; |
| 137 |
| 138 void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override; |
| 139 void BeginCOFFSymbolDef(const MCSymbol *Symbol) override; |
| 140 void EmitCOFFSymbolStorageClass(int StorageClass) override; |
| 141 void EmitCOFFSymbolType(int Type) override; |
| 142 void EndCOFFSymbolDef() override; |
| 143 void EmitCOFFSectionIndex(MCSymbol const *Symbol) override; |
| 144 void EmitCOFFSecRel32(MCSymbol const *Symbol) override; |
| 145 void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) override; |
| 146 void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, |
| 147 unsigned ByteAlignment) override; |
| 148 |
| 149 /// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol. |
| 150 /// |
| 151 /// @param Symbol - The common symbol to emit. |
| 152 /// @param Size - The size of the common symbol. |
| 153 /// @param ByteAlignment - The alignment of the common symbol in bytes. |
| 154 void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, |
| 155 unsigned ByteAlignment) override; |
| 156 |
| 157 void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = nullptr, |
| 158 uint64_t Size = 0, unsigned ByteAlignment = 0) override; |
| 159 |
| 160 void EmitTBSSSymbol (const MCSection *Section, MCSymbol *Symbol, |
| 161 uint64_t Size, unsigned ByteAlignment = 0) override; |
| 162 |
| 163 void EmitBytes(StringRef Data) override; |
| 164 |
| 165 void EmitValueImpl(const MCExpr *Value, unsigned Size, |
| 166 const SMLoc &Loc = SMLoc()) override; |
| 167 void EmitIntValue(uint64_t Value, unsigned Size) override; |
| 168 |
| 169 void EmitULEB128Value(const MCExpr *Value) override; |
| 170 |
| 171 void EmitSLEB128Value(const MCExpr *Value) override; |
| 172 |
| 173 void EmitGPRel64Value(const MCExpr *Value) override; |
| 174 |
| 175 void EmitGPRel32Value(const MCExpr *Value) override; |
| 176 |
| 177 |
| 178 void EmitFill(uint64_t NumBytes, uint8_t FillValue) override; |
| 179 |
| 180 void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0, |
| 181 unsigned ValueSize = 1, |
| 182 unsigned MaxBytesToEmit = 0) override; |
| 183 |
| 184 void EmitCodeAlignment(unsigned ByteAlignment, |
| 185 unsigned MaxBytesToEmit = 0) override; |
| 186 |
| 187 bool EmitValueToOffset(const MCExpr *Offset, |
| 188 unsigned char Value = 0) override; |
| 189 |
| 190 void EmitFileDirective(StringRef Filename) override; |
| 191 unsigned EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, |
| 192 StringRef Filename, |
| 193 unsigned CUID = 0) override; |
| 194 void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, |
| 195 unsigned Column, unsigned Flags, |
| 196 unsigned Isa, unsigned Discriminator, |
| 197 StringRef FileName) override; |
| 198 MCSymbol *getDwarfLineTableSymbol(unsigned CUID) override; |
| 199 |
| 200 void EmitIdent(StringRef IdentString) override; |
| 201 void EmitCFISections(bool EH, bool Debug) override; |
| 202 void EmitCFIDefCfa(int64_t Register, int64_t Offset) override; |
| 203 void EmitCFIDefCfaOffset(int64_t Offset) override; |
| 204 void EmitCFIDefCfaRegister(int64_t Register) override; |
| 205 void EmitCFIOffset(int64_t Register, int64_t Offset) override; |
| 206 void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding) override; |
| 207 void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) override; |
| 208 void EmitCFIRememberState() override; |
| 209 void EmitCFIRestoreState() override; |
| 210 void EmitCFISameValue(int64_t Register) override; |
| 211 void EmitCFIRelOffset(int64_t Register, int64_t Offset) override; |
| 212 void EmitCFIAdjustCfaOffset(int64_t Adjustment) override; |
| 213 void EmitCFISignalFrame() override; |
| 214 void EmitCFIUndefined(int64_t Register) override; |
| 215 void EmitCFIRegister(int64_t Register1, int64_t Register2) override; |
| 216 void EmitCFIWindowSave() override; |
| 217 |
| 218 void EmitWinCFIStartProc(const MCSymbol *Symbol) override; |
| 219 void EmitWinCFIEndProc() override; |
| 220 void EmitWinCFIStartChained() override; |
| 221 void EmitWinCFIEndChained() override; |
| 222 void EmitWinCFIPushReg(unsigned Register) override; |
| 223 void EmitWinCFISetFrame(unsigned Register, unsigned Offset) override; |
| 224 void EmitWinCFIAllocStack(unsigned Size) override; |
| 225 void EmitWinCFISaveReg(unsigned Register, unsigned Offset) override; |
| 226 void EmitWinCFISaveXMM(unsigned Register, unsigned Offset) override; |
| 227 void EmitWinCFIPushFrame(bool Code) override; |
| 228 void EmitWinCFIEndProlog() override; |
| 229 |
| 230 void EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except) override; |
| 231 void EmitWinEHHandlerData() override; |
| 232 |
| 233 void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override; |
| 234 |
| 235 void EmitBundleAlignMode(unsigned AlignPow2) override; |
| 236 void EmitBundleLock(bool AlignToEnd) override; |
| 237 void EmitBundleUnlock() override; |
| 238 |
| 239 /// EmitRawText - If this file is backed by an assembly streamer, this dumps |
| 240 /// the specified string in the output .s file. This capability is |
| 241 /// indicated by the hasRawTextSupport() predicate. |
| 242 void EmitRawTextImpl(StringRef String) override; |
| 243 |
| 244 void FinishImpl() override; |
| 245 }; |
| 246 #endif |
OLD | NEW |