This patch is needed to make c++ exceptions work for mips16.
[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::EmitDebugLabel(MCSymbol *Symbol) {
199   assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
200   assert(getCurrentSection() && "Cannot emit before setting section!");
201   Symbol->setSection(*getCurrentSection());
202   LastSymbol = Symbol;
203 }
204
205 void MCStreamer::EmitCompactUnwindEncoding(uint32_t CompactUnwindEncoding) {
206   EnsureValidFrame();
207   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
208   CurFrame->CompactUnwindEncoding = CompactUnwindEncoding;
209 }
210
211 void MCStreamer::EmitCFISections(bool EH, bool Debug) {
212   assert(EH || Debug);
213   EmitEHFrame = EH;
214   EmitDebugFrame = Debug;
215 }
216
217 void MCStreamer::EmitCFIStartProc() {
218   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
219   if (CurFrame && !CurFrame->End)
220     report_fatal_error("Starting a frame before finishing the previous one!");
221
222   MCDwarfFrameInfo Frame;
223   EmitCFIStartProcImpl(Frame);
224
225   FrameInfos.push_back(Frame);
226 }
227
228 void MCStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) {
229 }
230
231 void MCStreamer::RecordProcStart(MCDwarfFrameInfo &Frame) {
232   Frame.Function = LastSymbol;
233   // If the function is externally visible, we need to create a local
234   // symbol to avoid relocations.
235   StringRef Prefix = getContext().getAsmInfo().getPrivateGlobalPrefix();
236   if (LastSymbol && LastSymbol->getName().startswith(Prefix)) {
237     Frame.Begin = LastSymbol;
238   } else {
239     Frame.Begin = getContext().CreateTempSymbol();
240     EmitLabel(Frame.Begin);
241   }
242 }
243
244 void MCStreamer::EmitCFIEndProc() {
245   EnsureValidFrame();
246   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
247   EmitCFIEndProcImpl(*CurFrame);
248 }
249
250 void MCStreamer::EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) {
251 }
252
253 void MCStreamer::RecordProcEnd(MCDwarfFrameInfo &Frame) {
254   Frame.End = getContext().CreateTempSymbol();
255   EmitLabel(Frame.End);
256 }
257
258 MCSymbol *MCStreamer::EmitCFICommon() {
259   EnsureValidFrame();
260   MCSymbol *Label = getContext().CreateTempSymbol();
261   EmitLabel(Label);
262   return Label;
263 }
264
265 void MCStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) {
266   MCSymbol *Label = EmitCFICommon();
267   MCCFIInstruction Instruction =
268     MCCFIInstruction::createDefCfa(Label, Register, Offset);
269   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
270   CurFrame->Instructions.push_back(Instruction);
271 }
272
273 void MCStreamer::EmitCFIDefCfaOffset(int64_t Offset) {
274   MCSymbol *Label = EmitCFICommon();
275   MCCFIInstruction Instruction =
276     MCCFIInstruction::createDefCfaOffset(Label, Offset);
277   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
278   CurFrame->Instructions.push_back(Instruction);
279 }
280
281 void MCStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) {
282   MCSymbol *Label = EmitCFICommon();
283   MCCFIInstruction Instruction =
284     MCCFIInstruction::createAdjustCfaOffset(Label, Adjustment);
285   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
286   CurFrame->Instructions.push_back(Instruction);
287 }
288
289 void MCStreamer::EmitCFIDefCfaRegister(int64_t Register) {
290   MCSymbol *Label = EmitCFICommon();
291   MCCFIInstruction Instruction =
292     MCCFIInstruction::createDefCfaRegister(Label, Register);
293   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
294   CurFrame->Instructions.push_back(Instruction);
295 }
296
297 void MCStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) {
298   MCSymbol *Label = EmitCFICommon();
299   MCCFIInstruction Instruction =
300     MCCFIInstruction::createOffset(Label, Register, Offset);
301   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
302   CurFrame->Instructions.push_back(Instruction);
303 }
304
305 void MCStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) {
306   MCSymbol *Label = EmitCFICommon();
307   MCCFIInstruction Instruction =
308     MCCFIInstruction::createRelOffset(Label, Register, Offset);
309   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
310   CurFrame->Instructions.push_back(Instruction);
311 }
312
313 void MCStreamer::EmitCFIPersonality(const MCSymbol *Sym,
314                                     unsigned Encoding) {
315   EnsureValidFrame();
316   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
317   CurFrame->Personality = Sym;
318   CurFrame->PersonalityEncoding = Encoding;
319 }
320
321 void MCStreamer::EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
322   EnsureValidFrame();
323   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
324   CurFrame->Lsda = Sym;
325   CurFrame->LsdaEncoding = Encoding;
326 }
327
328 void MCStreamer::EmitCFIRememberState() {
329   MCSymbol *Label = EmitCFICommon();
330   MCCFIInstruction Instruction = MCCFIInstruction::createRememberState(Label);
331   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
332   CurFrame->Instructions.push_back(Instruction);
333 }
334
335 void MCStreamer::EmitCFIRestoreState() {
336   // FIXME: Error if there is no matching cfi_remember_state.
337   MCSymbol *Label = EmitCFICommon();
338   MCCFIInstruction Instruction = MCCFIInstruction::createRestoreState(Label);
339   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
340   CurFrame->Instructions.push_back(Instruction);
341 }
342
343 void MCStreamer::EmitCFISameValue(int64_t Register) {
344   MCSymbol *Label = EmitCFICommon();
345   MCCFIInstruction Instruction =
346     MCCFIInstruction::createSameValue(Label, Register);
347   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
348   CurFrame->Instructions.push_back(Instruction);
349 }
350
351 void MCStreamer::EmitCFIRestore(int64_t Register) {
352   MCSymbol *Label = EmitCFICommon();
353   MCCFIInstruction Instruction =
354     MCCFIInstruction::createRestore(Label, Register);
355   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
356   CurFrame->Instructions.push_back(Instruction);
357 }
358
359 void MCStreamer::EmitCFIEscape(StringRef Values) {
360   MCSymbol *Label = EmitCFICommon();
361   MCCFIInstruction Instruction = MCCFIInstruction::createEscape(Label, Values);
362   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
363   CurFrame->Instructions.push_back(Instruction);
364 }
365
366 void MCStreamer::EmitCFISignalFrame() {
367   EnsureValidFrame();
368   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
369   CurFrame->IsSignalFrame = true;
370 }
371
372 void MCStreamer::EmitCFIUndefined(int64_t Register) {
373   MCSymbol *Label = EmitCFICommon();
374   MCCFIInstruction Instruction =
375     MCCFIInstruction::createUndefined(Label, Register);
376   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
377   CurFrame->Instructions.push_back(Instruction);
378 }
379
380 void MCStreamer::EmitCFIRegister(int64_t Register1, int64_t Register2) {
381   MCSymbol *Label = EmitCFICommon();
382   MCCFIInstruction Instruction =
383     MCCFIInstruction::createRegister(Label, Register1, Register2);
384   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
385   CurFrame->Instructions.push_back(Instruction);
386 }
387
388 void MCStreamer::setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame) {
389   W64UnwindInfos.push_back(Frame);
390   CurrentW64UnwindInfo = W64UnwindInfos.back();
391 }
392
393 void MCStreamer::EnsureValidW64UnwindInfo() {
394   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
395   if (!CurFrame || CurFrame->End)
396     report_fatal_error("No open Win64 EH frame function!");
397 }
398
399 void MCStreamer::EmitWin64EHStartProc(const MCSymbol *Symbol) {
400   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
401   if (CurFrame && !CurFrame->End)
402     report_fatal_error("Starting a function before ending the previous one!");
403   MCWin64EHUnwindInfo *Frame = new MCWin64EHUnwindInfo;
404   Frame->Begin = getContext().CreateTempSymbol();
405   Frame->Function = Symbol;
406   EmitLabel(Frame->Begin);
407   setCurrentW64UnwindInfo(Frame);
408 }
409
410 void MCStreamer::EmitWin64EHEndProc() {
411   EnsureValidW64UnwindInfo();
412   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
413   if (CurFrame->ChainedParent)
414     report_fatal_error("Not all chained regions terminated!");
415   CurFrame->End = getContext().CreateTempSymbol();
416   EmitLabel(CurFrame->End);
417 }
418
419 void MCStreamer::EmitWin64EHStartChained() {
420   EnsureValidW64UnwindInfo();
421   MCWin64EHUnwindInfo *Frame = new MCWin64EHUnwindInfo;
422   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
423   Frame->Begin = getContext().CreateTempSymbol();
424   Frame->Function = CurFrame->Function;
425   Frame->ChainedParent = CurFrame;
426   EmitLabel(Frame->Begin);
427   setCurrentW64UnwindInfo(Frame);
428 }
429
430 void MCStreamer::EmitWin64EHEndChained() {
431   EnsureValidW64UnwindInfo();
432   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
433   if (!CurFrame->ChainedParent)
434     report_fatal_error("End of a chained region outside a chained region!");
435   CurFrame->End = getContext().CreateTempSymbol();
436   EmitLabel(CurFrame->End);
437   CurrentW64UnwindInfo = CurFrame->ChainedParent;
438 }
439
440 void MCStreamer::EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind,
441                                     bool Except) {
442   EnsureValidW64UnwindInfo();
443   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
444   if (CurFrame->ChainedParent)
445     report_fatal_error("Chained unwind areas can't have handlers!");
446   CurFrame->ExceptionHandler = Sym;
447   if (!Except && !Unwind)
448     report_fatal_error("Don't know what kind of handler this is!");
449   if (Unwind)
450     CurFrame->HandlesUnwind = true;
451   if (Except)
452     CurFrame->HandlesExceptions = true;
453 }
454
455 void MCStreamer::EmitWin64EHHandlerData() {
456   EnsureValidW64UnwindInfo();
457   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
458   if (CurFrame->ChainedParent)
459     report_fatal_error("Chained unwind areas can't have handlers!");
460 }
461
462 void MCStreamer::EmitWin64EHPushReg(unsigned Register) {
463   EnsureValidW64UnwindInfo();
464   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
465   MCSymbol *Label = getContext().CreateTempSymbol();
466   MCWin64EHInstruction Inst(Win64EH::UOP_PushNonVol, Label, Register);
467   EmitLabel(Label);
468   CurFrame->Instructions.push_back(Inst);
469 }
470
471 void MCStreamer::EmitWin64EHSetFrame(unsigned Register, unsigned Offset) {
472   EnsureValidW64UnwindInfo();
473   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
474   if (CurFrame->LastFrameInst >= 0)
475     report_fatal_error("Frame register and offset already specified!");
476   if (Offset & 0x0F)
477     report_fatal_error("Misaligned frame pointer offset!");
478   MCWin64EHInstruction Inst(Win64EH::UOP_SetFPReg, NULL, Register, Offset);
479   CurFrame->LastFrameInst = CurFrame->Instructions.size();
480   CurFrame->Instructions.push_back(Inst);
481 }
482
483 void MCStreamer::EmitWin64EHAllocStack(unsigned Size) {
484   EnsureValidW64UnwindInfo();
485   if (Size & 7)
486     report_fatal_error("Misaligned stack allocation!");
487   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
488   MCSymbol *Label = getContext().CreateTempSymbol();
489   MCWin64EHInstruction Inst(Label, Size);
490   EmitLabel(Label);
491   CurFrame->Instructions.push_back(Inst);
492 }
493
494 void MCStreamer::EmitWin64EHSaveReg(unsigned Register, unsigned Offset) {
495   EnsureValidW64UnwindInfo();
496   if (Offset & 7)
497     report_fatal_error("Misaligned saved register offset!");
498   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
499   MCSymbol *Label = getContext().CreateTempSymbol();
500   MCWin64EHInstruction Inst(
501      Offset > 512*1024-8 ? Win64EH::UOP_SaveNonVolBig : Win64EH::UOP_SaveNonVol,
502                             Label, Register, Offset);
503   EmitLabel(Label);
504   CurFrame->Instructions.push_back(Inst);
505 }
506
507 void MCStreamer::EmitWin64EHSaveXMM(unsigned Register, unsigned Offset) {
508   EnsureValidW64UnwindInfo();
509   if (Offset & 0x0F)
510     report_fatal_error("Misaligned saved vector register offset!");
511   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
512   MCSymbol *Label = getContext().CreateTempSymbol();
513   MCWin64EHInstruction Inst(
514     Offset > 512*1024-16 ? Win64EH::UOP_SaveXMM128Big : Win64EH::UOP_SaveXMM128,
515                             Label, Register, Offset);
516   EmitLabel(Label);
517   CurFrame->Instructions.push_back(Inst);
518 }
519
520 void MCStreamer::EmitWin64EHPushFrame(bool Code) {
521   EnsureValidW64UnwindInfo();
522   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
523   if (CurFrame->Instructions.size() > 0)
524     report_fatal_error("If present, PushMachFrame must be the first UOP");
525   MCSymbol *Label = getContext().CreateTempSymbol();
526   MCWin64EHInstruction Inst(Win64EH::UOP_PushMachFrame, Label, Code);
527   EmitLabel(Label);
528   CurFrame->Instructions.push_back(Inst);
529 }
530
531 void MCStreamer::EmitWin64EHEndProlog() {
532   EnsureValidW64UnwindInfo();
533   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
534   CurFrame->PrologEnd = getContext().CreateTempSymbol();
535   EmitLabel(CurFrame->PrologEnd);
536 }
537
538 void MCStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) {
539   llvm_unreachable("This file format doesn't support this directive");
540 }
541
542 void MCStreamer::EmitFnStart() {
543   errs() << "Not implemented yet\n";
544   abort();
545 }
546
547 void MCStreamer::EmitFnEnd() {
548   errs() << "Not implemented yet\n";
549   abort();
550 }
551
552 void MCStreamer::EmitCantUnwind() {
553   errs() << "Not implemented yet\n";
554   abort();
555 }
556
557 void MCStreamer::EmitHandlerData() {
558   errs() << "Not implemented yet\n";
559   abort();
560 }
561
562 void MCStreamer::EmitPersonality(const MCSymbol *Personality) {
563   errs() << "Not implemented yet\n";
564   abort();
565 }
566
567 void MCStreamer::EmitSetFP(unsigned FpReg, unsigned SpReg, int64_t Offset) {
568   errs() << "Not implemented yet\n";
569   abort();
570 }
571
572 void MCStreamer::EmitPad(int64_t Offset) {
573   errs() << "Not implemented yet\n";
574   abort();
575 }
576
577 void MCStreamer::EmitRegSave(const SmallVectorImpl<unsigned> &RegList, bool) {
578   errs() << "Not implemented yet\n";
579   abort();
580 }
581
582 void MCStreamer::EmitTCEntry(const MCSymbol &S) {
583   llvm_unreachable("Unsupported method");
584 }
585
586 /// EmitRawText - If this file is backed by an assembly streamer, this dumps
587 /// the specified string in the output .s file.  This capability is
588 /// indicated by the hasRawTextSupport() predicate.
589 void MCStreamer::EmitRawText(StringRef String) {
590   errs() << "EmitRawText called on an MCStreamer that doesn't support it, "
591   " something must not be fully mc'ized\n";
592   abort();
593 }
594
595 void MCStreamer::EmitRawText(const Twine &T) {
596   SmallString<128> Str;
597   T.toVector(Str);
598   EmitRawText(Str.str());
599 }
600
601 void MCStreamer::EmitFrames(bool usingCFI) {
602   if (!getNumFrameInfos())
603     return;
604
605   if (EmitEHFrame)
606     MCDwarfFrameEmitter::Emit(*this, usingCFI, true);
607
608   if (EmitDebugFrame)
609     MCDwarfFrameEmitter::Emit(*this, usingCFI, false);
610 }
611
612 void MCStreamer::EmitW64Tables() {
613   if (!getNumW64UnwindInfos())
614     return;
615
616   MCWin64EHUnwindEmitter::Emit(*this);
617 }
618
619 void MCStreamer::Finish() {
620   if (!FrameInfos.empty() && !FrameInfos.back().End)
621     report_fatal_error("Unfinished frame!");
622
623   FinishImpl();
624 }