Changes in directory llvm/lib/CodeGen:
DwarfWriter.cpp updated: 1.149 -> 1.150 MachineModuleInfo.cpp updated: 1.15 -> 1.16 --- Log message: Integrate exception filter support and exception catch support. This simplifies the code in DwarfWriter, allows for multiple filters and makes it trivial to specify filters accompanied by cleanups or catch-all specifications (see next patch). What a deal! Patch blessed by Anton. --- Diffs of the changes: (+44 -57) DwarfWriter.cpp | 74 ++++++++++++++------------------------------------ MachineModuleInfo.cpp | 27 +++++++++++++++--- 2 files changed, 44 insertions(+), 57 deletions(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.149 llvm/lib/CodeGen/DwarfWriter.cpp:1.150 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.149 Wed May 23 06:08:30 2007 +++ llvm/lib/CodeGen/DwarfWriter.cpp Sat Jun 2 11:53:42 2007 @@ -2896,13 +2896,10 @@ /// EquivPads - Whether two landing pads have equivalent actions. static bool EquivPads(const LandingPadInfo *L, const LandingPadInfo *R) { - const std::vector<unsigned> &LIds = L->TypeIds; - const std::vector<unsigned> &RIds = R->TypeIds; + const std::vector<int> &LIds = L->TypeIds; + const std::vector<int> &RIds = R->TypeIds; unsigned LSize = LIds.size(), RSize = RIds.size(); - if (L->IsFilter != R->IsFilter) - return false; - if (LSize != RSize) return false; @@ -2915,14 +2912,10 @@ /// PadLT - An order on landing pads, with EquivPads as order equivalence. static bool PadLT(const LandingPadInfo *L, const LandingPadInfo *R) { - const std::vector<unsigned> &LIds = L->TypeIds; - const std::vector<unsigned> &RIds = R->TypeIds; + const std::vector<int> &LIds = L->TypeIds; + const std::vector<int> &RIds = R->TypeIds; unsigned LSize = LIds.size(), RSize = RIds.size(); - if (L->IsFilter != R->IsFilter) - // Make filters come last - return L->IsFilter < R->IsFilter; - if (LSize != RSize) return LSize < RSize; @@ -2972,6 +2965,7 @@ MMI->TidyLandingPads(); const std::vector<GlobalVariable *> &TypeInfos = MMI->getTypeInfos(); + const std::vector<unsigned> &FilterIds = MMI->getFilterIds(); const std::vector<LandingPadInfo> &PadInfos = MMI->getLandingPads(); if (PadInfos.empty()) return; @@ -2985,11 +2979,6 @@ // Gather first action index for each landing pad site. SmallVector<unsigned, 32> Actions; - // FIXME - Assume there is only one filter typeinfo list per function - // time being. I.E., Each call to eh_filter will have the same list. - // This can change if a function is inlined. - const LandingPadInfo *Filter = 0; - // Compute sizes for exception table. unsigned SizeSites = 0; unsigned SizeActions = 0; @@ -3003,24 +2992,15 @@ unsigned SizeSiteActions = 0; if (!i || !EquivPads(LandingPad, LandingPads[i-1])) { - const std::vector<unsigned> &TypeIds = LandingPad->TypeIds; + const std::vector<int> &TypeIds = LandingPad->TypeIds; unsigned SizeAction = 0; - if (LandingPad->IsFilter) { - // FIXME - Assume there is only one filter typeinfo list per function - // time being. I.E., Each call to eh_filter will have the same list. - // This can change if a function is inlined. - Filter = LandingPad; - SizeAction = Asm->SizeSLEB128(-1) + Asm->SizeSLEB128(0); - SizeSiteActions += SizeAction; - // Record the first action of the landing pad site. - FirstAction = SizeActions + SizeSiteActions - SizeAction + 1; - } else if (TypeIds.empty()) { + if (TypeIds.empty()) { FirstAction = 0; } else { // Gather the action sizes for (unsigned j = 0, M = TypeIds.size(); j != M; ++j) { - unsigned TypeID = TypeIds[j]; + int TypeID = TypeIds[j]; unsigned SizeTypeID = Asm->SizeSLEB128(TypeID); signed Action = j ? -(SizeAction + SizeTypeID) : 0; SizeAction = SizeTypeID + Asm->SizeSLEB128(Action); @@ -3140,25 +3120,18 @@ for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) { if (!i || Actions[i] != Actions[i-1]) { const LandingPadInfo *LandingPad = LandingPads[i]; - const std::vector<unsigned> &TypeIds = LandingPad->TypeIds; + const std::vector<int> &TypeIds = LandingPad->TypeIds; unsigned SizeAction = 0; - if (LandingPad->IsFilter) { - Asm->EmitSLEB128Bytes(-1); + for (unsigned j = 0, M = TypeIds.size(); j < M; ++j) { + int TypeID = TypeIds[j]; + unsigned SizeTypeID = Asm->SizeSLEB128(TypeID); + Asm->EmitSLEB128Bytes(TypeID); Asm->EOL("TypeInfo index"); - Asm->EmitSLEB128Bytes(0); + signed Action = j ? -(SizeAction + SizeTypeID) : 0; + SizeAction = SizeTypeID + Asm->SizeSLEB128(Action); + Asm->EmitSLEB128Bytes(Action); Asm->EOL("Next action"); - } else { - for (unsigned j = 0, M = TypeIds.size(); j < M; ++j) { - unsigned TypeID = TypeIds[j]; - unsigned SizeTypeID = Asm->SizeSLEB128(TypeID); - Asm->EmitSLEB128Bytes(TypeID); - Asm->EOL("TypeInfo index"); - signed Action = j ? -(SizeAction + SizeTypeID) : 0; - SizeAction = SizeTypeID + Asm->SizeSLEB128(Action); - Asm->EmitSLEB128Bytes(Action); - Asm->EOL("Next action"); - } } } } @@ -3180,16 +3153,11 @@ Asm->EOL("TypeInfo"); } - // Emit the filter typeinfo. - if (Filter) { - const std::vector<unsigned> &TypeIds = Filter->TypeIds; - for (unsigned j = 0, M = TypeIds.size(); j < M; ++j) { - unsigned TypeID = TypeIds[j]; - Asm->EmitSLEB128Bytes(TypeID); - Asm->EOL("TypeInfo index"); - } - Asm->EmitSLEB128Bytes(0); - Asm->EOL("End of filter typeinfo"); + // Emit the filter typeids. + for (unsigned j = 0, M = FilterIds.size(); j < M; ++j) { + unsigned TypeID = FilterIds[j]; + Asm->EmitSLEB128Bytes(TypeID); + Asm->EOL("Filter TypeInfo index"); } Asm->EmitAlignment(2); Index: llvm/lib/CodeGen/MachineModuleInfo.cpp diff -u llvm/lib/CodeGen/MachineModuleInfo.cpp:1.15 llvm/lib/CodeGen/MachineModuleInfo.cpp:1.16 --- llvm/lib/CodeGen/MachineModuleInfo.cpp:1.15 Wed May 23 06:08:31 2007 +++ llvm/lib/CodeGen/MachineModuleInfo.cpp Sat Jun 2 11:53:42 2007 @@ -1521,6 +1521,7 @@ // Clean up exception info. LandingPads.clear(); TypeInfos.clear(); + FilterIds.clear(); } /// getDescFor - Convert a Value to a debug information descriptor. @@ -1708,12 +1709,16 @@ for (unsigned N = TyInfo.size(); N; --N) LP.TypeIds.push_back(getTypeIDFor(TyInfo[N - 1])); } - -/// setIsFilterLandingPad - Indicates that the landing pad is a throw filter. + +/// addFilterTypeInfo - Provide the filter typeinfo for a landing pad. /// -void MachineModuleInfo::setIsFilterLandingPad(MachineBasicBlock *LandingPad) { +void MachineModuleInfo::addFilterTypeInfo(MachineBasicBlock *LandingPad, + std::vector<GlobalVariable *> &TyInfo) { LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); - LP.IsFilter = true; + std::vector<unsigned> IdsInFilter (TyInfo.size()); + for (unsigned I = 0, E = TyInfo.size(); I != E; ++I) + IdsInFilter[I] = getTypeIDFor(TyInfo[I]); + LP.TypeIds.push_back(getFilterIDFor(IdsInFilter)); } /// TidyLandingPads - Remap landing pad labels and remove any deleted landing @@ -1760,6 +1765,20 @@ return TypeInfos.size(); } +/// getFilterIDFor - Return the filter id for the specified typeinfos. This is +/// function wide. +int MachineModuleInfo::getFilterIDFor(std::vector<unsigned> &TyIds) { + // TODO: map duplicate filters to the same filter id; a filter equal to the + // tail of an existing filter also need not be added; re-order filters and + // filter elements to maximize this kind of sharing. + int FilterID = -(1 + FilterIds.size()); + FilterIds.reserve(FilterIds.size() + TyIds.size() + 1); + for (unsigned I = 0, N = TyIds.size(); I != N; ++I) + FilterIds.push_back(TyIds[I]); + FilterIds.push_back(0); // terminator + return FilterID; +} + /// getPersonality - Return the personality function for the current function. Function *MachineModuleInfo::getPersonality() const { // FIXME: Until PR1414 will be fixed, we're using 1 personality function per _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits