diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c index 44b4de5982c..5df5278c8bd 100644 --- a/gcc/libgcc2.c +++ b/gcc/libgcc2.c @@ -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