From 14da32a486f31ba695de9080830e6fadf4942d5b Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Thu, 5 Jul 2007 15:15:01 +0000 Subject: [PATCH] Make sure only one copy of a filter is placed in the exception handling table if we encounter it multiple times. Filters could be folded harder than this, but that would mean a lot more work for not much gain. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37908 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/MachineModuleInfo.h | 5 +++++ lib/CodeGen/MachineModuleInfo.cpp | 24 +++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/include/llvm/CodeGen/MachineModuleInfo.h b/include/llvm/CodeGen/MachineModuleInfo.h index 4b00d01cee9..457d33d1f26 100644 --- a/include/llvm/CodeGen/MachineModuleInfo.h +++ b/include/llvm/CodeGen/MachineModuleInfo.h @@ -1022,6 +1022,11 @@ private: // std::vector FilterIds; + // FilterEnds - List of the indices in FilterIds corresponding to filter + // terminators. + // + std::vector FilterEnds; + // Personalities - Vector of all personality functions ever seen. Used to emit // common EH frames. std::vector Personalities; diff --git a/lib/CodeGen/MachineModuleInfo.cpp b/lib/CodeGen/MachineModuleInfo.cpp index 6ac038a1d9e..88d85074250 100644 --- a/lib/CodeGen/MachineModuleInfo.cpp +++ b/lib/CodeGen/MachineModuleInfo.cpp @@ -1522,6 +1522,7 @@ void MachineModuleInfo::EndFunction() { LandingPads.clear(); TypeInfos.clear(); FilterIds.clear(); + FilterEnds.clear(); } /// getDescFor - Convert a Value to a debug information descriptor. @@ -1772,13 +1773,30 @@ unsigned MachineModuleInfo::getTypeIDFor(GlobalVariable *TI) { /// getFilterIDFor - Return the filter id for the specified typeinfos. This is /// function wide. int MachineModuleInfo::getFilterIDFor(std::vector &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. + // If the new filter coincides with the tail of an existing filter, then + // re-use the existing filter. Folding filters more than this requires + // re-ordering filters and/or their elements - probably not worth it. + for (std::vector::iterator I = FilterEnds.begin(), + E = FilterEnds.end(); I != E; ++I) { + unsigned i = *I, j = TyIds.size(); + + while (i && j) + if (FilterIds[--i] != TyIds[--j]) + goto try_next; + + if (!j) + // The new filter coincides with range [i, end) of the existing filter. + return -(1 + i); + +try_next:; + } + + // Add the new filter. 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]); + FilterEnds.push_back(FilterIds.size()); FilterIds.push_back(0); // terminator return FilterID; } -- 2.34.1