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)
|
if (range->start < node->start)
|
||||||
node->start = range->start;
|
node->start = range->start;
|
||||||
if (range->end < node->end)
|
if (range->end > node->end)
|
||||||
node->end = range->end;
|
node->end = range->end;
|
||||||
}
|
}
|
||||||
|
|
||||||
node->next = exception_table_list;
|
node->next = exception_table_list;
|
||||||
exception_table_list = node;
|
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 */
|
#endif /* L_eh */
|
||||||
|
|
||||||
#ifdef L_pure
|
#ifdef L_pure
|
||||||
|
|
Loading…
Reference in New Issue