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 | 4836e3a6f88e1e5c3831856fb0a2e9b6c984164d (patch) | |
tree | d4f716c3d950359e0168215e7e42c481ef230824 /llvm/lib/CodeGen/MachineModuleInfo.cpp | |
parent | ed4f3743c20fc1726b75c8448d7e13ceea636654 (diff) | |
download | bcm5719-llvm-4836e3a6f88e1e5c3831856fb0a2e9b6c984164d.tar.gz bcm5719-llvm-4836e3a6f88e1e5c3831856fb0a2e9b6c984164d.zip |
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.
llvm-svn: 37908
Diffstat (limited to 'llvm/lib/CodeGen/MachineModuleInfo.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineModuleInfo.cpp | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/MachineModuleInfo.cpp b/llvm/lib/CodeGen/MachineModuleInfo.cpp index 6ac038a1d9e..88d85074250 100644 --- a/llvm/lib/CodeGen/MachineModuleInfo.cpp +++ b/llvm/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; } |