1 /////////////////////////////////////////////////////////////////////////////// 2 // 3 /// \file bcj_test.c 4 /// \brief Source code of compress_prepared_bcj_* 5 /// 6 /// This is a simple program that should make the compiler to generate 7 /// PC-relative branches, jumps, and calls. The compiled files can then 8 /// be used to test the branch conversion filters. Note that this program 9 /// itself does nothing useful. 10 /// 11 /// Compiling: gcc -std=c99 -fPIC -c bcj_test.c 12 /// Don't optimize or strip. 13 // 14 // Author: Lasse Collin 15 // 16 // This file has been put into the public domain. 17 // You can do whatever you want with this file. 18 // 19 /////////////////////////////////////////////////////////////////////////////// 20 21 extern int jump(int a, int b); 22 23 24 extern int 25 call(int a, int b) 26 { 27 if (a < b) 28 a = jump(a, b); 29 30 return a; 31 } 32 33 34 extern int 35 jump(int a, int b) 36 { 37 // The loop generates conditional jump backwards. 38 while (1) { 39 if (a < b) { 40 a *= 2; 41 a += 3 * b; 42 break; 43 } else { 44 // Put enough code here to prevent JMP SHORT on x86. 45 a += b; 46 a /= 2; 47 b += b % 5; 48 a -= b / 3; 49 b = 2 * b + a - 1; 50 a *= b + a + 1; 51 b += a - 1; 52 a += b * 2 - a / 5; 53 } 54 } 55 56 return a; 57 } 58 59 60 int 61 main(int argc, char **argv) 62 { 63 int a = call(argc, argc + 1); 64 return a == 0; 65 } 66