diff options
-rw-r--r-- | include/llvm/CodeGen/MachineModuleInfo.h | 5 | ||||
-rw-r--r-- | 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 4b00d01..457d33d 100644 --- a/include/llvm/CodeGen/MachineModuleInfo.h +++ b/include/llvm/CodeGen/MachineModuleInfo.h @@ -1022,6 +1022,11 @@ private: // std::vector<unsigned> FilterIds; + // FilterEnds - List of the indices in FilterIds corresponding to filter + // terminators. + // + std::vector<unsigned> FilterEnds; + // Personalities - Vector of all personality functions ever seen. Used to emit // common EH frames. std::vector<Function *> Personalities; diff --git a/lib/CodeGen/MachineModuleInfo.cpp b/lib/CodeGen/MachineModuleInfo.cpp index 6ac038a..88d8507 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<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. + // 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<unsigned>::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; } |