LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MCObjectStreamer.h
Go to the documentation of this file.
1 //===- MCObjectStreamer.h - MCStreamer Object File Interface ----*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef LLVM_MC_MCOBJECTSTREAMER_H
11 #define LLVM_MC_MCOBJECTSTREAMER_H
12 
13 #include "llvm/MC/MCAssembler.h"
14 #include "llvm/MC/MCStreamer.h"
15 
16 namespace llvm {
17 class MCAssembler;
18 class MCCodeEmitter;
19 class MCSectionData;
20 class MCExpr;
21 class MCFragment;
22 class MCDataFragment;
23 class MCAsmBackend;
24 class raw_ostream;
25 
26 /// \brief Streaming object file generation interface.
27 ///
28 /// This class provides an implementation of the MCStreamer interface which is
29 /// suitable for use with the assembler backend. Specific object file formats
30 /// are expected to subclass this interface to implement directives specific
31 /// to that file format or custom semantics expected by the object writer
32 /// implementation.
33 class MCObjectStreamer : public MCStreamer {
34  MCAssembler *Assembler;
35  MCSectionData *CurSectionData;
36  MCSectionData::iterator CurInsertionPoint;
37 
38  virtual void EmitInstToData(const MCInst &Inst) = 0;
39  virtual void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame);
40  virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame);
41 
42 protected:
43  MCObjectStreamer(MCContext &Context, MCTargetStreamer *TargetStreamer,
44  MCAsmBackend &TAB, raw_ostream &_OS,
45  MCCodeEmitter *_Emitter);
46  MCObjectStreamer(MCContext &Context, MCTargetStreamer *TargetStreamer,
47  MCAsmBackend &TAB, raw_ostream &_OS, MCCodeEmitter *_Emitter,
48  MCAssembler *_Assembler);
50 
51 public:
52  /// state management
53  virtual void reset();
54 
55 protected:
57  return CurSectionData;
58  }
59 
61 
62  void insert(MCFragment *F) const {
63  CurSectionData->getFragmentList().insert(CurInsertionPoint, F);
64  F->setParent(CurSectionData);
65  }
66 
67  /// Get a data fragment to write into, creating a new one if the current
68  /// fragment is not a data fragment.
70 
71  const MCExpr *AddValueSymbols(const MCExpr *Value);
72 
73 public:
74  MCAssembler &getAssembler() { return *Assembler; }
75 
76  /// @name MCStreamer Interface
77  /// @{
78 
79  virtual void EmitLabel(MCSymbol *Symbol);
80  virtual void EmitDebugLabel(MCSymbol *Symbol);
81  virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
82  virtual void EmitValueImpl(const MCExpr *Value, unsigned Size);
83  virtual void EmitULEB128Value(const MCExpr *Value);
84  virtual void EmitSLEB128Value(const MCExpr *Value);
85  virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
86  virtual void ChangeSection(const MCSection *Section,
87  const MCExpr *Subsection);
88  virtual void EmitInstruction(const MCInst &Inst);
89 
90  /// \brief Emit an instruction to a special fragment, because this instruction
91  /// can change its size during relaxation.
92  virtual void EmitInstToFragment(const MCInst &Inst);
93 
94  virtual void EmitBundleAlignMode(unsigned AlignPow2);
95  virtual void EmitBundleLock(bool AlignToEnd);
96  virtual void EmitBundleUnlock();
97  virtual void EmitBytes(StringRef Data);
98  virtual void EmitValueToAlignment(unsigned ByteAlignment,
99  int64_t Value = 0,
100  unsigned ValueSize = 1,
101  unsigned MaxBytesToEmit = 0);
102  virtual void EmitCodeAlignment(unsigned ByteAlignment,
103  unsigned MaxBytesToEmit = 0);
104  virtual bool EmitValueToOffset(const MCExpr *Offset, unsigned char Value);
105  virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
106  unsigned Column, unsigned Flags,
107  unsigned Isa, unsigned Discriminator,
108  StringRef FileName);
109  virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta,
110  const MCSymbol *LastLabel,
111  const MCSymbol *Label,
112  unsigned PointerSize);
113  virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
114  const MCSymbol *Label);
115  virtual void EmitGPRel32Value(const MCExpr *Value);
116  virtual void EmitGPRel64Value(const MCExpr *Value);
117  virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue);
118  virtual void EmitZeros(uint64_t NumBytes);
119  virtual void FinishImpl();
120 };
121 
122 } // end namespace llvm
123 
124 #endif
void setParent(MCSectionData *Value)
Definition: MCAssembler.h:96
virtual void EmitGPRel32Value(const MCExpr *Value)
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol)
virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue)
virtual void EmitValueImpl(const MCExpr *Value, unsigned Size)
virtual bool EmitValueToOffset(const MCExpr *Offset, unsigned char Value)
virtual void EmitBundleAlignMode(unsigned AlignPow2)
Set the bundle alignment mode from now on in the section. The argument is the power of 2 to which the...
virtual void EmitBundleLock(bool AlignToEnd)
The following instructions are a bundle-locked group.
F(f)
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta, const MCSymbol *LastLabel, const MCSymbol *Label, unsigned PointerSize)
const FragmentListType & getFragmentList() const
Definition: MCAssembler.h:622
virtual void EmitGPRel64Value(const MCExpr *Value)
MCFragment * getCurrentFragment() const
void insert(MCFragment *F) const
virtual void EmitDebugLabel(MCSymbol *Symbol)
virtual void ChangeSection(const MCSection *Section, const MCExpr *Subsection)
virtual void EmitCodeAlignment(unsigned ByteAlignment, unsigned MaxBytesToEmit=0)
virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator, StringRef FileName)
EmitDwarfLocDirective - This implements the DWARF2.
Streaming object file generation interface.
MCDataFragment * getOrCreateDataFragment() const
MCObjectStreamer(MCContext &Context, MCTargetStreamer *TargetStreamer, MCAsmBackend &TAB, raw_ostream &_OS, MCCodeEmitter *_Emitter)
MCAssembler & getAssembler()
MCCodeEmitter - Generic instruction encoding interface.
Definition: MCCodeEmitter.h:22
virtual void EmitInstruction(const MCInst &Inst)
iterator insert(iterator where, NodeTy *New)
Definition: ilist.h:412
virtual void EmitInstToFragment(const MCInst &Inst)
Emit an instruction to a special fragment, because this instruction can change its size during relaxa...
virtual void EmitBytes(StringRef Data)
virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, const MCSymbol *Label)
virtual void EmitLabel(MCSymbol *Symbol)
const MCExpr * AddValueSymbols(const MCExpr *Value)
virtual void EmitULEB128Value(const MCExpr *Value)
virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value=0, unsigned ValueSize=1, unsigned MaxBytesToEmit=0)
virtual void FinishImpl()
FinishImpl - Streamer specific finalization.
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value)
virtual void EmitSLEB128Value(const MCExpr *Value)
LLVM Value Representation.
Definition: Value.h:66
virtual void EmitZeros(uint64_t NumBytes)
Emit NumBytes worth of zeros. This function properly handles data in virtual sections.
MCAsmBackend - Generic interface to target specific assembler backends.
Definition: MCAsmBackend.h:34
MCSectionData * getCurrentSectionData() const
virtual void EmitBundleUnlock()
Ends a bundle-locked group.
virtual void reset()
state management