diff options
Diffstat (limited to 'include/llvm/MC/MCStreamer.h')
| -rw-r--r-- | include/llvm/MC/MCStreamer.h | 86 | 
1 files changed, 84 insertions, 2 deletions
| diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index 04d143ffef66d..cd710ee434251 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -183,6 +183,12 @@ class MCStreamer {    /// PushSection.    SmallVector<std::pair<MCSectionSubPair, MCSectionSubPair>, 4> SectionStack; +  /// The next unique ID to use when creating a WinCFI-related section (.pdata +  /// or .xdata). This ID ensures that we have a one-to-one mapping from +  /// code section to unwind info section, which MSVC's incremental linker +  /// requires. +  unsigned NextWinCFIID = 0; +  protected:    MCStreamer(MCContext &Ctx); @@ -222,6 +228,8 @@ public:      return DwarfFrameInfos;    } +  bool hasUnfinishedDwarfFrameInfo(); +    unsigned getNumWinFrameInfos() { return WinFrameInfos.size(); }    ArrayRef<WinEH::FrameInfo *> getWinFrameInfos() const {      return WinFrameInfos; @@ -244,7 +252,7 @@ public:    /// correctly?    virtual bool isIntegratedAssemblerRequired() const { return false; } -  /// \brief Add a textual command. +  /// \brief Add a textual comment.    ///    /// Typically for comments that can be emitted to the generated .s    /// file if applicable as a QoI issue to make the output of the compiler @@ -266,6 +274,12 @@ public:    /// only prints comments, the object streamer ignores it instead of asserting.    virtual void emitRawComment(const Twine &T, bool TabPrefix = true); +  /// \brief Add explicit comment T. T is required to be a valid +  /// comment in the output and does not need to be escaped. +  virtual void addExplicitComment(const Twine &T); +  /// \brief Emit added explicit comments. +  virtual void emitExplicitComments(); +    /// AddBlankLine - Emit a blank line to a .s file to pretty it up.    virtual void AddBlankLine() {} @@ -515,6 +529,10 @@ public:    /// etc.    virtual void EmitBytes(StringRef Data); +  /// Functionally identical to EmitBytes. When emitting textual assembly, this +  /// method uses .byte directives instead of .ascii or .asciz for readability. +  virtual void EmitBinaryData(StringRef Data); +    /// \brief Emit the expression \p Value into the output as a native    /// integer of the given \p Size bytes.    /// @@ -567,7 +585,29 @@ public:    /// \brief Emit NumBytes bytes worth of the value specified by FillValue.    /// This implements directives such as '.space'. -  virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue); +  virtual void emitFill(uint64_t NumBytes, uint8_t FillValue); + +  /// \brief Emit \p Size bytes worth of the value specified by \p FillValue. +  /// +  /// This is used to implement assembler directives such as .space or .skip. +  /// +  /// \param NumBytes - The number of bytes to emit. +  /// \param FillValue - The value to use when filling bytes. +  /// \param Loc - The location of the expression for error reporting. +  virtual void emitFill(const MCExpr &NumBytes, uint64_t FillValue, +                        SMLoc Loc = SMLoc()); + +  /// \brief Emit \p NumValues copies of \p Size bytes. Each \p Size bytes is +  /// taken from the lowest order 4 bytes of \p Expr expression. +  /// +  /// This is used to implement assembler directives such as .fill. +  /// +  /// \param NumValues - The number of copies of \p Size bytes to emit. +  /// \param Size - The size (in bytes) of each repeated value. +  /// \param Expr - The expression from which \p Size bytes are used. +  virtual void emitFill(uint64_t NumValues, int64_t Size, int64_t Expr); +  virtual void emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr, +                        SMLoc Loc = SMLoc());    /// \brief Emit NumBytes worth of zeros.    /// This function properly handles data in virtual sections. @@ -640,6 +680,40 @@ public:                                       unsigned Isa, unsigned Discriminator,                                       StringRef FileName); +  /// \brief Associate a filename with a specified logical file number.  This +  /// implements the '.cv_file 4 "foo.c"' assembler directive. +  virtual unsigned EmitCVFileDirective(unsigned FileNo, StringRef Filename); + +  /// \brief This implements the CodeView '.cv_loc' assembler directive. +  virtual void EmitCVLocDirective(unsigned FunctionId, unsigned FileNo, +                                  unsigned Line, unsigned Column, +                                  bool PrologueEnd, bool IsStmt, +                                  StringRef FileName); + +  /// \brief This implements the CodeView '.cv_linetable' assembler directive. +  virtual void EmitCVLinetableDirective(unsigned FunctionId, +                                        const MCSymbol *FnStart, +                                        const MCSymbol *FnEnd); + +  /// \brief This implements the CodeView '.cv_inline_linetable' assembler +  /// directive. +  virtual void EmitCVInlineLinetableDirective( +      unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, +      const MCSymbol *FnStartSym, const MCSymbol *FnEndSym, +      ArrayRef<unsigned> SecondaryFunctionIds); + +  /// \brief This implements the CodeView '.cv_def_range' assembler +  /// directive. +  virtual void EmitCVDefRangeDirective( +      ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges, +      StringRef FixedSizePortion); + +  /// \brief This implements the CodeView '.cv_stringtable' assembler directive. +  virtual void EmitCVStringTableDirective() {} + +  /// \brief This implements the CodeView '.cv_filechecksums' assembler directive. +  virtual void EmitCVFileChecksumsDirective() {} +    /// Emit the absolute difference between two symbols.    ///    /// \pre Offset of \c Hi is greater than the offset \c Lo. @@ -684,6 +758,14 @@ public:    virtual void EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except);    virtual void EmitWinEHHandlerData(); +  /// Get the .pdata section used for the given section. Typically the given +  /// section is either the main .text section or some other COMDAT .text +  /// section, but it may be any section containing code. +  MCSection *getAssociatedPDataSection(const MCSection *TextSec); + +  /// Get the .xdata section used for the given section. +  MCSection *getAssociatedXDataSection(const MCSection *TextSec); +    virtual void EmitSyntaxDirective();    /// \brief Emit a .reloc directive. | 
