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} |