xref: /llvm-project/libcxxabi/test/vendor/ibm/cond_reg_restore.pass.cpp (revision 2d3655037ccfa276cb0949c2ce0cff56985f6637)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // Check that the condition register is restored properly during unwinding
10 // on AIX. Option -O3 is required so that the compiler will re-use the value
11 // in the condition register instead of re-evaluating the condition expression.
12 
13 // REQUIRES: target={{.+}}-aix{{.*}}
14 // ADDITIONAL_COMPILE_FLAGS: -O3
15 // UNSUPPORTED: no-exceptions
16 
17 #include <cstdlib>
18 #include <cassert>
19 
20 int __attribute__((noinline)) test2(int i) {
21   // The inline assembly forces the prologue/epilogue to save/restore the
22   // condition register.
23   asm volatile("nop" : : : "cr2");
24   if (i > 3) {
25     throw i;
26   }
27   srand(i);
28   return rand() + i;
29 }
30 
31 void __attribute__((noinline)) test(int argc, const char **argv) {
32   int a = atoi(argv[1]);
33   int b = atoi(argv[2]);
34   try {
35     test2(a < b ? argc : b);
36   } catch (int num) {
37     assert(!(a < b));
38   }
39 }
40 int main(int, char**) {
41   const char *av[]={"a.out", "12", "10"};
42   test(4, av);
43   return 0;
44 }
45