Believe it or not, this is a simplification. :-)
[oota-llvm.git] / lib / CodeGen / AsmPrinter / DwarfException.cpp
1 //===-- CodeGen/AsmPrinter/DwarfException.cpp - Dwarf Exception Impl ------===//
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 // This file contains support for writing dwarf exception info into asm files.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "DwarfException.h"
15 #include "llvm/Module.h"
16 #include "llvm/CodeGen/MachineModuleInfo.h"
17 #include "llvm/CodeGen/MachineFrameInfo.h"
18 #include "llvm/CodeGen/MachineFunction.h"
19 #include "llvm/CodeGen/MachineLocation.h"
20 #include "llvm/MC/MCStreamer.h"
21 #include "llvm/MC/MCAsmInfo.h"
22 #include "llvm/Target/TargetData.h"
23 #include "llvm/Target/TargetFrameInfo.h"
24 #include "llvm/Target/TargetLoweringObjectFile.h"
25 #include "llvm/Target/TargetOptions.h"
26 #include "llvm/Target/TargetRegisterInfo.h"
27 #include "llvm/Support/Dwarf.h"
28 #include "llvm/Support/Mangler.h"
29 #include "llvm/Support/Timer.h"
30 #include "llvm/Support/raw_ostream.h"
31 #include "llvm/ADT/SmallString.h"
32 #include "llvm/ADT/StringExtras.h"
33 using namespace llvm;
34
35 static TimerGroup &getDwarfTimerGroup() {
36   static TimerGroup DwarfTimerGroup("Dwarf Exception");
37   return DwarfTimerGroup;
38 }
39
40 DwarfException::DwarfException(raw_ostream &OS, AsmPrinter *A,
41                                const MCAsmInfo *T)
42   : Dwarf(OS, A, T, "eh"), shouldEmitTable(false), shouldEmitMoves(false),
43     shouldEmitTableModule(false), shouldEmitMovesModule(false),
44     ExceptionTimer(0) {
45   if (TimePassesIsEnabled)
46     ExceptionTimer = new Timer("Dwarf Exception Writer",
47                                getDwarfTimerGroup());
48 }
49
50 DwarfException::~DwarfException() {
51   delete ExceptionTimer;
52 }
53
54 unsigned DwarfException::SizeOfEncodedValue(unsigned Encoding) {
55   if (Encoding == dwarf::DW_EH_PE_omit)
56     return 0;
57
58   switch (Encoding & 0x07) {
59   case dwarf::DW_EH_PE_absptr:
60     return TD->getPointerSize();
61   case dwarf::DW_EH_PE_udata2:
62     return 2;
63   case dwarf::DW_EH_PE_udata4:
64     return 4;
65   case dwarf::DW_EH_PE_udata8:
66     return 8;
67   }
68
69   llvm_unreachable("Invalid encoded value.");
70   return 0;
71 }
72
73 /// EmitCIE - Emit a Common Information Entry (CIE). This holds information that
74 /// is shared among many Frame Description Entries.  There is at least one CIE
75 /// in every non-empty .debug_frame section.
76 void DwarfException::EmitCIE(const Function *Personality, unsigned Index) {
77   // Size and sign of stack growth.
78   int stackGrowth =
79     Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
80     TargetFrameInfo::StackGrowsUp ?
81     TD->getPointerSize() : -TD->getPointerSize();
82
83   // Begin eh frame section.
84   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getEHFrameSection());
85
86   if (MAI->is_EHSymbolPrivate())
87     O << MAI->getPrivateGlobalPrefix();
88
89   O << "EH_frame" << Index << ":\n";
90   EmitLabel("section_eh_frame", Index);
91
92   // Define base labels.
93   EmitLabel("eh_frame_common", Index);
94
95   // Define the eh frame length.
96   EmitDifference("eh_frame_common_end", Index,
97                  "eh_frame_common_begin", Index, true);
98   Asm->EOL("Length of Common Information Entry");
99
100   // EH frame header.
101   EmitLabel("eh_frame_common_begin", Index);
102   Asm->EmitInt32((int)0);
103   Asm->EOL("CIE Identifier Tag");
104   Asm->EmitInt8(dwarf::DW_CIE_VERSION);
105   Asm->EOL("CIE Version");
106
107   // The personality presence indicates that language specific information will
108   // show up in the eh frame.
109
110   // FIXME: Don't hardcode these encodings.
111   unsigned PerEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
112   if (Personality && MAI->getNeedsIndirectEncoding())
113     PerEncoding |= dwarf::DW_EH_PE_indirect;
114   unsigned LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
115   unsigned FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
116
117   char Augmentation[5] = { 0 };
118   unsigned AugmentationSize = 0;
119   char *APtr = Augmentation + 1;
120
121   if (Personality) {
122     // There is a personality function.
123     *APtr++ = 'P';
124     AugmentationSize += 1 + SizeOfEncodedValue(PerEncoding);
125   }
126
127   if (UsesLSDA[Index]) {
128     // An LSDA pointer is in the FDE augmentation.
129     *APtr++ = 'L';
130     ++AugmentationSize;
131   }
132
133   if (FDEEncoding != dwarf::DW_EH_PE_absptr) {
134     // A non-default pointer encoding for the FDE.
135     *APtr++ = 'R';
136     ++AugmentationSize;
137   }
138
139   if (APtr != Augmentation + 1)
140     Augmentation[0] = 'z';
141
142   Asm->EmitString(Augmentation);
143   Asm->EOL("CIE Augmentation");
144
145   // Round out reader.
146   Asm->EmitULEB128Bytes(1);
147   Asm->EOL("CIE Code Alignment Factor");
148   Asm->EmitSLEB128Bytes(stackGrowth);
149   Asm->EOL("CIE Data Alignment Factor");
150   Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), true));
151   Asm->EOL("CIE Return Address Column");
152
153   Asm->EmitULEB128Bytes(AugmentationSize);
154   Asm->EOL("Augmentation Size");
155
156   Asm->EmitInt8(PerEncoding);
157   Asm->EOL("Personality", PerEncoding);
158
159   // If there is a personality, we need to indicate the function's location.
160   if (Personality) {
161     PrintRelDirective(true);
162     O << MAI->getPersonalityPrefix();
163     Asm->EmitExternalGlobal((const GlobalVariable *)(Personality));
164     O << MAI->getPersonalitySuffix();
165     if (strcmp(MAI->getPersonalitySuffix(), "+4@GOTPCREL"))
166       O << "-" << MAI->getPCSymbol();
167     Asm->EOL("Personality");
168
169     Asm->EmitInt8(LSDAEncoding);
170     Asm->EOL("LSDA Encoding", LSDAEncoding);
171
172     Asm->EmitInt8(FDEEncoding);
173     Asm->EOL("FDE Encoding", FDEEncoding);
174   }
175
176   // Indicate locations of general callee saved registers in frame.
177   std::vector<MachineMove> Moves;
178   RI->getInitialFrameState(Moves);
179   EmitFrameMoves(NULL, 0, Moves, true);
180
181   // On Darwin the linker honors the alignment of eh_frame, which means it must
182   // be 8-byte on 64-bit targets to match what gcc does.  Otherwise you get
183   // holes which confuse readers of eh_frame.
184   Asm->EmitAlignment(TD->getPointerSize() == sizeof(int32_t) ? 2 : 3,
185                      0, 0, false);
186   EmitLabel("eh_frame_common_end", Index);
187
188   Asm->EOL();
189 }
190
191 /// EmitFDE - Emit the Frame Description Entry (FDE) for the function.
192 void DwarfException::EmitFDE(const FunctionEHFrameInfo &EHFrameInfo) {
193   assert(!EHFrameInfo.function->hasAvailableExternallyLinkage() &&
194          "Should not emit 'available externally' functions at all");
195
196   const Function *TheFunc = EHFrameInfo.function;
197
198   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getEHFrameSection());
199
200   // Externally visible entry into the functions eh frame info. If the
201   // corresponding function is static, this should not be externally visible.
202   if (!TheFunc->hasLocalLinkage())
203     if (const char *GlobalEHDirective = MAI->getGlobalEHDirective())
204       O << GlobalEHDirective << EHFrameInfo.FnName << "\n";
205
206   // If corresponding function is weak definition, this should be too.
207   if (TheFunc->isWeakForLinker() && MAI->getWeakDefDirective())
208     O << MAI->getWeakDefDirective() << EHFrameInfo.FnName << "\n";
209
210   // If there are no calls then you can't unwind.  This may mean we can omit the
211   // EH Frame, but some environments do not handle weak absolute symbols. If
212   // UnwindTablesMandatory is set we cannot do this optimization; the unwind
213   // info is to be available for non-EH uses.
214   if (!EHFrameInfo.hasCalls && !UnwindTablesMandatory &&
215       (!TheFunc->isWeakForLinker() ||
216        !MAI->getWeakDefDirective() ||
217        MAI->getSupportsWeakOmittedEHFrame())) {
218     O << EHFrameInfo.FnName << " = 0\n";
219     // This name has no connection to the function, so it might get
220     // dead-stripped when the function is not, erroneously.  Prohibit
221     // dead-stripping unconditionally.
222     if (const char *UsedDirective = MAI->getUsedDirective())
223       O << UsedDirective << EHFrameInfo.FnName << "\n\n";
224   } else {
225     O << EHFrameInfo.FnName << ":\n";
226
227     // EH frame header.
228     EmitDifference("eh_frame_end", EHFrameInfo.Number,
229                    "eh_frame_begin", EHFrameInfo.Number, true);
230     Asm->EOL("Length of Frame Information Entry");
231
232     EmitLabel("eh_frame_begin", EHFrameInfo.Number);
233
234     EmitSectionOffset("eh_frame_begin", "eh_frame_common",
235                       EHFrameInfo.Number, EHFrameInfo.PersonalityIndex,
236                       true, true, false);
237
238     Asm->EOL("FDE CIE offset");
239
240     EmitReference("eh_func_begin", EHFrameInfo.Number, true, true);
241     Asm->EOL("FDE initial location");
242     EmitDifference("eh_func_end", EHFrameInfo.Number,
243                    "eh_func_begin", EHFrameInfo.Number, true);
244     Asm->EOL("FDE address range");
245
246     // If there is a personality and landing pads then point to the language
247     // specific data area in the exception table.
248     if (MMI->getPersonalities()[0] != NULL) {
249       bool is4Byte = TD->getPointerSize() == sizeof(int32_t);
250
251       Asm->EmitULEB128Bytes(is4Byte ? 4 : 8);
252       Asm->EOL("Augmentation size");
253
254       if (EHFrameInfo.hasLandingPads)
255         EmitReference("exception", EHFrameInfo.Number, true, false);
256       else {
257         if (is4Byte)
258           Asm->EmitInt32((int)0);
259         else
260           Asm->EmitInt64((int)0);
261       }
262       Asm->EOL("Language Specific Data Area");
263     } else {
264       Asm->EmitULEB128Bytes(0);
265       Asm->EOL("Augmentation size");
266     }
267
268     // Indicate locations of function specific callee saved registers in frame.
269     EmitFrameMoves("eh_func_begin", EHFrameInfo.Number, EHFrameInfo.Moves,
270                    true);
271
272     // On Darwin the linker honors the alignment of eh_frame, which means it
273     // must be 8-byte on 64-bit targets to match what gcc does.  Otherwise you
274     // get holes which confuse readers of eh_frame.
275     Asm->EmitAlignment(TD->getPointerSize() == sizeof(int32_t) ? 2 : 3,
276                        0, 0, false);
277     EmitLabel("eh_frame_end", EHFrameInfo.Number);
278
279     // If the function is marked used, this table should be also.  We cannot
280     // make the mark unconditional in this case, since retaining the table also
281     // retains the function in this case, and there is code around that depends
282     // on unused functions (calling undefined externals) being dead-stripped to
283     // link correctly.  Yes, there really is.
284     if (MMI->isUsedFunction(EHFrameInfo.function))
285       if (const char *UsedDirective = MAI->getUsedDirective())
286         O << UsedDirective << EHFrameInfo.FnName << "\n\n";
287   }
288
289   Asm->EOL();
290 }
291
292 /// SharedTypeIds - How many leading type ids two landing pads have in common.
293 unsigned DwarfException::SharedTypeIds(const LandingPadInfo *L,
294                                        const LandingPadInfo *R) {
295   const std::vector<int> &LIds = L->TypeIds, &RIds = R->TypeIds;
296   unsigned LSize = LIds.size(), RSize = RIds.size();
297   unsigned MinSize = LSize < RSize ? LSize : RSize;
298   unsigned Count = 0;
299
300   for (; Count != MinSize; ++Count)
301     if (LIds[Count] != RIds[Count])
302       return Count;
303
304   return Count;
305 }
306
307 /// PadLT - Order landing pads lexicographically by type id.
308 bool DwarfException::PadLT(const LandingPadInfo *L, const LandingPadInfo *R) {
309   const std::vector<int> &LIds = L->TypeIds, &RIds = R->TypeIds;
310   unsigned LSize = LIds.size(), RSize = RIds.size();
311   unsigned MinSize = LSize < RSize ? LSize : RSize;
312
313   for (unsigned i = 0; i != MinSize; ++i)
314     if (LIds[i] != RIds[i])
315       return LIds[i] < RIds[i];
316
317   return LSize < RSize;
318 }
319
320 /// ComputeActionsTable - Compute the actions table and gather the first action
321 /// index for each landing pad site.
322 unsigned DwarfException::
323 ComputeActionsTable(const SmallVectorImpl<const LandingPadInfo*> &LandingPads,
324                     SmallVectorImpl<ActionEntry> &Actions,
325                     SmallVectorImpl<unsigned> &FirstActions) {
326
327   // The action table follows the call-site table in the LSDA. The individual
328   // records are of two types:
329   //
330   //   * Catch clause
331   //   * Exception specification
332   //
333   // The two record kinds have the same format, with only small differences.
334   // They are distinguished by the "switch value" field: Catch clauses
335   // (TypeInfos) have strictly positive switch values, and exception
336   // specifications (FilterIds) have strictly negative switch values. Value 0
337   // indicates a catch-all clause.
338   //
339   // Negative type IDs index into FilterIds. Positive type IDs index into
340   // TypeInfos.  The value written for a positive type ID is just the type ID
341   // itself.  For a negative type ID, however, the value written is the
342   // (negative) byte offset of the corresponding FilterIds entry.  The byte
343   // offset is usually equal to the type ID (because the FilterIds entries are
344   // written using a variable width encoding, which outputs one byte per entry
345   // as long as the value written is not too large) but can differ.  This kind
346   // of complication does not occur for positive type IDs because type infos are
347   // output using a fixed width encoding.  FilterOffsets[i] holds the byte
348   // offset corresponding to FilterIds[i].
349
350   const std::vector<unsigned> &FilterIds = MMI->getFilterIds();
351   SmallVector<int, 16> FilterOffsets;
352   FilterOffsets.reserve(FilterIds.size());
353   int Offset = -1;
354
355   for (std::vector<unsigned>::const_iterator
356          I = FilterIds.begin(), E = FilterIds.end(); I != E; ++I) {
357     FilterOffsets.push_back(Offset);
358     Offset -= MCAsmInfo::getULEB128Size(*I);
359   }
360
361   FirstActions.reserve(LandingPads.size());
362
363   int FirstAction = 0;
364   unsigned SizeActions = 0;
365   const LandingPadInfo *PrevLPI = 0;
366
367   for (SmallVectorImpl<const LandingPadInfo *>::const_iterator
368          I = LandingPads.begin(), E = LandingPads.end(); I != E; ++I) {
369     const LandingPadInfo *LPI = *I;
370     const std::vector<int> &TypeIds = LPI->TypeIds;
371     const unsigned NumShared = PrevLPI ? SharedTypeIds(LPI, PrevLPI) : 0;
372     unsigned SizeSiteActions = 0;
373
374     if (NumShared < TypeIds.size()) {
375       unsigned SizeAction = 0;
376       ActionEntry *PrevAction = 0;
377
378       if (NumShared) {
379         const unsigned SizePrevIds = PrevLPI->TypeIds.size();
380         assert(Actions.size());
381         PrevAction = &Actions.back();
382         SizeAction = MCAsmInfo::getSLEB128Size(PrevAction->NextAction) +
383           MCAsmInfo::getSLEB128Size(PrevAction->ValueForTypeID);
384
385         for (unsigned j = NumShared; j != SizePrevIds; ++j) {
386           SizeAction -=
387             MCAsmInfo::getSLEB128Size(PrevAction->ValueForTypeID);
388           SizeAction += -PrevAction->NextAction;
389           PrevAction = PrevAction->Previous;
390         }
391       }
392
393       // Compute the actions.
394       for (unsigned J = NumShared, M = TypeIds.size(); J != M; ++J) {
395         int TypeID = TypeIds[J];
396         assert(-1 - TypeID < (int)FilterOffsets.size() && "Unknown filter id!");
397         int ValueForTypeID = TypeID < 0 ? FilterOffsets[-1 - TypeID] : TypeID;
398         unsigned SizeTypeID = MCAsmInfo::getSLEB128Size(ValueForTypeID);
399
400         int NextAction = SizeAction ? -(SizeAction + SizeTypeID) : 0;
401         SizeAction = SizeTypeID + MCAsmInfo::getSLEB128Size(NextAction);
402         SizeSiteActions += SizeAction;
403
404         ActionEntry Action = { ValueForTypeID, NextAction, PrevAction };
405         Actions.push_back(Action);
406         PrevAction = &Actions.back();
407       }
408
409       // Record the first action of the landing pad site.
410       FirstAction = SizeActions + SizeSiteActions - SizeAction + 1;
411     } // else identical - re-use previous FirstAction
412
413     // Information used when created the call-site table. The action record
414     // field of the call site record is the offset of the first associated
415     // action record, relative to the start of the actions table. This value is
416     // biased by 1 (1 in dicating the start of the actions table), and 0
417     // indicates that there are no actions.
418     FirstActions.push_back(FirstAction);
419
420     // Compute this sites contribution to size.
421     SizeActions += SizeSiteActions;
422
423     PrevLPI = LPI;
424   }
425
426   return SizeActions;
427 }
428
429 /// ComputeCallSiteTable - Compute the call-site table.  The entry for an invoke
430 /// has a try-range containing the call, a non-zero landing pad, and an
431 /// appropriate action.  The entry for an ordinary call has a try-range
432 /// containing the call and zero for the landing pad and the action.  Calls
433 /// marked 'nounwind' have no entry and must not be contained in the try-range
434 /// of any entry - they form gaps in the table.  Entries must be ordered by
435 /// try-range address.
436 void DwarfException::
437 ComputeCallSiteTable(SmallVectorImpl<CallSiteEntry> &CallSites,
438                      const RangeMapType &PadMap,
439                      const SmallVectorImpl<const LandingPadInfo *> &LandingPads,
440                      const SmallVectorImpl<unsigned> &FirstActions) {
441   // The end label of the previous invoke or nounwind try-range.
442   unsigned LastLabel = 0;
443
444   // Whether there is a potentially throwing instruction (currently this means
445   // an ordinary call) between the end of the previous try-range and now.
446   bool SawPotentiallyThrowing = false;
447
448   // Whether the last CallSite entry was for an invoke.
449   bool PreviousIsInvoke = false;
450
451   // Visit all instructions in order of address.
452   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
453        I != E; ++I) {
454     for (MachineBasicBlock::const_iterator MI = I->begin(), E = I->end();
455          MI != E; ++MI) {
456       if (!MI->isLabel()) {
457         SawPotentiallyThrowing |= MI->getDesc().isCall();
458         continue;
459       }
460
461       unsigned BeginLabel = MI->getOperand(0).getImm();
462       assert(BeginLabel && "Invalid label!");
463
464       // End of the previous try-range?
465       if (BeginLabel == LastLabel)
466         SawPotentiallyThrowing = false;
467
468       // Beginning of a new try-range?
469       RangeMapType::iterator L = PadMap.find(BeginLabel);
470       if (L == PadMap.end())
471         // Nope, it was just some random label.
472         continue;
473
474       const PadRange &P = L->second;
475       const LandingPadInfo *LandingPad = LandingPads[P.PadIndex];
476       assert(BeginLabel == LandingPad->BeginLabels[P.RangeIndex] &&
477              "Inconsistent landing pad map!");
478
479       // For Dwarf exception handling (SjLj handling doesn't use this). If some
480       // instruction between the previous try-range and this one may throw,
481       // create a call-site entry with no landing pad for the region between the
482       // try-ranges.
483       if (SawPotentiallyThrowing &&
484           MAI->getExceptionHandlingType() == ExceptionHandling::Dwarf) {
485         CallSiteEntry Site = { LastLabel, BeginLabel, 0, 0 };
486         CallSites.push_back(Site);
487         PreviousIsInvoke = false;
488       }
489
490       LastLabel = LandingPad->EndLabels[P.RangeIndex];
491       assert(BeginLabel && LastLabel && "Invalid landing pad!");
492
493       if (LandingPad->LandingPadLabel) {
494         // This try-range is for an invoke.
495         CallSiteEntry Site = {
496           BeginLabel,
497           LastLabel,
498           LandingPad->LandingPadLabel,
499           FirstActions[P.PadIndex]
500         };
501
502         // Try to merge with the previous call-site. SJLJ doesn't do this
503         if (PreviousIsInvoke &&
504           MAI->getExceptionHandlingType() == ExceptionHandling::Dwarf) {
505           CallSiteEntry &Prev = CallSites.back();
506           if (Site.PadLabel == Prev.PadLabel && Site.Action == Prev.Action) {
507             // Extend the range of the previous entry.
508             Prev.EndLabel = Site.EndLabel;
509             continue;
510           }
511         }
512
513         // Otherwise, create a new call-site.
514         CallSites.push_back(Site);
515         PreviousIsInvoke = true;
516       } else {
517         // Create a gap.
518         PreviousIsInvoke = false;
519       }
520     }
521   }
522
523   // If some instruction between the previous try-range and the end of the
524   // function may throw, create a call-site entry with no landing pad for the
525   // region following the try-range.
526   if (SawPotentiallyThrowing &&
527       MAI->getExceptionHandlingType() == ExceptionHandling::Dwarf) {
528     CallSiteEntry Site = { LastLabel, 0, 0, 0 };
529     CallSites.push_back(Site);
530   }
531 }
532
533 /// EmitExceptionTable - Emit landing pads and actions.
534 ///
535 /// The general organization of the table is complex, but the basic concepts are
536 /// easy.  First there is a header which describes the location and organization
537 /// of the three components that follow.
538 ///
539 ///  1. The landing pad site information describes the range of code covered by
540 ///     the try.  In our case it's an accumulation of the ranges covered by the
541 ///     invokes in the try.  There is also a reference to the landing pad that
542 ///     handles the exception once processed.  Finally an index into the actions
543 ///     table.
544 ///  2. The action table, in our case, is composed of pairs of type IDs and next
545 ///     action offset.  Starting with the action index from the landing pad
546 ///     site, each type ID is checked for a match to the current exception.  If
547 ///     it matches then the exception and type id are passed on to the landing
548 ///     pad.  Otherwise the next action is looked up.  This chain is terminated
549 ///     with a next action of zero.  If no type id is found the the frame is
550 ///     unwound and handling continues.
551 ///  3. Type ID table contains references to all the C++ typeinfo for all
552 ///     catches in the function.  This tables is reversed indexed base 1.
553 void DwarfException::EmitExceptionTable() {
554   const std::vector<GlobalVariable *> &TypeInfos = MMI->getTypeInfos();
555   const std::vector<unsigned> &FilterIds = MMI->getFilterIds();
556   const std::vector<LandingPadInfo> &PadInfos = MMI->getLandingPads();
557   if (PadInfos.empty()) return;
558
559   // Sort the landing pads in order of their type ids.  This is used to fold
560   // duplicate actions.
561   SmallVector<const LandingPadInfo *, 64> LandingPads;
562   LandingPads.reserve(PadInfos.size());
563
564   for (unsigned i = 0, N = PadInfos.size(); i != N; ++i)
565     LandingPads.push_back(&PadInfos[i]);
566
567   std::sort(LandingPads.begin(), LandingPads.end(), PadLT);
568
569   // Compute the actions table and gather the first action index for each
570   // landing pad site.
571   SmallVector<ActionEntry, 32> Actions;
572   SmallVector<unsigned, 64> FirstActions;
573   unsigned SizeActions = ComputeActionsTable(LandingPads, Actions, FirstActions);
574
575   // Invokes and nounwind calls have entries in PadMap (due to being bracketed
576   // by try-range labels when lowered).  Ordinary calls do not, so appropriate
577   // try-ranges for them need be deduced when using Dwarf exception handling.
578   RangeMapType PadMap;
579   for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) {
580     const LandingPadInfo *LandingPad = LandingPads[i];
581     for (unsigned j = 0, E = LandingPad->BeginLabels.size(); j != E; ++j) {
582       unsigned BeginLabel = LandingPad->BeginLabels[j];
583       assert(!PadMap.count(BeginLabel) && "Duplicate landing pad labels!");
584       PadRange P = { i, j };
585       PadMap[BeginLabel] = P;
586     }
587   }
588
589   // Compute the call-site table.
590   SmallVector<CallSiteEntry, 64> CallSites;
591   ComputeCallSiteTable(CallSites, PadMap, LandingPads, FirstActions);
592
593   // Final tallies.
594
595   // Call sites.
596   const unsigned SiteStartSize  = sizeof(int32_t); // DW_EH_PE_udata4
597   const unsigned SiteLengthSize = sizeof(int32_t); // DW_EH_PE_udata4
598   const unsigned LandingPadSize = sizeof(int32_t); // DW_EH_PE_udata4
599   unsigned SizeSites;
600
601   bool HaveTTData = (MAI->getExceptionHandlingType() == ExceptionHandling::SjLj)
602     ? (!TypeInfos.empty() || !FilterIds.empty()) : true;
603
604
605   if (MAI->getExceptionHandlingType() == ExceptionHandling::SjLj) {
606     SizeSites = 0;
607   } else
608     SizeSites = CallSites.size() *
609       (SiteStartSize + SiteLengthSize + LandingPadSize);
610   for (unsigned i = 0, e = CallSites.size(); i < e; ++i) {
611     SizeSites += MCAsmInfo::getULEB128Size(CallSites[i].Action);
612     if (MAI->getExceptionHandlingType() == ExceptionHandling::SjLj)
613       SizeSites += MCAsmInfo::getULEB128Size(i);
614   }
615   // Type infos.
616   const unsigned TypeInfoSize = TD->getPointerSize(); // DW_EH_PE_absptr
617   unsigned SizeTypes = TypeInfos.size() * TypeInfoSize;
618
619   unsigned TypeOffset = sizeof(int8_t) +   // Call site format
620     MCAsmInfo::getULEB128Size(SizeSites) + // Call-site table length
621     SizeSites + SizeActions + SizeTypes;
622
623   unsigned TotalSize = sizeof(int8_t) + // LPStart format
624                        sizeof(int8_t) + // TType format
625        (HaveTTData ?
626           MCAsmInfo::getULEB128Size(TypeOffset) : 0) + // TType base offset
627                        TypeOffset;
628
629   unsigned SizeAlign = (4 - TotalSize) & 3;
630
631   // Begin the exception table.
632   const MCSection *LSDASection = Asm->getObjFileLowering().getLSDASection();
633   Asm->OutStreamer.SwitchSection(LSDASection);
634   Asm->EmitAlignment(2, 0, 0, false);
635   O << "GCC_except_table" << SubprogramCount << ":\n";
636
637   for (unsigned i = 0; i != SizeAlign; ++i) {
638     Asm->EmitInt8(0);
639     Asm->EOL("Padding");
640   }
641
642   EmitLabel("exception", SubprogramCount);
643   if (MAI->getExceptionHandlingType() == ExceptionHandling::SjLj) {
644     SmallString<16> LSDAName;
645     raw_svector_ostream(LSDAName) << MAI->getPrivateGlobalPrefix() <<
646       "_LSDA_" << Asm->getFunctionNumber();
647     O << LSDAName.str() << ":\n";
648   }
649
650   // Emit the header.
651   Asm->EmitInt8(dwarf::DW_EH_PE_omit);
652   Asm->EOL("@LPStart format", dwarf::DW_EH_PE_omit);
653
654 #if 0
655   if (TypeInfos.empty() && FilterIds.empty()) {
656     // If there are no typeinfos or filters, there is nothing to emit, optimize
657     // by specifying the "omit" encoding.
658     Asm->EmitInt8(dwarf::DW_EH_PE_omit);
659     Asm->EOL("@TType format", dwarf::DW_EH_PE_omit);
660   } else {
661     // Okay, we have actual filters or typeinfos to emit.  As such, we need to
662     // pick a type encoding for them.  We're about to emit a list of pointers to
663     // typeinfo objects at the end of the LSDA.  However, unless we're in static
664     // mode, this reference will require a relocation by the dynamic linker.
665     //
666     // Because of this, we have a couple of options:
667     //   1) If we are in -static mode, we can always use an absolute reference
668     //      from the LSDA, because the static linker will resolve it.
669     //   2) Otherwise, if the LSDA section is writable, we can output the direct
670     //      reference to the typeinfo and allow the dynamic linker to relocate
671     //      it.  Since it is in a writable section, the dynamic linker won't
672     //      have a problem.
673     //   3) Finally, if we're in PIC mode and the LDSA section isn't writable,
674     //      we need to use some form of indirection.  For example, on Darwin,
675     //      we can output a statically-relocatable reference to a dyld stub. The
676     //      offset to the stub is constant, but the contents are in a section
677     //      that is updated by the dynamic linker.  This is easy enough, but we
678     //      need to tell the personality function of the unwinder to indirect
679     //      through the dyld stub.
680     //
681     // FIXME: When this is actually implemented, we'll have to emit the stubs
682     // somewhere.  This predicate should be moved to a shared location that is
683     // in target-independent code.
684     //
685     if (LSDASection->isWritable() ||
686         Asm->TM.getRelocationModel() == Reloc::Static) {
687       Asm->EmitInt8(DW_EH_PE_absptr);
688       Asm->EOL("TType format (DW_EH_PE_absptr)");
689     } else {
690       Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_indirect | DW_EH_PE_sdata4);
691       Asm->EOL("TType format (DW_EH_PE_pcrel | DW_EH_PE_indirect"
692                " | DW_EH_PE_sdata4)");
693     }
694     Asm->EmitULEB128Bytes(TypeOffset);
695     Asm->EOL("TType base offset");
696   }
697 #else
698   // For SjLj exceptions, if there is no TypeInfo, then we just explicitly
699   // say that we're omitting that bit.
700   // FIXME: does this apply to Dwarf also? The above #if 0 implies yes?
701   if (!HaveTTData) {
702     Asm->EmitInt8(dwarf::DW_EH_PE_omit);
703     Asm->EOL("@TType format", dwarf::DW_EH_PE_omit);
704   } else {
705     Asm->EmitInt8(dwarf::DW_EH_PE_absptr);
706     Asm->EOL("@TType format", dwarf::DW_EH_PE_absptr);
707     Asm->EmitULEB128Bytes(TypeOffset);
708     Asm->EOL("@TType base offset");
709   }
710 #endif
711
712   // SjLj Exception handilng
713   if (MAI->getExceptionHandlingType() == ExceptionHandling::SjLj) {
714     Asm->EmitInt8(dwarf::DW_EH_PE_udata4);
715     Asm->EOL("Call site format", dwarf::DW_EH_PE_udata4);
716     Asm->EmitULEB128Bytes(SizeSites);
717     Asm->EOL("Call site table length");
718
719     // Emit the landing pad site information.
720     unsigned idx = 0;
721     for (SmallVectorImpl<CallSiteEntry>::const_iterator
722          I = CallSites.begin(), E = CallSites.end(); I != E; ++I, ++idx) {
723       const CallSiteEntry &S = *I;
724
725       // Offset of the landing pad, counted in 16-byte bundles relative to the
726       // @LPStart address.
727       Asm->EmitULEB128Bytes(idx);
728       Asm->EOL("Landing pad");
729
730       // Offset of the first associated action record, relative to the start of
731       // the action table. This value is biased by 1 (1 indicates the start of
732       // the action table), and 0 indicates that there are no actions.
733       Asm->EmitULEB128Bytes(S.Action);
734       Asm->EOL("Action");
735     }
736   } else {
737     // DWARF Exception handling
738     assert(MAI->getExceptionHandlingType() == ExceptionHandling::Dwarf);
739
740     // The call-site table is a list of all call sites that may throw an
741     // exception (including C++ 'throw' statements) in the procedure
742     // fragment. It immediately follows the LSDA header. Each entry indicates,
743     // for a given call, the first corresponding action record and corresponding
744     // landing pad.
745     //
746     // The table begins with the number of bytes, stored as an LEB128
747     // compressed, unsigned integer. The records immediately follow the record
748     // count. They are sorted in increasing call-site address. Each record
749     // indicates:
750     //
751     //   * The position of the call-site.
752     //   * The position of the landing pad.
753     //   * The first action record for that call site.
754     //
755     // A missing entry in the call-site table indicates that a call is not
756     // supposed to throw. Such calls include:
757     //
758     //   * Calls to destructors within cleanup code. C++ semantics forbids these
759     //     calls to throw.
760     //   * Calls to intrinsic routines in the standard library which are known
761     //     not to throw (sin, memcpy, et al).
762     //
763     // If the runtime does not find the call-site entry for a given call, it
764     // will call `terminate()'.
765
766     // Emit the landing pad call site table.
767     Asm->EmitInt8(dwarf::DW_EH_PE_udata4);
768     Asm->EOL("Call site format", dwarf::DW_EH_PE_udata4);
769     Asm->EmitULEB128Bytes(SizeSites);
770     Asm->EOL("Call site table size");
771
772     for (SmallVectorImpl<CallSiteEntry>::const_iterator
773          I = CallSites.begin(), E = CallSites.end(); I != E; ++I) {
774       const CallSiteEntry &S = *I;
775       const char *BeginTag;
776       unsigned BeginNumber;
777
778       if (!S.BeginLabel) {
779         BeginTag = "eh_func_begin";
780         BeginNumber = SubprogramCount;
781       } else {
782         BeginTag = "label";
783         BeginNumber = S.BeginLabel;
784       }
785
786       // Offset of the call site relative to the previous call site, counted in
787       // number of 16-byte bundles. The first call site is counted relative to
788       // the start of the procedure fragment.
789       EmitSectionOffset(BeginTag, "eh_func_begin", BeginNumber, SubprogramCount,
790                         true, true);
791       Asm->EOL("Region start");
792
793       if (!S.EndLabel)
794         EmitDifference("eh_func_end", SubprogramCount, BeginTag, BeginNumber,
795                        true);
796       else
797         EmitDifference("label", S.EndLabel, BeginTag, BeginNumber, true);
798
799       Asm->EOL("Region length");
800
801       // Offset of the landing pad, counted in 16-byte bundles relative to the
802       // @LPStart address.
803       if (!S.PadLabel)
804         Asm->EmitInt32(0);
805       else
806         EmitSectionOffset("label", "eh_func_begin", S.PadLabel, SubprogramCount,
807                           true, true);
808
809       Asm->EOL("Landing pad");
810
811       // Offset of the first associated action record, relative to the start of
812       // the action table. This value is biased by 1 (1 indicates the start of
813       // the action table), and 0 indicates that there are no actions.
814       Asm->EmitULEB128Bytes(S.Action);
815       Asm->EOL("Action");
816     }
817   }
818
819   // Emit the Action Table.
820   for (SmallVectorImpl<ActionEntry>::const_iterator
821          I = Actions.begin(), E = Actions.end(); I != E; ++I) {
822     const ActionEntry &Action = *I;
823
824     // Type Filter
825     //
826     //   Used by the runtime to match the type of the thrown exception to the
827     //   type of the catch clauses or the types in the exception specification.
828
829     Asm->EmitSLEB128Bytes(Action.ValueForTypeID);
830     Asm->EOL("TypeInfo index");
831
832     // Action Record
833     //
834     //   Self-relative signed displacement in bytes of the next action record,
835     //   or 0 if there is no next action record.
836
837     Asm->EmitSLEB128Bytes(Action.NextAction);
838     Asm->EOL("Next action");
839   }
840
841   // Emit the Catch Clauses. The code for the catch clauses following the same
842   // try is similar to a switch statement. The catch clause action record
843   // informs the runtime about the type of a catch clause and about the
844   // associated switch value.
845   //
846   //  Action Record Fields:
847   //
848   //   * Filter Value
849   //     Positive value, starting at 1. Index in the types table of the
850   //     __typeinfo for the catch-clause type. 1 is the first word preceding
851   //     TTBase, 2 is the second word, and so on. Used by the runtime to check
852   //     if the thrown exception type matches the catch-clause type. Back-end
853   //     generated switch statements check against this value.
854   //
855   //   * Next
856   //     Signed offset, in bytes from the start of this field, to the next
857   //     chained action record, or zero if none.
858   //
859   // The order of the action records determined by the next field is the order
860   // of the catch clauses as they appear in the source code, and must be kept in
861   // the same order. As a result, changing the order of the catch clause would
862   // change the semantics of the program.
863   for (std::vector<GlobalVariable *>::const_reverse_iterator
864          I = TypeInfos.rbegin(), E = TypeInfos.rend(); I != E; ++I) {
865     const GlobalVariable *GV = *I;
866     PrintRelDirective();
867
868     if (GV) {
869       std::string GLN;
870       O << Asm->getGlobalLinkName(GV, GLN);
871     } else {
872       O << "0x0";
873     }
874
875     Asm->EOL("TypeInfo");
876   }
877
878   // Emit the Type Table.
879   for (std::vector<unsigned>::const_iterator
880          I = FilterIds.begin(), E = FilterIds.end(); I < E; ++I) {
881     unsigned TypeID = *I;
882     Asm->EmitULEB128Bytes(TypeID);
883     Asm->EOL("Filter TypeInfo index");
884   }
885
886   Asm->EmitAlignment(2, 0, 0, false);
887 }
888
889 /// EndModule - Emit all exception information that should come after the
890 /// content.
891 void DwarfException::EndModule() {
892   if (MAI->getExceptionHandlingType() != ExceptionHandling::Dwarf)
893     return;
894
895   if (!shouldEmitMovesModule && !shouldEmitTableModule)
896     return;
897
898   if (TimePassesIsEnabled)
899     ExceptionTimer->startTimer();
900
901   const std::vector<Function *> Personalities = MMI->getPersonalities();
902
903   for (unsigned i = 0, e = Personalities.size(); i < e; ++i)
904     EmitCIE(Personalities[i], i);
905
906   for (std::vector<FunctionEHFrameInfo>::iterator
907          I = EHFrames.begin(), E = EHFrames.end(); I != E; ++I)
908     EmitFDE(*I);
909
910   if (TimePassesIsEnabled)
911     ExceptionTimer->stopTimer();
912 }
913
914 /// BeginFunction - Gather pre-function exception information.  Assumes being
915 /// emitted immediately after the function entry point.
916 void DwarfException::BeginFunction(MachineFunction *MF) {
917   if (TimePassesIsEnabled)
918     ExceptionTimer->startTimer();
919
920   this->MF = MF;
921   shouldEmitTable = shouldEmitMoves = false;
922
923   if (MMI && MAI->doesSupportExceptionHandling()) {
924     // Map all labels and get rid of any dead landing pads.
925     MMI->TidyLandingPads();
926
927     // If any landing pads survive, we need an EH table.
928     if (!MMI->getLandingPads().empty())
929       shouldEmitTable = true;
930
931     // See if we need frame move info.
932     if (!MF->getFunction()->doesNotThrow() || UnwindTablesMandatory)
933       shouldEmitMoves = true;
934
935     if (shouldEmitMoves || shouldEmitTable)
936       // Assumes in correct section after the entry point.
937       EmitLabel("eh_func_begin", ++SubprogramCount);
938   }
939
940   shouldEmitTableModule |= shouldEmitTable;
941   shouldEmitMovesModule |= shouldEmitMoves;
942
943   if (TimePassesIsEnabled)
944     ExceptionTimer->stopTimer();
945 }
946
947 /// EndFunction - Gather and emit post-function exception information.
948 ///
949 void DwarfException::EndFunction() {
950   if (!shouldEmitMoves && !shouldEmitTable) return;
951
952   if (TimePassesIsEnabled)
953     ExceptionTimer->startTimer();
954
955   EmitLabel("eh_func_end", SubprogramCount);
956   EmitExceptionTable();
957
958   // Save EH frame information
959   EHFrames.push_back(FunctionEHFrameInfo(getAsm()->getCurrentFunctionEHName(MF),
960                                          SubprogramCount,
961                                          MMI->getPersonalityIndex(),
962                                          MF->getFrameInfo()->hasCalls(),
963                                          !MMI->getLandingPads().empty(),
964                                          MMI->getFrameMoves(),
965                                          MF->getFunction()));
966
967   // Record if this personality index uses a landing pad.
968   UsesLSDA[MMI->getPersonalityIndex()] |= !MMI->getLandingPads().empty();
969
970   if (TimePassesIsEnabled)
971     ExceptionTimer->stopTimer();
972 }