26 virtual void EmitInstToFragment(
const MCInst &Inst);
27 virtual void EmitInstToData(
const MCInst &Inst);
37 virtual void InitSections();
38 virtual void InitToTextSection();
45 unsigned ValueSize = 1,
46 unsigned MaxBytesToEmit = 0);
48 unsigned MaxBytesToEmit = 0);
49 virtual bool EmitValueToOffset(
const MCExpr *Offset,
50 unsigned char Value = 0);
51 virtual void FinishImpl();
65 virtual void EmitSymbolDesc(
MCSymbol *
Symbol,
unsigned DescValue) {
78 virtual void EmitCOFFSymbolStorageClass(
int StorageClass) {
81 virtual void EmitCOFFSymbolType(
int Type) {
84 virtual void EndCOFFSymbolDef() {
90 virtual void EmitLocalCommonSymbol(
MCSymbol *
Symbol, uint64_t Size,
94 virtual void EmitFileDirective(
StringRef Filename) {
97 virtual void EmitIdent(
StringRef IdentString) {
100 virtual bool EmitDwarfFileDirective(
unsigned FileNo,
StringRef Directory,
108 void MCPureStreamer::InitSections() {
112 void MCPureStreamer::InitToTextSection() {
113 SwitchSection(getContext().getObjectFileInfo()->getTextSection());
117 assert(Symbol->
isUndefined() &&
"Cannot define a symbol twice!");
118 assert(!Symbol->
isVariable() &&
"Cannot emit a variable symbol!");
119 assert(getCurrentSection().first &&
"Cannot emit before setting section!");
121 AssignSection(Symbol, getCurrentSection().first);
123 MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
127 if (getAssembler().isSymbolLinkerVisible(SD.
getSymbol()))
135 assert(!SD.
getFragment() &&
"Unexpected fragment on symbol data!");
141 void MCPureStreamer::EmitDebugLabel(
MCSymbol *Symbol) {
150 void MCPureStreamer::EmitBytes(
StringRef Data) {
153 getOrCreateDataFragment()->getContents().append(Data.
begin(), Data.
end());
156 void MCPureStreamer::EmitValueToAlignment(
unsigned ByteAlignment,
157 int64_t
Value,
unsigned ValueSize,
158 unsigned MaxBytesToEmit) {
161 if (MaxBytesToEmit == 0)
163 insert(
new MCAlignFragment(ByteAlignment, Value, ValueSize, MaxBytesToEmit));
166 if (ByteAlignment > getCurrentSectionData()->getAlignment())
167 getCurrentSectionData()->setAlignment(ByteAlignment);
170 void MCPureStreamer::EmitCodeAlignment(
unsigned ByteAlignment,
171 unsigned MaxBytesToEmit) {
174 if (MaxBytesToEmit == 0)
181 if (ByteAlignment > getCurrentSectionData()->getAlignment())
182 getCurrentSectionData()->setAlignment(ByteAlignment);
185 bool MCPureStreamer::EmitValueToOffset(
const MCExpr *Offset,
186 unsigned char Value) {
191 void MCPureStreamer::EmitInstToFragment(
const MCInst &Inst) {
202 getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, Fixups);
209 void MCPureStreamer::EmitInstToData(
const MCInst &Inst) {
215 getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, Fixups);
219 for (
unsigned i = 0, e = Fixups.
size(); i != e; ++i) {
226 void MCPureStreamer::FinishImpl() {
234 return new MCPureStreamer(Context, MAB, OS, CE);
MCStreamer * createPureStreamer(MCContext &Ctx, MCAsmBackend &TAB, raw_ostream &OS, MCCodeEmitter *CE)
virtual SmallVectorImpl< char > & getContents()
COFF::SymbolStorageClass StorageClass
const MCSymbol & getSymbol() const
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
SmallVectorImpl< MCFixup > & getFixups()
void setEmitNops(bool Value)
Streaming object file generation interface.
MCFragment * getFragment() const
MCCodeEmitter - Generic instruction encoding interface.
void append(in_iter in_start, in_iter in_end)
virtual SmallVectorImpl< char > & getContents()
void setOffset(uint64_t Value)
virtual void FinishImpl()
FinishImpl - Streamer specific finalization.
void setFragment(MCFragment *Value)
bool isVariable() const
isVariable - Check if this is a variable symbol.
LLVM Value Representation.
MCAsmBackend - Generic interface to target specific assembler backends.
bool isUndefined() const
isUndefined - Check if this symbol undefined (i.e., implicitly defined).
SmallVectorImpl< MCFixup > & getFixups()