Home | History | Annotate | Download | only in ltrace.main
      1 /*
      2  * This file is part of ltrace.
      3  * Copyright (C) 2012 Petr Machata, Red Hat Inc.
      4  *
      5  * This program is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU General Public License as
      7  * published by the Free Software Foundation; either version 2 of the
      8  * License, or (at your option) any later version.
      9  *
     10  * This program is distributed in the hope that it will be useful, but
     11  * WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13  * General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU General Public License
     16  * along with this program; if not, write to the Free Software
     17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
     18  * 02110-1301 USA
     19  */
     20 
     21 /* This is specially made to produce tail calls.  We then trace them
     22  * and see if ltrace handles it well, or whether its internal stack
     23  * overflows.  */
     24 
     25 __attribute__((noinline, optimize(3))) int
     26 func3(int i)
     27 {
     28 	return i + 1;
     29 }
     30 
     31 __attribute__((noinline, optimize(3))) int
     32 func2(int i)
     33 {
     34 	return func3(i * 3);
     35 }
     36 
     37 __attribute__((noinline, optimize(3))) int
     38 func1(int i)
     39 {
     40 	return func2(i + 2);
     41 }
     42 
     43 __attribute__((optimize(0))) int
     44 main(int argc, char **argv)
     45 {
     46 	int counter = 0;
     47 	int i;
     48 	for (i = 0; i < 100; ++i)
     49 		counter += func1(i);
     50 	return counter;
     51 }
     52