MCObjectStreamer.h revision 245a1e20419aa5a3c833d7a8e89168e19d5f4d2c
10bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant//===- MCObjectStreamer.h - MCStreamer Object File Interface ----*- C++ -*-===// 20bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant// 30bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant// The LLVM Compiler Infrastructure 40bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant// 50bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant// This file is distributed under the University of Illinois Open Source 60bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant// License. See LICENSE.TXT for details. 70bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant// 80bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant//===----------------------------------------------------------------------===// 90bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant 100bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant#ifndef LLVM_MC_MCOBJECTSTREAMER_H 110bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant#define LLVM_MC_MCOBJECTSTREAMER_H 120bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant 130bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant#include "llvm/MC/MCStreamer.h" 145e57142c5902c3f73a6fdcb8cab55e88ffb43a56Howard Hinnant 150bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnantnamespace llvm { 160bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnantclass MCAssembler; 170bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnantclass MCCodeEmitter; 180bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnantclass MCSectionData; 190bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnantclass MCExpr; 200bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnantclass MCFragment; 210bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnantclass MCDataFragment; 220bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnantclass TargetAsmBackend; 230bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnantclass raw_ostream; 240bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant 250bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant/// \brief Streaming object file generation interface. 260bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant/// 270bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant/// This class provides an implementation of the MCStreamer interface which is 280bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant/// suitable for use with the assembler backend. Specific object file formats 290bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant/// are expected to subclass this interface to implement directives specific 300bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant/// to that file format or custom semantics expected by the object writer 310bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant/// implementation. 320bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnantclass MCObjectStreamer : public MCStreamer { 330bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant MCAssembler *Assembler; 340bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant MCSectionData *CurSectionData; 350bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant 360bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant virtual void EmitInstToData(const MCInst &Inst) = 0; 370bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant 380bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnantprotected: 390bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant MCObjectStreamer(MCContext &Context, TargetAsmBackend &TAB, 400bb0a7c9ea7dc2852c9bfb38584f4673ada25e2aHoward Hinnant raw_ostream &_OS, MCCodeEmitter *_Emitter); 41 ~MCObjectStreamer(); 42 43 MCSectionData *getCurrentSectionData() const { 44 return CurSectionData; 45 } 46 47 MCFragment *getCurrentFragment() const; 48 49 /// Get a data fragment to write into, creating a new one if the current 50 /// fragment is not a data fragment. 51 MCDataFragment *getOrCreateDataFragment() const; 52 53 const MCExpr *AddValueSymbols(const MCExpr *Value); 54 55public: 56 MCAssembler &getAssembler() { return *Assembler; } 57 58 /// @name MCStreamer Interface 59 /// @{ 60 61 virtual void EmitLabel(MCSymbol *Symbol); 62 virtual void EmitValueImpl(const MCExpr *Value, unsigned Size, 63 bool isPCRel, unsigned AddrSpace); 64 virtual void EmitULEB128Value(const MCExpr *Value, unsigned AddrSpace = 0); 65 virtual void EmitSLEB128Value(const MCExpr *Value, unsigned AddrSpace = 0); 66 virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol); 67 virtual void SwitchSection(const MCSection *Section); 68 virtual void EmitInstruction(const MCInst &Inst); 69 virtual void EmitInstToFragment(const MCInst &Inst); 70 virtual void EmitValueToOffset(const MCExpr *Offset, unsigned char Value); 71 virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta, 72 const MCSymbol *LastLabel, 73 const MCSymbol *Label); 74 virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, 75 const MCSymbol *Label); 76 virtual void Finish(); 77 78 /// @} 79}; 80 81} // end namespace llvm 82 83#endif 84