xref: /llvm-project/bolt/test/runtime/Inputs/exceptions_split.cpp (revision 777e268b8168b326db54ecacb62733ee926bb781)
1*777e268bSElvina Yakubova // Test that we can have a statement that throws in hot cold
2*777e268bSElvina Yakubova // and a landing pad in cold code.
3*777e268bSElvina Yakubova //
4*777e268bSElvina Yakubova // Record performance data with no args. Run test with 2 args.
5*777e268bSElvina Yakubova 
6*777e268bSElvina Yakubova #include <stdint.h>
7*777e268bSElvina Yakubova #include <stdio.h>
8*777e268bSElvina Yakubova 
foo()9*777e268bSElvina Yakubova int foo() { return 0; }
10*777e268bSElvina Yakubova 
bar(int a)11*777e268bSElvina Yakubova void bar(int a) {
12*777e268bSElvina Yakubova   if (a > 2 && a % 2)
13*777e268bSElvina Yakubova     throw new int();
14*777e268bSElvina Yakubova }
15*777e268bSElvina Yakubova 
filter_only()16*777e268bSElvina Yakubova void filter_only() { foo(); }
17*777e268bSElvina Yakubova 
main(int argc,char ** argv)18*777e268bSElvina Yakubova int main(int argc, char **argv) {
19*777e268bSElvina Yakubova   unsigned r = 0;
20*777e268bSElvina Yakubova 
21*777e268bSElvina Yakubova   uint64_t limit = (argc >= 2 ? 10 : 5000);
22*777e268bSElvina Yakubova   for (uint64_t i = 0; i < limit; ++i) {
23*777e268bSElvina Yakubova     i += foo();
24*777e268bSElvina Yakubova     try {
25*777e268bSElvina Yakubova       bar(argc);
26*777e268bSElvina Yakubova       try {
27*777e268bSElvina Yakubova         if (argc >= 2)
28*777e268bSElvina Yakubova           throw new int();
29*777e268bSElvina Yakubova       } catch (...) {
30*777e268bSElvina Yakubova         printf("catch 2\n");
31*777e268bSElvina Yakubova         throw new int();
32*777e268bSElvina Yakubova       }
33*777e268bSElvina Yakubova     } catch (...) {
34*777e268bSElvina Yakubova       printf("catch 1\n");
35*777e268bSElvina Yakubova     }
36*777e268bSElvina Yakubova   }
37*777e268bSElvina Yakubova 
38*777e268bSElvina Yakubova   return 0;
39*777e268bSElvina Yakubova }
40