diff options
author | Duncan Sands <baldrick@free.fr> | 2007-07-05 15:15:01 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2007-07-05 15:15:01 +0000 |
commit | 14da32a486f31ba695de9080830e6fadf4942d5b (patch) | |
tree | 52ffcc9cb6a209e4c44ad66ff7da10cef9780ada /lib/CodeGen | |
parent | 586eccb8cb281c0caf133bbd82a7c95741c231cb (diff) | |
download | external_llvm-14da32a486f31ba695de9080830e6fadf4942d5b.zip external_llvm-14da32a486f31ba695de9080830e6fadf4942d5b.tar.gz external_llvm-14da32a486f31ba695de9080830e6fadf4942d5b.tar.bz2 |
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
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/MachineModuleInfo.cpp | 24 |
1 files changed, 21 insertions, 3 deletions
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; } |