http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56460



             Bug #: 56460

           Summary: _Unwind_Find_FDE is O(n) in the number of frame infos,

                    (and LLVM's JIT will generate many of them)

    Classification: Unclassified

           Product: gcc

           Version: 4.7.2

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: libgcc

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: c...@progress.com





Using LLVM with stack unwinding code calls __register_frame_info for every

function it JITs.  After generating a large number of functions, any occurrence

of throwing an exception (even in G++ compiled code) takes a very long time

(10's of milliseconds if 50,000 functions are generated) between  the throw and

catch, even if the catch is in the same function.  



Profiling and code inspection shows that the time is spent in _Unwind_Find_FDE

where it linearly walks the seen_objects linked list, looking for an object to

map the PC's on the stack up to.  Typically, there is at most one frame_info

registered per shared object, so typically a low number.  But if we want to

dynamically add a large number (as LLVM's JIT does; one per function), we could

maintain an ordered array of objects and perform a binary search of that array.



A proposed diff is attached.  We're seeing significant performance improvements

with this patch.

Reply via email to