Make the MCStreamer have a reset method and call that after finalization of the asm...
[oota-llvm.git] / lib / MC / MCStreamer.cpp
1 //===- lib/MC/MCStreamer.cpp - Streaming Machine Code Output --------------===//
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 #include "llvm/MC/MCStreamer.h"
11 #include "llvm/ADT/SmallString.h"
12 #include "llvm/ADT/Twine.h"
13 #include "llvm/MC/MCAsmInfo.h"
14 #include "llvm/MC/MCContext.h"
15 #include "llvm/MC/MCExpr.h"
16 #include "llvm/MC/MCObjectWriter.h"
17 #include "llvm/MC/MCSymbol.h"
18 #include "llvm/Support/ErrorHandling.h"
19 #include "llvm/Support/LEB128.h"
20 #include "llvm/Support/raw_ostream.h"
21 #include <cstdlib>
22 using namespace llvm;
23
24 MCStreamer::MCStreamer(MCContext &Ctx)
25   : Context(Ctx), EmitEHFrame(true), EmitDebugFrame(false),
26     CurrentW64UnwindInfo(0), LastSymbol(0),
27     AutoInitSections(false) {
28   const MCSection *section = NULL;
29   SectionStack.push_back(std::make_pair(section, section));
30 }
31
32 MCStreamer::~MCStreamer() {
33   for (unsigned i = 0; i < getNumW64UnwindInfos(); ++i)
34     delete W64UnwindInfos[i];
35 }
36
37 void MCStreamer::reset() {
38   for (unsigned i = 0; i < getNumW64UnwindInfos(); ++i)
39     delete W64UnwindInfos[i];
40   EmitEHFrame = true;
41   EmitDebugFrame = false;
42   CurrentW64UnwindInfo = 0;
43   LastSymbol = 0;
44   AutoInitSections = false;
45   const MCSection *section = NULL;
46   SectionStack.clear();
47   SectionStack.push_back(std::make_pair(section, section));  
48 }
49
50 const MCExpr *MCStreamer::BuildSymbolDiff(MCContext &Context,
51                                           const MCSymbol *A,
52                                           const MCSymbol *B) {
53   MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
54   const MCExpr *ARef =
55     MCSymbolRefExpr::Create(A, Variant, Context);
56   const MCExpr *BRef =
57     MCSymbolRefExpr::Create(B, Variant, Context);
58   const MCExpr *AddrDelta =
59     MCBinaryExpr::Create(MCBinaryExpr::Sub, ARef, BRef, Context);
60   return AddrDelta;
61 }
62
63 const MCExpr *MCStreamer::ForceExpAbs(const MCExpr* Expr) {
64   if (Context.getAsmInfo().hasAggressiveSymbolFolding() ||
65       isa<MCSymbolRefExpr>(Expr))
66     return Expr;
67
68   MCSymbol *ABS = Context.CreateTempSymbol();
69   EmitAssignment(ABS, Expr);
70   return MCSymbolRefExpr::Create(ABS, Context);
71 }
72
73 raw_ostream &MCStreamer::GetCommentOS() {
74   // By default, discard comments.
75   return nulls();
76 }
77
78 void MCStreamer::EmitDwarfSetLineAddr(int64_t LineDelta,
79                                       const MCSymbol *Label, int PointerSize) {
80   // emit the sequence to set the address
81   EmitIntValue(dwarf::DW_LNS_extended_op, 1);
82   EmitULEB128IntValue(PointerSize + 1);
83   EmitIntValue(dwarf::DW_LNE_set_address, 1);
84   EmitSymbolValue(Label, PointerSize);
85
86   // emit the sequence for the LineDelta (from 1) and a zero address delta.
87   MCDwarfLineAddr::Emit(this, LineDelta, 0);
88 }
89
90 /// EmitIntValue - Special case of EmitValue that avoids the client having to
91 /// pass in a MCExpr for constant integers.
92 void MCStreamer::EmitIntValue(uint64_t Value, unsigned Size,
93                               unsigned AddrSpace) {
94   assert(Size <= 8 && "Invalid size");
95   assert((isUIntN(8 * Size, Value) || isIntN(8 * Size, Value)) &&
96          "Invalid size");
97   char buf[8];
98   const bool isLittleEndian = Context.getAsmInfo().isLittleEndian();
99   for (unsigned i = 0; i != Size; ++i) {
100     unsigned index = isLittleEndian ? i : (Size - i - 1);
101     buf[i] = uint8_t(Value >> (index * 8));
102   }
103   EmitBytes(StringRef(buf, Size), AddrSpace);
104 }
105
106 /// EmitULEB128Value - Special case of EmitULEB128Value that avoids the
107 /// client having to pass in a MCExpr for constant integers.
108 void MCStreamer::EmitULEB128IntValue(uint64_t Value, unsigned AddrSpace,
109                                      unsigned Padding) {
110   SmallString<128> Tmp;
111   raw_svector_ostream OSE(Tmp);
112   encodeULEB128(Value, OSE, Padding);
113   EmitBytes(OSE.str(), AddrSpace);
114 }
115
116 /// EmitSLEB128Value - Special case of EmitSLEB128Value that avoids the
117 /// client having to pass in a MCExpr for constant integers.
118 void MCStreamer::EmitSLEB128IntValue(int64_t Value, unsigned AddrSpace) {
119   SmallString<128> Tmp;
120   raw_svector_ostream OSE(Tmp);
121   encodeSLEB128(Value, OSE);
122   EmitBytes(OSE.str(), AddrSpace);
123 }
124
125 void MCStreamer::EmitAbsValue(const MCExpr *Value, unsigned Size,
126                               unsigned AddrSpace) {
127   const MCExpr *ABS = ForceExpAbs(Value);
128   EmitValue(ABS, Size, AddrSpace);
129 }
130
131
132 void MCStreamer::EmitValue(const MCExpr *Value, unsigned Size,
133                            unsigned AddrSpace) {
134   EmitValueImpl(Value, Size, AddrSpace);
135 }
136
137 void MCStreamer::EmitSymbolValue(const MCSymbol *Sym, unsigned Size,
138                                   unsigned AddrSpace) {
139   EmitValueImpl(MCSymbolRefExpr::Create(Sym, getContext()), Size,
140                 AddrSpace);
141 }
142
143 void MCStreamer::EmitGPRel64Value(const MCExpr *Value) {
144   report_fatal_error("unsupported directive in streamer");
145 }
146
147 void MCStreamer::EmitGPRel32Value(const MCExpr *Value) {
148   report_fatal_error("unsupported directive in streamer");
149 }
150
151 /// EmitFill - Emit NumBytes bytes worth of the value specified by
152 /// FillValue.  This implements directives such as '.space'.
153 void MCStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue,
154                           unsigned AddrSpace) {
155   const MCExpr *E = MCConstantExpr::Create(FillValue, getContext());
156   for (uint64_t i = 0, e = NumBytes; i != e; ++i)
157     EmitValue(E, 1, AddrSpace);
158 }
159
160 bool MCStreamer::EmitDwarfFileDirective(unsigned FileNo,
161                                         StringRef Directory,
162                                         StringRef Filename) {
163   return getContext().GetDwarfFile(Directory, Filename, FileNo) == 0;
164 }
165
166 void MCStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
167                                        unsigned Column, unsigned Flags,
168                                        unsigned Isa,
169                                        unsigned Discriminator,
170                                        StringRef FileName) {
171   getContext().setCurrentDwarfLoc(FileNo, Line, Column, Flags, Isa,
172                                   Discriminator);
173 }
174
175 MCDwarfFrameInfo *MCStreamer::getCurrentFrameInfo() {
176   if (FrameInfos.empty())
177     return NULL;
178   return &FrameInfos.back();
179 }
180
181 void MCStreamer::EnsureValidFrame() {
182   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
183   if (!CurFrame || CurFrame->End)
184     report_fatal_error("No open frame");
185 }
186
187 void MCStreamer::EmitEHSymAttributes(const MCSymbol *Symbol,
188                                      MCSymbol *EHSymbol) {
189 }
190
191 void MCStreamer::EmitLabel(MCSymbol *Symbol) {
192   assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
193   assert(getCurrentSection() && "Cannot emit before setting section!");
194   Symbol->setSection(*getCurrentSection());
195   LastSymbol = Symbol;
196 }
197
198 void MCStreamer::EmitCompactUnwindEncoding(uint32_t CompactUnwindEncoding) {
199   EnsureValidFrame();
200   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
201   CurFrame->CompactUnwindEncoding = CompactUnwindEncoding;
202 }
203
204 void MCStreamer::EmitCFISections(bool EH, bool Debug) {
205   assert(EH || Debug);
206   EmitEHFrame = EH;
207   EmitDebugFrame = Debug;
208 }
209
210 void MCStreamer::EmitCFIStartProc() {
211   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
212   if (CurFrame && !CurFrame->End)
213     report_fatal_error("Starting a frame before finishing the previous one!");
214
215   MCDwarfFrameInfo Frame;
216   EmitCFIStartProcImpl(Frame);
217
218   FrameInfos.push_back(Frame);
219 }
220
221 void MCStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) {
222 }
223
224 void MCStreamer::RecordProcStart(MCDwarfFrameInfo &Frame) {
225   Frame.Function = LastSymbol;
226   // If the function is externally visible, we need to create a local
227   // symbol to avoid relocations.
228   StringRef Prefix = getContext().getAsmInfo().getPrivateGlobalPrefix();
229   if (LastSymbol && LastSymbol->getName().startswith(Prefix)) {
230     Frame.Begin = LastSymbol;
231   } else {
232     Frame.Begin = getContext().CreateTempSymbol();
233     EmitLabel(Frame.Begin);
234   }
235 }
236
237 void MCStreamer::EmitCFIEndProc() {
238   EnsureValidFrame();
239   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
240   EmitCFIEndProcImpl(*CurFrame);
241 }
242
243 void MCStreamer::EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) {
244 }
245
246 void MCStreamer::RecordProcEnd(MCDwarfFrameInfo &Frame) {
247   Frame.End = getContext().CreateTempSymbol();
248   EmitLabel(Frame.End);
249 }
250
251 MCSymbol *MCStreamer::EmitCFICommon() {
252   EnsureValidFrame();
253   MCSymbol *Label = getContext().CreateTempSymbol();
254   EmitLabel(Label);
255   return Label;
256 }
257
258 void MCStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) {
259   MCSymbol *Label = EmitCFICommon();
260   MCCFIInstruction Instruction =
261     MCCFIInstruction::createDefCfa(Label, Register, Offset);
262   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
263   CurFrame->Instructions.push_back(Instruction);
264 }
265
266 void MCStreamer::EmitCFIDefCfaOffset(int64_t Offset) {
267   MCSymbol *Label = EmitCFICommon();
268   MCCFIInstruction Instruction =
269     MCCFIInstruction::createDefCfaOffset(Label, Offset);
270   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
271   CurFrame->Instructions.push_back(Instruction);
272 }
273
274 void MCStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) {
275   MCSymbol *Label = EmitCFICommon();
276   MCCFIInstruction Instruction =
277     MCCFIInstruction::createAdjustCfaOffset(Label, Adjustment);
278   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
279   CurFrame->Instructions.push_back(Instruction);
280 }
281
282 void MCStreamer::EmitCFIDefCfaRegister(int64_t Register) {
283   MCSymbol *Label = EmitCFICommon();
284   MCCFIInstruction Instruction =
285     MCCFIInstruction::createDefCfaRegister(Label, Register);
286   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
287   CurFrame->Instructions.push_back(Instruction);
288 }
289
290 void MCStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) {
291   MCSymbol *Label = EmitCFICommon();
292   MCCFIInstruction Instruction =
293     MCCFIInstruction::createOffset(Label, Register, Offset);
294   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
295   CurFrame->Instructions.push_back(Instruction);
296 }
297
298 void MCStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) {
299   MCSymbol *Label = EmitCFICommon();
300   MCCFIInstruction Instruction =
301     MCCFIInstruction::createRelOffset(Label, Register, Offset);
302   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
303   CurFrame->Instructions.push_back(Instruction);
304 }
305
306 void MCStreamer::EmitCFIPersonality(const MCSymbol *Sym,
307                                     unsigned Encoding) {
308   EnsureValidFrame();
309   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
310   CurFrame->Personality = Sym;
311   CurFrame->PersonalityEncoding = Encoding;
312 }
313
314 void MCStreamer::EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
315   EnsureValidFrame();
316   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
317   CurFrame->Lsda = Sym;
318   CurFrame->LsdaEncoding = Encoding;
319 }
320
321 void MCStreamer::EmitCFIRememberState() {
322   MCSymbol *Label = EmitCFICommon();
323   MCCFIInstruction Instruction = MCCFIInstruction::createRememberState(Label);
324   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
325   CurFrame->Instructions.push_back(Instruction);
326 }
327
328 void MCStreamer::EmitCFIRestoreState() {
329   // FIXME: Error if there is no matching cfi_remember_state.
330   MCSymbol *Label = EmitCFICommon();
331   MCCFIInstruction Instruction = MCCFIInstruction::createRestoreState(Label);
332   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
333   CurFrame->Instructions.push_back(Instruction);
334 }
335
336 void MCStreamer::EmitCFISameValue(int64_t Register) {
337   MCSymbol *Label = EmitCFICommon();
338   MCCFIInstruction Instruction =
339     MCCFIInstruction::createSameValue(Label, Register);
340   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
341   CurFrame->Instructions.push_back(Instruction);
342 }
343
344 void MCStreamer::EmitCFIRestore(int64_t Register) {
345   MCSymbol *Label = EmitCFICommon();
346   MCCFIInstruction Instruction =
347     MCCFIInstruction::createRestore(Label, Register);
348   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
349   CurFrame->Instructions.push_back(Instruction);
350 }
351
352 void MCStreamer::EmitCFIEscape(StringRef Values) {
353   MCSymbol *Label = EmitCFICommon();
354   MCCFIInstruction Instruction = MCCFIInstruction::createEscape(Label, Values);
355   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
356   CurFrame->Instructions.push_back(Instruction);
357 }
358
359 void MCStreamer::EmitCFISignalFrame() {
360   EnsureValidFrame();
361   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
362   CurFrame->IsSignalFrame = true;
363 }
364
365 void MCStreamer::EmitCFIUndefined(int64_t Register) {
366   MCSymbol *Label = EmitCFICommon();
367   MCCFIInstruction Instruction =
368     MCCFIInstruction::createUndefined(Label, Register);
369   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
370   CurFrame->Instructions.push_back(Instruction);
371 }
372
373 void MCStreamer::EmitCFIRegister(int64_t Register1, int64_t Register2) {
374   MCSymbol *Label = EmitCFICommon();
375   MCCFIInstruction Instruction =
376     MCCFIInstruction::createRegister(Label, Register1, Register2);
377   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
378   CurFrame->Instructions.push_back(Instruction);
379 }
380
381 void MCStreamer::setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame) {
382   W64UnwindInfos.push_back(Frame);
383   CurrentW64UnwindInfo = W64UnwindInfos.back();
384 }
385
386 void MCStreamer::EnsureValidW64UnwindInfo() {
387   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
388   if (!CurFrame || CurFrame->End)
389     report_fatal_error("No open Win64 EH frame function!");
390 }
391
392 void MCStreamer::EmitWin64EHStartProc(const MCSymbol *Symbol) {
393   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
394   if (CurFrame && !CurFrame->End)
395     report_fatal_error("Starting a function before ending the previous one!");
396   MCWin64EHUnwindInfo *Frame = new MCWin64EHUnwindInfo;
397   Frame->Begin = getContext().CreateTempSymbol();
398   Frame->Function = Symbol;
399   EmitLabel(Frame->Begin);
400   setCurrentW64UnwindInfo(Frame);
401 }
402
403 void MCStreamer::EmitWin64EHEndProc() {
404   EnsureValidW64UnwindInfo();
405   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
406   if (CurFrame->ChainedParent)
407     report_fatal_error("Not all chained regions terminated!");
408   CurFrame->End = getContext().CreateTempSymbol();
409   EmitLabel(CurFrame->End);
410 }
411
412 void MCStreamer::EmitWin64EHStartChained() {
413   EnsureValidW64UnwindInfo();
414   MCWin64EHUnwindInfo *Frame = new MCWin64EHUnwindInfo;
415   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
416   Frame->Begin = getContext().CreateTempSymbol();
417   Frame->Function = CurFrame->Function;
418   Frame->ChainedParent = CurFrame;
419   EmitLabel(Frame->Begin);
420   setCurrentW64UnwindInfo(Frame);
421 }
422
423 void MCStreamer::EmitWin64EHEndChained() {
424   EnsureValidW64UnwindInfo();
425   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
426   if (!CurFrame->ChainedParent)
427     report_fatal_error("End of a chained region outside a chained region!");
428   CurFrame->End = getContext().CreateTempSymbol();
429   EmitLabel(CurFrame->End);
430   CurrentW64UnwindInfo = CurFrame->ChainedParent;
431 }
432
433 void MCStreamer::EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind,
434                                     bool Except) {
435   EnsureValidW64UnwindInfo();
436   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
437   if (CurFrame->ChainedParent)
438     report_fatal_error("Chained unwind areas can't have handlers!");
439   CurFrame->ExceptionHandler = Sym;
440   if (!Except && !Unwind)
441     report_fatal_error("Don't know what kind of handler this is!");
442   if (Unwind)
443     CurFrame->HandlesUnwind = true;
444   if (Except)
445     CurFrame->HandlesExceptions = true;
446 }
447
448 void MCStreamer::EmitWin64EHHandlerData() {
449   EnsureValidW64UnwindInfo();
450   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
451   if (CurFrame->ChainedParent)
452     report_fatal_error("Chained unwind areas can't have handlers!");
453 }
454
455 void MCStreamer::EmitWin64EHPushReg(unsigned Register) {
456   EnsureValidW64UnwindInfo();
457   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
458   MCSymbol *Label = getContext().CreateTempSymbol();
459   MCWin64EHInstruction Inst(Win64EH::UOP_PushNonVol, Label, Register);
460   EmitLabel(Label);
461   CurFrame->Instructions.push_back(Inst);
462 }
463
464 void MCStreamer::EmitWin64EHSetFrame(unsigned Register, unsigned Offset) {
465   EnsureValidW64UnwindInfo();
466   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
467   if (CurFrame->LastFrameInst >= 0)
468     report_fatal_error("Frame register and offset already specified!");
469   if (Offset & 0x0F)
470     report_fatal_error("Misaligned frame pointer offset!");
471   MCWin64EHInstruction Inst(Win64EH::UOP_SetFPReg, NULL, Register, Offset);
472   CurFrame->LastFrameInst = CurFrame->Instructions.size();
473   CurFrame->Instructions.push_back(Inst);
474 }
475
476 void MCStreamer::EmitWin64EHAllocStack(unsigned Size) {
477   EnsureValidW64UnwindInfo();
478   if (Size & 7)
479     report_fatal_error("Misaligned stack allocation!");
480   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
481   MCSymbol *Label = getContext().CreateTempSymbol();
482   MCWin64EHInstruction Inst(Label, Size);
483   EmitLabel(Label);
484   CurFrame->Instructions.push_back(Inst);
485 }
486
487 void MCStreamer::EmitWin64EHSaveReg(unsigned Register, unsigned Offset) {
488   EnsureValidW64UnwindInfo();
489   if (Offset & 7)
490     report_fatal_error("Misaligned saved register offset!");
491   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
492   MCSymbol *Label = getContext().CreateTempSymbol();
493   MCWin64EHInstruction Inst(
494      Offset > 512*1024-8 ? Win64EH::UOP_SaveNonVolBig : Win64EH::UOP_SaveNonVol,
495                             Label, Register, Offset);
496   EmitLabel(Label);
497   CurFrame->Instructions.push_back(Inst);
498 }
499
500 void MCStreamer::EmitWin64EHSaveXMM(unsigned Register, unsigned Offset) {
501   EnsureValidW64UnwindInfo();
502   if (Offset & 0x0F)
503     report_fatal_error("Misaligned saved vector register offset!");
504   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
505   MCSymbol *Label = getContext().CreateTempSymbol();
506   MCWin64EHInstruction Inst(
507     Offset > 512*1024-16 ? Win64EH::UOP_SaveXMM128Big : Win64EH::UOP_SaveXMM128,
508                             Label, Register, Offset);
509   EmitLabel(Label);
510   CurFrame->Instructions.push_back(Inst);
511 }
512
513 void MCStreamer::EmitWin64EHPushFrame(bool Code) {
514   EnsureValidW64UnwindInfo();
515   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
516   if (CurFrame->Instructions.size() > 0)
517     report_fatal_error("If present, PushMachFrame must be the first UOP");
518   MCSymbol *Label = getContext().CreateTempSymbol();
519   MCWin64EHInstruction Inst(Win64EH::UOP_PushMachFrame, Label, Code);
520   EmitLabel(Label);
521   CurFrame->Instructions.push_back(Inst);
522 }
523
524 void MCStreamer::EmitWin64EHEndProlog() {
525   EnsureValidW64UnwindInfo();
526   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
527   CurFrame->PrologEnd = getContext().CreateTempSymbol();
528   EmitLabel(CurFrame->PrologEnd);
529 }
530
531 void MCStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) {
532   llvm_unreachable("This file format doesn't support this directive");
533 }
534
535 void MCStreamer::EmitFnStart() {
536   errs() << "Not implemented yet\n";
537   abort();
538 }
539
540 void MCStreamer::EmitFnEnd() {
541   errs() << "Not implemented yet\n";
542   abort();
543 }
544
545 void MCStreamer::EmitCantUnwind() {
546   errs() << "Not implemented yet\n";
547   abort();
548 }
549
550 void MCStreamer::EmitHandlerData() {
551   errs() << "Not implemented yet\n";
552   abort();
553 }
554
555 void MCStreamer::EmitPersonality(const MCSymbol *Personality) {
556   errs() << "Not implemented yet\n";
557   abort();
558 }
559
560 void MCStreamer::EmitSetFP(unsigned FpReg, unsigned SpReg, int64_t Offset) {
561   errs() << "Not implemented yet\n";
562   abort();
563 }
564
565 void MCStreamer::EmitPad(int64_t Offset) {
566   errs() << "Not implemented yet\n";
567   abort();
568 }
569
570 void MCStreamer::EmitRegSave(const SmallVectorImpl<unsigned> &RegList, bool) {
571   errs() << "Not implemented yet\n";
572   abort();
573 }
574
575 void MCStreamer::EmitTCEntry(const MCSymbol &S) {
576   llvm_unreachable("Unsupported method");
577 }
578
579 /// EmitRawText - If this file is backed by an assembly streamer, this dumps
580 /// the specified string in the output .s file.  This capability is
581 /// indicated by the hasRawTextSupport() predicate.
582 void MCStreamer::EmitRawText(StringRef String) {
583   errs() << "EmitRawText called on an MCStreamer that doesn't support it, "
584   " something must not be fully mc'ized\n";
585   abort();
586 }
587
588 void MCStreamer::EmitRawText(const Twine &T) {
589   SmallString<128> Str;
590   T.toVector(Str);
591   EmitRawText(Str.str());
592 }
593
594 void MCStreamer::EmitFrames(bool usingCFI) {
595   if (!getNumFrameInfos())
596     return;
597
598   if (EmitEHFrame)
599     MCDwarfFrameEmitter::Emit(*this, usingCFI, true);
600
601   if (EmitDebugFrame)
602     MCDwarfFrameEmitter::Emit(*this, usingCFI, false);
603 }
604
605 void MCStreamer::EmitW64Tables() {
606   if (!getNumW64UnwindInfos())
607     return;
608
609   MCWin64EHUnwindEmitter::Emit(*this);
610 }
611
612 void MCStreamer::Finish() {
613   if (!FrameInfos.empty() && !FrameInfos.back().End)
614     report_fatal_error("Unfinished frame!");
615
616   FinishImpl();
617 }