<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body dir="auto">
In short, need to override several member functions completely because of the limitations of PTX format. I can move them to TargetStreamer completely, probably. Will be able provide more info on Monday. <br>
<br>
<div id="AppleMailSignature">Best regards,
<div>Alexey Bataev</div>
</div>
<div><br>
10 нояб. 2017 г., в 16:58, Rafael Avila de Espindola <<a href="mailto:rafael.espindola@gmail.com">rafael.espindola@gmail.com</a>> написал(а):<br>
<br>
</div>
<blockquote type="cite">
<div><span>The existing and support way of doing target specific things is via</span><br>
<span>TargetStreamer. What prevents you from using it?</span><br>
<span></span><br>
<span>Cheers,</span><br>
<span>Rafael</span><br>
<span></span><br>
<span>Alexey Bataev via Phabricator via llvm-commits</span><br>
<span><<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> writes:</span><br>
<span></span><br>
<blockquote type="cite"><span>ABataev created this revision.</span><br>
</blockquote>
<blockquote type="cite"><span>Herald added a subscriber: aprantl.</span><br>
</blockquote>
<blockquote type="cite"><span></span><br>
</blockquote>
<blockquote type="cite"><span>Declaration of MCAsmStreamer is moved to include directory to make it</span><br>
</blockquote>
<blockquote type="cite"><span>possible to override it. Required for implementing of debug info for</span><br>
</blockquote>
<blockquote type="cite"><span>Cuda/NVPTX.</span><br>
</blockquote>
<blockquote type="cite"><span></span><br>
</blockquote>
<blockquote type="cite"><span></span><br>
</blockquote>
<blockquote type="cite"><span><a href="https://reviews.llvm.org/D39907">https://reviews.llvm.org/D39907</a></span><br>
</blockquote>
<blockquote type="cite"><span></span><br>
</blockquote>
<blockquote type="cite"><span>Files:</span><br>
</blockquote>
<blockquote type="cite"><span> include/llvm/MC/MCAsmStreamer.h</span><br>
</blockquote>
<blockquote type="cite"><span> include/llvm/Support/TargetRegistry.h</span><br>
</blockquote>
<blockquote type="cite"><span> lib/MC/MCAsmStreamer.cpp</span><br>
</blockquote>
<blockquote type="cite"><span></span><br>
</blockquote>
<blockquote type="cite"><span>Index: lib/MC/MCAsmStreamer.cpp</span><br>
</blockquote>
<blockquote type="cite"><span>===================================================================</span><br>
</blockquote>
<blockquote type="cite"><span>--- lib/MC/MCAsmStreamer.cpp</span><br>
</blockquote>
<blockquote type="cite"><span>+++ lib/MC/MCAsmStreamer.cpp</span><br>
</blockquote>
<blockquote type="cite"><span>@@ -8,23 +8,20 @@</span><br>
</blockquote>
<blockquote type="cite"><span>//===----------------------------------------------------------------------===//</span><br>
</blockquote>
<blockquote type="cite"><span></span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/ADT/STLExtras.h"</span><br>
</blockquote>
<blockquote type="cite"><span>-#include "llvm/ADT/SmallString.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/ADT/StringExtras.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/ADT/Twine.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/MC/MCAsmBackend.h"</span><br>
</blockquote>
<blockquote type="cite"><span>+#include "llvm/MC/MCAsmStreamer.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/MC/MCAsmInfo.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/MC/MCCodeEmitter.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/MC/MCCodeView.h"</span><br>
</blockquote>
<blockquote type="cite"><span>-#include "llvm/MC/MCContext.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/MC/MCExpr.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/MC/MCFixupKindInfo.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/MC/MCInst.h"</span><br>
</blockquote>
<blockquote type="cite"><span>-#include "llvm/MC/MCInstPrinter.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/MC/MCObjectFileInfo.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/MC/MCRegisterInfo.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/MC/MCSectionCOFF.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/MC/MCSectionMachO.h"</span><br>
</blockquote>
<blockquote type="cite"><span>-#include "llvm/MC/MCStreamer.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/MC/MCSymbolELF.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/Support/ErrorHandling.h"</span><br>
</blockquote>
<blockquote type="cite"><span>#include "llvm/Support/Format.h"</span><br>
</blockquote>
<blockquote type="cite"><span>@@ -37,279 +34,17 @@</span><br>
</blockquote>
<blockquote type="cite"><span></span><br>
</blockquote>
<blockquote type="cite"><span>using namespace llvm;</span><br>
</blockquote>
<blockquote type="cite"><span></span><br>
</blockquote>
<blockquote type="cite"><span>-namespace {</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>-class MCAsmStreamer final : public MCStreamer {</span><br>
</blockquote>
<blockquote type="cite"><span>- std::unique_ptr<formatted_raw_ostream> OSOwner;</span><br>
</blockquote>
<blockquote type="cite"><span>- formatted_raw_ostream &OS;</span><br>
</blockquote>
<blockquote type="cite"><span>- const MCAsmInfo *MAI;</span><br>
</blockquote>
<blockquote type="cite"><span>- std::unique_ptr<MCInstPrinter> InstPrinter;</span><br>
</blockquote>
<blockquote type="cite"><span>- std::unique_ptr<MCCodeEmitter> Emitter;</span><br>
</blockquote>
<blockquote type="cite"><span>- std::unique_ptr<MCAsmBackend> AsmBackend;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- SmallString<128> ExplicitCommentToEmit;</span><br>
</blockquote>
<blockquote type="cite"><span>- SmallString<128> CommentToEmit;</span><br>
</blockquote>
<blockquote type="cite"><span>- raw_svector_ostream CommentStream;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned IsVerboseAsm : 1;</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned ShowInst : 1;</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned UseDwarfDirectory : 1;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitRegisterName(int64_t Register);</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>-public:</span><br>
</blockquote>
<blockquote type="cite"><span>- MCAsmStreamer(MCContext &Context, std::unique_ptr<formatted_raw_ostream> os,</span><br>
</blockquote>
<blockquote type="cite"><span>- bool isVerboseAsm, bool useDwarfDirectory,</span><br>
</blockquote>
<blockquote type="cite"><span>- MCInstPrinter *printer, MCCodeEmitter *emitter,</span><br>
</blockquote>
<blockquote type="cite"><span>- MCAsmBackend *asmbackend, bool showInst)</span><br>
</blockquote>
<blockquote type="cite"><span>- : MCStreamer(Context), OSOwner(std::move(os)), OS(*OSOwner),</span><br>
</blockquote>
<blockquote type="cite"><span>- MAI(Context.getAsmInfo()), InstPrinter(printer), Emitter(emitter),</span><br>
</blockquote>
<blockquote type="cite"><span>- AsmBackend(asmbackend), CommentStream(CommentToEmit),</span><br>
</blockquote>
<blockquote type="cite"><span>- IsVerboseAsm(isVerboseAsm), ShowInst(showInst),</span><br>
</blockquote>
<blockquote type="cite"><span>- UseDwarfDirectory(useDwarfDirectory) {</span><br>
</blockquote>
<blockquote type="cite"><span>- assert(InstPrinter);</span><br>
</blockquote>
<blockquote type="cite"><span>- if (IsVerboseAsm)</span><br>
</blockquote>
<blockquote type="cite"><span>- InstPrinter->setCommentStream(CommentStream);</span><br>
</blockquote>
<blockquote type="cite"><span>- }</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- inline void EmitEOL() {</span><br>
</blockquote>
<blockquote type="cite"><span>- // Dump Explicit Comments here.</span><br>
</blockquote>
<blockquote type="cite"><span>- emitExplicitComments();</span><br>
</blockquote>
<blockquote type="cite"><span>- // If we don't have any comments, just emit a \n.</span><br>
</blockquote>
<blockquote type="cite"><span>- if (!IsVerboseAsm) {</span><br>
</blockquote>
<blockquote type="cite"><span>- OS << '\n';</span><br>
</blockquote>
<blockquote type="cite"><span>- return;</span><br>
</blockquote>
<blockquote type="cite"><span>- }</span><br>
</blockquote>
<blockquote type="cite"><span>- EmitCommentsAndEOL();</span><br>
</blockquote>
<blockquote type="cite"><span>- }</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitSyntaxDirective() override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCommentsAndEOL();</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- /// isVerboseAsm - Return true if this streamer supports verbose assembly at</span><br>
</blockquote>
<blockquote type="cite"><span>- /// all.</span><br>
</blockquote>
<blockquote type="cite"><span>- bool isVerboseAsm() const override { return IsVerboseAsm; }</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- /// hasRawTextSupport - We support EmitRawText.</span><br>
</blockquote>
<blockquote type="cite"><span>- bool hasRawTextSupport() const override { return true; }</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- /// AddComment - Add a comment that can be emitted to the generated .s</span><br>
</blockquote>
<blockquote type="cite"><span>- /// file if applicable as a QoI issue to make the output of the compiler</span><br>
</blockquote>
<blockquote type="cite"><span>- /// more readable. This only affects the MCAsmStreamer, and only when</span><br>
</blockquote>
<blockquote type="cite"><span>- /// verbose assembly output is enabled.</span><br>
</blockquote>
<blockquote type="cite"><span>- void AddComment(const Twine &T, bool EOL = true) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- /// AddEncodingComment - Add a comment showing the encoding of an instruction.</span><br>
</blockquote>
<blockquote type="cite"><span>- /// If PrintSchedInfo - is true then the comment sched:[x:y] should</span><br>
</blockquote>
<blockquote type="cite"><span>- // be added to output if it's being supported by target</span><br>
</blockquote>
<blockquote type="cite"><span>- void AddEncodingComment(const MCInst &Inst, const MCSubtargetInfo &,</span><br>
</blockquote>
<blockquote type="cite"><span>- bool PrintSchedInfo);</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- /// GetCommentOS - Return a raw_ostream that comments can be written to.</span><br>
</blockquote>
<blockquote type="cite"><span>- /// Unlike AddComment, you are required to terminate comments with \n if you</span><br>
</blockquote>
<blockquote type="cite"><span>- /// use this method.</span><br>
</blockquote>
<blockquote type="cite"><span>- raw_ostream &GetCommentOS() override {</span><br>
</blockquote>
<blockquote type="cite"><span>- if (!IsVerboseAsm)</span><br>
</blockquote>
<blockquote type="cite"><span>- return nulls(); // Discard comments unless in verbose asm mode.</span><br>
</blockquote>
<blockquote type="cite"><span>- return CommentStream;</span><br>
</blockquote>
<blockquote type="cite"><span>- }</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void emitRawComment(const Twine &T, bool TabPrefix = true) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void addExplicitComment(const Twine &T) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void emitExplicitComments() override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- /// AddBlankLine - Emit a blank line to a .s file to pretty it up.</span><br>
</blockquote>
<blockquote type="cite"><span>- void AddBlankLine() override {</span><br>
</blockquote>
<blockquote type="cite"><span>- EmitEOL();</span><br>
</blockquote>
<blockquote type="cite"><span>+/// Emit End-Of-Line symbol.</span><br>
</blockquote>
<blockquote type="cite"><span>+inline void MCAsmStreamer::EmitEOL() {</span><br>
</blockquote>
<blockquote type="cite"><span>+ // Dump Explicit Comments here.</span><br>
</blockquote>
<blockquote type="cite"><span>+ emitExplicitComments();</span><br>
</blockquote>
<blockquote type="cite"><span>+ // If we don't have any comments, just emit a \n.</span><br>
</blockquote>
<blockquote type="cite"><span>+ if (!IsVerboseAsm) {</span><br>
</blockquote>
<blockquote type="cite"><span>+ OS << '\n';</span><br>
</blockquote>
<blockquote type="cite"><span>+ return;</span><br>
</blockquote>
<blockquote type="cite"><span> }</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- /// @name MCStreamer Interface</span><br>
</blockquote>
<blockquote type="cite"><span>- /// @{</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void ChangeSection(MCSection *Section, const MCExpr *Subsection) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitAssemblerFlag(MCAssemblerFlag Flag) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitLinkerOptions(ArrayRef<std::string> Options) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitDataRegion(MCDataRegionType Kind) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitVersionMin(MCVersionMinType Kind, unsigned Major, unsigned Minor,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned Update) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitThumbFunc(MCSymbol *Func) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void BeginCOFFSymbolDef(const MCSymbol *Symbol) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCOFFSymbolStorageClass(int StorageClass) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCOFFSymbolType(int Type) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EndCOFFSymbolDef() override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCOFFSafeSEH(MCSymbol const *Symbol) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCOFFSectionIndex(MCSymbol const *Symbol) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void emitELFSize(MCSymbol *Symbol, const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned ByteAlignment) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- /// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol.</span><br>
</blockquote>
<blockquote type="cite"><span>- ///</span><br>
</blockquote>
<blockquote type="cite"><span>- /// @param Symbol - The common symbol to emit.</span><br>
</blockquote>
<blockquote type="cite"><span>- /// @param Size - The size of the common symbol.</span><br>
</blockquote>
<blockquote type="cite"><span>- /// @param ByteAlignment - The alignment of the common symbol in bytes.</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned ByteAlignment) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr,</span><br>
</blockquote>
<blockquote type="cite"><span>- uint64_t Size = 0, unsigned ByteAlignment = 0) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned ByteAlignment = 0) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitBinaryData(StringRef Data) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitBytes(StringRef Data) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitValueImpl(const MCExpr *Value, unsigned Size,</span><br>
</blockquote>
<blockquote type="cite"><span>- SMLoc Loc = SMLoc()) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitIntValue(uint64_t Value, unsigned Size) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitULEB128Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitSLEB128Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitDTPRel32Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitDTPRel64Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitTPRel32Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitTPRel64Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitGPRel64Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitGPRel32Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void emitFill(uint64_t NumBytes, uint8_t FillValue) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void emitFill(const MCExpr &NumBytes, uint64_t FillValue,</span><br>
</blockquote>
<blockquote type="cite"><span>- SMLoc Loc = SMLoc()) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void emitFill(uint64_t NumValues, int64_t Size, int64_t Expr) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,</span><br>
</blockquote>
<blockquote type="cite"><span>- SMLoc Loc = SMLoc()) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned ValueSize = 1,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned MaxBytesToEmit = 0) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCodeAlignment(unsigned ByteAlignment,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned MaxBytesToEmit = 0) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void emitValueToOffset(const MCExpr *Offset,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned char Value,</span><br>
</blockquote>
<blockquote type="cite"><span>- SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitFileDirective(StringRef Filename) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,</span><br>
</blockquote>
<blockquote type="cite"><span>- StringRef Filename,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned CUID = 0) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitDwarfLocDirective(unsigned FileNo, unsigned Line,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned Column, unsigned Flags,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned Isa, unsigned Discriminator,</span><br>
</blockquote>
<blockquote type="cite"><span>- StringRef FileName) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- MCSymbol *getDwarfLineTableSymbol(unsigned CUID) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- bool EmitCVFileDirective(unsigned FileNo, StringRef Filename,</span><br>
</blockquote>
<blockquote type="cite"><span>- ArrayRef<uint8_t> Checksum,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned ChecksumKind) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- bool EmitCVFuncIdDirective(unsigned FuncId) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- bool EmitCVInlineSiteIdDirective(unsigned FunctionId, unsigned IAFunc,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned IAFile, unsigned IALine,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned IACol, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCVLocDirective(unsigned FunctionId, unsigned FileNo, unsigned Line,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned Column, bool PrologueEnd, bool IsStmt,</span><br>
</blockquote>
<blockquote type="cite"><span>- StringRef FileName, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCVLinetableDirective(unsigned FunctionId, const MCSymbol *FnStart,</span><br>
</blockquote>
<blockquote type="cite"><span>- const MCSymbol *FnEnd) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCVInlineLinetableDirective(unsigned PrimaryFunctionId,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned SourceFileId,</span><br>
</blockquote>
<blockquote type="cite"><span>- unsigned SourceLineNum,</span><br>
</blockquote>
<blockquote type="cite"><span>- const MCSymbol *FnStartSym,</span><br>
</blockquote>
<blockquote type="cite"><span>- const MCSymbol *FnEndSym) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCVDefRangeDirective(</span><br>
</blockquote>
<blockquote type="cite"><span>- ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,</span><br>
</blockquote>
<blockquote type="cite"><span>- StringRef FixedSizePortion) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCVStringTableDirective() override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCVFileChecksumsDirective() override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCVFileChecksumOffsetDirective(unsigned FileNo) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCVFPOData(const MCSymbol *ProcSym, SMLoc L) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitIdent(StringRef IdentString) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFISections(bool EH, bool Debug) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIDefCfa(int64_t Register, int64_t Offset) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIDefCfaOffset(int64_t Offset) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIDefCfaRegister(int64_t Register) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIOffset(int64_t Register, int64_t Offset) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIRememberState() override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIRestoreState() override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIRestore(int64_t Register) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFISameValue(int64_t Register) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIRelOffset(int64_t Register, int64_t Offset) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIAdjustCfaOffset(int64_t Adjustment) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIEscape(StringRef Values) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIGnuArgsSize(int64_t Size) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFISignalFrame() override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIUndefined(int64_t Register) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIRegister(int64_t Register1, int64_t Register2) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIWindowSave() override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitCFIReturnColumn(int64_t Register) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWinCFIEndProc(SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWinCFIStartChained(SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWinCFIEndChained(SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWinCFIPushReg(unsigned Register, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWinCFISetFrame(unsigned Register, unsigned Offset,</span><br>
</blockquote>
<blockquote type="cite"><span>- SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWinCFIAllocStack(unsigned Size, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWinCFISaveReg(unsigned Register, unsigned Offset,</span><br>
</blockquote>
<blockquote type="cite"><span>- SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWinCFISaveXMM(unsigned Register, unsigned Offset,</span><br>
</blockquote>
<blockquote type="cite"><span>- SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWinCFIPushFrame(bool Code, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWinCFIEndProlog(SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except,</span><br>
</blockquote>
<blockquote type="cite"><span>- SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitWinEHHandlerData(SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI,</span><br>
</blockquote>
<blockquote type="cite"><span>- bool PrintSchedInfo) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitBundleAlignMode(unsigned AlignPow2) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitBundleLock(bool AlignToEnd) override;</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitBundleUnlock() override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- bool EmitRelocDirective(const MCExpr &Offset, StringRef Name,</span><br>
</blockquote>
<blockquote type="cite"><span>- const MCExpr *Expr, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- /// EmitRawText - If this file is backed by an assembly streamer, this dumps</span><br>
</blockquote>
<blockquote type="cite"><span>- /// the specified string in the output .s file. This capability is</span><br>
</blockquote>
<blockquote type="cite"><span>- /// indicated by the hasRawTextSupport() predicate.</span><br>
</blockquote>
<blockquote type="cite"><span>- void EmitRawTextImpl(StringRef String) override;</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>- void FinishImpl() override;</span><br>
</blockquote>
<blockquote type="cite"><span>-};</span><br>
</blockquote>
<blockquote type="cite"><span>-</span><br>
</blockquote>
<blockquote type="cite"><span>-} // end anonymous namespace.</span><br>
</blockquote>
<blockquote type="cite"><span>+ EmitCommentsAndEOL();</span><br>
</blockquote>
<blockquote type="cite"><span>+}</span><br>
</blockquote>
<blockquote type="cite"><span></span><br>
</blockquote>
<blockquote type="cite"><span>/// AddComment - Add a comment that can be emitted to the generated .s</span><br>
</blockquote>
<blockquote type="cite"><span>/// file if applicable as a QoI issue to make the output of the compiler</span><br>
</blockquote>
<blockquote type="cite"><span>Index: include/llvm/Support/TargetRegistry.h</span><br>
</blockquote>
<blockquote type="cite"><span>===================================================================</span><br>
</blockquote>
<blockquote type="cite"><span>--- include/llvm/Support/TargetRegistry.h</span><br>
</blockquote>
<blockquote type="cite"><span>+++ include/llvm/Support/TargetRegistry.h</span><br>
</blockquote>
<blockquote type="cite"><span>@@ -164,6 +164,10 @@</span><br>
</blockquote>
<blockquote type="cite"><span> using AsmTargetStreamerCtorTy = MCTargetStreamer *(*)(</span><br>
</blockquote>
<blockquote type="cite"><span> MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint,</span><br>
</blockquote>
<blockquote type="cite"><span> bool IsVerboseAsm);</span><br>
</blockquote>
<blockquote type="cite"><span>+ using AsmStreamerCtorTy = MCStreamer</span><br>
</blockquote>
<blockquote type="cite"><span>+ *(*)(MCContext &Context, std::unique_ptr<formatted_raw_ostream> OS,</span><br>
</blockquote>
<blockquote type="cite"><span>+ bool isVerboseAsm, bool useDwarfDirectory, MCInstPrinter *IP,</span><br>
</blockquote>
<blockquote type="cite"><span>+ MCCodeEmitter *CE, MCAsmBackend *MAB, bool ShowInst);</span><br>
</blockquote>
<blockquote type="cite"><span> using ObjectTargetStreamerCtorTy = MCTargetStreamer *(*)(</span><br>
</blockquote>
<blockquote type="cite"><span> MCStreamer &S, const MCSubtargetInfo &STI);</span><br>
</blockquote>
<blockquote type="cite"><span> using MCRelocationInfoCtorTy = MCRelocationInfo *(*)(const Triple &TT,</span><br>
</blockquote>
<blockquote type="cite"><span>@@ -252,6 +256,9 @@</span><br>
</blockquote>
<blockquote type="cite"><span> /// registered (default = nullptr).</span><br>
</blockquote>
<blockquote type="cite"><span> AsmTargetStreamerCtorTy AsmTargetStreamerCtorFn = nullptr;</span><br>
</blockquote>
<blockquote type="cite"><span></span><br>
</blockquote>
<blockquote type="cite"><span>+ /// Construction function for common asm streamer.</span><br>
</blockquote>
<blockquote type="cite"><span>+ AsmStreamerCtorTy AsmStreamerCtorFn = nullptr;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span> /// Construction function for this target's obj TargetStreamer, if</span><br>
</blockquote>
<blockquote type="cite"><span> /// registered (default = nullptr).</span><br>
</blockquote>
<blockquote type="cite"><span> ObjectTargetStreamerCtorTy ObjectTargetStreamerCtorFn = nullptr;</span><br>
</blockquote>
<blockquote type="cite"><span>@@ -492,9 +499,11 @@</span><br>
</blockquote>
<blockquote type="cite"><span> MCInstPrinter *InstPrint, MCCodeEmitter *CE,</span><br>
</blockquote>
<blockquote type="cite"><span> MCAsmBackend *TAB, bool ShowInst) const {</span><br>
</blockquote>
<blockquote type="cite"><span> formatted_raw_ostream &OSRef = *OS;</span><br>
</blockquote>
<blockquote type="cite"><span>- MCStreamer *S = llvm::createAsmStreamer(Ctx, std::move(OS), IsVerboseAsm,</span><br>
</blockquote>
<blockquote type="cite"><span>- UseDwarfDirectory, InstPrint, CE,</span><br>
</blockquote>
<blockquote type="cite"><span>- TAB, ShowInst);</span><br>
</blockquote>
<blockquote type="cite"><span>+ AsmStreamerCtorTy Streamer =</span><br>
</blockquote>
<blockquote type="cite"><span>+ AsmStreamerCtorFn ? AsmStreamerCtorFn : llvm::createAsmStreamer;</span><br>
</blockquote>
<blockquote type="cite"><span>+ MCStreamer *S = Streamer(Ctx, std::move(OS), IsVerboseAsm,</span><br>
</blockquote>
<blockquote type="cite"><span>+ UseDwarfDirectory, InstPrint, CE, TAB, ShowInst);</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span> createAsmTargetStreamer(*S, OSRef, InstPrint, IsVerboseAsm);</span><br>
</blockquote>
<blockquote type="cite"><span> return S;</span><br>
</blockquote>
<blockquote type="cite"><span> }</span><br>
</blockquote>
<blockquote type="cite"><span>@@ -830,6 +839,10 @@</span><br>
</blockquote>
<blockquote type="cite"><span> T.AsmTargetStreamerCtorFn = Fn;</span><br>
</blockquote>
<blockquote type="cite"><span> }</span><br>
</blockquote>
<blockquote type="cite"><span></span><br>
</blockquote>
<blockquote type="cite"><span>+ static void RegisterAsmStreamer(Target &T, Target::AsmStreamerCtorTy Fn) {</span><br>
</blockquote>
<blockquote type="cite"><span>+ T.AsmStreamerCtorFn = Fn;</span><br>
</blockquote>
<blockquote type="cite"><span>+ }</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span> static void</span><br>
</blockquote>
<blockquote type="cite"><span> RegisterObjectTargetStreamer(Target &T,</span><br>
</blockquote>
<blockquote type="cite"><span> Target::ObjectTargetStreamerCtorTy Fn) {</span><br>
</blockquote>
<blockquote type="cite"><span>Index: include/llvm/MC/MCAsmStreamer.h</span><br>
</blockquote>
<blockquote type="cite"><span>===================================================================</span><br>
</blockquote>
<blockquote type="cite"><span>--- /dev/null</span><br>
</blockquote>
<blockquote type="cite"><span>+++ include/llvm/MC/MCAsmStreamer.h</span><br>
</blockquote>
<blockquote type="cite"><span>@@ -0,0 +1,284 @@</span><br>
</blockquote>
<blockquote type="cite"><span>+//===- lib/MC/MCAsmStreamer.h - Text Assembly Output ------------*- C++ -*-===//</span><br>
</blockquote>
<blockquote type="cite"><span>+//</span><br>
</blockquote>
<blockquote type="cite"><span>+// The LLVM Compiler Infrastructure</span><br>
</blockquote>
<blockquote type="cite"><span>+//</span><br>
</blockquote>
<blockquote type="cite"><span>+// This file is distributed under the University of Illinois Open Source</span><br>
</blockquote>
<blockquote type="cite"><span>+// License. See LICENSE.TXT for details.</span><br>
</blockquote>
<blockquote type="cite"><span>+//</span><br>
</blockquote>
<blockquote type="cite"><span>+//===----------------------------------------------------------------------===//</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+#include "llvm/ADT/SmallString.h"</span><br>
</blockquote>
<blockquote type="cite"><span>+#include "llvm/MC/MCContext.h"</span><br>
</blockquote>
<blockquote type="cite"><span>+#include "llvm/MC/MCInstPrinter.h"</span><br>
</blockquote>
<blockquote type="cite"><span>+#include "llvm/MC/MCStreamer.h"</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+namespace llvm {</span><br>
</blockquote>
<blockquote type="cite"><span>+class Twine;</span><br>
</blockquote>
<blockquote type="cite"><span>+class MCAsmBackend;</span><br>
</blockquote>
<blockquote type="cite"><span>+class MCAsmInfo;</span><br>
</blockquote>
<blockquote type="cite"><span>+class MCCodeEmitter;</span><br>
</blockquote>
<blockquote type="cite"><span>+class MCExpr;</span><br>
</blockquote>
<blockquote type="cite"><span>+class MCInst;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+class MCAsmStreamer final : public MCStreamer {</span><br>
</blockquote>
<blockquote type="cite"><span>+ std::unique_ptr<formatted_raw_ostream> OSOwner;</span><br>
</blockquote>
<blockquote type="cite"><span>+ formatted_raw_ostream &OS;</span><br>
</blockquote>
<blockquote type="cite"><span>+ const MCAsmInfo *MAI;</span><br>
</blockquote>
<blockquote type="cite"><span>+ std::unique_ptr<MCInstPrinter> InstPrinter;</span><br>
</blockquote>
<blockquote type="cite"><span>+ std::unique_ptr<MCCodeEmitter> Emitter;</span><br>
</blockquote>
<blockquote type="cite"><span>+ std::unique_ptr<MCAsmBackend> AsmBackend;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ SmallString<128> ExplicitCommentToEmit;</span><br>
</blockquote>
<blockquote type="cite"><span>+ SmallString<128> CommentToEmit;</span><br>
</blockquote>
<blockquote type="cite"><span>+ raw_svector_ostream CommentStream;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned IsVerboseAsm : 1;</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned ShowInst : 1;</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned UseDwarfDirectory : 1;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitRegisterName(int64_t Register);</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+public:</span><br>
</blockquote>
<blockquote type="cite"><span>+ MCAsmStreamer(MCContext &Context, std::unique_ptr<formatted_raw_ostream> os,</span><br>
</blockquote>
<blockquote type="cite"><span>+ bool isVerboseAsm, bool useDwarfDirectory,</span><br>
</blockquote>
<blockquote type="cite"><span>+ MCInstPrinter *printer, MCCodeEmitter *emitter,</span><br>
</blockquote>
<blockquote type="cite"><span>+ MCAsmBackend *asmbackend, bool showInst)</span><br>
</blockquote>
<blockquote type="cite"><span>+ : MCStreamer(Context), OSOwner(std::move(os)), OS(*OSOwner),</span><br>
</blockquote>
<blockquote type="cite"><span>+ MAI(Context.getAsmInfo()), InstPrinter(printer), Emitter(emitter),</span><br>
</blockquote>
<blockquote type="cite"><span>+ AsmBackend(asmbackend), CommentStream(CommentToEmit),</span><br>
</blockquote>
<blockquote type="cite"><span>+ IsVerboseAsm(isVerboseAsm), ShowInst(showInst),</span><br>
</blockquote>
<blockquote type="cite"><span>+ UseDwarfDirectory(useDwarfDirectory) {</span><br>
</blockquote>
<blockquote type="cite"><span>+ assert(InstPrinter);</span><br>
</blockquote>
<blockquote type="cite"><span>+ if (IsVerboseAsm)</span><br>
</blockquote>
<blockquote type="cite"><span>+ InstPrinter->setCommentStream(CommentStream);</span><br>
</blockquote>
<blockquote type="cite"><span>+ }</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitEOL();</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitSyntaxDirective() override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCommentsAndEOL();</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// isVerboseAsm - Return true if this streamer supports verbose assembly at</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// all.</span><br>
</blockquote>
<blockquote type="cite"><span>+ bool isVerboseAsm() const override { return IsVerboseAsm; }</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// hasRawTextSupport - We support EmitRawText.</span><br>
</blockquote>
<blockquote type="cite"><span>+ bool hasRawTextSupport() const override { return true; }</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// AddComment - Add a comment that can be emitted to the generated .s</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// file if applicable as a QoI issue to make the output of the compiler</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// more readable. This only affects the MCAsmStreamer, and only when</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// verbose assembly output is enabled.</span><br>
</blockquote>
<blockquote type="cite"><span>+ void AddComment(const Twine &T, bool EOL = true) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// AddEncodingComment - Add a comment showing the encoding of an instruction.</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// If PrintSchedInfo - is true then the comment sched:[x:y] should</span><br>
</blockquote>
<blockquote type="cite"><span>+ // be added to output if it's being supported by target</span><br>
</blockquote>
<blockquote type="cite"><span>+ void AddEncodingComment(const MCInst &Inst, const MCSubtargetInfo &,</span><br>
</blockquote>
<blockquote type="cite"><span>+ bool PrintSchedInfo);</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// GetCommentOS - Return a raw_ostream that comments can be written to.</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// Unlike AddComment, you are required to terminate comments with \n if you</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// use this method.</span><br>
</blockquote>
<blockquote type="cite"><span>+ raw_ostream &GetCommentOS() override {</span><br>
</blockquote>
<blockquote type="cite"><span>+ if (!IsVerboseAsm)</span><br>
</blockquote>
<blockquote type="cite"><span>+ return nulls(); // Discard comments unless in verbose asm mode.</span><br>
</blockquote>
<blockquote type="cite"><span>+ return CommentStream;</span><br>
</blockquote>
<blockquote type="cite"><span>+ }</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void emitRawComment(const Twine &T, bool TabPrefix = true) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void addExplicitComment(const Twine &T) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void emitExplicitComments() override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// AddBlankLine - Emit a blank line to a .s file to pretty it up.</span><br>
</blockquote>
<blockquote type="cite"><span>+ void AddBlankLine() override {</span><br>
</blockquote>
<blockquote type="cite"><span>+ EmitEOL();</span><br>
</blockquote>
<blockquote type="cite"><span>+ }</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// @name MCStreamer Interface</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// @{</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void ChangeSection(MCSection *Section, const MCExpr *Subsection) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitAssemblerFlag(MCAssemblerFlag Flag) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitLinkerOptions(ArrayRef<std::string> Options) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitDataRegion(MCDataRegionType Kind) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitVersionMin(MCVersionMinType Kind, unsigned Major, unsigned Minor,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned Update) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitThumbFunc(MCSymbol *Func) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void BeginCOFFSymbolDef(const MCSymbol *Symbol) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCOFFSymbolStorageClass(int StorageClass) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCOFFSymbolType(int Type) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EndCOFFSymbolDef() override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCOFFSafeSEH(MCSymbol const *Symbol) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCOFFSectionIndex(MCSymbol const *Symbol) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void emitELFSize(MCSymbol *Symbol, const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned ByteAlignment) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol.</span><br>
</blockquote>
<blockquote type="cite"><span>+ ///</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// @param Symbol - The common symbol to emit.</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// @param Size - The size of the common symbol.</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// @param ByteAlignment - The alignment of the common symbol in bytes.</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned ByteAlignment) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr,</span><br>
</blockquote>
<blockquote type="cite"><span>+ uint64_t Size = 0, unsigned ByteAlignment = 0) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned ByteAlignment = 0) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitBinaryData(StringRef Data) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitBytes(StringRef Data) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitValueImpl(const MCExpr *Value, unsigned Size,</span><br>
</blockquote>
<blockquote type="cite"><span>+ SMLoc Loc = SMLoc()) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitIntValue(uint64_t Value, unsigned Size) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitULEB128Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitSLEB128Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitDTPRel32Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitDTPRel64Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitTPRel32Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitTPRel64Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitGPRel64Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitGPRel32Value(const MCExpr *Value) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void emitFill(uint64_t NumBytes, uint8_t FillValue) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void emitFill(const MCExpr &NumBytes, uint64_t FillValue,</span><br>
</blockquote>
<blockquote type="cite"><span>+ SMLoc Loc = SMLoc()) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void emitFill(uint64_t NumValues, int64_t Size, int64_t Expr) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,</span><br>
</blockquote>
<blockquote type="cite"><span>+ SMLoc Loc = SMLoc()) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned ValueSize = 1,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned MaxBytesToEmit = 0) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCodeAlignment(unsigned ByteAlignment,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned MaxBytesToEmit = 0) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void emitValueToOffset(const MCExpr *Offset,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned char Value,</span><br>
</blockquote>
<blockquote type="cite"><span>+ SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitFileDirective(StringRef Filename) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,</span><br>
</blockquote>
<blockquote type="cite"><span>+ StringRef Filename,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned CUID = 0) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitDwarfLocDirective(unsigned FileNo, unsigned Line,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned Column, unsigned Flags,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned Isa, unsigned Discriminator,</span><br>
</blockquote>
<blockquote type="cite"><span>+ StringRef FileName) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ MCSymbol *getDwarfLineTableSymbol(unsigned CUID) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ bool EmitCVFileDirective(unsigned FileNo, StringRef Filename,</span><br>
</blockquote>
<blockquote type="cite"><span>+ ArrayRef<uint8_t> Checksum,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned ChecksumKind) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ bool EmitCVFuncIdDirective(unsigned FuncId) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ bool EmitCVInlineSiteIdDirective(unsigned FunctionId, unsigned IAFunc,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned IAFile, unsigned IALine,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned IACol, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCVLocDirective(unsigned FunctionId, unsigned FileNo, unsigned Line,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned Column, bool PrologueEnd, bool IsStmt,</span><br>
</blockquote>
<blockquote type="cite"><span>+ StringRef FileName, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCVLinetableDirective(unsigned FunctionId, const MCSymbol *FnStart,</span><br>
</blockquote>
<blockquote type="cite"><span>+ const MCSymbol *FnEnd) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCVInlineLinetableDirective(unsigned PrimaryFunctionId,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned SourceFileId,</span><br>
</blockquote>
<blockquote type="cite"><span>+ unsigned SourceLineNum,</span><br>
</blockquote>
<blockquote type="cite"><span>+ const MCSymbol *FnStartSym,</span><br>
</blockquote>
<blockquote type="cite"><span>+ const MCSymbol *FnEndSym) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCVDefRangeDirective(</span><br>
</blockquote>
<blockquote type="cite"><span>+ ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,</span><br>
</blockquote>
<blockquote type="cite"><span>+ StringRef FixedSizePortion) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCVStringTableDirective() override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCVFileChecksumsDirective() override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCVFileChecksumOffsetDirective(unsigned FileNo) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCVFPOData(const MCSymbol *ProcSym, SMLoc L) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitIdent(StringRef IdentString) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFISections(bool EH, bool Debug) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIDefCfa(int64_t Register, int64_t Offset) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIDefCfaOffset(int64_t Offset) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIDefCfaRegister(int64_t Register) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIOffset(int64_t Register, int64_t Offset) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIRememberState() override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIRestoreState() override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIRestore(int64_t Register) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFISameValue(int64_t Register) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIRelOffset(int64_t Register, int64_t Offset) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIAdjustCfaOffset(int64_t Adjustment) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIEscape(StringRef Values) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIGnuArgsSize(int64_t Size) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFISignalFrame() override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIUndefined(int64_t Register) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIRegister(int64_t Register1, int64_t Register2) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIWindowSave() override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitCFIReturnColumn(int64_t Register) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWinCFIEndProc(SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWinCFIStartChained(SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWinCFIEndChained(SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWinCFIPushReg(unsigned Register, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWinCFISetFrame(unsigned Register, unsigned Offset,</span><br>
</blockquote>
<blockquote type="cite"><span>+ SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWinCFIAllocStack(unsigned Size, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWinCFISaveReg(unsigned Register, unsigned Offset,</span><br>
</blockquote>
<blockquote type="cite"><span>+ SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWinCFISaveXMM(unsigned Register, unsigned Offset,</span><br>
</blockquote>
<blockquote type="cite"><span>+ SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWinCFIPushFrame(bool Code, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWinCFIEndProlog(SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except,</span><br>
</blockquote>
<blockquote type="cite"><span>+ SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitWinEHHandlerData(SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI,</span><br>
</blockquote>
<blockquote type="cite"><span>+ bool PrintSchedInfo) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitBundleAlignMode(unsigned AlignPow2) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitBundleLock(bool AlignToEnd) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitBundleUnlock() override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ bool EmitRelocDirective(const MCExpr &Offset, StringRef Name,</span><br>
</blockquote>
<blockquote type="cite"><span>+ const MCExpr *Expr, SMLoc Loc) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// EmitRawText - If this file is backed by an assembly streamer, this dumps</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// the specified string in the output .s file. This capability is</span><br>
</blockquote>
<blockquote type="cite"><span>+ /// indicated by the hasRawTextSupport() predicate.</span><br>
</blockquote>
<blockquote type="cite"><span>+ void EmitRawTextImpl(StringRef String) override;</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+ void FinishImpl() override;</span><br>
</blockquote>
<blockquote type="cite"><span>+};</span><br>
</blockquote>
<blockquote type="cite"><span>+</span><br>
</blockquote>
<blockquote type="cite"><span>+} // end namespace llvm</span><br>
</blockquote>
<blockquote type="cite"><span>_______________________________________________</span><br>
</blockquote>
<blockquote type="cite"><span>llvm-commits mailing list</span><br>
</blockquote>
<blockquote type="cite"><span><a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a></span><br>
</blockquote>
<blockquote type="cite"><span><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a></span><br>
</blockquote>
</div>
</blockquote>
</body>
</html>