| //===- MCObjectStreamer.h - MCStreamer Object File Interface ----*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_MC_MCOBJECTSTREAMER_H |
| #define LLVM_MC_MCOBJECTSTREAMER_H |
| |
| #include "llvm/MC/MCStreamer.h" |
| |
| namespace llvm { |
| class MCAssembler; |
| class MCCodeEmitter; |
| class MCSectionData; |
| class MCExpr; |
| class MCFragment; |
| class MCDataFragment; |
| class MCAsmBackend; |
| class raw_ostream; |
| |
| /// \brief Streaming object file generation interface. |
| /// |
| /// This class provides an implementation of the MCStreamer interface which is |
| /// suitable for use with the assembler backend. Specific object file formats |
| /// are expected to subclass this interface to implement directives specific |
| /// to that file format or custom semantics expected by the object writer |
| /// implementation. |
| class MCObjectStreamer : public MCStreamer { |
| MCAssembler *Assembler; |
| MCSectionData *CurSectionData; |
| |
| virtual void EmitInstToData(const MCInst &Inst) = 0; |
| |
| protected: |
| MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB, |
| raw_ostream &_OS, MCCodeEmitter *_Emitter); |
| MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB, |
| raw_ostream &_OS, MCCodeEmitter *_Emitter, |
| MCAssembler *_Assembler); |
| ~MCObjectStreamer(); |
| |
| MCSectionData *getCurrentSectionData() const { |
| return CurSectionData; |
| } |
| |
| MCFragment *getCurrentFragment() const; |
| |
| /// Get a data fragment to write into, creating a new one if the current |
| /// fragment is not a data fragment. |
| MCDataFragment *getOrCreateDataFragment() const; |
| |
| const MCExpr *AddValueSymbols(const MCExpr *Value); |
| |
| public: |
| MCAssembler &getAssembler() { return *Assembler; } |
| |
| /// @name MCStreamer Interface |
| /// @{ |
| |
| virtual void EmitLabel(MCSymbol *Symbol); |
| virtual void EmitValueImpl(const MCExpr *Value, unsigned Size, |
| unsigned AddrSpace); |
| virtual void EmitULEB128Value(const MCExpr *Value); |
| virtual void EmitSLEB128Value(const MCExpr *Value); |
| virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol); |
| virtual void ChangeSection(const MCSection *Section); |
| virtual void EmitInstruction(const MCInst &Inst); |
| virtual void EmitInstToFragment(const MCInst &Inst); |
| virtual void EmitValueToOffset(const MCExpr *Offset, unsigned char Value); |
| virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta, |
| const MCSymbol *LastLabel, |
| const MCSymbol *Label, |
| unsigned PointerSize); |
| virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, |
| const MCSymbol *Label); |
| virtual void Finish(); |
| |
| /// @} |
| }; |
| |
| } // end namespace llvm |
| |
| #endif |