Deleted Added
full compact
DwarfException.cpp (204961) DwarfException.cpp (205218)
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//===----------------------------------------------------------------------===//

--- 36 unchanged lines hidden (view full) ---

45 if (TimePassesIsEnabled)
46 ExceptionTimer = new Timer("DWARF Exception Writer");
47}
48
49DwarfException::~DwarfException() {
50 delete ExceptionTimer;
51}
52
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//===----------------------------------------------------------------------===//

--- 36 unchanged lines hidden (view full) ---

45 if (TimePassesIsEnabled)
46 ExceptionTimer = new Timer("DWARF Exception Writer");
47}
48
49DwarfException::~DwarfException() {
50 delete ExceptionTimer;
51}
52
53/// CreateLabelDiff - Emit a label and subtract it from the expression we
54/// already have. This is equivalent to emitting "foo - .", but we have to emit
55/// the label for "." directly.
56const MCExpr *DwarfException::CreateLabelDiff(const MCExpr *ExprRef,
57 const char *LabelName,
58 unsigned Index) {
59 SmallString<64> Name;
60 raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix()
61 << LabelName << Asm->getFunctionNumber()
62 << "_" << Index;
63 MCSymbol *DotSym = Asm->OutContext.GetOrCreateTemporarySymbol(Name.str());
64 Asm->OutStreamer.EmitLabel(DotSym);
65
66 return MCBinaryExpr::CreateSub(ExprRef,
67 MCSymbolRefExpr::Create(DotSym,
68 Asm->OutContext),
69 Asm->OutContext);
70}
71
72/// EmitCIE - Emit a Common Information Entry (CIE). This holds information that
73/// is shared among many Frame Description Entries. There is at least one CIE
74/// in every non-empty .debug_frame section.
75void DwarfException::EmitCIE(const Function *PersonalityFn, unsigned Index) {
76 // Size and sign of stack growth.
77 int stackGrowth =
78 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
79 TargetFrameInfo::StackGrowsUp ?

--- 84 unchanged lines hidden (view full) ---

164 EmitEncodingByte(LSDAEncoding, "LSDA");
165 if (FDEEncoding != dwarf::DW_EH_PE_absptr)
166 EmitEncodingByte(FDEEncoding, "FDE");
167 }
168
169 // Indicate locations of general callee saved registers in frame.
170 std::vector<MachineMove> Moves;
171 RI->getInitialFrameState(Moves);
53/// EmitCIE - Emit a Common Information Entry (CIE). This holds information that
54/// is shared among many Frame Description Entries. There is at least one CIE
55/// in every non-empty .debug_frame section.
56void DwarfException::EmitCIE(const Function *PersonalityFn, unsigned Index) {
57 // Size and sign of stack growth.
58 int stackGrowth =
59 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
60 TargetFrameInfo::StackGrowsUp ?

--- 84 unchanged lines hidden (view full) ---

145 EmitEncodingByte(LSDAEncoding, "LSDA");
146 if (FDEEncoding != dwarf::DW_EH_PE_absptr)
147 EmitEncodingByte(FDEEncoding, "FDE");
148 }
149
150 // Indicate locations of general callee saved registers in frame.
151 std::vector<MachineMove> Moves;
152 RI->getInitialFrameState(Moves);
172 EmitFrameMoves(NULL, 0, Moves, true);
153 EmitFrameMoves(0, Moves, true);
173
174 // On Darwin the linker honors the alignment of eh_frame, which means it must
175 // be 8-byte on 64-bit targets to match what gcc does. Otherwise you get
176 // holes which confuse readers of eh_frame.
177 Asm->EmitAlignment(TD->getPointerSize() == 4 ? 2 : 3, 0, 0, false);
178 Asm->OutStreamer.EmitLabel(getDWLabel("eh_frame_common_end", Index));
179}
180

--- 54 unchanged lines hidden (view full) ---

235 Asm->OutStreamer.EmitLabel(getDWLabel("eh_frame_begin",EHFrameInfo.Number));
236
237 Asm->OutStreamer.AddComment("FDE CIE offset");
238 EmitSectionOffset(getDWLabel("eh_frame_begin", EHFrameInfo.Number),
239 getDWLabel("eh_frame_common",
240 EHFrameInfo.PersonalityIndex),
241 true, true);
242
154
155 // On Darwin the linker honors the alignment of eh_frame, which means it must
156 // be 8-byte on 64-bit targets to match what gcc does. Otherwise you get
157 // holes which confuse readers of eh_frame.
158 Asm->EmitAlignment(TD->getPointerSize() == 4 ? 2 : 3, 0, 0, false);
159 Asm->OutStreamer.EmitLabel(getDWLabel("eh_frame_common_end", Index));
160}
161

--- 54 unchanged lines hidden (view full) ---

216 Asm->OutStreamer.EmitLabel(getDWLabel("eh_frame_begin",EHFrameInfo.Number));
217
218 Asm->OutStreamer.AddComment("FDE CIE offset");
219 EmitSectionOffset(getDWLabel("eh_frame_begin", EHFrameInfo.Number),
220 getDWLabel("eh_frame_common",
221 EHFrameInfo.PersonalityIndex),
222 true, true);
223
224 MCSymbol *EHFuncBeginSym = getDWLabel("eh_func_begin", EHFrameInfo.Number);
243
244 Asm->OutStreamer.AddComment("FDE initial location");
225
226 Asm->OutStreamer.AddComment("FDE initial location");
245 EmitReference(getDWLabel("eh_func_begin", EHFrameInfo.Number), FDEEncoding);
227 EmitReference(EHFuncBeginSym, FDEEncoding);
228
246 Asm->OutStreamer.AddComment("FDE address range");
229 Asm->OutStreamer.AddComment("FDE address range");
247 EmitDifference(getDWLabel("eh_func_end", EHFrameInfo.Number),
248 getDWLabel("eh_func_begin", EHFrameInfo.Number),
230 EmitDifference(getDWLabel("eh_func_end", EHFrameInfo.Number),EHFuncBeginSym,
249 SizeOfEncodedValue(FDEEncoding) == 4);
250
251 // If there is a personality and landing pads then point to the language
252 // specific data area in the exception table.
253 if (MMI->getPersonalities()[0] != NULL) {
254 unsigned Size = SizeOfEncodedValue(LSDAEncoding);
255
256 EmitULEB128(Size, "Augmentation size");
257 Asm->OutStreamer.AddComment("Language Specific Data Area");
258 if (EHFrameInfo.hasLandingPads)
259 EmitReference(getDWLabel("exception", EHFrameInfo.Number),LSDAEncoding);
260 else
261 Asm->OutStreamer.EmitIntValue(0, Size/*size*/, 0/*addrspace*/);
262
263 } else {
264 EmitULEB128(0, "Augmentation size");
265 }
266
267 // Indicate locations of function specific callee saved registers in frame.
231 SizeOfEncodedValue(FDEEncoding) == 4);
232
233 // If there is a personality and landing pads then point to the language
234 // specific data area in the exception table.
235 if (MMI->getPersonalities()[0] != NULL) {
236 unsigned Size = SizeOfEncodedValue(LSDAEncoding);
237
238 EmitULEB128(Size, "Augmentation size");
239 Asm->OutStreamer.AddComment("Language Specific Data Area");
240 if (EHFrameInfo.hasLandingPads)
241 EmitReference(getDWLabel("exception", EHFrameInfo.Number),LSDAEncoding);
242 else
243 Asm->OutStreamer.EmitIntValue(0, Size/*size*/, 0/*addrspace*/);
244
245 } else {
246 EmitULEB128(0, "Augmentation size");
247 }
248
249 // Indicate locations of function specific callee saved registers in frame.
268 EmitFrameMoves("eh_func_begin", EHFrameInfo.Number, EHFrameInfo.Moves,
269 true);
250 EmitFrameMoves(EHFuncBeginSym, EHFrameInfo.Moves, true);
270
271 // On Darwin the linker honors the alignment of eh_frame, which means it
272 // must be 8-byte on 64-bit targets to match what gcc does. Otherwise you
273 // get holes which confuse readers of eh_frame.
274 Asm->EmitAlignment(TD->getPointerSize() == sizeof(int32_t) ? 2 : 3,
275 0, 0, false);
276 Asm->OutStreamer.EmitLabel(getDWLabel("eh_frame_end", EHFrameInfo.Number));
277

--- 190 unchanged lines hidden (view full) ---

468/// of any entry - they form gaps in the table. Entries must be ordered by
469/// try-range address.
470void DwarfException::
471ComputeCallSiteTable(SmallVectorImpl<CallSiteEntry> &CallSites,
472 const RangeMapType &PadMap,
473 const SmallVectorImpl<const LandingPadInfo *> &LandingPads,
474 const SmallVectorImpl<unsigned> &FirstActions) {
475 // The end label of the previous invoke or nounwind try-range.
251
252 // On Darwin the linker honors the alignment of eh_frame, which means it
253 // must be 8-byte on 64-bit targets to match what gcc does. Otherwise you
254 // get holes which confuse readers of eh_frame.
255 Asm->EmitAlignment(TD->getPointerSize() == sizeof(int32_t) ? 2 : 3,
256 0, 0, false);
257 Asm->OutStreamer.EmitLabel(getDWLabel("eh_frame_end", EHFrameInfo.Number));
258

--- 190 unchanged lines hidden (view full) ---

449/// of any entry - they form gaps in the table. Entries must be ordered by
450/// try-range address.
451void DwarfException::
452ComputeCallSiteTable(SmallVectorImpl<CallSiteEntry> &CallSites,
453 const RangeMapType &PadMap,
454 const SmallVectorImpl<const LandingPadInfo *> &LandingPads,
455 const SmallVectorImpl<unsigned> &FirstActions) {
456 // The end label of the previous invoke or nounwind try-range.
476 unsigned LastLabel = 0;
457 MCSymbol *LastLabel = 0;
477
478 // Whether there is a potentially throwing instruction (currently this means
479 // an ordinary call) between the end of the previous try-range and now.
480 bool SawPotentiallyThrowing = false;
481
482 // Whether the last CallSite entry was for an invoke.
483 bool PreviousIsInvoke = false;
484
485 // Visit all instructions in order of address.
486 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
487 I != E; ++I) {
488 for (MachineBasicBlock::const_iterator MI = I->begin(), E = I->end();
489 MI != E; ++MI) {
490 if (!MI->isLabel()) {
491 if (MI->getDesc().isCall())
492 SawPotentiallyThrowing |= !CallToNoUnwindFunction(MI);
458
459 // Whether there is a potentially throwing instruction (currently this means
460 // an ordinary call) between the end of the previous try-range and now.
461 bool SawPotentiallyThrowing = false;
462
463 // Whether the last CallSite entry was for an invoke.
464 bool PreviousIsInvoke = false;
465
466 // Visit all instructions in order of address.
467 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
468 I != E; ++I) {
469 for (MachineBasicBlock::const_iterator MI = I->begin(), E = I->end();
470 MI != E; ++MI) {
471 if (!MI->isLabel()) {
472 if (MI->getDesc().isCall())
473 SawPotentiallyThrowing |= !CallToNoUnwindFunction(MI);
493
494 continue;
495 }
496
474 continue;
475 }
476
497 unsigned BeginLabel = MI->getOperand(0).getImm();
498 assert(BeginLabel && "Invalid label!");
499
500 // End of the previous try-range?
477 // End of the previous try-range?
478 MCSymbol *BeginLabel = MI->getOperand(0).getMCSymbol();
501 if (BeginLabel == LastLabel)
502 SawPotentiallyThrowing = false;
503
504 // Beginning of a new try-range?
505 RangeMapType::const_iterator L = PadMap.find(BeginLabel);
506 if (L == PadMap.end())
507 // Nope, it was just some random label.
508 continue;

--- 85 unchanged lines hidden (view full) ---

594/// with a next action of zero. If no type id is found then the frame is
595/// unwound and handling continues.
596/// 3. Type ID table contains references to all the C++ typeinfo for all
597/// catches in the function. This tables is reverse indexed base 1.
598void DwarfException::EmitExceptionTable() {
599 const std::vector<GlobalVariable *> &TypeInfos = MMI->getTypeInfos();
600 const std::vector<unsigned> &FilterIds = MMI->getFilterIds();
601 const std::vector<LandingPadInfo> &PadInfos = MMI->getLandingPads();
479 if (BeginLabel == LastLabel)
480 SawPotentiallyThrowing = false;
481
482 // Beginning of a new try-range?
483 RangeMapType::const_iterator L = PadMap.find(BeginLabel);
484 if (L == PadMap.end())
485 // Nope, it was just some random label.
486 continue;

--- 85 unchanged lines hidden (view full) ---

572/// with a next action of zero. If no type id is found then the frame is
573/// unwound and handling continues.
574/// 3. Type ID table contains references to all the C++ typeinfo for all
575/// catches in the function. This tables is reverse indexed base 1.
576void DwarfException::EmitExceptionTable() {
577 const std::vector<GlobalVariable *> &TypeInfos = MMI->getTypeInfos();
578 const std::vector<unsigned> &FilterIds = MMI->getFilterIds();
579 const std::vector<LandingPadInfo> &PadInfos = MMI->getLandingPads();
602 if (PadInfos.empty()) return;
603
604 // Sort the landing pads in order of their type ids. This is used to fold
605 // duplicate actions.
606 SmallVector<const LandingPadInfo *, 64> LandingPads;
607 LandingPads.reserve(PadInfos.size());
608
609 for (unsigned i = 0, N = PadInfos.size(); i != N; ++i)
610 LandingPads.push_back(&PadInfos[i]);

--- 8 unchanged lines hidden (view full) ---

619
620 // Invokes and nounwind calls have entries in PadMap (due to being bracketed
621 // by try-range labels when lowered). Ordinary calls do not, so appropriate
622 // try-ranges for them need be deduced when using DWARF exception handling.
623 RangeMapType PadMap;
624 for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) {
625 const LandingPadInfo *LandingPad = LandingPads[i];
626 for (unsigned j = 0, E = LandingPad->BeginLabels.size(); j != E; ++j) {
580
581 // Sort the landing pads in order of their type ids. This is used to fold
582 // duplicate actions.
583 SmallVector<const LandingPadInfo *, 64> LandingPads;
584 LandingPads.reserve(PadInfos.size());
585
586 for (unsigned i = 0, N = PadInfos.size(); i != N; ++i)
587 LandingPads.push_back(&PadInfos[i]);

--- 8 unchanged lines hidden (view full) ---

596
597 // Invokes and nounwind calls have entries in PadMap (due to being bracketed
598 // by try-range labels when lowered). Ordinary calls do not, so appropriate
599 // try-ranges for them need be deduced when using DWARF exception handling.
600 RangeMapType PadMap;
601 for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) {
602 const LandingPadInfo *LandingPad = LandingPads[i];
603 for (unsigned j = 0, E = LandingPad->BeginLabels.size(); j != E; ++j) {
627 unsigned BeginLabel = LandingPad->BeginLabels[j];
604 MCSymbol *BeginLabel = LandingPad->BeginLabels[j];
628 assert(!PadMap.count(BeginLabel) && "Duplicate landing pad labels!");
629 PadRange P = { i, j };
630 PadMap[BeginLabel] = P;
631 }
632 }
633
634 // Compute the call-site table.
635 SmallVector<CallSiteEntry, 64> CallSites;

--- 168 unchanged lines hidden (view full) ---

804 EmitEncodingByte(dwarf::DW_EH_PE_udata4, "Call site");
805
806 // Add extra padding if it wasn't added to the TType base offset.
807 EmitULEB128(CallSiteTableLength, "Call site table length", SizeAlign);
808
809 for (SmallVectorImpl<CallSiteEntry>::const_iterator
810 I = CallSites.begin(), E = CallSites.end(); I != E; ++I) {
811 const CallSiteEntry &S = *I;
605 assert(!PadMap.count(BeginLabel) && "Duplicate landing pad labels!");
606 PadRange P = { i, j };
607 PadMap[BeginLabel] = P;
608 }
609 }
610
611 // Compute the call-site table.
612 SmallVector<CallSiteEntry, 64> CallSites;

--- 168 unchanged lines hidden (view full) ---

781 EmitEncodingByte(dwarf::DW_EH_PE_udata4, "Call site");
782
783 // Add extra padding if it wasn't added to the TType base offset.
784 EmitULEB128(CallSiteTableLength, "Call site table length", SizeAlign);
785
786 for (SmallVectorImpl<CallSiteEntry>::const_iterator
787 I = CallSites.begin(), E = CallSites.end(); I != E; ++I) {
788 const CallSiteEntry &S = *I;
812 const char *BeginTag;
813 unsigned BeginNumber;
814
815 if (!S.BeginLabel) {
816 BeginTag = "eh_func_begin";
817 BeginNumber = SubprogramCount;
818 } else {
819 BeginTag = "label";
820 BeginNumber = S.BeginLabel;
821 }
822
789
790 MCSymbol *EHFuncBeginSym = getDWLabel("eh_func_begin", SubprogramCount);
791
792 MCSymbol *BeginLabel = S.BeginLabel;
793 if (BeginLabel == 0)
794 BeginLabel = EHFuncBeginSym;
795 MCSymbol *EndLabel = S.EndLabel;
796 if (EndLabel == 0)
797 EndLabel = getDWLabel("eh_func_end", SubprogramCount);
798
823 // Offset of the call site relative to the previous call site, counted in
824 // number of 16-byte bundles. The first call site is counted relative to
825 // the start of the procedure fragment.
826 Asm->OutStreamer.AddComment("Region start");
799 // Offset of the call site relative to the previous call site, counted in
800 // number of 16-byte bundles. The first call site is counted relative to
801 // the start of the procedure fragment.
802 Asm->OutStreamer.AddComment("Region start");
827 EmitSectionOffset(getDWLabel(BeginTag, BeginNumber),
828 getDWLabel("eh_func_begin", SubprogramCount),
829 true, true);
830
803 EmitSectionOffset(BeginLabel, EHFuncBeginSym, true, true);
804
831 Asm->OutStreamer.AddComment("Region length");
805 Asm->OutStreamer.AddComment("Region length");
832 if (!S.EndLabel)
833 EmitDifference(getDWLabel("eh_func_end", SubprogramCount),
834 getDWLabel(BeginTag, BeginNumber),
835 true);
836 else
837 EmitDifference(getDWLabel("label", S.EndLabel),
838 getDWLabel(BeginTag, BeginNumber), true);
806 EmitDifference(EndLabel, BeginLabel, true);
839
840
841 // Offset of the landing pad, counted in 16-byte bundles relative to the
842 // @LPStart address.
843 Asm->OutStreamer.AddComment("Landing pad");
807
808
809 // Offset of the landing pad, counted in 16-byte bundles relative to the
810 // @LPStart address.
811 Asm->OutStreamer.AddComment("Landing pad");
844 if (!S.PadLabel) {
812 if (!S.PadLabel)
845 Asm->OutStreamer.EmitIntValue(0, 4/*size*/, 0/*addrspace*/);
813 Asm->OutStreamer.EmitIntValue(0, 4/*size*/, 0/*addrspace*/);
846 } else {
847 EmitSectionOffset(getDWLabel("label", S.PadLabel),
848 getDWLabel("eh_func_begin", SubprogramCount),
849 true, true);
850 }
814 else
815 EmitSectionOffset(S.PadLabel, EHFuncBeginSym, true, true);
851
852 // Offset of the first associated action record, relative to the start of
853 // the action table. This value is biased by 1 (1 indicates the start of
854 // the action table), and 0 indicates that there are no actions.
855 EmitULEB128(S.Action, "Action");
856 }
857 }
858

--- 83 unchanged lines hidden (view full) ---

942 if (!MMI || !MAI->doesSupportExceptionHandling()) return;
943
944 if (TimePassesIsEnabled)
945 ExceptionTimer->startTimer();
946
947 this->MF = MF;
948 shouldEmitTable = shouldEmitMoves = false;
949
816
817 // Offset of the first associated action record, relative to the start of
818 // the action table. This value is biased by 1 (1 indicates the start of
819 // the action table), and 0 indicates that there are no actions.
820 EmitULEB128(S.Action, "Action");
821 }
822 }
823

--- 83 unchanged lines hidden (view full) ---

907 if (!MMI || !MAI->doesSupportExceptionHandling()) return;
908
909 if (TimePassesIsEnabled)
910 ExceptionTimer->startTimer();
911
912 this->MF = MF;
913 shouldEmitTable = shouldEmitMoves = false;
914
950 // Map all labels and get rid of any dead landing pads.
951 MMI->TidyLandingPads();
952
953 // If any landing pads survive, we need an EH table.
915 // If any landing pads survive, we need an EH table.
954 if (!MMI->getLandingPads().empty())
955 shouldEmitTable = true;
916 shouldEmitTable = !MMI->getLandingPads().empty();
956
957 // See if we need frame move info.
917
918 // See if we need frame move info.
958 if (!MF->getFunction()->doesNotThrow() || UnwindTablesMandatory)
959 shouldEmitMoves = true;
919 shouldEmitMoves = !MF->getFunction()->doesNotThrow() || UnwindTablesMandatory;
960
961 if (shouldEmitMoves || shouldEmitTable)
962 // Assumes in correct section after the entry point.
963 Asm->OutStreamer.EmitLabel(getDWLabel("eh_func_begin", ++SubprogramCount));
964
965 shouldEmitTableModule |= shouldEmitTable;
966 shouldEmitMovesModule |= shouldEmitMoves;
967

--- 5 unchanged lines hidden (view full) ---

973///
974void DwarfException::EndFunction() {
975 if (!shouldEmitMoves && !shouldEmitTable) return;
976
977 if (TimePassesIsEnabled)
978 ExceptionTimer->startTimer();
979
980 Asm->OutStreamer.EmitLabel(getDWLabel("eh_func_end", SubprogramCount));
920
921 if (shouldEmitMoves || shouldEmitTable)
922 // Assumes in correct section after the entry point.
923 Asm->OutStreamer.EmitLabel(getDWLabel("eh_func_begin", ++SubprogramCount));
924
925 shouldEmitTableModule |= shouldEmitTable;
926 shouldEmitMovesModule |= shouldEmitMoves;
927

--- 5 unchanged lines hidden (view full) ---

933///
934void DwarfException::EndFunction() {
935 if (!shouldEmitMoves && !shouldEmitTable) return;
936
937 if (TimePassesIsEnabled)
938 ExceptionTimer->startTimer();
939
940 Asm->OutStreamer.EmitLabel(getDWLabel("eh_func_end", SubprogramCount));
981 EmitExceptionTable();
982
941
942 // Record if this personality index uses a landing pad.
943 bool HasLandingPad = !MMI->getLandingPads().empty();
944 UsesLSDA[MMI->getPersonalityIndex()] |= HasLandingPad;
945
946 // Map all labels and get rid of any dead landing pads.
947 MMI->TidyLandingPads();
948
949 if (HasLandingPad)
950 EmitExceptionTable();
951
983 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
984 MCSymbol *FunctionEHSym =
985 Asm->GetSymbolWithGlobalValueBase(MF->getFunction(), ".eh",
986 TLOF.isFunctionEHFrameSymbolPrivate());
987
988 // Save EH frame information
989 EHFrames.push_back(FunctionEHFrameInfo(FunctionEHSym, SubprogramCount,
990 MMI->getPersonalityIndex(),
991 MF->getFrameInfo()->hasCalls(),
992 !MMI->getLandingPads().empty(),
993 MMI->getFrameMoves(),
994 MF->getFunction()));
995
952 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
953 MCSymbol *FunctionEHSym =
954 Asm->GetSymbolWithGlobalValueBase(MF->getFunction(), ".eh",
955 TLOF.isFunctionEHFrameSymbolPrivate());
956
957 // Save EH frame information
958 EHFrames.push_back(FunctionEHFrameInfo(FunctionEHSym, SubprogramCount,
959 MMI->getPersonalityIndex(),
960 MF->getFrameInfo()->hasCalls(),
961 !MMI->getLandingPads().empty(),
962 MMI->getFrameMoves(),
963 MF->getFunction()));
964
996 // Record if this personality index uses a landing pad.
997 UsesLSDA[MMI->getPersonalityIndex()] |= !MMI->getLandingPads().empty();
998
999 if (TimePassesIsEnabled)
1000 ExceptionTimer->stopTimer();
1001}
965 if (TimePassesIsEnabled)
966 ExceptionTimer->stopTimer();
967}