OSDN Git Service

* libgcc2.c (__register_exceptions): Find max ending of a segment for
authormrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Nov 1994 01:33:07 +0000 (01:33 +0000)
committermrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Nov 1994 01:33:07 +0000 (01:33 +0000)
        end, not min.
        * libgcc2.c (__unwind_function): New function to support stack
        unwinding on i[34]86 for g++ exception handling.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@8571 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/libgcc2.c

index 44b4de5..5df5278 100644 (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 */
 \f
 #ifdef L_pure