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:
parent
db5ae43ff2
commit
5603182320
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user