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