Home | History | Annotate | Download | only in Unit
      1 //===-- gcc_personality_test_helper.cxx -----------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include <stdlib.h>
     11 #include <stdio.h>
     12 
     13 extern "C" {
     14     extern void foo_clean(void* x);
     15     extern void bar_clean(void* x);
     16     extern void register_foo_local(int* x);
     17     extern void register_bar_local(int* x);
     18     extern void done_foo();
     19     extern void done_bar();
     20     extern void foo();
     21 }
     22 
     23 static int* foo_x = NULL;
     24 void register_foo_local(int* x)
     25 {
     26     foo_x = x;
     27 }
     28 
     29 static int* bar_x = NULL;
     30 void register_bar_local(int* x)
     31 {
     32     bar_x = x;
     33 }
     34 
     35 static bool foo_clean_called = false;
     36 void foo_clean(void* x)
     37 {
     38     if  ( foo_x == NULL )
     39         abort();
     40     if ( foo_x != (int*)x)
     41         abort();
     42     foo_clean_called = true;
     43 }
     44 
     45 static bool bar_clean_called = false;
     46 void bar_clean(void* x)
     47 {
     48     if  ( bar_x == NULL )
     49         abort();
     50     if ( bar_x != (int*)x)
     51         abort();
     52     bar_clean_called = true;
     53 }
     54 
     55 void done_foo()
     56 {
     57 }
     58 
     59 void done_bar()
     60 {
     61     throw "done";
     62 }
     63 
     64 
     65 //
     66 // foo() is in gcc_personality_test.c and calls bar() which
     67 // calls done_bar() which throws an exception.
     68 // main() will catch the exception and verify that the cleanup
     69 // routines for foo() and bar() were called by the personality
     70 // function.
     71 //
     72 int main()
     73 {
     74     try {
     75         foo();
     76     }
     77     catch(...) {
     78         if ( !foo_clean_called )
     79             abort();
     80         if ( !bar_clean_called )
     81             abort();
     82 		return 0;
     83     }
     84 	abort();
     85 }
     86