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