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