libgcc2.c (__register_exceptions): Find max ending of a segment for end, not min.

* libgcc2.c (__register_exceptions): Find max ending of a segment for
        end, not min.
        * libgcc2.c (__unwind_function): New function to support stack
        unwinding on i[34]86 for g++ exception handling.

From-SVN: r8571
This commit is contained in:
Mike Stump 1994-11-29 01:33:07 +00:00
parent db5ae43ff2
commit 5603182320
1 changed files with 27 additions and 1 deletions

View File

@ -2254,13 +2254,39 @@ __register_exceptions (exception_table *table)
{
if (range->start < node->start)
node->start = range->start;
if (range->end < node->end)
if (range->end > node->end)
node->end = range->end;
}
node->next = exception_table_list;
exception_table_list = node;
}
#ifdef __i386
void
__unwind_function(void *ptr)
{
asm("movl 8(%esp),%ecx");
/* Undo current frame */
asm("movl %ebp,%esp");
asm("popl %ebp");
asm("# like ret, but stay here");
asm("addl $4,%esp");
/* Now, undo previous frame. */
/* This is a test routine, as we have to dynamically probe to find out
what to pop for certain, this is just a guess. */
asm("leal -16(%ebp),%esp");
asm("pop %eax # really for popl %ebx");
asm("pop %eax # really for popl %esi");
asm("pop %eax # really for popl %edi");
asm("movl %ebp,%esp");
asm("popl %ebp");
asm("movl %ecx,0(%esp)");
asm("ret");
}
#endif
#endif /* L_eh */
#ifdef L_pure