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